11 use init_mod ,
only : do_ocnprep, debug, logunit,
vardefs, fsrc, fdst, ftype, nxr, nyr
13 use arrays_mod,
only : maskspval, mask3d
19 type(esmf_routehandle) :: rh
20 type(esmf_dynamicmask) :: dynamiclevmask
21 type(esmf_mesh) :: meshsrc
22 type(esmf_mesh) :: meshdst
24 integer :: srctermprocessing = 0
27 module procedure remaprh1d
28 module procedure remaprh2d
29 module procedure remaprh1ddyn
30 module procedure remaprh2ddyn
34 module procedure rotremap2d
35 module procedure rotremap3d
43 character(len=*),
parameter :: u_file_u = __file__
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)
118 end subroutine createrh
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
166 end subroutine remaprh1d
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)
216 end subroutine remaprh2d
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
269 end subroutine remaprh1ddyn
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
330 end subroutine remaprh2ddyn
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)
387 end subroutine rotremap2d
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)
443 end subroutine rotremap3d
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)
493 end subroutine dynlevmaskproc
503 logical function chkerr(rc, line, file)
504 integer,
intent(in) :: rc
505 integer,
intent(in) :: line
506 character(len=*),
intent(in) :: file
511 if (esmf_logfounderror(rctocheck=lrc, msg=esmf_logerr_passthru, line=line, file=file))
then 515 end module utils_esmf_mod