22 use init_mod ,
only : nxt, nyt, nlevs, nxr, nyr, outvars, readnml, readcsv
23 use init_mod ,
only : wgtsdir, griddir, ftype, fsrc, fdst, input_file, maskvar
24 use init_mod ,
only : do_ocnprep, debug, logunit
25 use arrays_mod ,
only : b2d, c2d, b3d, rgb2d, rgb3d, rgc2d, setup_packing
26 use arrays_mod ,
only : nbilin2d, nbilin3d, nconsd2d, bilin2d, bilin3d, consd2d
27 use arrays_mod ,
only : mask3d, hmin, maskspval, eta
30 use restarts_mod ,
only : setup_icerestart, setup_ocnrestart
31 use ocncalc_mod ,
only : calc_eta, vfill
36 character(len=160) :: gridfile
37 character(len=160) :: wgtsfile
38 character(len=160) :: fout
40 real(kind=8),
allocatable,
dimension(:) :: angsrc
41 real(kind=8),
allocatable,
dimension(:) :: angdst
43 real(kind=8),
allocatable,
dimension(:) :: bathysrc
44 real(kind=8),
allocatable,
dimension(:) :: bathydst
47 real(kind=8),
allocatable,
dimension(:,:) :: out2d
48 real(kind=8),
allocatable,
dimension(:,:,:) :: out3d
50 character(len=120) :: errmsg
51 character(len=120) :: meshfsrc, meshfdst
53 integer :: k,n,nn,rc,ncid,varid
54 character(len=20) :: vname
58 character(len=*),
parameter :: u_file_u = __file__
64 call esmf_initialize(rc=rc)
65 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
66 call esmf_vmgetglobal(vm, rc=rc)
67 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
73 call readnml(
'ocniceprep.nml',errmsg,rc)
75 write(0,
'(a)')trim(errmsg)
78 write(logunit,
'(a)')trim(errmsg)
81 call readcsv(trim(ftype)//
'.csv',errmsg,rc,nvalid)
83 write(0,
'(a)')trim(errmsg)
86 write(logunit,
'(a)')trim(errmsg)
93 meshfsrc = trim(griddir)//fsrc(3:5)//
'/'//
'mesh.'//trim(fsrc)//
'.nc' 94 meshfdst = trim(griddir)//fdst(3:5)//
'/'//
'mesh.'//trim(fdst)//
'.nc' 95 write(logunit,
'(a)')
'mesh src: '//trim(meshfsrc)
96 write(logunit,
'(a)')
'mesh dst: '//trim(meshfdst)
97 call createrh(trim(meshfsrc),trim(meshfdst),rc=rc)
98 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
105 allocate(angsrc(nxt*nyt)); angsrc = 0.0
106 allocate(angdst(nxr*nyr)); angdst = 0.0
107 allocate(bathysrc(nxt*nyt)); bathysrc = 0.0
108 allocate(bathydst(nxr*nyr)); bathydst = 0.0
110 gridfile = trim(griddir)//fsrc(3:5)//
'/'//
'tripole.'//trim(fsrc)//
'.nc' 111 call nf90_err(nf90_open(trim(gridfile), nf90_nowrite, ncid), &
112 'open: '//trim(gridfile))
113 call getfield(trim(gridfile),
'anglet', dims=(/nxt,nyt/), field=angsrc)
114 call getfield(trim(gridfile),
'depth', dims=(/nxt,nyt/), field=bathysrc)
115 call nf90_err(nf90_close(ncid),
'close: '//trim(gridfile))
117 gridfile = trim(griddir)//fdst(3:5)//
'/'//
'tripole.'//trim(fdst)//
'.nc' 118 call nf90_err(nf90_open(trim(gridfile), nf90_nowrite, ncid), &
119 'open: '//trim(gridfile))
120 call getfield(trim(gridfile),
'anglet', dims=(/nxr,nyr/), field=angdst)
121 call getfield(trim(gridfile),
'depth', dims=(/nxr,nyr/), field=bathydst)
122 call nf90_err(nf90_close(ncid),
'close: '//trim(gridfile))
129 call nf90_err(nf90_open(trim(input_file), nf90_nowrite, ncid), &
130 'open: '//trim(input_file))
132 call nf90_err(nf90_inq_dimid(ncid,
'Layer', varid), &
133 'get dimension Id: Layer'//trim(input_file))
134 call nf90_err(nf90_inquire_dimension(ncid, varid, len=nlevs), &
135 'get dimension Id: Layer'//trim(input_file))
137 call nf90_err(nf90_inq_dimid(ncid,
'ncat', varid), &
138 'get dimension Id: ncat'//trim(input_file))
139 call nf90_err(nf90_inquire_dimension(ncid, varid, len=nlevs), &
140 'get dimension Id: ncat'//trim(input_file))
144 if (trim(outvars(n)%var_name) .eq.
'eta')
then 145 outvars(n)%long_name =
'Interface height' 146 outvars(n)%units =
'm' 148 call nf90_err(nf90_inq_varid(ncid, trim(outvars(n)%var_name), varid), &
149 'get variable Id: '//trim(outvars(n)%var_name))
150 call nf90_err(nf90_get_att(ncid, varid,
'long_name', outvars(n)%long_name), &
151 'get variable attribute: long_name '//trim(outvars(n)%var_name))
152 call nf90_err(nf90_get_att(ncid, varid,
'units', outvars(n)%units), &
153 'get variable attribute: units '//trim(outvars(n)%var_name) )
157 call nf90_err(nf90_close(ncid),
'close: '//trim(input_file))
161 write(logunit,
'(i4,a14,i4,a10,3(a6),a2)')n,
' '//trim(outvars(n)%var_name)// &
162 ', ', outvars(n)%var_dimen,
', '//trim(outvars(n)%var_remapmethod), &
163 ', '//trim(outvars(n)%var_grid),
', '//trim(outvars(n)%var_pair), &
164 ', '//trim(outvars(n)%var_pair_grid)
173 allocate(eta(nlevs,nxt*nyt)); eta=0.0
174 call calc_eta(trim(input_file),(/nxt,nyt,nlevs/),bathysrc)
176 allocate(mask3d(nlevs,nxt*nyt)); mask3d = 0.0
177 call getfield(trim(input_file), trim(maskvar), dims=(/nxt,nyt,nlevs/), field=mask3d)
178 where(mask3d .le.
real(hmin,4))mask3d = hmin
180 where(mask3d .le. hmin)mask3d = maskspval
181 where(mask3d .ne. maskspval)mask3d = 1.0
184 call dumpnc(trim(ftype)//
'.'//trim(fsrc)//
'.eta.nc',
'eta', &
185 dims=(/nxt,nyt,nlevs/), field=eta)
186 call dumpnc(trim(ftype)//
'.'//trim(fsrc)//
'.mask3d.nc',
'mask3d', &
187 dims=(/nxt,nyt,nlevs/), field=mask3d)
195 call setup_packing(nvalid,outvars)
198 if (
allocated(bilin2d))
then 199 call packarrays(trim(input_file), trim(wgtsdir)//fsrc(3:5)//
'/', &
200 cos(angsrc), sin(angsrc), b2d, dims=(/nxt,nyt/), nflds=nbilin2d, fields=bilin2d)
202 call remaprh(src_field=bilin2d, dst_field=rgb2d,rc=rc)
203 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
206 write(logunit,
'(a)')
'remap 2D fields bilinear with RH ' 207 write(logunit,
'(a)')
'packed min/max values, mapped min/max values' 209 write(logunit,
'(i4,a14,3(a2,a6),4g14.4)')n,
' '// &
210 trim(b2d(n)%var_name),
' ',trim(b2d(n)%var_grid),
' ', &
211 trim(b2d(n)%var_pair),
' ',trim(b2d(n)%var_pair_grid), &
212 minval(bilin2d(n,:)), maxval(bilin2d(n,:)), &
213 minval(rgb2d(n,:)), maxval(rgb2d(n,:))
215 call dumpnc(trim(ftype)//
'.'//trim(fsrc)//
'.bilin2d.nc',
'bilin2d', &
216 dims=(/nxt,nyt/), nflds=nbilin2d, field=bilin2d)
217 call dumpnc(trim(ftype)//
'.'//trim(fdst)//
'.rgbilin2d.nc',
'rgbilin2d', &
218 dims=(/nxr,nyr/), nflds=nbilin2d, field=rgb2d)
223 if (
allocated(consd2d))
then 224 call packarrays(trim(input_file), trim(wgtsdir)//fsrc(3:5)//
'/', &
225 cos(angsrc), sin(angsrc), c2d, dims=(/nxt,nyt/), nflds=nconsd2d, fields=consd2d)
227 call remaprh(src_field=consd2d, dst_field=rgc2d,rc=rc)
228 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
231 write(logunit,
'(a)')
'remap 2D fields conserv with RH ' 232 write(logunit,
'(a)')
'packed min/max values, mapped min/max values' 234 write(logunit,
'(i4,a14,3(a2,a6),4g14.4)')n,
' '// &
235 trim(c2d(n)%var_name),
' ', trim(c2d(n)%var_grid),
' ', &
236 trim(c2d(n)%var_pair),
' ', trim(c2d(n)%var_pair_grid), &
237 minval(consd2d(n,:)), maxval(consd2d(n,:)), &
238 minval(rgc2d(n,:)), maxval(rgc2d(n,:))
240 call dumpnc(trim(ftype)//
'.'//trim(fsrc)//
'.consd2d.nc',
'consd2d', &
241 dims=(/nxt,nyt/), nflds=nconsd2d, field=consd2d)
242 call dumpnc(trim(ftype)//
'.'//trim(fdst)//
'.rgconsd2d.nc',
'rgconsd2d', &
243 dims=(/nxr,nyr/), nflds=nconsd2d, field=rgc2d)
248 if (
allocated(bilin3d))
then 249 call packarrays(trim(input_file), trim(wgtsdir)//fsrc(3:5)//
'/', &
250 cos(angsrc), sin(angsrc), b3d, dims=(/nxt,nyt,nlevs/), nflds=nbilin3d, fields=bilin3d)
254 call remaprh(k,src_field=bilin3d(:,k,:), dst_field=rgb3d(:,k,:), hmask=mask3d(k,:),rc=rc)
255 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
257 call remaprh(src_field=bilin3d(:,k,:), dst_field=rgb3d(:,k,:),rc=rc)
258 if (chkerr(rc,__line__,u_file_u))
call esmf_finalize(endflag=esmf_end_abort)
266 write(logunit,
'(a)')
'remap 3D fields bilinear with RH ' 267 write(logunit,
'(a)')
'packed min/max values,mapped min/max values' 269 write(logunit,
'(i4,a14,3(a2,a6),4g14.4)')n,
' '// &
270 trim(b3d(n)%var_name),
' ', trim(b3d(n)%var_grid),
' ', &
271 trim(b3d(n)%var_pair),
' ', trim(b3d(n)%var_pair_grid), &
272 minval(bilin3d(n,:,:)), maxval(bilin3d(n,:,:)), &
273 minval(rgb3d(n,:,:)), maxval(rgb3d(n,:,:))
275 call dumpnc(trim(ftype)//
'.'//trim(fsrc)//
'.bilin3d.nc',
'bilin3d', &
276 dims=(/nxt,nyt,nlevs/), nk=nlevs, nflds=nbilin3d, field=bilin3d)
277 call dumpnc(trim(ftype)//
'.'//trim(fdst)//
'.rgbilin3d.nc',
'rgbilin3d', &
278 dims=(/nxr,nyr,nlevs/), nk=nlevs, nflds=nbilin3d, field=rgb3d)
286 if (
allocated(bilin2d))
then 287 call rotremap(trim(wgtsdir)//fdst(3:5)//
'/', b2d, cos(angdst), sin(angdst), &
288 dims=(/nxr,nyr/), nflds=nbilin2d, fields=rgb2d)
290 call dumpnc(trim(ftype)//
'.'//trim(fdst)//
'.rgbilin2d.ij.nc',
'rgbilin2d', &
291 dims=(/nxr,nyr/), nflds=nbilin2d, field=rgb2d)
294 if (
allocated(consd2d))
then 295 call rotremap(trim(wgtsdir)//fdst(3:5)//
'/', c2d, cos(angdst), sin(angdst), &
296 dims=(/nxr,nyr/), nflds=nconsd2d, fields=rgc2d)
298 call dumpnc(trim(ftype)//
'.'//trim(fdst)//
'.rgbilin2d.ij.nc',
'rgbilin2d', &
299 dims=(/nxr,nyr/), nflds=nconsd2d, field=rgc2d)
302 if (
allocated(bilin3d))
then 303 call rotremap(trim(wgtsdir)//fdst(3:5)//
'/', b3d, cos(angdst), sin(angdst), &
304 dims=(/nxr,nyr,nlevs/), nflds=nbilin3d, fields=rgb3d)
306 call dumpnc(trim(ftype)//
'.'//trim(fdst)//
'.rgbilin3d.ij.nc',
'rgbilin3d', &
307 dims=(/nxr,nyr,nlevs/), nk=nlevs, nflds=nbilin3d, field=rgb3d)
315 allocate(out2d(nxr,nyr)); out2d = 0.0
316 allocate(out3d(nxr,nyr,nlevs)); out3d = 0.0
318 fout = trim(ftype)//
'.'//trim(fdst)//
'.nc' 319 if (debug)
write(logunit,
'(a)')
'output file: '//trim(fout)
322 call setup_ocnrestart(trim(input_file),trim(fout),bathydst)
324 call setup_icerestart(trim(input_file),trim(fout))
327 call nf90_err(nf90_open(trim(fout), nf90_write, ncid),
'write: '//trim(fout))
328 if (
allocated(rgb2d))
then 330 out2d(:,:) = reshape(rgb2d(n,:), (/nxr,nyr/))
331 if (b2d(n)%var_grid(1:2) ==
'Bu') out2d(:,nyr) = out2d(:,nyr-1)
332 vname = trim(b2d(n)%var_name)
333 call nf90_err(nf90_inq_varid(ncid, vname, varid),
'get variable Id: '//vname)
334 call nf90_err(nf90_put_var(ncid, varid, out2d),
'put variable: '//vname)
337 if (
allocated(rgc2d))
then 339 out2d(:,:) = reshape(rgc2d(n,:), (/nxr,nyr/))
340 vname = trim(c2d(n)%var_name)
341 call nf90_err(nf90_inq_varid(ncid, vname, varid),
'get variable Id: '//vname)
342 call nf90_err(nf90_put_var(ncid, varid, out2d),
'put variable: '//vname)
345 if (
allocated(rgb3d))
then 348 out3d(:,:,k) = reshape(rgb3d(n,k,:), (/nxr,nyr/))
350 if (b3d(n)%var_grid(1:2) ==
'Cv') out3d(:,nyr,:) = out3d(:,nyr-1,:)
351 vname = trim(b3d(n)%var_name)
352 call nf90_err(nf90_inq_varid(ncid, vname, varid),
'get variable Id: '//vname)
353 call nf90_err(nf90_put_var(ncid, varid, out3d),
'put variable: '//vname)
356 call nf90_err(nf90_close(ncid),
'close: '// trim(fout))
357 write(logunit,
'(a)')trim(fout)//
' done'
program ocniceprep
Read either a MOM6 or CICE6 restart file at 1/4deg tripole resolution and remap the required fields t...