14 use utilities,
only : error_handler, netcdf_err
123 integer,
intent(in) :: localpet, npets
125 if (trim(
input_type) ==
"gaussian_nemsio" .or. &
126 trim(
input_type) ==
"gfs_gaussian_nemsio" .or. &
168 integer,
intent(in) :: npets
170 character(len=250) :: the_file
172 integer :: i, j, rc, clb(2), cub(2), ncid, id_grid
174 integer(sfcio_intkind) :: rc2
175 integer(sigio_intkind) :: rc3
178 real(esmf_kind_r8),
allocatable :: latitude(:,:)
179 real(esmf_kind_r8),
allocatable :: longitude(:,:)
180 real(esmf_kind_r8),
pointer :: lat_src_ptr(:,:)
181 real(esmf_kind_r8),
pointer :: lon_src_ptr(:,:)
182 real(esmf_kind_r8),
pointer :: lat_corner_src_ptr(:,:)
183 real(esmf_kind_r8),
pointer :: lon_corner_src_ptr(:,:)
184 real(esmf_kind_r8) :: deltalon
185 real(esmf_kind_r8),
allocatable :: slat(:), wlat(:)
188 type(nemsio_gfile) :: gfile
190 type(esmf_polekind_flag) :: polekindflag(2)
192 type(sfcio_head) :: sfchead
193 type(sigio_head) :: sighead
196 print*,
"- DEFINE INPUT GRID OBJECT FOR GAUSSIAN DATA." 206 if (trim(
input_type) ==
"gaussian_netcdf")
then 208 print*,
'- OPEN AND READ: ',trim(the_file)
209 rc=nf90_open(trim(the_file),nf90_nowrite,ncid)
210 call netcdf_err(rc,
'opening file')
212 print*,
"- READ grid_xt" 213 rc=nf90_inq_dimid(ncid,
'grid_xt', id_grid)
214 call netcdf_err(rc,
'reading grid_xt id')
215 rc=nf90_inquire_dimension(ncid,id_grid,len=
i_input)
216 call netcdf_err(rc,
'reading grid_xt')
218 print*,
"- READ grid_yt" 219 rc=nf90_inq_dimid(ncid,
'grid_yt', id_grid)
220 call netcdf_err(rc,
'reading grid_yt id')
221 rc=nf90_inquire_dimension(ncid,id_grid,len=
j_input)
222 call netcdf_err(rc,
'reading grid_yt')
224 rc = nf90_close(ncid)
230 print*,
"- OPEN AND READ ", trim(the_file)
231 call sfcio_sropen(21, trim(the_file), rc2)
232 if (rc2 /= 0)
call error_handler(
"OPENING FILE", rc2)
233 call sfcio_srhead(21, sfchead, rc2)
234 if (rc2 /= 0)
call error_handler(
"READING FILE", rc2)
235 call sfcio_sclose(21, rc2)
239 print*,
"- OPEN AND READ ", trim(the_file)
240 call sigio_sropen(21, trim(the_file), rc3)
241 if (rc3 /= 0)
call error_handler(
"OPENING FILE", rc3)
242 call sigio_srhead(21, sighead, rc3)
243 if (rc3 /= 0)
call error_handler(
"READING FILE", rc3)
244 call sigio_sclose(21, rc3)
251 call nemsio_init(iret=rc)
253 print*,
"- OPEN AND READ ", trim(the_file)
254 call nemsio_open(gfile, the_file,
"read", iret=rc)
255 if (rc /= 0)
call error_handler(
"OPENING FILE", rc)
257 call nemsio_getfilehead(gfile, iret=rc, dimx=
i_input, dimy=
j_input)
258 if (rc /= 0)
call error_handler(
"READING FILE", rc)
260 call nemsio_close(gfile)
269 polekindflag(1:2) = esmf_polekind_monopole
271 print*,
"- CALL GridCreate1PeriDim FOR INPUT GRID." 272 input_grid = esmf_gridcreate1peridim(minindex=(/1,1/), &
274 polekindflag=polekindflag, &
277 coordsys=esmf_coordsys_sph_deg, &
278 regdecomp=(/1,npets/), &
279 indexflag=esmf_index_global, rc=rc)
280 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
281 call error_handler(
"IN GridCreate1PeriDim", rc)
283 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE." 285 typekind=esmf_typekind_r8, &
286 staggerloc=esmf_staggerloc_center, &
287 name=
"input_grid_latitude", rc=rc)
288 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
289 call error_handler(
"IN FieldCreate", rc)
291 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE." 293 typekind=esmf_typekind_r8, &
294 staggerloc=esmf_staggerloc_center, &
295 name=
"input_grid_longitude", rc=rc)
296 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
297 call error_handler(
"IN FieldCreate", rc)
302 deltalon = 360.0_esmf_kind_r8 /
real(i_input,kind=esmf_kind_r8)
304 longitude(i,:) =
real((i-1),kind=esmf_kind_r8) * deltalon
309 call splat(4,
j_input, slat, wlat)
312 latitude(:,i) = 90.0_esmf_kind_r8 - (acos(slat(i))* 180.0_esmf_kind_r8 / &
313 (4.0_esmf_kind_r8*atan(1.0_esmf_kind_r8)))
316 deallocate(slat, wlat)
318 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE." 320 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
321 call error_handler(
"IN FieldScatter", rc)
323 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE." 325 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
326 call error_handler(
"IN FieldScatter", rc)
328 print*,
"- CALL GridAddCoord FOR INPUT GRID." 330 staggerloc=esmf_staggerloc_center, rc=rc)
331 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
332 call error_handler(
"IN GridAddCoord", rc)
334 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD." 337 staggerloc=esmf_staggerloc_center, &
339 farrayptr=lon_src_ptr, rc=rc)
340 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
341 call error_handler(
"IN GridGetCoord", rc)
343 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD." 346 staggerloc=esmf_staggerloc_center, &
348 computationallbound=clb, &
349 computationalubound=cub, &
350 farrayptr=lat_src_ptr, rc=rc)
351 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
352 call error_handler(
"IN GridGetCoord", rc)
354 do j = clb(2), cub(2)
355 do i = clb(1), cub(1)
356 lon_src_ptr(i,j) = longitude(i,j)
357 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
358 lat_src_ptr(i,j) = latitude(i,j)
362 print*,
"- CALL GridAddCoord FOR INPUT GRID." 364 staggerloc=esmf_staggerloc_corner, rc=rc)
365 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
366 call error_handler(
"IN GridAddCoord", rc)
368 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD." 369 nullify(lon_corner_src_ptr)
371 staggerloc=esmf_staggerloc_corner, &
373 farrayptr=lon_corner_src_ptr, rc=rc)
374 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
375 call error_handler(
"IN GridGetCoord", rc)
377 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD." 378 nullify(lat_corner_src_ptr)
380 staggerloc=esmf_staggerloc_corner, &
382 computationallbound=clb, &
383 computationalubound=cub, &
384 farrayptr=lat_corner_src_ptr, rc=rc)
385 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
386 call error_handler(
"IN GridGetCoord", rc)
388 do j = clb(2), cub(2)
389 do i = clb(1), cub(1)
390 lon_corner_src_ptr(i,j) = longitude(i,1) - (0.5_esmf_kind_r8*deltalon)
391 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
393 lat_corner_src_ptr(i,j) = 90.0_esmf_kind_r8
397 lat_corner_src_ptr(i,j) = -90.0_esmf_kind_r8
400 lat_corner_src_ptr(i,j) = 0.5_esmf_kind_r8 * (latitude(i,j-1)+ latitude(i,j))
404 deallocate(latitude,longitude)
423 character(len=500) :: the_file
425 integer,
intent(in) :: localpet, npets
427 integer :: id_tiles, id_dim, tile
428 integer :: extra, error, ncid
429 integer,
allocatable :: decomptile(:,:)
431 real(esmf_kind_r8),
allocatable :: latitude_one_tile(:,:)
432 real(esmf_kind_r8),
allocatable :: latitude_s_one_tile(:,:)
433 real(esmf_kind_r8),
allocatable :: latitude_w_one_tile(:,:)
434 real(esmf_kind_r8),
allocatable :: longitude_one_tile(:,:)
435 real(esmf_kind_r8),
allocatable :: longitude_s_one_tile(:,:)
436 real(esmf_kind_r8),
allocatable :: longitude_w_one_tile(:,:)
440 call netcdf_err(error,
'opening grid mosaic file')
442 print*,
"- READ NUMBER OF TILES" 443 error=nf90_inq_dimid(ncid,
'ntiles', id_tiles)
444 call netcdf_err(error,
'reading ntiles id')
446 call netcdf_err(error,
'reading ntiles')
448 error = nf90_close(ncid)
453 call error_handler(
"MUST RUN WITH A TASK COUNT THAT IS A MULTIPLE OF 6.", 1)
465 decomptile(:,tile)=(/1,extra/)
468 print*,
"- CALL GridCreateMosaic FOR INPUT MODEL GRID" 470 regdecompptile=decomptile, &
471 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
472 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
473 indexflag=esmf_index_global, &
476 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
477 call error_handler(
"IN GridCreateMosaic", error)
483 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE." 485 typekind=esmf_typekind_r8, &
486 staggerloc=esmf_staggerloc_center, &
487 name=
"input_grid_latitude", &
489 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
490 call error_handler(
"IN FieldCreate", error)
492 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE." 494 typekind=esmf_typekind_r8, &
495 staggerloc=esmf_staggerloc_center, &
496 name=
"input_grid_longitude", &
498 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
499 call error_handler(
"IN FieldCreate", error)
501 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE_S." 503 typekind=esmf_typekind_r8, &
504 staggerloc=esmf_staggerloc_edge2, &
505 name=
"input_grid_latitude_s", &
507 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
508 call error_handler(
"IN FieldCreate", error)
510 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE_S." 512 typekind=esmf_typekind_r8, &
513 staggerloc=esmf_staggerloc_edge2, &
514 name=
"input_grid_longitude_s", &
516 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
517 call error_handler(
"IN FieldCreate", error)
519 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE_W." 521 typekind=esmf_typekind_r8, &
522 staggerloc=esmf_staggerloc_edge1, &
523 name=
"input_grid_latitude_w", &
525 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
526 call error_handler(
"IN FieldCreate", error)
528 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE_W." 530 typekind=esmf_typekind_r8, &
531 staggerloc=esmf_staggerloc_edge1, &
532 name=
"input_grid_longitude_w", &
534 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
535 call error_handler(
"IN FieldCreate", error)
539 print*,
'- OPEN FIRST INPUT GRID OROGRAPHY FILE: ',trim(the_file)
540 error=nf90_open(trim(the_file),nf90_nowrite,ncid)
541 call netcdf_err(error,
'opening ororgraphy file')
542 print*,
"- READ GRID DIMENSIONS" 543 error=nf90_inq_dimid(ncid,
'lon', id_dim)
544 call netcdf_err(error,
'reading lon id')
545 error=nf90_inquire_dimension(ncid,id_dim,len=
i_input)
546 call netcdf_err(error,
'reading lon')
547 error=nf90_inq_dimid(ncid,
'lat', id_dim)
548 call netcdf_err(error,
'reading lat id')
549 error=nf90_inquire_dimension(ncid,id_dim,len=
j_input)
550 call netcdf_err(error,
'reading lat')
551 error = nf90_close(ncid)
553 print*,
"- I/J DIMENSIONS OF THE INPUT GRID TILES ",
i_input,
j_input 558 if (localpet == 0)
then 566 allocate(longitude_one_tile(0,0))
567 allocate(longitude_s_one_tile(0,0))
568 allocate(longitude_w_one_tile(0,0))
569 allocate(latitude_one_tile(0,0))
570 allocate(latitude_s_one_tile(0,0))
571 allocate(latitude_w_one_tile(0,0))
575 if (localpet == 0)
then 578 latitude_s_one_tile, latitude_w_one_tile, longitude_one_tile, &
579 longitude_s_one_tile, longitude_w_one_tile)
581 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE. TILE IS: ", tile
582 call esmf_fieldscatter(
latitude_input_grid, latitude_one_tile, rootpet=0, tile=tile, rc=error)
583 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
584 call error_handler(
"IN FieldScatter", error)
585 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE. TILE IS: ", tile
586 call esmf_fieldscatter(
longitude_input_grid, longitude_one_tile, rootpet=0, tile=tile, rc=error)
587 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
588 call error_handler(
"IN FieldScatter", error)
589 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE_S. TILE IS: ", tile
591 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
592 call error_handler(
"IN FieldScatter", error)
593 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE_S. TILE IS: ", tile
595 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
596 call error_handler(
"IN FieldScatter", error)
597 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE_W. TILE IS: ", tile
599 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
600 call error_handler(
"IN FieldScatter", error)
601 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE_W. TILE IS: ", tile
603 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
604 call error_handler(
"IN FieldScatter", error)
607 deallocate(longitude_one_tile)
608 deallocate(longitude_s_one_tile)
609 deallocate(longitude_w_one_tile)
610 deallocate(latitude_one_tile)
611 deallocate(latitude_s_one_tile)
612 deallocate(latitude_w_one_tile)
630 integer,
intent(in) :: npets
632 character(len=500) :: the_file
634 integer :: i, j, k, jdisc, jgdtn, jpdtn, lugb, lugi
635 integer :: jids(200), jgdt(200), jpdt(200), rc
636 integer :: kgds(200), nret, clb(2), cub(2)
641 real,
allocatable :: rlon(:,:),rlat(:,:),xpts(:,:),ypts(:,:)
642 real,
allocatable :: rlon_corner(:,:),rlat_corner(:,:)
643 real,
allocatable :: rlon_diff(:,:),rlat_diff(:,:)
644 real,
allocatable :: xpts_corner(:,:),ypts_corner(:,:)
645 real(esmf_kind_r8),
allocatable :: latitude(:,:)
646 real(esmf_kind_r8),
allocatable :: longitude(:,:)
647 real(esmf_kind_r8),
allocatable :: latitude_corner(:,:)
648 real(esmf_kind_r8),
allocatable :: longitude_corner(:,:)
649 real(esmf_kind_r8),
pointer :: lat_src_ptr(:,:)
650 real(esmf_kind_r8),
pointer :: lat_corner_src_ptr(:,:)
651 real(esmf_kind_r8),
pointer :: lon_src_ptr(:,:)
652 real(esmf_kind_r8),
pointer :: lon_corner_src_ptr(:,:)
654 type(esmf_polekind_flag) :: polekindflag(2)
656 type(gribfield) :: gfld
662 print*,
"- OPEN AND READ INPUT DATA GRIB2 FILE: ", trim(the_file)
663 call baopenr(lugb,the_file,rc)
664 if (rc /= 0)
call error_handler(
"OPENING FILE", rc)
678 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
680 if (rc /= 0)
call error_handler(
"DEGRIBBING INPUT FILE.", rc)
682 call baclose(lugb,rc)
684 if (gfld%igdtnum == 0)
then 685 print*,
"- INPUT DATA ON LAT/LON GRID." 687 elseif (gfld%igdtnum == 30)
then 688 print*,
"- INPUT DATA ON LAMBERT CONFORMAL GRID." 690 elseif (gfld%igdtnum == 32769 .or. gfld%igdtnum == 1)
then 691 print*,
"- INPUT DATA ON ROTATED LAT/LON GRID." 694 call error_handler(
"INPUT GRID TEMPLATE NOT SUPPORTED.", 2)
721 print*,
"- COMPUTE GRID CELL CENTER COORDINATES." 722 call gdswzd(kgds,1,(
i_input*
j_input),-9999.,xpts,ypts,rlon,rlat,nret)
725 call error_handler(
"GDSWZD RETURNED WRONG NUMBER OF POINTS.", 2)
728 deallocate(xpts, ypts)
732 xpts_corner(i,j) = float(i) - 0.5
733 ypts_corner(i,j) = float(j) - 0.5
737 print*,
"- COMPUTE GRID CELL CORNER COORDINATES." 738 call gdswzd(kgds,1,(
ip1_input*
jp1_input),-9999.,xpts_corner,ypts_corner,rlon_corner,rlat_corner,nret)
741 call error_handler(
"GDSWZD RETURNED WRONG NUMBER OF POINTS.", 2)
744 deallocate(xpts_corner, ypts_corner)
746 if (gfld%igdtnum == 0)
then 748 print*,
"- CALL GridCreate1PeriDim FOR INPUT GRID." 750 polekindflag(1:2) = esmf_polekind_monopole
752 input_grid = esmf_gridcreate1peridim(minindex=(/1,1/), &
754 polekindflag=polekindflag, &
757 coordsys=esmf_coordsys_sph_deg, &
758 regdecomp=(/1,npets/), &
759 indexflag=esmf_index_global, rc=rc)
763 print*,
"- CALL GridCreateNoPeriDim FOR INPUT GRID." 766 indexflag=esmf_index_global, &
771 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
772 call error_handler(
"IN GridCreate1PeriDim", rc)
774 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE." 776 typekind=esmf_typekind_r8, &
777 staggerloc=esmf_staggerloc_center, &
778 name=
"input_grid_latitude", rc=rc)
779 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
780 call error_handler(
"IN FieldCreate", rc)
782 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE." 784 typekind=esmf_typekind_r8, &
785 staggerloc=esmf_staggerloc_center, &
786 name=
"input_grid_longitude", rc=rc)
787 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
788 call error_handler(
"IN FieldCreate", rc)
796 deallocate (rlat, rlon)
798 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE." 800 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
801 call error_handler(
"IN FieldScatter", rc)
803 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE." 805 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
806 call error_handler(
"IN FieldScatter", rc)
808 print*,
"- CALL GridAddCoord FOR INPUT GRID." 810 staggerloc=esmf_staggerloc_center, rc=rc)
811 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
812 call error_handler(
"IN GridAddCoord", rc)
814 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD." 817 staggerloc=esmf_staggerloc_center, &
819 farrayptr=lon_src_ptr, rc=rc)
820 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
821 call error_handler(
"IN GridGetCoord", rc)
823 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD." 826 staggerloc=esmf_staggerloc_center, &
828 computationallbound=clb, &
829 computationalubound=cub, &
830 farrayptr=lat_src_ptr, rc=rc)
831 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
832 call error_handler(
"IN GridGetCoord", rc)
834 do j = clb(2), cub(2)
835 do i = clb(1), cub(1)
836 lon_src_ptr(i,j) = longitude(i,j)
837 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
838 lat_src_ptr(i,j) = latitude(i,j)
842 deallocate(latitude, longitude)
847 latitude_corner = rlat_corner
848 longitude_corner = rlon_corner
850 deallocate (rlat_corner, rlon_corner)
852 print*,
"- CALL GridAddCoord FOR INPUT GRID." 854 staggerloc=esmf_staggerloc_corner, rc=rc)
855 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
856 call error_handler(
"IN GridAddCoord", rc)
858 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD." 859 nullify(lon_corner_src_ptr)
861 staggerloc=esmf_staggerloc_corner, &
863 farrayptr=lon_corner_src_ptr, rc=rc)
864 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
865 call error_handler(
"IN GridGetCoord", rc)
867 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD." 868 nullify(lat_corner_src_ptr)
870 staggerloc=esmf_staggerloc_corner, &
872 computationallbound=clb, &
873 computationalubound=cub, &
874 farrayptr=lat_corner_src_ptr, rc=rc)
875 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
876 call error_handler(
"IN GridGetCoord", rc)
878 do j = clb(2), cub(2)
879 do i = clb(1), cub(1)
880 lon_corner_src_ptr(i,j) = longitude_corner(i,j)
881 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
882 lat_corner_src_ptr(i,j) = latitude_corner(i,j)
886 deallocate(latitude_corner, longitude_corner)
905 integer,
intent(in) :: localpet, npets
907 character(len=500) :: the_file
909 integer :: error, ncid, extra
911 integer :: id_dim, id_grid_tiles
913 integer,
allocatable :: decomptile(:,:)
914 integer(esmf_kind_i8),
allocatable :: landmask_one_tile(:,:)
915 integer(esmf_kind_i8),
allocatable :: seamask_one_tile(:,:)
917 real(esmf_kind_r8),
allocatable :: land_frac_one_tile(:,:)
918 real(esmf_kind_r8),
allocatable :: latitude_one_tile(:,:)
919 real(esmf_kind_r8),
allocatable :: latitude_s_one_tile(:,:)
920 real(esmf_kind_r8),
allocatable :: latitude_w_one_tile(:,:)
921 real(esmf_kind_r8),
allocatable :: longitude_one_tile(:,:)
922 real(esmf_kind_r8),
allocatable :: longitude_s_one_tile(:,:)
923 real(esmf_kind_r8),
allocatable :: longitude_w_one_tile(:,:)
924 real(esmf_kind_r8),
allocatable :: terrain_one_tile(:,:)
930 call netcdf_err(error,
'opening grid mosaic file')
932 print*,
"- READ NUMBER OF TILES" 933 error=nf90_inq_dimid(ncid,
'ntiles', id_tiles)
934 call netcdf_err(error,
'reading ntile id')
936 call netcdf_err(error,
'reading ntiles')
937 error=nf90_inq_varid(ncid,
'gridtiles', id_grid_tiles)
938 call netcdf_err(error,
'reading gridtiles id')
941 print*,
"- READ TILE NAMES" 943 call netcdf_err(error,
'reading gridtiles')
945 error = nf90_close(ncid)
950 call error_handler(
"MUST RUN WITH TASK COUNT THAT IS A MULTIPLE OF # OF TILES.", 1)
959 print*,
'- OPEN FIRST TARGET GRID OROGRAPHY FILE: ',trim(the_file)
960 error=nf90_open(trim(the_file),nf90_nowrite,ncid)
961 call netcdf_err(error,
'opening orography file')
962 print*,
"- READ GRID DIMENSIONS" 963 error=nf90_inq_dimid(ncid,
'lon', id_dim)
964 call netcdf_err(error,
'reading lon id')
965 error=nf90_inquire_dimension(ncid,id_dim,len=
i_target)
966 call netcdf_err(error,
'reading lon')
967 error=nf90_inq_dimid(ncid,
'lat', id_dim)
968 call netcdf_err(error,
'reading lat id')
969 error=nf90_inquire_dimension(ncid,id_dim,len=
j_target)
970 call netcdf_err(error,
'reading lat')
971 error = nf90_close(ncid)
987 decomptile(:,tile)=(/1,extra/)
990 print*,
"- CALL GridCreateMosaic FOR TARGET GRID" 992 regdecompptile=decomptile, &
993 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
994 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
995 indexflag=esmf_index_global, &
997 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
998 call error_handler(
"IN GridCreateMosaic", error)
1005 print*,
"- CALL FieldCreate FOR TARGET GRID LAND FRACTION." 1007 typekind=esmf_typekind_r8, &
1008 staggerloc=esmf_staggerloc_center, &
1009 name=
"target_grid_landmask", rc=error)
1010 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1011 call error_handler(
"IN FieldCreate", error)
1013 print*,
"- CALL FieldCreate FOR TARGET GRID LANDMASK." 1015 typekind=esmf_typekind_i8, &
1016 staggerloc=esmf_staggerloc_center, &
1017 name=
"target_grid_landmask", rc=error)
1018 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1019 call error_handler(
"IN FieldCreate", error)
1021 print*,
"- CALL FieldCreate FOR TARGET GRID SEAMASK." 1023 typekind=esmf_typekind_i8, &
1024 staggerloc=esmf_staggerloc_center, &
1025 name=
"target_grid_seamask", rc=error)
1026 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1027 call error_handler(
"IN FieldCreate", error)
1029 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE." 1031 typekind=esmf_typekind_r8, &
1032 staggerloc=esmf_staggerloc_center, &
1033 name=
"target_grid_latitude", rc=error)
1034 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1035 call error_handler(
"IN FieldCreate", error)
1037 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE_S." 1039 typekind=esmf_typekind_r8, &
1040 staggerloc=esmf_staggerloc_edge2, &
1041 name=
"target_grid_latitude_s", rc=error)
1042 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1043 call error_handler(
"IN FieldCreate", error)
1045 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE_W." 1047 typekind=esmf_typekind_r8, &
1048 staggerloc=esmf_staggerloc_edge1, &
1049 name=
"target_grid_latitude_w", &
1051 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1052 call error_handler(
"IN FieldCreate", error)
1054 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE." 1056 typekind=esmf_typekind_r8, &
1057 staggerloc=esmf_staggerloc_center, &
1058 name=
"target_grid_longitude", &
1060 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1061 call error_handler(
"IN FieldCreate", error)
1063 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE_S." 1065 typekind=esmf_typekind_r8, &
1066 staggerloc=esmf_staggerloc_edge2, &
1067 name=
"target_grid_longitude_s", &
1069 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1070 call error_handler(
"IN FieldCreate", error)
1072 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE_W." 1074 typekind=esmf_typekind_r8, &
1075 staggerloc=esmf_staggerloc_edge1, &
1076 name=
"target_grid_longitude_w", &
1078 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1079 call error_handler(
"IN FieldCreate", error)
1081 print*,
"- CALL FieldCreate FOR TARGET GRID TERRAIN." 1083 typekind=esmf_typekind_r8, &
1084 staggerloc=esmf_staggerloc_center, &
1085 name=
"target_grid_terrain", &
1087 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1088 call error_handler(
"IN FieldCreate", error)
1090 if (localpet == 0)
then 1102 allocate(land_frac_one_tile(0,0))
1103 allocate(landmask_one_tile(0,0))
1104 allocate(seamask_one_tile(0,0))
1105 allocate(longitude_one_tile(0,0))
1106 allocate(longitude_s_one_tile(0,0))
1107 allocate(longitude_w_one_tile(0,0))
1108 allocate(latitude_one_tile(0,0))
1109 allocate(latitude_s_one_tile(0,0))
1110 allocate(latitude_w_one_tile(0,0))
1111 allocate(terrain_one_tile(0,0))
1115 if (localpet == 0)
then 1118 terrain_one_tile, land_frac_one_tile)
1120 seamask_one_tile = 0
1121 where(floor(land_frac_one_tile) == 0) seamask_one_tile = 1
1122 landmask_one_tile = 0
1123 where(ceiling(land_frac_one_tile) == 1) landmask_one_tile = 1
1127 latitude_s_one_tile, latitude_w_one_tile, longitude_one_tile, &
1128 longitude_s_one_tile, longitude_w_one_tile)
1130 print*,
"- CALL FieldScatter FOR TARGET GRID LAND FRACTION. TILE IS: ", tile
1132 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1133 call error_handler(
"IN FieldScatter", error)
1134 print*,
"- CALL FieldScatter FOR TARGET GRID LANDMASK. TILE IS: ", tile
1135 call esmf_fieldscatter(
landmask_target_grid, landmask_one_tile, rootpet=0, tile=tile, rc=error)
1136 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1137 call error_handler(
"IN FieldScatter", error)
1138 print*,
"- CALL FieldScatter FOR TARGET GRID SEAMASK. TILE IS: ", tile
1139 call esmf_fieldscatter(
seamask_target_grid, seamask_one_tile, rootpet=0, tile=tile, rc=error)
1140 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1141 call error_handler(
"IN FieldScatter", error)
1142 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE. TILE IS: ", tile
1144 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1145 call error_handler(
"IN FieldScatter", error)
1146 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE_S. TILE IS: ", tile
1148 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1149 call error_handler(
"IN FieldScatter", error)
1150 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE_W. TILE IS: ", tile
1152 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1153 call error_handler(
"IN FieldScatter", error)
1154 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE. TILE IS: ", tile
1155 call esmf_fieldscatter(
latitude_target_grid, latitude_one_tile, rootpet=0, tile=tile, rc=error)
1156 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1157 call error_handler(
"IN FieldScatter", error)
1158 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE_S. TILE IS: ", tile
1160 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1161 call error_handler(
"IN FieldScatter", error)
1162 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE_W. TILE IS: ", tile
1164 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1165 call error_handler(
"IN FieldScatter", error)
1166 print*,
"- CALL FieldScatter FOR TARGET GRID TERRAIN. TILE IS: ", tile
1167 call esmf_fieldscatter(
terrain_target_grid, terrain_one_tile, rootpet=0, tile=tile, rc=error)
1168 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1169 call error_handler(
"IN FieldScatter", error)
1172 deallocate(land_frac_one_tile)
1173 deallocate(landmask_one_tile)
1174 deallocate(seamask_one_tile)
1175 deallocate(longitude_one_tile)
1176 deallocate(longitude_s_one_tile)
1177 deallocate(longitude_w_one_tile)
1178 deallocate(latitude_one_tile)
1179 deallocate(latitude_s_one_tile)
1180 deallocate(latitude_w_one_tile)
1181 deallocate(terrain_one_tile)
1204 i_tile, j_tile, ip1_tile, jp1_tile, &
1205 latitude, latitude_s, latitude_w, &
1206 longitude, longitude_s, longitude_w)
1212 character(len=*),
intent(in) :: mosaic_file, orog_dir
1214 integer,
intent(in) :: num_tiles, tile
1215 integer,
intent(in) :: i_tile, j_tile
1216 integer,
intent(in) :: ip1_tile, jp1_tile
1218 real(esmf_kind_r8),
intent(out) :: latitude(i_tile, j_tile)
1219 real(esmf_kind_r8),
intent(out) :: latitude_s(i_tile, jp1_tile)
1220 real(esmf_kind_r8),
intent(out) :: latitude_w(ip1_tile, j_tile)
1221 real(esmf_kind_r8),
intent(out) :: longitude(i_tile, j_tile)
1222 real(esmf_kind_r8),
intent(out) :: longitude_s(i_tile, jp1_tile)
1223 real(esmf_kind_r8),
intent(out) :: longitude_w(ip1_tile, j_tile)
1225 character(len=50) :: grid_files(num_tiles)
1226 character(len=255) :: grid_file
1228 integer :: error, id_var, ncid
1229 integer :: id_dim, nxp, nyp, i, j, ii, jj
1231 real(esmf_kind_r8),
allocatable :: tmpvar(:,:)
1233 print*,
"- READ MODEL GRID FILE" 1235 print*,
'- OPEN MOSAIC FILE: ', trim(mosaic_file)
1236 error=nf90_open(trim(mosaic_file), nf90_nowrite, ncid)
1237 call netcdf_err(error,
'opening mosaic file')
1239 print*,
"- READ GRID FILE NAMES" 1240 error=nf90_inq_varid(ncid,
'gridfiles', id_var)
1241 call netcdf_err(error,
'reading gridfiles id')
1242 error=nf90_get_var(ncid, id_var, grid_files)
1243 call netcdf_err(error,
'reading gridfiles')
1245 error = nf90_close(ncid)
1247 grid_file = trim(orog_dir) // trim(grid_files(tile))
1249 print*,
'- OPEN GRID FILE: ', trim(grid_file)
1250 error=nf90_open(trim(grid_file), nf90_nowrite, ncid)
1251 call netcdf_err(error,
'opening grid file')
1253 print*,
'- READ NXP ID' 1254 error=nf90_inq_dimid(ncid,
'nxp', id_dim)
1255 call netcdf_err(error,
'reading nxp id')
1258 error=nf90_inquire_dimension(ncid,id_dim,len=nxp)
1259 call netcdf_err(error,
'reading nxp')
1261 print*,
'- READ NYP ID' 1262 error=nf90_inq_dimid(ncid,
'nyp', id_dim)
1263 call netcdf_err(error,
'reading nyp id')
1266 error=nf90_inquire_dimension(ncid,id_dim,len=nyp)
1267 call netcdf_err(error,
'reading nyp')
1269 if ((nxp/2 /= i_tile) .or. (nyp/2 /= j_tile))
then 1270 call error_handler(
"DIMENSION MISMATCH IN GRID FILE.", 1)
1273 allocate(tmpvar(nxp,nyp))
1275 print*,
'- READ LONGITUDE ID' 1276 error=nf90_inq_varid(ncid,
'x', id_var)
1277 call netcdf_err(error,
'reading longitude id')
1279 print*,
'- READ LONGITUDE' 1280 error=nf90_get_var(ncid, id_var, tmpvar)
1281 call netcdf_err(error,
'reading longitude')
1287 longitude(i,j) = tmpvar(ii,jj)
1295 longitude_s(i,j) = tmpvar(ii,jj)
1303 longitude_w(i,j) = tmpvar(ii,jj)
1307 print*,
'- READ LATITUDE ID' 1308 error=nf90_inq_varid(ncid,
'y', id_var)
1309 call netcdf_err(error,
'reading latitude id')
1311 print*,
'- READ LATIITUDE' 1312 error=nf90_get_var(ncid, id_var, tmpvar)
1313 call netcdf_err(error,
'reading latitude')
1319 latitude(i,j) = tmpvar(ii,jj)
1327 latitude_s(i,j) = tmpvar(ii,jj)
1335 latitude_w(i,j) = tmpvar(ii,jj)
1341 error = nf90_close(ncid)
1361 character(len=*),
intent(in) :: orog_file
1363 integer,
intent(in) :: idim, jdim
1364 integer(esmf_kind_i8),
intent(out) :: mask(idim,jdim)
1366 real(esmf_kind_i8),
intent(out) :: terrain(idim,jdim)
1367 real(esmf_kind_i8),
intent(out) :: land_frac(idim,jdim)
1369 integer :: error, lat, lon
1370 integer :: ncid, id_dim, id_var
1372 real(kind=4),
allocatable :: dummy(:,:)
1374 print*,
"- READ MODEL LAND MASK FILE" 1376 print*,
'- OPEN LAND MASK FILE: ', orog_file
1377 error=nf90_open(orog_file,nf90_nowrite,ncid)
1378 call netcdf_err(error,
'opening land mask file')
1380 print*,
"- READ I-DIMENSION" 1381 error=nf90_inq_dimid(ncid,
'lon', id_dim)
1382 call netcdf_err(error,
'reading idim id')
1383 error=nf90_inquire_dimension(ncid,id_dim,len=lon)
1384 call netcdf_err(error,
'reading idim')
1386 print*,
"- READ J-DIMENSION" 1387 error=nf90_inq_dimid(ncid,
'lat', id_dim)
1388 call netcdf_err(error,
'reading jdim id')
1389 error=nf90_inquire_dimension(ncid,id_dim,len=lat)
1390 call netcdf_err(error,
'reading jdim')
1392 print*,
"- I/J DIMENSIONS: ", lon, lat
1394 if ((lon /= idim) .or. (lat /= jdim))
then 1395 call error_handler(
"MISMATCH IN DIMENSIONS.", 1)
1398 allocate(dummy(idim,jdim))
1400 print*,
"- READ LAND MASK" 1401 error=nf90_inq_varid(ncid,
'slmsk', id_var)
1402 call netcdf_err(error,
'reading slmsk id')
1403 error=nf90_get_var(ncid, id_var, dummy)
1404 call netcdf_err(error,
'reading slmsk')
1407 print*,
"- READ RAW OROGRAPHY." 1408 error=nf90_inq_varid(ncid,
'orog_raw', id_var)
1409 call netcdf_err(error,
'reading orog_raw id')
1410 error=nf90_get_var(ncid, id_var, dummy)
1411 call netcdf_err(error,
'reading orog_raw')
1414 print*,
"- READ LAND FRACTION." 1415 error=nf90_inq_varid(ncid,
'land_frac', id_var)
1416 call netcdf_err(error,
'reading land_frac id')
1417 error=nf90_get_var(ncid, id_var, dummy)
1418 call netcdf_err(error,
'reading orog_raw')
1421 error = nf90_close(ncid)
1436 print*,
"- DESTROY MODEL DATA." 1486 subroutine gdt_to_gds(igdtnum, igdstmpl, igdtlen, kgds, ni, nj, res)
1490 integer,
intent(in ) :: igdtnum, igdtlen, igdstmpl(igdtlen)
1491 integer,
intent( out) :: kgds(200), ni, nj
1492 integer :: iscale, i
1494 real,
intent( out) :: res
1496 real :: clatr, slatr, clonr, dpr, slat
1497 real :: slat0, clat0, clat, clon, rlat
1498 real :: rlon0, rlon, hs
1502 if (igdtnum.eq.32769)
then 1504 iscale=igdstmpl(10)*igdstmpl(11)
1505 if (iscale == 0) iscale = 1e6
1512 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1514 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1518 if (igdstmpl(1)==2 ) kgds(6)=64
1519 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1520 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1522 kgds(7)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1524 kgds(8)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1526 kgds(9)=nint(float(igdstmpl(17))/float(iscale)*1000.)
1528 kgds(10)=nint(float(igdstmpl(18))/float(iscale)*1000.)
1532 if (btest(igdstmpl(19),7)) kgds(11) = 128
1533 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1534 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
1536 kgds(12)=nint(float(igdstmpl(20))/float(iscale)*1000.)
1538 kgds(13)=nint(float(igdstmpl(21))/float(iscale)*1000.)
1544 res = ((float(kgds(9)) / 1000.0) + (float(kgds(10)) / 1000.0)) &
1547 elseif (igdtnum.eq.1)
then 1550 iscale=igdstmpl(10)*igdstmpl(11)
1551 if (iscale == 0) iscale = 1e6
1559 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1561 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1565 if (igdstmpl(1)==2 ) kgds(6)=64
1566 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1567 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1569 kgds(7)=nint(float(igdstmpl(20))/float(iscale)*1000.)
1571 kgds(8)=nint(float(igdstmpl(21))/float(iscale)*1000.)
1573 kgds(7) = kgds(7) + 90000.0
1574 print*,
"INPUT LAT, LON CENTER ", kgds(7), kgds(8)
1576 dpr = 180.0/3.1415926
1577 clatr=cos((float(kgds(4))/1000.0)/dpr)
1578 slatr=sin((float(kgds(4))/1000.0)/dpr)
1579 clonr=cos((float(kgds(5))/1000.0)/dpr)
1580 slat0=sin((float(kgds(7))/1000.0)/dpr)
1581 clat0=cos((float(kgds(7))/1000.0)/dpr)
1583 slat=clat0*slatr+slat0*clatr*clonr
1584 clat=sqrt(1-slat**2)
1585 clon=(clat0*clatr*clonr-slat0*slatr)/clat
1586 clon=min(max(clon,-1.0),1.0)
1590 rlon0=float(kgds(8))/1000.0
1592 if ((kgds(5)-kgds(8)) > 0)
then 1598 rlon = mod(rlon0+hs*dpr*acos(clon)+3600,360.0)
1600 kgds(4)=nint(rlat*1000.)
1601 kgds(5)=nint(rlon*1000.)
1603 kgds(12)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1605 kgds(13)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1608 clatr=cos((float(kgds(12))/1000.0)/dpr)
1609 slatr=sin((float(kgds(12))/1000.0)/dpr)
1610 clonr=cos((float(kgds(13))/1000.0)/dpr)
1612 slat=clat0*slatr+slat0*clatr*clonr
1615 clat=sqrt(1-slat**2)
1616 clon=(clat0*clatr*clonr-slat0*slatr)/clat
1617 clon=min(max(clon,-1.0),1.0)
1619 if ((kgds(13)-kgds(8)) > 0)
then 1625 rlon = mod(rlon0+hs*dpr*acos(clon)+3600,360.0)
1627 print*,
'got here last point ',kgds(12), kgds(13)
1628 print*,
'got here last point rotated ', rlat, rlon
1630 kgds(12)=nint(rlat*1000.)
1631 kgds(13)=nint(rlon*1000.)
1633 kgds(9)=igdstmpl(17)
1634 kgds(10)=igdstmpl(18)
1637 if (btest(igdstmpl(19),7)) kgds(11) = 128
1638 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1639 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
1644 res = ((float(kgds(9)) / 1.e6) + (float(kgds(10)) / 1.e6)) &
1649 print*,
'final kgds ',i,kgds(i)
1653 elseif(igdtnum==30)
then 1662 kgds(4) = nint(float(igdstmpl(10))/1000.0)
1663 kgds(5) = nint(float(igdstmpl(11))/1000.0)
1666 if (igdstmpl(1)==2 ) kgds(6)=64
1667 if ( btest(igdstmpl(12),4).OR.btest(igdstmpl(12),5) ) kgds(6)=kgds(6)+128
1668 if ( btest(igdstmpl(12),3) ) kgds(6)=kgds(6)+8
1670 kgds(7) = nint(float(igdstmpl(14))/1000.0)
1671 kgds(8) = nint(float(igdstmpl(15))/1000.0)
1672 kgds(9) = nint(float(igdstmpl(16))/1000.0)
1676 if (btest(igdstmpl(18),7)) kgds(11) = 128
1677 if (btest(igdstmpl(18),6)) kgds(11) = kgds(11) + 64
1678 if (btest(igdstmpl(18),5)) kgds(11) = kgds(11) + 32
1680 kgds(12) = nint(float(igdstmpl(19))/1000.0)
1681 kgds(13) = nint(float(igdstmpl(20))/1000.0)
1685 elseif(igdtnum==0)
then 1687 iscale=igdstmpl(10)*igdstmpl(11)
1688 if (iscale == 0) iscale = 1e6
1694 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1695 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1698 if (igdstmpl(1)==2 ) kgds(6)=64
1699 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1700 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1702 kgds(7)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1703 kgds(8)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1704 kgds(9)=nint(float(igdstmpl(17))/float(iscale)*1000.)
1705 kgds(10)=nint(float(igdstmpl(18))/float(iscale)*1000.)
1708 if (btest(igdstmpl(19),7)) kgds(11) = 128
1709 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1710 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
1718 call error_handler(
"UNRECOGNIZED INPUT GRID TYPE ", 1)
integer, public j_target
j dimension of each global tile, or of a nest, target grid.
This module contains code to read the setup namelist file, handle the varmap file for GRIB2 data...
integer, public num_tiles_target_grid
Number of tiles, target grid.
subroutine, public cleanup_input_target_grid_data
Deallocate all esmf grid objects.
integer, public lsoil_target
Number of soil layers, target grid.
integer, public ip1_input
i_input plus 1
type(esmf_field), public longitude_w_target_grid
longitude of 'west' edge of grid box, target grid
integer, public j_input
j-dimension of input grid (or of each global tile)
subroutine define_input_grid_mosaic(localpet, npets)
Define input grid for tiled data using the 'mosaic', 'grid' and orography files.
type(esmf_field), public land_frac_target_grid
land fraction, target grid
integer, public jp1_input
j_input plus 1
integer, public nsoill_out
Number of soil levels desired in the output data.
type(esmf_field), public longitude_s_target_grid
longitude of 'south' edge of grid box, target grid
Sets up the ESMF grid objects for the input data grid and target FV3 grid.
type(esmf_field), public latitude_input_grid
latitude of grid center, input grid
type(esmf_field), public latitude_target_grid
latitude of grid center, target grid
integer, public i_target
i dimension of each global tile, or of a nest, target 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.
integer, public num_tiles_input_grid
Number of tiles, input grid.
type(esmf_field), public latitude_s_target_grid
latitude of 'south' edge of grid box, target grid
type(esmf_field), public latitude_w_input_grid
latitude of 'west' edge of grid box, input grid
type(esmf_grid), public target_grid
target grid esmf grid object.
logical, public convert_sfc
Convert sfc data when true.
character(len=500), public orog_dir_target_grid
Directory containing the target grid orography files.
character(len=500), dimension(6), public orog_files_input_grid
Input grid orography files.
type(esmf_field), public latitude_w_target_grid
latitude of 'west' edge of grid box, target grid
character(len=500), public orog_dir_input_grid
Directory containing the input grid orography files.
type(esmf_field), public landmask_target_grid
land mask target grid - '1' some or all land; '0' all non-land
character(len=500), public mosaic_file_target_grid
Target grid mosaic file.
character(len=500), public mosaic_file_input_grid
Input grid mosaic file.
type(esmf_field), public longitude_w_input_grid
longitude of 'west' edge of grid box, input grid
character(len=500), dimension(6), public atm_files_input_grid
File names of input atmospheric data.
type(esmf_field), public latitude_s_input_grid
latitude of 'south' edge of grid box, input grid
subroutine, public define_target_grid(localpet, npets)
Setup the esmf grid object for the target grid.
character(len=500), dimension(6), public orog_files_target_grid
Target grid orography files.
type(esmf_field), public longitude_s_input_grid
longitude of 'south' edge of grid box, input grid
logical, public convert_atm
Convert atmospheric data when true.
type(esmf_field), public longitude_target_grid
longitude of grid center, target grid
subroutine, public define_input_grid(localpet, npets)
Driver routine to setup the esmf grid object for the input grid.
type(esmf_grid), public input_grid
input grid esmf grid object
character(len=500), public data_dir_input_grid
Directory containing input atm or sfc files.
subroutine gdt_to_gds(igdtnum, igdstmpl, igdtlen, kgds, ni, nj, res)
Convert the GRIB2 grid description template to to the GRIB1 grid description section.
character(len=50), public input_grid_type
map projection of input grid
integer, public ip1_target
ip1_target plus 1
character(len=25), public input_type
Input data type:
subroutine get_model_mask_terrain(orog_file, idim, jdim, mask, terrain, land_frac)
Read the model land mask and terrain for a single tile from the orography file.
type(esmf_field), public terrain_target_grid
terrain height target grid
character(len=5), dimension(:), allocatable, public tiles_target_grid
Tile names of target grid.
type(esmf_field), public longitude_input_grid
longitude of grid center, input grid
character(len=500), public grib2_file_input_grid
REQUIRED.
type(esmf_field), public seamask_target_grid
sea mask target grid - '1' some or all non-land; '0' all land
subroutine define_input_grid_gaussian(npets)
Define grid object for input data on global gaussian grids.
character(len=500), dimension(6), public sfc_files_input_grid
File names containing input surface data.
integer, public i_input
i-dimension of input grid (or of each global tile)
subroutine define_input_grid_grib2(npets)
Define input grid object for grib2 input data.
integer, public jp1_target
jp1_target plus 1