19 character(len=5),
allocatable,
public :: tiles_target_grid(:)
21 character(len=50),
public :: input_grid_type =
"latlon"
25 integer,
public :: lsoil_target = 4
27 integer,
public :: i_input
30 integer,
public :: j_input
33 integer,
public :: ip1_input
35 integer,
public :: jp1_input
37 integer,
public :: i_target
40 integer,
public :: j_target
43 integer,
public :: ip1_target
45 integer,
public :: jp1_target
47 integer,
public :: num_tiles_input_grid
49 integer,
public :: num_tiles_target_grid
52 type(esmf_grid
),
public :: input_grid
54 type(esmf_grid
),
public :: target_grid
57 type(esmf_field
),
public :: latitude_input_grid
59 type(esmf_field
),
public :: longitude_input_grid
61 type(esmf_field
),
public :: latitude_s_input_grid
64 type(esmf_field
),
public :: longitude_s_input_grid
67 type(esmf_field
),
public :: latitude_w_input_grid
70 type(esmf_field
),
public :: longitude_w_input_grid
74 type(esmf_field
),
public :: landmask_target_grid
77 type(esmf_field
),
public :: latitude_target_grid
79 type(esmf_field
),
public :: latitude_s_target_grid
82 type(esmf_field
),
public :: latitude_w_target_grid
85 type(esmf_field
),
public :: longitude_target_grid
87 type(esmf_field
),
public :: longitude_s_target_grid
90 type(esmf_field
),
public :: longitude_w_target_grid
93 type(esmf_field
),
public :: seamask_target_grid
96 type(esmf_field
),
public :: terrain_target_grid
122 integer,
intent(in) :: localpet, npets
124 if (trim(input_type) ==
"gaussian_nemsio" .or. &
125 trim(input_type) ==
"gfs_gaussian_nemsio" .or. &
126 trim(input_type) ==
"gfs_sigio" .or. &
127 trim(input_type) ==
"gaussian_netcdf")
then
129 elseif (trim(input_type) ==
"grib2")
then
152 atm_files_input_grid, &
153 sfc_files_input_grid, &
155 convert_atm, convert_sfc
163 integer,
intent(in) :: npets
165 character(len=250) :: the_file
167 integer :: i, j, rc, clb(2), cub(2), ncid, id_grid
168 integer(sfcio_intkind) :: rc2
169 integer(sigio_intkind) :: rc3
171 real(esmf_kind_r8),
allocatable :: latitude(:,:)
172 real(esmf_kind_r8),
allocatable :: longitude(:,:)
173 real(esmf_kind_r8),
pointer :: lat_src_ptr(:,:)
174 real(esmf_kind_r8),
pointer :: lon_src_ptr(:,:)
175 real(esmf_kind_r8),
pointer :: lat_corner_src_ptr(:,:)
176 real(esmf_kind_r8),
pointer :: lon_corner_src_ptr(:,:)
177 real(esmf_kind_r8) :: deltalon
178 real(esmf_kind_r8),
allocatable :: slat(:), wlat(:)
180 type(nemsio_gfile
) :: gfile
181 type(esmf_polekind_flag
) :: polekindflag(2)
182 type(sfcio_head
) :: sfchead
183 type(sigio_head
) :: sighead
185 print*,
"- DEFINE INPUT GRID OBJECT FOR GAUSSIAN DATA."
187 num_tiles_input_grid = 1
189 if (convert_sfc)
then
190 the_file=trim(data_dir_input_grid) //
"/" // trim(sfc_files_input_grid(1))
191 elseif (convert_atm)
then
192 the_file=trim(data_dir_input_grid) //
"/" // trim(atm_files_input_grid(1))
195 if (trim(input_type) ==
"gfs_sigio")
then
198 if (convert_sfc)
then
199 print*,
"- OPEN AND READ ", trim(the_file)
200 call sfcio_sropen(21, trim(the_file), rc2)
202 call sfcio_srhead(21, sfchead, rc2)
204 call sfcio_sclose(21, rc2)
205 i_input = sfchead%lonb
206 j_input = sfchead%latb
207 elseif (convert_atm)
then
208 print*,
"- OPEN AND READ ", trim(the_file)
209 call sigio_sropen(21, trim(the_file), rc3)
211 call sigio_srhead(21, sighead, rc3)
213 call sigio_sclose(21, rc3)
214 i_input = sighead%lonb
215 j_input = sighead%latb
218 elseif (trim(input_type) ==
"gaussian_netcdf")
then
220 print*,
'- OPEN AND READ: ',trim(the_file)
221 rc=nf90_open(trim(the_file),nf90_nowrite,ncid)
224 print*,
"- READ grid_xt"
225 rc=nf90_inq_dimid(ncid,
'grid_xt', id_grid)
227 rc=nf90_inquire_dimension(ncid,id_grid,len=i_input)
230 print*,
"- READ grid_yt"
231 rc=nf90_inq_dimid(ncid,
'grid_yt', id_grid)
233 rc=nf90_inquire_dimension(ncid,id_grid,len=j_input)
236 rc = nf90_close(ncid)
240 call nemsio_init(iret=rc)
242 print*,
"- OPEN AND READ ", trim(the_file)
243 call nemsio_open(gfile, the_file,
"read", iret=rc)
246 call nemsio_getfilehead(gfile, iret=rc, dimx=i_input, dimy=j_input)
249 call nemsio_close(gfile)
253 ip1_input = i_input + 1
254 jp1_input = j_input + 1
256 polekindflag(1:2) = esmf_polekind_monopole
258 print*,
"- CALL GridCreate1PeriDim FOR INPUT GRID."
259 input_grid = esmf_gridcreate1peridim(minindex=(/1,1/), &
260 maxindex=(/i_input,j_input/), &
261 polekindflag=polekindflag, &
264 coordsys=esmf_coordsys_sph_deg, &
265 regdecomp=(/1,npets/), &
266 indexflag=esmf_index_global, rc=rc)
267 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
270 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE."
271 latitude_input_grid = esmf_fieldcreate(input_grid, &
272 typekind=esmf_typekind_r8, &
273 staggerloc=esmf_staggerloc_center, &
274 name=
"input_grid_latitude", rc=rc)
275 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
278 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE."
279 longitude_input_grid = esmf_fieldcreate(input_grid, &
280 typekind=esmf_typekind_r8, &
281 staggerloc=esmf_staggerloc_center, &
282 name=
"input_grid_longitude", rc=rc)
283 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
286 allocate(longitude(i_input,j_input))
287 allocate(latitude(i_input,j_input))
289 deltalon = 360.0_esmf_kind_r8 /
real(i_input,kind=esmf_kind_r8)
291 longitude(i,:) =
real((i-1),kind=esmf_kind_r8) * deltalon
294 allocate(slat(j_input))
295 allocate(wlat(j_input))
296 call splat(4, j_input, slat, wlat)
299 latitude(:,i) = 90.0_esmf_kind_r8 - (acos(slat(i))* 180.0_esmf_kind_r8 / &
300 (4.0_esmf_kind_r8*atan(1.0_esmf_kind_r8)))
303 deallocate(slat, wlat)
305 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE."
306 call esmf_fieldscatter(longitude_input_grid, longitude, rootpet=0, rc=rc)
307 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
310 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE."
311 call esmf_fieldscatter(latitude_input_grid, latitude, rootpet=0, rc=rc)
312 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
315 print*,
"- CALL GridAddCoord FOR INPUT GRID."
316 call esmf_gridaddcoord(input_grid, &
317 staggerloc=esmf_staggerloc_center, rc=rc)
318 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
321 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
323 call esmf_gridgetcoord(input_grid, &
324 staggerloc=esmf_staggerloc_center, &
326 farrayptr=lon_src_ptr, rc=rc)
327 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
330 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
332 call esmf_gridgetcoord(input_grid, &
333 staggerloc=esmf_staggerloc_center, &
335 computationallbound=clb, &
336 computationalubound=cub, &
337 farrayptr=lat_src_ptr, rc=rc)
338 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
341 do j = clb(2), cub(2)
342 do i = clb(1), cub(1)
343 lon_src_ptr(i,j) = longitude(i,j)
344 if (lon_src_ptr(i,j) > 360.0_esmf_kind_r8) lon_src_ptr(i,j) = lon_src_ptr(i,j) - 360.0_esmf_kind_r8
345 lat_src_ptr(i,j) = latitude(i,j)
349 print*,
"- CALL GridAddCoord FOR INPUT GRID."
350 call esmf_gridaddcoord(input_grid, &
351 staggerloc=esmf_staggerloc_corner, rc=rc)
352 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
355 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
356 nullify(lon_corner_src_ptr)
357 call esmf_gridgetcoord(input_grid, &
358 staggerloc=esmf_staggerloc_corner, &
360 farrayptr=lon_corner_src_ptr, rc=rc)
361 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
364 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
365 nullify(lat_corner_src_ptr)
366 call esmf_gridgetcoord(input_grid, &
367 staggerloc=esmf_staggerloc_corner, &
369 computationallbound=clb, &
370 computationalubound=cub, &
371 farrayptr=lat_corner_src_ptr, rc=rc)
372 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
375 do j = clb(2), cub(2)
376 do i = clb(1), cub(1)
377 lon_corner_src_ptr(i,j) = longitude(i,1) - (0.5_esmf_kind_r8*deltalon)
378 if (lon_corner_src_ptr(i,j) > 360.0_esmf_kind_r8) lon_corner_src_ptr(i,j) = lon_corner_src_ptr(i,j) - 360.0_esmf_kind_r8
380 lat_corner_src_ptr(i,j) = 90.0_esmf_kind_r8
383 if (j == jp1_input)
then
384 lat_corner_src_ptr(i,j) = -90.0_esmf_kind_r8
387 lat_corner_src_ptr(i,j) = 0.5_esmf_kind_r8 * (latitude(i,j-1)+ latitude(i,j))
391 deallocate(latitude,longitude)
405 orog_dir_input_grid, &
406 orog_files_input_grid
410 character(len=500) :: the_file
412 integer,
intent(in) :: localpet, npets
414 integer :: id_tiles, id_dim, tile
415 integer :: extra, error, ncid
416 integer,
allocatable :: decomptile(:,:)
418 integer(esmf_kind_i8),
allocatable :: landmask_one_tile(:,:)
420 real(esmf_kind_r8),
allocatable :: latitude_one_tile(:,:)
421 real(esmf_kind_r8),
allocatable :: latitude_s_one_tile(:,:)
422 real(esmf_kind_r8),
allocatable :: latitude_w_one_tile(:,:)
423 real(esmf_kind_r8),
allocatable :: longitude_one_tile(:,:)
424 real(esmf_kind_r8),
allocatable :: longitude_s_one_tile(:,:)
425 real(esmf_kind_r8),
allocatable :: longitude_w_one_tile(:,:)
427 print*,
'- OPEN INPUT GRID MOSAIC FILE: ',trim(mosaic_file_input_grid)
428 error=nf90_open(trim(mosaic_file_input_grid),nf90_nowrite,ncid)
429 call
netcdf_err(error,
'opening grid mosaic file')
431 print*,
"- READ NUMBER OF TILES"
432 error=nf90_inq_dimid(ncid,
'ntiles', id_tiles)
434 error=nf90_inquire_dimension(ncid,id_tiles,len=num_tiles_input_grid)
437 error = nf90_close(ncid)
439 print*,
'- NUMBER OF TILES, INPUT MODEL GRID IS ', num_tiles_input_grid
441 if (mod(npets,num_tiles_input_grid) /= 0)
then
442 call
error_handler(
"MUST RUN WITH A TASK COUNT THAT IS A MULTIPLE OF 6.", 1)
449 extra = npets / num_tiles_input_grid
451 allocate(decomptile(2,num_tiles_input_grid))
453 do tile = 1, num_tiles_input_grid
454 decomptile(:,tile)=(/1,extra/)
457 print*,
"- CALL GridCreateMosaic FOR INPUT MODEL GRID"
458 input_grid = esmf_gridcreatemosaic(filename=trim(mosaic_file_input_grid), &
459 regdecompptile=decomptile, &
460 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
461 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
462 indexflag=esmf_index_global, &
463 tilefilepath=trim(orog_dir_input_grid), &
465 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
472 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE."
473 latitude_input_grid = esmf_fieldcreate(input_grid, &
474 typekind=esmf_typekind_r8, &
475 staggerloc=esmf_staggerloc_center, &
476 name=
"input_grid_latitude", &
478 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
481 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE."
482 longitude_input_grid = esmf_fieldcreate(input_grid, &
483 typekind=esmf_typekind_r8, &
484 staggerloc=esmf_staggerloc_center, &
485 name=
"input_grid_longitude", &
487 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
490 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE_S."
491 latitude_s_input_grid = esmf_fieldcreate(input_grid, &
492 typekind=esmf_typekind_r8, &
493 staggerloc=esmf_staggerloc_edge2, &
494 name=
"input_grid_latitude_s", &
496 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
499 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE_S."
500 longitude_s_input_grid = esmf_fieldcreate(input_grid, &
501 typekind=esmf_typekind_r8, &
502 staggerloc=esmf_staggerloc_edge2, &
503 name=
"input_grid_longitude_s", &
505 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
508 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE_W."
509 latitude_w_input_grid = esmf_fieldcreate(input_grid, &
510 typekind=esmf_typekind_r8, &
511 staggerloc=esmf_staggerloc_edge1, &
512 name=
"input_grid_latitude_w", &
514 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
517 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE_W."
518 longitude_w_input_grid = esmf_fieldcreate(input_grid, &
519 typekind=esmf_typekind_r8, &
520 staggerloc=esmf_staggerloc_edge1, &
521 name=
"input_grid_longitude_w", &
523 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
526 the_file = trim(orog_dir_input_grid) // trim(orog_files_input_grid(1))
528 print*,
'- OPEN FIRST INPUT GRID OROGRAPHY FILE: ',trim(the_file)
529 error=nf90_open(trim(the_file),nf90_nowrite,ncid)
530 call
netcdf_err(error,
'opening ororgraphy file')
531 print*,
"- READ GRID DIMENSIONS"
532 error=nf90_inq_dimid(ncid,
'lon', id_dim)
534 error=nf90_inquire_dimension(ncid,id_dim,len=i_input)
536 error=nf90_inq_dimid(ncid,
'lat', id_dim)
538 error=nf90_inquire_dimension(ncid,id_dim,len=j_input)
540 error = nf90_close(ncid)
542 print*,
"- I/J DIMENSIONS OF THE INPUT GRID TILES ", i_input, j_input
544 ip1_input = i_input + 1
545 jp1_input = j_input + 1
547 if (localpet == 0)
then
548 allocate(longitude_one_tile(i_input,j_input))
549 allocate(longitude_s_one_tile(i_input,jp1_input))
550 allocate(longitude_w_one_tile(ip1_input,j_input))
551 allocate(latitude_one_tile(i_input,j_input))
552 allocate(latitude_s_one_tile(i_input,jp1_input))
553 allocate(latitude_w_one_tile(ip1_input,j_input))
554 allocate(landmask_one_tile(i_input,j_input))
556 allocate(longitude_one_tile(0,0))
557 allocate(longitude_s_one_tile(0,0))
558 allocate(longitude_w_one_tile(0,0))
559 allocate(latitude_one_tile(0,0))
560 allocate(latitude_s_one_tile(0,0))
561 allocate(latitude_w_one_tile(0,0))
562 allocate(landmask_one_tile(0,0))
565 do tile = 1, num_tiles_input_grid
566 if (localpet == 0)
then
567 call
get_model_latlons(mosaic_file_input_grid, orog_dir_input_grid, num_tiles_input_grid, tile, &
568 i_input, j_input, ip1_input, jp1_input, latitude_one_tile, &
569 latitude_s_one_tile, latitude_w_one_tile, longitude_one_tile, &
570 longitude_s_one_tile, longitude_w_one_tile)
572 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE. TILE IS: ", tile
573 call esmf_fieldscatter(latitude_input_grid, latitude_one_tile, rootpet=0, tile=tile, rc=error)
574 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
576 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE. TILE IS: ", tile
577 call esmf_fieldscatter(longitude_input_grid, longitude_one_tile, rootpet=0, tile=tile, rc=error)
578 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
580 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE_S. TILE IS: ", tile
581 call esmf_fieldscatter(latitude_s_input_grid, latitude_s_one_tile, rootpet=0, tile=tile, rc=error)
582 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
584 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE_S. TILE IS: ", tile
585 call esmf_fieldscatter(longitude_s_input_grid, longitude_s_one_tile, rootpet=0, tile=tile, rc=error)
586 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
588 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE_W. TILE IS: ", tile
589 call esmf_fieldscatter(latitude_w_input_grid, latitude_w_one_tile, rootpet=0, tile=tile, rc=error)
590 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
592 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE_W. TILE IS: ", tile
593 call esmf_fieldscatter(longitude_w_input_grid, longitude_w_one_tile, rootpet=0, tile=tile, rc=error)
594 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
598 deallocate(longitude_one_tile)
599 deallocate(longitude_s_one_tile)
600 deallocate(longitude_w_one_tile)
601 deallocate(latitude_one_tile)
602 deallocate(latitude_s_one_tile)
603 deallocate(latitude_w_one_tile)
604 deallocate(landmask_one_tile)
618 use program_setup, only : grib2_file_input_grid, data_dir_input_grid
622 integer,
intent(in) :: npets
624 character(len=500) :: the_file
626 integer :: i, j, k, jdisc, jgdtn, jpdtn, lugb, lugi
627 integer :: jids(200), jgdt(200), jpdt(200), rc
628 integer :: kgds(200), nret, clb(2), cub(2)
633 real,
allocatable :: rlon(:,:),rlat(:,:),xpts(:,:),ypts(:,:)
634 real,
allocatable :: rlon_corner(:,:),rlat_corner(:,:)
635 real,
allocatable :: rlon_diff(:,:),rlat_diff(:,:)
636 real,
allocatable :: xpts_corner(:,:),ypts_corner(:,:)
637 real(esmf_kind_r8),
allocatable :: latitude(:,:)
638 real(esmf_kind_r8),
allocatable :: longitude(:,:)
639 real(esmf_kind_r8),
allocatable :: latitude_corner(:,:)
640 real(esmf_kind_r8),
allocatable :: longitude_corner(:,:)
641 real(esmf_kind_r8),
pointer :: lat_src_ptr(:,:)
642 real(esmf_kind_r8),
pointer :: lat_corner_src_ptr(:,:)
643 real(esmf_kind_r8),
pointer :: lon_src_ptr(:,:)
644 real(esmf_kind_r8),
pointer :: lon_corner_src_ptr(:,:)
646 type(esmf_polekind_flag
) :: polekindflag(2)
648 type(gribfield
) :: gfld
650 the_file = trim(data_dir_input_grid) //
"/" // grib2_file_input_grid
654 print*,
"- OPEN AND READ INPUT DATA GRIB2 FILE: ", trim(the_file)
655 call baopenr(lugb,the_file,rc)
670 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
672 if (rc /= 0) call
error_handler(
"DEGRIBBING INPUT FILE.", rc)
674 call baclose(lugb,rc)
676 if (gfld%igdtnum == 0)
then
677 print*,
"- INPUT DATA ON LAT/LON GRID."
678 input_grid_type =
'latlon'
679 elseif (gfld%igdtnum == 30)
then
680 print*,
"- INPUT DATA ON LAMBERT CONFORMAL GRID."
681 input_grid_type =
'lambert'
682 elseif (gfld%igdtnum == 32769)
then
683 print*,
"- INPUT DATA ON ROTATED LAT/LON GRID."
684 input_grid_type =
'rotated_latlon'
690 call
gdt_to_gds(gfld%igdtnum, gfld%igdtmpl, gfld%igdtlen, kgds, i_input, j_input, res)
692 ip1_input = i_input + 1
693 jp1_input = j_input + 1
695 allocate(rlat(i_input,j_input))
696 allocate(rlon(i_input,j_input))
697 allocate(rlat_diff(i_input,j_input))
698 allocate(rlon_diff(i_input,j_input))
699 allocate(xpts(i_input,j_input))
700 allocate(ypts(i_input,j_input))
701 allocate(rlat_corner(ip1_input,jp1_input))
702 allocate(rlon_corner(ip1_input,jp1_input))
703 allocate(xpts_corner(ip1_input,jp1_input))
704 allocate(ypts_corner(ip1_input,jp1_input))
713 print*,
"- COMPUTE GRID CELL CENTER COORDINATES."
714 call gdswzd(kgds,1,(i_input*j_input),-9999.,xpts,ypts,rlon,rlat,nret)
716 if (nret /= (i_input*j_input))
then
717 call
error_handler(
"GDSWZD RETURNED WRONG NUMBER OF POINTS.", 2)
720 deallocate(xpts, ypts)
724 xpts_corner(i,j) = float(i) - 0.5
725 ypts_corner(i,j) = float(j) - 0.5
729 print*,
"- COMPUTE GRID CELL CORNER COORDINATES."
730 call gdswzd(kgds,1,(ip1_input*jp1_input),-9999.,xpts_corner,ypts_corner,rlon_corner,rlat_corner,nret)
732 if (nret /= (ip1_input*jp1_input))
then
733 call
error_handler(
"GDSWZD RETURNED WRONG NUMBER OF POINTS.", 2)
736 deallocate(xpts_corner, ypts_corner)
738 if (gfld%igdtnum == 0)
then
740 print*,
"- CALL GridCreate1PeriDim FOR INPUT GRID."
742 polekindflag(1:2) = esmf_polekind_monopole
744 input_grid = esmf_gridcreate1peridim(minindex=(/1,1/), &
745 maxindex=(/i_input,j_input/), &
746 polekindflag=polekindflag, &
749 coordsys=esmf_coordsys_sph_deg, &
750 regdecomp=(/1,npets/), &
751 indexflag=esmf_index_global, rc=rc)
755 print*,
"- CALL GridCreateNoPeriDim FOR INPUT GRID."
757 input_grid = esmf_gridcreatenoperidim(maxindex=(/i_input,j_input/), &
758 indexflag=esmf_index_global, &
763 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
766 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE."
767 latitude_input_grid = esmf_fieldcreate(input_grid, &
768 typekind=esmf_typekind_r8, &
769 staggerloc=esmf_staggerloc_center, &
770 name=
"input_grid_latitude", rc=rc)
771 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
774 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE."
775 longitude_input_grid = esmf_fieldcreate(input_grid, &
776 typekind=esmf_typekind_r8, &
777 staggerloc=esmf_staggerloc_center, &
778 name=
"input_grid_longitude", rc=rc)
779 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
782 allocate(latitude(i_input,j_input))
783 allocate(longitude(i_input,j_input))
788 deallocate (rlat, rlon)
790 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE."
791 call esmf_fieldscatter(longitude_input_grid, longitude, rootpet=0, rc=rc)
792 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
795 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE."
796 call esmf_fieldscatter(latitude_input_grid, latitude, rootpet=0, rc=rc)
797 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
800 print*,
"- CALL GridAddCoord FOR INPUT GRID."
801 call esmf_gridaddcoord(input_grid, &
802 staggerloc=esmf_staggerloc_center, rc=rc)
803 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
806 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
808 call esmf_gridgetcoord(input_grid, &
809 staggerloc=esmf_staggerloc_center, &
811 farrayptr=lon_src_ptr, rc=rc)
812 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
815 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
817 call esmf_gridgetcoord(input_grid, &
818 staggerloc=esmf_staggerloc_center, &
820 computationallbound=clb, &
821 computationalubound=cub, &
822 farrayptr=lat_src_ptr, rc=rc)
823 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
826 do j = clb(2), cub(2)
827 do i = clb(1), cub(1)
828 lon_src_ptr(i,j) = longitude(i,j)
829 if (lon_src_ptr(i,j) > 360.0_esmf_kind_r8) lon_src_ptr(i,j) = lon_src_ptr(i,j) - 360.0_esmf_kind_r8
830 lat_src_ptr(i,j) = latitude(i,j)
834 deallocate(latitude, longitude)
836 allocate(latitude_corner(ip1_input,jp1_input))
837 allocate(longitude_corner(ip1_input,jp1_input))
839 latitude_corner = rlat_corner
840 longitude_corner = rlon_corner
842 deallocate (rlat_corner, rlon_corner)
844 print*,
"- CALL GridAddCoord FOR INPUT GRID."
845 call esmf_gridaddcoord(input_grid, &
846 staggerloc=esmf_staggerloc_corner, rc=rc)
847 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
850 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
851 nullify(lon_corner_src_ptr)
852 call esmf_gridgetcoord(input_grid, &
853 staggerloc=esmf_staggerloc_corner, &
855 farrayptr=lon_corner_src_ptr, rc=rc)
856 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
859 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
860 nullify(lat_corner_src_ptr)
861 call esmf_gridgetcoord(input_grid, &
862 staggerloc=esmf_staggerloc_corner, &
864 computationallbound=clb, &
865 computationalubound=cub, &
866 farrayptr=lat_corner_src_ptr, rc=rc)
867 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
870 do j = clb(2), cub(2)
871 do i = clb(1), cub(1)
872 lon_corner_src_ptr(i,j) = longitude_corner(i,j)
873 if (lon_corner_src_ptr(i,j) > 360.0_esmf_kind_r8) lon_corner_src_ptr(i,j) = lon_corner_src_ptr(i,j) - 360.0_esmf_kind_r8
874 lat_corner_src_ptr(i,j) = latitude_corner(i,j)
878 deallocate(latitude_corner, longitude_corner)
891 orog_dir_target_grid, &
892 orog_files_target_grid, &
897 integer,
intent(in) :: localpet, npets
899 character(len=500) :: the_file
901 integer :: error, ncid, extra
903 integer :: id_dim, id_grid_tiles
905 integer,
allocatable :: decomptile(:,:)
906 integer(esmf_kind_i8),
allocatable :: landmask_one_tile(:,:)
907 integer(esmf_kind_i8),
allocatable :: seamask_one_tile(:,:)
909 real(esmf_kind_r8),
allocatable :: latitude_one_tile(:,:)
910 real(esmf_kind_r8),
allocatable :: latitude_s_one_tile(:,:)
911 real(esmf_kind_r8),
allocatable :: latitude_w_one_tile(:,:)
912 real(esmf_kind_r8),
allocatable :: longitude_one_tile(:,:)
913 real(esmf_kind_r8),
allocatable :: longitude_s_one_tile(:,:)
914 real(esmf_kind_r8),
allocatable :: longitude_w_one_tile(:,:)
915 real(esmf_kind_r8),
allocatable :: terrain_one_tile(:,:)
917 lsoil_target = nsoill_out
919 print*,
'- OPEN TARGET GRID MOSAIC FILE: ',trim(mosaic_file_target_grid)
920 error=nf90_open(trim(mosaic_file_target_grid),nf90_nowrite,ncid)
921 call
netcdf_err(error,
'opening grid mosaic file')
923 print*,
"- READ NUMBER OF TILES"
924 error=nf90_inq_dimid(ncid,
'ntiles', id_tiles)
926 error=nf90_inquire_dimension(ncid,id_tiles,len=num_tiles_target_grid)
928 error=nf90_inq_varid(ncid,
'gridtiles', id_grid_tiles)
929 call
netcdf_err(error,
'reading gridtiles id')
930 allocate(tiles_target_grid(num_tiles_target_grid))
931 tiles_target_grid=
"NULL"
932 print*,
"- READ TILE NAMES"
933 error=nf90_get_var(ncid, id_grid_tiles, tiles_target_grid)
936 error = nf90_close(ncid)
938 print*,
'- NUMBER OF TILES, TARGET MODEL GRID IS ', num_tiles_target_grid
940 if (mod(npets,num_tiles_target_grid) /= 0)
then
941 call
error_handler(
"MUST RUN WITH TASK COUNT THAT IS A MULTIPLE OF # OF TILES.", 1)
948 the_file = trim(orog_dir_target_grid) // trim(orog_files_target_grid(1))
950 print*,
'- OPEN FIRST TARGET GRID OROGRAPHY FILE: ',trim(the_file)
951 error=nf90_open(trim(the_file),nf90_nowrite,ncid)
952 call
netcdf_err(error,
'opening orography file')
953 print*,
"- READ GRID DIMENSIONS"
954 error=nf90_inq_dimid(ncid,
'lon', id_dim)
956 error=nf90_inquire_dimension(ncid,id_dim,len=i_target)
958 error=nf90_inq_dimid(ncid,
'lat', id_dim)
960 error=nf90_inquire_dimension(ncid,id_dim,len=j_target)
962 error = nf90_close(ncid)
964 print*,
"- I/J DIMENSIONS OF THE TARGET GRID TILES ", i_target, j_target
966 ip1_target = i_target + 1
967 jp1_target = j_target + 1
973 extra = npets / num_tiles_target_grid
975 allocate(decomptile(2,num_tiles_target_grid))
977 do tile = 1, num_tiles_target_grid
978 decomptile(:,tile)=(/1,extra/)
981 print*,
"- CALL GridCreateMosaic FOR TARGET GRID"
982 target_grid = esmf_gridcreatemosaic(filename=trim(mosaic_file_target_grid), &
983 regdecompptile=decomptile, &
984 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
985 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
986 indexflag=esmf_index_global, &
987 tilefilepath=trim(orog_dir_target_grid), rc=error)
988 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
996 print*,
"- CALL FieldCreate FOR TARGET GRID LANDMASK."
997 landmask_target_grid = esmf_fieldcreate(target_grid, &
998 typekind=esmf_typekind_i8, &
999 staggerloc=esmf_staggerloc_center, &
1000 name=
"target_grid_landmask", rc=error)
1001 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1004 print*,
"- CALL FieldCreate FOR TARGET GRID SEAMASK."
1005 seamask_target_grid = esmf_fieldcreate(target_grid, &
1006 typekind=esmf_typekind_i8, &
1007 staggerloc=esmf_staggerloc_center, &
1008 name=
"target_grid_seamask", rc=error)
1009 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1012 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE."
1013 latitude_target_grid = esmf_fieldcreate(target_grid, &
1014 typekind=esmf_typekind_r8, &
1015 staggerloc=esmf_staggerloc_center, &
1016 name=
"target_grid_latitude", rc=error)
1017 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1020 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE_S."
1021 latitude_s_target_grid = esmf_fieldcreate(target_grid, &
1022 typekind=esmf_typekind_r8, &
1023 staggerloc=esmf_staggerloc_edge2, &
1024 name=
"target_grid_latitude_s", rc=error)
1025 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1028 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE_W."
1029 latitude_w_target_grid = esmf_fieldcreate(target_grid, &
1030 typekind=esmf_typekind_r8, &
1031 staggerloc=esmf_staggerloc_edge1, &
1032 name=
"target_grid_latitude_w", &
1034 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1037 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE."
1038 longitude_target_grid = esmf_fieldcreate(target_grid, &
1039 typekind=esmf_typekind_r8, &
1040 staggerloc=esmf_staggerloc_center, &
1041 name=
"target_grid_longitude", &
1043 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1046 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE_S."
1047 longitude_s_target_grid = esmf_fieldcreate(target_grid, &
1048 typekind=esmf_typekind_r8, &
1049 staggerloc=esmf_staggerloc_edge2, &
1050 name=
"target_grid_longitude_s", &
1052 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1055 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE_W."
1056 longitude_w_target_grid = esmf_fieldcreate(target_grid, &
1057 typekind=esmf_typekind_r8, &
1058 staggerloc=esmf_staggerloc_edge1, &
1059 name=
"target_grid_longitude_w", &
1061 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1064 print*,
"- CALL FieldCreate FOR TARGET GRID TERRAIN."
1065 terrain_target_grid = esmf_fieldcreate(target_grid, &
1066 typekind=esmf_typekind_r8, &
1067 staggerloc=esmf_staggerloc_center, &
1068 name=
"target_grid_terrain", &
1070 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1073 if (localpet == 0)
then
1074 allocate(landmask_one_tile(i_target,j_target))
1075 allocate(seamask_one_tile(i_target,j_target))
1076 allocate(latitude_one_tile(i_target,j_target))
1077 allocate(latitude_s_one_tile(i_target,jp1_target))
1078 allocate(latitude_w_one_tile(ip1_target,j_target))
1079 allocate(longitude_one_tile(i_target,j_target))
1080 allocate(longitude_s_one_tile(i_target,jp1_target))
1081 allocate(longitude_w_one_tile(ip1_target,j_target))
1082 allocate(terrain_one_tile(i_target,j_target))
1084 allocate(landmask_one_tile(0,0))
1085 allocate(seamask_one_tile(0,0))
1086 allocate(longitude_one_tile(0,0))
1087 allocate(longitude_s_one_tile(0,0))
1088 allocate(longitude_w_one_tile(0,0))
1089 allocate(latitude_one_tile(0,0))
1090 allocate(latitude_s_one_tile(0,0))
1091 allocate(latitude_w_one_tile(0,0))
1092 allocate(terrain_one_tile(0,0))
1095 do tile = 1, num_tiles_target_grid
1096 if (localpet == 0)
then
1097 the_file = trim(orog_dir_target_grid) // trim(orog_files_target_grid(tile))
1100 seamask_one_tile = 0
1101 where(landmask_one_tile == 0) seamask_one_tile = 1
1102 call
get_model_latlons(mosaic_file_target_grid, orog_dir_target_grid, num_tiles_target_grid, tile, &
1103 i_target, j_target, ip1_target, jp1_target, latitude_one_tile, &
1104 latitude_s_one_tile, latitude_w_one_tile, longitude_one_tile, &
1105 longitude_s_one_tile, longitude_w_one_tile)
1107 print*,
"- CALL FieldScatter FOR TARGET GRID LANDMASK. TILE IS: ", tile
1108 call esmf_fieldscatter(landmask_target_grid, landmask_one_tile, rootpet=0, tile=tile, rc=error)
1109 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1111 print*,
"- CALL FieldScatter FOR TARGET GRID SEAMASK. TILE IS: ", tile
1112 call esmf_fieldscatter(seamask_target_grid, seamask_one_tile, rootpet=0, tile=tile, rc=error)
1113 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1115 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE. TILE IS: ", tile
1116 call esmf_fieldscatter(longitude_target_grid, longitude_one_tile, rootpet=0, tile=tile, rc=error)
1117 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1119 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE_S. TILE IS: ", tile
1120 call esmf_fieldscatter(longitude_s_target_grid, longitude_s_one_tile, rootpet=0, tile=tile, rc=error)
1121 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1123 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE_W. TILE IS: ", tile
1124 call esmf_fieldscatter(longitude_w_target_grid, longitude_w_one_tile, rootpet=0, tile=tile, rc=error)
1125 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1127 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE. TILE IS: ", tile
1128 call esmf_fieldscatter(latitude_target_grid, latitude_one_tile, rootpet=0, tile=tile, rc=error)
1129 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1131 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE_S. TILE IS: ", tile
1132 call esmf_fieldscatter(latitude_s_target_grid, latitude_s_one_tile, rootpet=0, tile=tile, rc=error)
1133 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1135 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE_W. TILE IS: ", tile
1136 call esmf_fieldscatter(latitude_w_target_grid, latitude_w_one_tile, rootpet=0, tile=tile, rc=error)
1137 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1139 print*,
"- CALL FieldScatter FOR TARGET GRID TERRAIN. TILE IS: ", tile
1140 call esmf_fieldscatter(terrain_target_grid, terrain_one_tile, rootpet=0, tile=tile, rc=error)
1141 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1145 deallocate(landmask_one_tile)
1146 deallocate(seamask_one_tile)
1147 deallocate(longitude_one_tile)
1148 deallocate(longitude_s_one_tile)
1149 deallocate(longitude_w_one_tile)
1150 deallocate(latitude_one_tile)
1151 deallocate(latitude_s_one_tile)
1152 deallocate(latitude_w_one_tile)
1153 deallocate(terrain_one_tile)
1176 i_tile, j_tile, ip1_tile, jp1_tile, &
1177 latitude, latitude_s, latitude_w, &
1178 longitude, longitude_s, longitude_w)
1184 character(len=*),
intent(in) :: mosaic_file, orog_dir
1186 integer,
intent(in) :: num_tiles, tile
1187 integer,
intent(in) :: i_tile, j_tile
1188 integer,
intent(in) :: ip1_tile, jp1_tile
1190 real(esmf_kind_r8),
intent(out) :: latitude(i_tile, j_tile)
1191 real(esmf_kind_r8),
intent(out) :: latitude_s(i_tile, jp1_tile)
1192 real(esmf_kind_r8),
intent(out) :: latitude_w(ip1_tile, j_tile)
1193 real(esmf_kind_r8),
intent(out) :: longitude(i_tile, j_tile)
1194 real(esmf_kind_r8),
intent(out) :: longitude_s(i_tile, jp1_tile)
1195 real(esmf_kind_r8),
intent(out) :: longitude_w(ip1_tile, j_tile)
1197 character(len=50) :: grid_files(num_tiles)
1198 character(len=255) :: grid_file
1200 integer :: error, id_var, ncid
1201 integer :: id_dim, nxp, nyp, i, j, ii, jj
1203 real(esmf_kind_r8),
allocatable :: tmpvar(:,:)
1205 print*,
"- READ MODEL GRID FILE"
1207 print*,
'- OPEN MOSAIC FILE: ', trim(mosaic_file)
1208 error=nf90_open(trim(mosaic_file), nf90_nowrite, ncid)
1209 call
netcdf_err(error,
'opening mosaic file')
1211 print*,
"- READ GRID FILE NAMES"
1212 error=nf90_inq_varid(ncid,
'gridfiles', id_var)
1213 call
netcdf_err(error,
'reading gridfiles id')
1214 error=nf90_get_var(ncid, id_var, grid_files)
1217 error = nf90_close(ncid)
1219 grid_file = trim(orog_dir) // trim(grid_files(tile))
1221 print*,
'- OPEN GRID FILE: ', trim(grid_file)
1222 error=nf90_open(trim(grid_file), nf90_nowrite, ncid)
1225 print*,
'- READ NXP ID'
1226 error=nf90_inq_dimid(ncid,
'nxp', id_dim)
1230 error=nf90_inquire_dimension(ncid,id_dim,len=nxp)
1233 print*,
'- READ NYP ID'
1234 error=nf90_inq_dimid(ncid,
'nyp', id_dim)
1238 error=nf90_inquire_dimension(ncid,id_dim,len=nyp)
1241 if ((nxp/2 /= i_tile) .or. (nyp/2 /= j_tile))
then
1245 allocate(tmpvar(nxp,nyp))
1247 print*,
'- READ LONGITUDE ID'
1248 error=nf90_inq_varid(ncid,
'x', id_var)
1249 call
netcdf_err(error,
'reading longitude id')
1251 print*,
'- READ LONGITUDE'
1252 error=nf90_get_var(ncid, id_var, tmpvar)
1259 longitude(i,j) = tmpvar(ii,jj)
1267 longitude_s(i,j) = tmpvar(ii,jj)
1275 longitude_w(i,j) = tmpvar(ii,jj)
1279 print*,
'- READ LATITUDE ID'
1280 error=nf90_inq_varid(ncid,
'y', id_var)
1281 call
netcdf_err(error,
'reading latitude id')
1283 print*,
'- READ LATIITUDE'
1284 error=nf90_get_var(ncid, id_var, tmpvar)
1291 latitude(i,j) = tmpvar(ii,jj)
1299 latitude_s(i,j) = tmpvar(ii,jj)
1307 latitude_w(i,j) = tmpvar(ii,jj)
1313 error = nf90_close(ncid)
1332 character(len=*),
intent(in) :: orog_file
1334 integer,
intent(in) :: idim, jdim
1335 integer(esmf_kind_i8),
intent(out) :: mask(idim,jdim)
1337 real(esmf_kind_i8),
intent(out) :: terrain(idim,jdim)
1339 integer :: error, lat, lon
1340 integer :: ncid, id_dim, id_var
1342 real(kind=4),
allocatable :: dummy(:,:)
1344 print*,
"- READ MODEL LAND MASK FILE"
1346 print*,
'- OPEN LAND MASK FILE: ', orog_file
1347 error=nf90_open(orog_file,nf90_nowrite,ncid)
1348 call
netcdf_err(error,
'opening land mask file')
1350 print*,
"- READ I-DIMENSION"
1351 error=nf90_inq_dimid(ncid,
'lon', id_dim)
1353 error=nf90_inquire_dimension(ncid,id_dim,len=lon)
1356 print*,
"- READ J-DIMENSION"
1357 error=nf90_inq_dimid(ncid,
'lat', id_dim)
1359 error=nf90_inquire_dimension(ncid,id_dim,len=lat)
1362 print*,
"- I/J DIMENSIONS: ", lon, lat
1364 if ((lon /= idim) .or. (lat /= jdim))
then
1368 allocate(dummy(idim,jdim))
1370 print*,
"- READ LAND MASK"
1371 error=nf90_inq_varid(ncid,
'slmsk', id_var)
1373 error=nf90_get_var(ncid, id_var, dummy)
1377 print*,
"- READ RAW OROGRAPHY."
1378 error=nf90_inq_varid(ncid,
'orog_raw', id_var)
1379 call
netcdf_err(error,
'reading orog_raw id')
1380 error=nf90_get_var(ncid, id_var, dummy)
1384 error = nf90_close(ncid)
1399 print*,
"- DESTROY MODEL DATA."
1401 call esmf_fielddestroy(latitude_input_grid,rc=rc)
1402 call esmf_fielddestroy(longitude_input_grid,rc=rc)
1403 if (esmf_fieldiscreated(latitude_s_input_grid))
then
1404 call esmf_fielddestroy(latitude_s_input_grid, rc=rc)
1406 if (esmf_fieldiscreated(latitude_w_input_grid))
then
1407 call esmf_fielddestroy(latitude_w_input_grid, rc=rc)
1409 if (esmf_fieldiscreated(longitude_s_input_grid))
then
1410 call esmf_fielddestroy(longitude_s_input_grid, rc=rc)
1412 if (esmf_fieldiscreated(longitude_w_input_grid))
then
1413 call esmf_fielddestroy(longitude_w_input_grid, rc=rc)
1415 call esmf_fielddestroy(landmask_target_grid, rc=rc)
1416 call esmf_fielddestroy(latitude_target_grid, rc=rc)
1417 if (esmf_fieldiscreated(latitude_s_target_grid))
then
1418 call esmf_fielddestroy(latitude_s_target_grid, rc=rc)
1420 if (esmf_fieldiscreated(latitude_w_target_grid))
then
1421 call esmf_fielddestroy(latitude_w_target_grid, rc=rc)
1423 call esmf_fielddestroy(longitude_target_grid, rc=rc)
1424 if (esmf_fieldiscreated(longitude_s_target_grid))
then
1425 call esmf_fielddestroy(longitude_s_target_grid, rc=rc)
1427 if (esmf_fieldiscreated(longitude_w_target_grid))
then
1428 call esmf_fielddestroy(longitude_w_target_grid, rc=rc)
1430 call esmf_fielddestroy(seamask_target_grid, rc=rc)
1431 call esmf_fielddestroy(terrain_target_grid, rc=rc)
1432 call esmf_griddestroy(input_grid, rc=rc)
1433 call esmf_griddestroy(target_grid, rc=rc)
1448 subroutine gdt_to_gds(igdtnum, igdstmpl, igdtlen, kgds, ni, nj, res)
1452 integer,
intent(in ) :: igdtnum, igdtlen, igdstmpl(igdtlen)
1453 integer,
intent( out) :: kgds(200), ni, nj
1456 real,
intent( out) :: res
1460 if (igdtnum.eq.32769)
then
1462 iscale=igdstmpl(10)*igdstmpl(11)
1463 if (iscale == 0) iscale = 1e6
1470 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1472 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1476 if (igdstmpl(1)==2 ) kgds(6)=64
1477 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1478 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1480 kgds(7)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1482 kgds(8)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1484 kgds(9)=nint(float(igdstmpl(17))/float(iscale)*1000.)
1486 kgds(10)=nint(float(igdstmpl(18))/float(iscale)*1000.)
1490 if (btest(igdstmpl(19),7)) kgds(11) = 128
1491 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1492 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
1494 kgds(12)=nint(float(igdstmpl(20))/float(iscale)*1000.)
1496 kgds(13)=nint(float(igdstmpl(21))/float(iscale)*1000.)
1502 res = ((float(kgds(9)) / 1000.0) + (float(kgds(10)) / 1000.0)) &
1505 elseif(igdtnum==30)
then
1514 kgds(4) = nint(float(igdstmpl(10))/1000.0)
1515 kgds(5) = nint(float(igdstmpl(11))/1000.0)
1518 if (igdstmpl(1)==2 ) kgds(6)=64
1519 if ( btest(igdstmpl(12),4).OR.btest(igdstmpl(12),5) ) kgds(6)=kgds(6)+128
1520 if ( btest(igdstmpl(12),3) ) kgds(6)=kgds(6)+8
1522 kgds(7) = nint(float(igdstmpl(14))/1000.0)
1523 kgds(8) = nint(float(igdstmpl(15))/1000.0)
1524 kgds(9) = nint(float(igdstmpl(16))/1000.0)
1528 if (btest(igdstmpl(18),7)) kgds(11) = 128
1529 if (btest(igdstmpl(18),6)) kgds(11) = kgds(11) + 64
1530 if (btest(igdstmpl(18),5)) kgds(11) = kgds(11) + 32
1532 kgds(12) = nint(float(igdstmpl(19))/1000.0)
1533 kgds(13) = nint(float(igdstmpl(20))/1000.0)
1537 elseif(igdtnum==0)
then
1539 iscale=igdstmpl(10)*igdstmpl(11)
1540 if (iscale == 0) iscale = 1e6
1546 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1547 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1550 if (igdstmpl(1)==2 ) kgds(6)=64
1551 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1552 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1554 kgds(7)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1555 kgds(8)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1556 kgds(9)=nint(float(igdstmpl(17))/float(iscale)*1000.)
1557 kgds(10)=nint(float(igdstmpl(18))/float(iscale)*1000.)
1560 if (btest(igdstmpl(19),7)) kgds(11) = 128
1561 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1562 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
subroutine get_model_mask_terrain(orog_file, idim, jdim, mask, terrain)
Read the model land mask and terrain for a single tile from the orography file.
subroutine, public cleanup_input_target_grid_data
Deallocate all esmf grid objects.
subroutine define_input_grid_grib2(npets)
Define input grid object for grib2 input data.
subroutine gdt_to_gds(igdtnum, igdstmpl, igdtlen, kgds, ni, nj, res)
Convert the GRIB2 grid description template to to the GRIB1 grid description section.
subroutine define_input_grid_gaussian(npets)
Define grid object for input data on global gaussian grids.
subroutine netcdf_err(err, string)
Error handler for netcdf.
Sets up the ESMF grid objects for the input data grid and target FV3 grid.
subroutine get_model_latlons(mosaic_file, orog_dir, num_tiles, tile, i_tile, j_tile, ip1_tile, jp1_tile, latitude, latitude_s, latitude_w, longitude, longitude_s, longitude_w)
Read model lat/lons for a single tile from the "grid" specificaton file.
subroutine error_handler(string, rc)
General error handler.
subroutine define_input_grid_mosaic(localpet, npets)
Define input grid for tiled data using the 'mosaic', 'grid' and orography files.
This module contains code to read the setup namelist file, handle the varmap file for GRIB2 data...
subroutine, public define_input_grid(localpet, npets)
Driver routine to setup the esmf grid object for the input grid.
subroutine, public define_target_grid(localpet, npets)
Setup the esmf grid object for the target grid.