52 subroutine createrh(srcmeshfile,dstmeshfile,rc)
54 character(len=*),
intent(in) :: srcmeshfile
55 character(len=*),
intent(in) :: dstmeshfile
56 integer,
intent(out) :: rc
59 type(esmf_field) :: fldsrc
60 type(esmf_field) :: flddst
61 type(esmf_regridmethod_flag) :: regridmethod
62 type(esmf_extrapmethod_flag) :: extrapmethod
63 type(esmf_field) :: dststatusfield
64 integer,
pointer :: dststatus(:)
65 character(len=20) :: subname =
'remapRH1d'
68 if (debug)
write(logunit,
'(a)')
'enter '//trim(subname)
74 regridmethod = esmf_regridmethod_bilinear
75 extrapmethod = esmf_extrapmethod_nearest_idavg
77 regridmethod = esmf_regridmethod_nearest_stod
78 extrapmethod = esmf_extrapmethod_nearest_stod
81 meshsrc = esmf_meshcreate(filename=trim(srcmeshfile), fileformat=esmf_fileformat_esmfmesh, rc=rc)
82 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
83 fldsrc = esmf_fieldcreate(meshsrc, esmf_typekind_r8, name=
'mshsrc', meshloc=esmf_meshloc_element, rc=rc)
84 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
86 meshdst = esmf_meshcreate(filename=trim(dstmeshfile), fileformat=esmf_fileformat_esmfmesh, rc=rc)
87 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
88 flddst = esmf_fieldcreate(meshdst, esmf_typekind_r8, name=
'mshdst', meshloc=esmf_meshloc_element, rc=rc)
89 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
91 dststatusfield = esmf_fieldcreate(meshdst, esmf_typekind_i4, meshloc=esmf_meshloc_element, rc=rc)
92 if (chkerr(rc,__line__,u_file_u))
return
93 call esmf_fieldget(dststatusfield, farrayptr=dststatus, rc=rc)
94 if (chkerr(rc,__line__,u_file_u))
return
96 call esmf_fieldregridstore(fldsrc, flddst, routehandle=rh, &
97 srcmaskvalues=(/0/), dstmaskvalues=(/0/), &
98 regridmethod=regridmethod, &
99 extrapmethod=extrapmethod, &
100 polemethod=esmf_polemethod_allavg, &
101 ignoredegenerate=.true., &
102 srctermprocessing=srctermprocessing, &
103 dststatusfield=dststatusfield, &
104 unmappedaction=esmf_unmappedaction_ignore, rc=rc)
105 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
108 call esmf_dynamicmasksetr8r8r8(dynamiclevmask, dynamicsrcmaskvalue=maskspval, &
109 dynamicmaskroutine=dynlevmaskproc, rc=rc)
110 if (chkerr(rc,__line__,u_file_u))
return
113 call dumpnc(trim(ftype)//
'.'//trim(fdst)//
'.dststat.nc',
'dststat', &
114 dims=(/nxr,nyr/), field=real(dststatus,8))
117 if (debug)
write(logunit,
'(a)')
'exit '//trim(subname)
128 subroutine remaprh1d(kk,src_field,dst_field,rc)
130 integer,
intent(in) :: kk
131 real(kind=8), intent(in) :: src_field(:)
132 real(kind=8), intent(out) :: dst_field(:)
133 integer,
intent(out) :: rc
136 type(esmf_field) :: fldsrc
137 type(esmf_field) :: flddst
138 real(kind=8), pointer :: srcptr(:), dstptr(:)
139 character(len=20) :: subname =
'remapRH1d'
142 if (debug)
write(logunit,
'(a,i5)')
'enter '//trim(subname)//
' ',kk
145 fldsrc = esmf_fieldcreate(meshsrc, esmf_typekind_r8, meshloc=esmf_meshloc_element,rc=rc)
146 if (chkerr(rc,__line__,u_file_u))
return
147 flddst = esmf_fieldcreate(meshdst, esmf_typekind_r8, meshloc=esmf_meshloc_element,rc=rc)
148 if (chkerr(rc,__line__,u_file_u))
return
150 call esmf_fieldget(fldsrc, farrayptr=srcptr, rc=rc)
151 if (chkerr(rc,__line__,u_file_u))
return
152 call esmf_fieldget(flddst, farrayptr=dstptr, rc=rc)
153 if (chkerr(rc,__line__,u_file_u))
return
156 if (esmf_routehandleiscreated(rh,rc=rc))
then
157 call esmf_fieldregrid(fldsrc, flddst, routehandle=rh, rc=rc)
158 if (chkerr(rc,__line__,u_file_u))
return
160 call esmf_logwrite(trim(subname)//
": RH not created ", esmf_logmsg_info)
165 if (debug)
write(logunit,
'(a,i5)')
'exit '//trim(subname)//
' ',kk
175 subroutine remaprh2d(src_field,dst_field,rc)
177 real(kind=8), intent(in) :: src_field(:,:)
178 real(kind=8), intent(out) :: dst_field(:,:)
179 integer,
intent(out) :: rc
182 type(esmf_field) :: fldsrc
183 type(esmf_field) :: flddst
184 real(kind=8), pointer :: srcptr(:,:), dstptr(:,:)
185 character(len=20) :: subname =
'remapRH2d'
188 if (debug)
write(logunit,
'(a)')
'enter '//trim(subname)
191 fldsrc = esmf_fieldcreate(meshsrc, esmf_typekind_r8, meshloc=esmf_meshloc_element, &
192 ungriddedlbound=(/1/), ungriddedubound=(/
size(src_field,1)/), &
193 gridtofieldmap=(/2/), rc=rc)
194 if (chkerr(rc,__line__,u_file_u))
return
195 flddst = esmf_fieldcreate(meshdst, esmf_typekind_r8, meshloc=esmf_meshloc_element, &
196 ungriddedlbound=(/1/), ungriddedubound=(/
size(dst_field,1)/), &
197 gridtofieldmap=(/2/), rc=rc)
198 if (chkerr(rc,__line__,u_file_u))
return
200 call esmf_fieldget(fldsrc, farrayptr=srcptr, rc=rc)
201 if (chkerr(rc,__line__,u_file_u))
return
202 call esmf_fieldget(flddst, farrayptr=dstptr, rc=rc)
203 if (chkerr(rc,__line__,u_file_u))
return
206 if (esmf_routehandleiscreated(rh,rc=rc))
then
207 call esmf_fieldregrid(fldsrc, flddst, routehandle=rh, rc=rc)
208 if (chkerr(rc,__line__,u_file_u))
return
210 call esmf_logwrite(trim(subname)//
": RH not created ", esmf_logmsg_info)
215 if (debug)
write(logunit,
'(a)')
'exit '//trim(subname)
227 subroutine remaprh1ddyn(kk,src_field,dst_field,hmask,rc)
230 integer,
intent(in) :: kk
231 real(kind=8), intent(in) :: src_field(:)
232 real(kind=8), intent(in) :: hmask(:)
233 real(kind=8), intent(out) :: dst_field(:)
234 integer,
intent(out) :: rc
237 type(esmf_field) :: fldsrc
238 type(esmf_field) :: flddst
239 real(kind=8), pointer :: srcptr(:), dstptr(:)
240 character(len=20) :: subname =
'remapRH1ddyn'
243 if (debug)
write(logunit,
'(a,i5)')
'enter '//trim(subname)//
' ',kk
246 fldsrc = esmf_fieldcreate(meshsrc, esmf_typekind_r8, meshloc=esmf_meshloc_element)
247 if (chkerr(rc,__line__,u_file_u))
return
248 flddst = esmf_fieldcreate(meshdst, esmf_typekind_r8, meshloc=esmf_meshloc_element)
249 if (chkerr(rc,__line__,u_file_u))
return
251 call esmf_fieldget(fldsrc, farrayptr=srcptr, rc=rc)
252 if (chkerr(rc,__line__,u_file_u))
return
253 call esmf_fieldget(flddst, farrayptr=dstptr, rc=rc)
254 if (chkerr(rc,__line__,u_file_u))
return
257 where(hmask .eq. maskspval)srcptr = maskspval
259 if (esmf_routehandleiscreated(rh,rc=rc))
then
260 call esmf_fieldregrid(fldsrc, flddst, routehandle=rh, dynamicmask=dynamiclevmask, rc=rc)
261 if (chkerr(rc,__line__,u_file_u))
return
263 call esmf_logwrite(trim(subname)//
": RH not created ", esmf_logmsg_info)
268 if (debug)
write(logunit,
'(a,i5)')
'exit '//trim(subname)//
' ',kk
280 subroutine remaprh2ddyn(kk,src_field,dst_field,hmask,rc)
282 integer,
intent(in) :: kk
283 real(kind=8), intent(in) :: src_field(:,:)
284 real(kind=8), intent(in) :: hmask(:)
285 real(kind=8), intent(out) :: dst_field(:,:)
286 integer,
intent(out) :: rc
289 type(esmf_field) :: fldsrc
290 type(esmf_field) :: flddst
292 real(kind=8), pointer :: srcptr(:,:), dstptr(:,:)
293 character(len=20) :: subname =
'remapRH2ddyn'
296 if (debug)
write(logunit,
'(a,i5)')
'enter '//trim(subname)//
' ',kk
299 fldsrc = esmf_fieldcreate(meshsrc, esmf_typekind_r8, meshloc=esmf_meshloc_element, &
300 ungriddedlbound=(/1/), ungriddedubound=(/
size(src_field,1)/), &
301 gridtofieldmap=(/2/), rc=rc)
302 if (chkerr(rc,__line__,u_file_u))
return
303 flddst = esmf_fieldcreate(meshdst, esmf_typekind_r8, meshloc=esmf_meshloc_element, &
304 ungriddedlbound=(/1/), ungriddedubound=(/
size(dst_field,1)/), &
305 gridtofieldmap=(/2/), rc=rc)
306 if (chkerr(rc,__line__,u_file_u))
return
308 call esmf_fieldget(fldsrc, farrayptr=srcptr, rc=rc)
309 if (chkerr(rc,__line__,u_file_u))
return
310 call esmf_fieldget(flddst, farrayptr=dstptr, rc=rc)
311 if (chkerr(rc,__line__,u_file_u))
return
314 do n = 1,ubound(src_field,2)
315 do i = 1,ubound(src_field,1)
316 if(hmask(n) .eq. maskspval)srcptr(i,n) = maskspval
320 if (esmf_routehandleiscreated(rh,rc=rc))
then
321 call esmf_fieldregrid(fldsrc, flddst, routehandle=rh, dynamicmask=dynamiclevmask, rc=rc)
322 if (chkerr(rc,__line__,u_file_u))
return
324 call esmf_logwrite(trim(subname)//
": RH not created ", esmf_logmsg_info)
329 if (debug)
write(logunit,
'(a,i5)')
'exit '//trim(subname)//
' ',kk
343 subroutine rotremap2d(wdir, vars, cosrot, sinrot, dims, nflds, fields)
345 character(len=*),
intent(in) :: wdir
346 real(kind=8), intent(in) :: cosrot(:),sinrot(:)
347 type(
vardefs),
intent(in) :: vars(:)
348 integer,
intent(in) :: dims(:)
349 integer,
intent(in) :: nflds
350 real(kind=8), intent(inout) :: fields(:,:)
352 integer :: n, idx1, idx2
353 real(kind=8), allocatable,
dimension(:) :: urot, vrot
354 character(len=10) :: vgrid1, vgrid2
355 character(len=240) :: wgtsfile
356 character(len=20) :: subname =
'rotremap2d'
359 if (debug)
write(logunit,
'(a)')
'enter '//trim(subname)
363 if (len_trim(vars(n)%var_pair) > 0 .and. idx1 .eq. 0)
then
368 if (idx1 .eq. 0)
return
370 vgrid1 = vars(idx1)%var_grid(1:2)
371 vgrid2 = vars(idx1)%var_pair_grid(1:2)
373 allocate(urot(1:dims(1)*dims(2))); urot = 0.0
374 allocate(vrot(1:dims(1)*dims(2))); vrot = 0.0
375 urot(:) = fields(idx1,:)*cosrot(:) - fields(idx2,:)*sinrot(:)
376 vrot(:) = fields(idx2,:)*cosrot(:) + fields(idx1,:)*sinrot(:)
378 wgtsfile = trim(wdir)//
'tripole.'//trim(fdst)//
'.Ct.to.'//trim(vgrid1)//
'.bilinear.nc'
379 call remap(trim(wgtsfile), urot, fields(idx1,:))
380 if (debug)
write(logunit,
'(a)')
'use '//trim(wgtsfile)//
' to restagger from Ct to '//trim(vgrid1)
382 wgtsfile = trim(wdir)//
'tripole.'//trim(fdst)//
'.Ct.to.'//trim(vgrid2)//
'.bilinear.nc'
383 call remap(trim(wgtsfile), vrot, fields(idx2,:))
384 if (debug)
write(logunit,
'(a)')
'use '//trim(wgtsfile)//
' to restagger from Ct to '//trim(vgrid2)
386 if (debug)
write(logunit,
'(a)')
'exit '//trim(subname)
400 subroutine rotremap3d(wdir, vars, cosrot, sinrot, dims, nflds, fields)
402 character(len=*),
intent(in) :: wdir
403 real(kind=8), intent(in) :: cosrot(:),sinrot(:)
404 type(
vardefs),
intent(in) :: vars(:)
405 integer,
intent(in) :: dims(:)
406 integer,
intent(in) :: nflds
407 real(kind=8), intent(inout) :: fields(:,:,:)
409 integer :: k, n, idx1, idx2
410 real(kind=8), allocatable,
dimension(:) :: urot, vrot
411 character(len=10) :: vgrid1, vgrid2
412 character(len=240) :: wgtsfile
413 character(len=20) :: subname =
'rotremap3d'
416 if (debug)
write(logunit,
'(a)')
'enter '//trim(subname)
420 if (len_trim(vars(n)%var_pair) > 0 .and. idx1 .eq. 0)
then
425 if (idx1 .eq. 0)
return
427 vgrid1 = vars(idx1)%var_grid(1:2)
428 vgrid2 = vars(idx1)%var_pair_grid(1:2)
429 if (debug)
write(logunit,
'(a)')
'restagger from Ct to '//trim(vgrid1)//
' and '//trim(vgrid2)
431 allocate(urot(1:dims(1)*dims(2))); urot = 0.0
432 allocate(vrot(1:dims(1)*dims(2))); vrot = 0.0
434 urot(:) = fields(idx1,k,:)*cosrot(:) - fields(idx2,k,:)*sinrot(:)
435 vrot(:) = fields(idx2,k,:)*cosrot(:) + fields(idx1,k,:)*sinrot(:)
436 wgtsfile = trim(wdir)//
'tripole.'//trim(fdst)//
'.Ct.to.'//trim(vgrid1)//
'.bilinear.nc'
437 call remap(trim(wgtsfile), urot, fields(idx1,k,:))
438 wgtsfile = trim(wdir)//
'tripole.'//trim(fdst)//
'.Ct.to.'//trim(vgrid2)//
'.bilinear.nc'
439 call remap(trim(wgtsfile), vrot, fields(idx2,k,:))
442 if (debug)
write(logunit,
'(a)')
'exit '//trim(subname)
453 subroutine dynlevmaskproc(dynamicMaskList, dynamicSrcMaskValue, dynamicDstMaskValue, rc)
456 type(esmf_dynamicmaskelementr8r8r8) ,
pointer :: dynamicMaskList(:)
457 real(ESMF_KIND_R8),
intent(in),
optional :: dynamicSrcMaskValue
458 real(ESMF_KIND_R8),
intent(in),
optional :: dynamicDstMaskValue
459 integer ,
intent(out) :: rc
463 real(ESMF_KIND_R8) :: renorm
464 character(len=20) :: subname =
'dynLevMaskProc'
467 if (debug)
write(logunit,
'(a)')
'enter '//trim(subname)
470 if (
associated(dynamicmasklist))
then
471 do i=1,
size(dynamicmasklist)
472 dynamicmasklist(i)%dstElement = 0.0
474 do j = 1,
size(dynamicmasklist(i)%factor)
475 if (dynamicsrcmaskvalue /= dynamicmasklist(i)%srcElement(j))
then
476 dynamicmasklist(i)%dstElement = dynamicmasklist(i)%dstElement + &
477 (dynamicmasklist(i)%factor(j) * dynamicmasklist(i)%srcElement(j))
478 renorm = renorm + dynamicmasklist(i)%factor(j)
481 if (renorm > 0.0)
then
482 dynamicmasklist(i)%dstElement = dynamicmasklist(i)%dstElement / renorm
483 else if (
present(dynamicsrcmaskvalue))
then
484 dynamicmasklist(i)%dstElement = dynamicsrcmaskvalue
491 if (debug)
write(logunit,
'(a)')
'exit '//trim(subname)