169 integer,
intent(in) :: localpet, npets
171 character(len=250) :: the_file
173 integer :: i, j, rc, clb(2), cub(2), ncid, id_grid, idum(2)
175 integer(sfcio_intkind) :: rc2
176 integer(sigio_intkind) :: rc3
179 real(esmf_kind_r8),
allocatable :: latitude(:,:)
180 real(esmf_kind_r8),
allocatable :: longitude(:,:)
181 real(esmf_kind_r8),
pointer :: lat_src_ptr(:,:)
182 real(esmf_kind_r8),
pointer :: lon_src_ptr(:,:)
183 real(esmf_kind_r8),
pointer :: lat_corner_src_ptr(:,:)
184 real(esmf_kind_r8),
pointer :: lon_corner_src_ptr(:,:)
185 real(esmf_kind_r8) :: deltalon
186 real(esmf_kind_r8),
allocatable :: slat(:), wlat(:)
189 type(nemsio_gfile) :: gfile
191 type(esmf_polekind_flag) :: polekindflag(2)
193 type(sfcio_head) :: sfchead
194 type(sigio_head) :: sighead
199 print*,
"- DEFINE INPUT GRID OBJECT FOR GAUSSIAN DATA."
209 if (trim(
input_type) ==
"gaussian_netcdf")
then
211 call esmf_vmgetglobal(vm, rc=rc)
212 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
213 call error_handler(
"IN VMGetGlobal", rc)
215 if (localpet == 0)
then
216 print*,
'- OPEN AND READ: ',trim(the_file)
217 rc=nf90_open(trim(the_file),nf90_nowrite,ncid)
218 call netcdf_err(rc,
'opening file')
220 print*,
"- READ grid_xt"
221 rc=nf90_inq_dimid(ncid,
'grid_xt', id_grid)
222 call netcdf_err(rc,
'reading grid_xt id')
223 rc=nf90_inquire_dimension(ncid,id_grid,len=idum(1))
224 call netcdf_err(rc,
'reading grid_xt')
226 print*,
"- READ grid_yt"
227 rc=nf90_inq_dimid(ncid,
'grid_yt', id_grid)
228 call netcdf_err(rc,
'reading grid_yt id')
229 rc=nf90_inquire_dimension(ncid,id_grid,len=idum(2))
230 call netcdf_err(rc,
'reading grid_yt')
232 rc = nf90_close(ncid)
235 call esmf_vmbroadcast(vm, idum, 2, 0, rc=rc)
236 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
237 call error_handler(
"IN VMBroadcast", rc)
246 print*,
"- OPEN AND READ ", trim(the_file)
247 call sfcio_sropen(21, trim(the_file), rc2)
248 if (rc2 /= 0)
call error_handler(
"OPENING FILE", rc2)
249 call sfcio_srhead(21, sfchead, rc2)
250 if (rc2 /= 0)
call error_handler(
"READING FILE", rc2)
251 call sfcio_sclose(21, rc2)
255 print*,
"- OPEN AND READ ", trim(the_file)
256 call sigio_sropen(21, trim(the_file), rc3)
257 if (rc3 /= 0)
call error_handler(
"OPENING FILE", rc3)
258 call sigio_srhead(21, sighead, rc3)
259 if (rc3 /= 0)
call error_handler(
"READING FILE", rc3)
260 call sigio_sclose(21, rc3)
267 call nemsio_init(iret=rc)
269 print*,
"- OPEN AND READ ", trim(the_file)
270 call nemsio_open(gfile, the_file,
"read", iret=rc)
271 if (rc /= 0)
call error_handler(
"OPENING FILE", rc)
273 call nemsio_getfilehead(gfile, iret=rc, dimx=
i_input, dimy=
j_input)
274 if (rc /= 0)
call error_handler(
"READING FILE", rc)
276 call nemsio_close(gfile)
285 polekindflag(1:2) = esmf_polekind_monopole
287 print*,
"- CALL GridCreate1PeriDim FOR INPUT GRID."
288 input_grid = esmf_gridcreate1peridim(minindex=(/1,1/), &
290 polekindflag=polekindflag, &
293 coordsys=esmf_coordsys_sph_deg, &
294 regdecomp=(/1,npets/), &
295 indexflag=esmf_index_global, rc=rc)
296 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
297 call error_handler(
"IN GridCreate1PeriDim", rc)
299 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE."
301 typekind=esmf_typekind_r8, &
302 staggerloc=esmf_staggerloc_center, &
303 name=
"input_grid_latitude", rc=rc)
304 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
305 call error_handler(
"IN FieldCreate", rc)
307 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE."
309 typekind=esmf_typekind_r8, &
310 staggerloc=esmf_staggerloc_center, &
311 name=
"input_grid_longitude", rc=rc)
312 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
313 call error_handler(
"IN FieldCreate", rc)
318 deltalon = 360.0_esmf_kind_r8 / real(
i_input,kind=esmf_kind_r8)
320 longitude(i,:) = real((i-1),kind=esmf_kind_r8) * deltalon
325 call splat(4,
j_input, slat, wlat)
328 latitude(:,i) = 90.0_esmf_kind_r8 - (acos(slat(i))* 180.0_esmf_kind_r8 / &
329 (4.0_esmf_kind_r8*atan(1.0_esmf_kind_r8)))
332 deallocate(slat, wlat)
334 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE."
336 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
337 call error_handler(
"IN FieldScatter", rc)
339 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE."
341 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
342 call error_handler(
"IN FieldScatter", rc)
344 print*,
"- CALL GridAddCoord FOR INPUT GRID."
346 staggerloc=esmf_staggerloc_center, rc=rc)
347 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
348 call error_handler(
"IN GridAddCoord", rc)
350 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
353 staggerloc=esmf_staggerloc_center, &
355 farrayptr=lon_src_ptr, rc=rc)
356 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
357 call error_handler(
"IN GridGetCoord", rc)
359 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
362 staggerloc=esmf_staggerloc_center, &
364 computationallbound=clb, &
365 computationalubound=cub, &
366 farrayptr=lat_src_ptr, rc=rc)
367 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
368 call error_handler(
"IN GridGetCoord", rc)
370 do j = clb(2), cub(2)
371 do i = clb(1), cub(1)
372 lon_src_ptr(i,j) = longitude(i,j)
373 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
374 lat_src_ptr(i,j) = latitude(i,j)
378 print*,
"- CALL GridAddCoord FOR INPUT GRID."
380 staggerloc=esmf_staggerloc_corner, rc=rc)
381 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
382 call error_handler(
"IN GridAddCoord", rc)
384 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
385 nullify(lon_corner_src_ptr)
387 staggerloc=esmf_staggerloc_corner, &
389 farrayptr=lon_corner_src_ptr, rc=rc)
390 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
391 call error_handler(
"IN GridGetCoord", rc)
393 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
394 nullify(lat_corner_src_ptr)
396 staggerloc=esmf_staggerloc_corner, &
398 computationallbound=clb, &
399 computationalubound=cub, &
400 farrayptr=lat_corner_src_ptr, rc=rc)
401 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
402 call error_handler(
"IN GridGetCoord", rc)
404 do j = clb(2), cub(2)
405 do i = clb(1), cub(1)
406 lon_corner_src_ptr(i,j) = longitude(i,1) - (0.5_esmf_kind_r8*deltalon)
407 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
409 lat_corner_src_ptr(i,j) = 90.0_esmf_kind_r8
413 lat_corner_src_ptr(i,j) = -90.0_esmf_kind_r8
416 lat_corner_src_ptr(i,j) = 0.5_esmf_kind_r8 * (latitude(i,j-1)+ latitude(i,j))
420 deallocate(latitude,longitude)
439 character(len=500) :: the_file
441 integer,
intent(in) :: localpet, npets
443 integer :: id_tiles, id_dim, tile
444 integer :: extra, error, ncid, idum(1), idum2(2)
445 integer,
allocatable :: decomptile(:,:)
447 real(esmf_kind_r8),
allocatable :: latitude_one_tile(:,:)
448 real(esmf_kind_r8),
allocatable :: latitude_s_one_tile(:,:)
449 real(esmf_kind_r8),
allocatable :: latitude_w_one_tile(:,:)
450 real(esmf_kind_r8),
allocatable :: longitude_one_tile(:,:)
451 real(esmf_kind_r8),
allocatable :: longitude_s_one_tile(:,:)
452 real(esmf_kind_r8),
allocatable :: longitude_w_one_tile(:,:)
456 call esmf_vmgetglobal(vm, rc=error)
457 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
458 call error_handler(
"IN VMGetGlobal", error)
460 if (localpet == 0)
then
463 call netcdf_err(error,
'opening grid mosaic file')
464 print*,
"- READ NUMBER OF TILES"
465 error=nf90_inq_dimid(ncid,
'ntiles', id_tiles)
466 call netcdf_err(error,
'reading ntiles id')
467 error=nf90_inquire_dimension(ncid,id_tiles,len=idum(1))
468 call netcdf_err(error,
'reading ntiles')
469 error = nf90_close(ncid)
472 call esmf_vmbroadcast(vm, idum, 1, 0, rc=error)
473 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
474 call error_handler(
"IN VMBroadcast", error)
481 call error_handler(
"MUST RUN WITH A TASK COUNT THAT IS A MULTIPLE OF 6.", 1)
493 decomptile(:,tile)=(/1,extra/)
496 print*,
"- CALL GridCreateMosaic FOR INPUT MODEL GRID"
498 regdecompptile=decomptile, &
499 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
500 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
501 indexflag=esmf_index_global, &
504 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
505 call error_handler(
"IN GridCreateMosaic", error)
511 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE."
513 typekind=esmf_typekind_r8, &
514 staggerloc=esmf_staggerloc_center, &
515 name=
"input_grid_latitude", &
517 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
518 call error_handler(
"IN FieldCreate", error)
520 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE."
522 typekind=esmf_typekind_r8, &
523 staggerloc=esmf_staggerloc_center, &
524 name=
"input_grid_longitude", &
526 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
527 call error_handler(
"IN FieldCreate", error)
529 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE_S."
531 typekind=esmf_typekind_r8, &
532 staggerloc=esmf_staggerloc_edge2, &
533 name=
"input_grid_latitude_s", &
535 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
536 call error_handler(
"IN FieldCreate", error)
538 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE_S."
540 typekind=esmf_typekind_r8, &
541 staggerloc=esmf_staggerloc_edge2, &
542 name=
"input_grid_longitude_s", &
544 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
545 call error_handler(
"IN FieldCreate", error)
547 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE_W."
549 typekind=esmf_typekind_r8, &
550 staggerloc=esmf_staggerloc_edge1, &
551 name=
"input_grid_latitude_w", &
553 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
554 call error_handler(
"IN FieldCreate", error)
556 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE_W."
558 typekind=esmf_typekind_r8, &
559 staggerloc=esmf_staggerloc_edge1, &
560 name=
"input_grid_longitude_w", &
562 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
563 call error_handler(
"IN FieldCreate", error)
567 if (localpet == 0)
then
568 print*,
'- OPEN FIRST INPUT GRID OROGRAPHY FILE: ',trim(the_file)
569 error=nf90_open(trim(the_file),nf90_nowrite,ncid)
570 call netcdf_err(error,
'opening ororgraphy file')
571 print*,
"- READ GRID DIMENSIONS"
572 error=nf90_inq_dimid(ncid,
'lon', id_dim)
573 call netcdf_err(error,
'reading lon id')
574 error=nf90_inquire_dimension(ncid,id_dim,len=idum2(1))
575 call netcdf_err(error,
'reading lon')
576 error=nf90_inq_dimid(ncid,
'lat', id_dim)
577 call netcdf_err(error,
'reading lat id')
578 error=nf90_inquire_dimension(ncid,id_dim,len=idum2(2))
579 call netcdf_err(error,
'reading lat')
580 error = nf90_close(ncid)
583 call esmf_vmbroadcast(vm, idum2, 2, 0, rc=error)
584 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
585 call error_handler(
"IN VMBroadcast", error)
590 print*,
"- I/J DIMENSIONS OF THE INPUT GRID TILES ",
i_input,
j_input
595 if (localpet == 0)
then
603 allocate(longitude_one_tile(0,0))
604 allocate(longitude_s_one_tile(0,0))
605 allocate(longitude_w_one_tile(0,0))
606 allocate(latitude_one_tile(0,0))
607 allocate(latitude_s_one_tile(0,0))
608 allocate(latitude_w_one_tile(0,0))
612 if (localpet == 0)
then
615 latitude_s_one_tile, latitude_w_one_tile, longitude_one_tile, &
616 longitude_s_one_tile, longitude_w_one_tile)
618 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE. TILE IS: ", tile
619 call esmf_fieldscatter(
latitude_input_grid, latitude_one_tile, rootpet=0, tile=tile, rc=error)
620 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
621 call error_handler(
"IN FieldScatter", error)
622 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE. TILE IS: ", tile
623 call esmf_fieldscatter(
longitude_input_grid, longitude_one_tile, rootpet=0, tile=tile, rc=error)
624 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
625 call error_handler(
"IN FieldScatter", error)
626 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE_S. TILE IS: ", tile
628 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
629 call error_handler(
"IN FieldScatter", error)
630 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE_S. TILE IS: ", tile
632 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
633 call error_handler(
"IN FieldScatter", error)
634 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE_W. TILE IS: ", tile
636 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
637 call error_handler(
"IN FieldScatter", error)
638 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE_W. TILE IS: ", tile
640 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
641 call error_handler(
"IN FieldScatter", error)
644 deallocate(longitude_one_tile)
645 deallocate(longitude_s_one_tile)
646 deallocate(longitude_w_one_tile)
647 deallocate(latitude_one_tile)
648 deallocate(latitude_s_one_tile)
649 deallocate(latitude_w_one_tile)
668 integer,
intent(in) :: localpet, npets
670 character(len=500) :: the_file
672 integer :: i, j, k, jdisc, jgdtn, jpdtn, lugb, lugi
673 integer :: jids(200), jgdt(200), jpdt(200), rc
674 integer :: kgds(200), nret, clb(2), cub(2), idum(3)
679 real,
allocatable :: rlon(:,:),rlat(:,:),xpts(:,:),ypts(:,:)
680 real,
allocatable :: rlon_corner(:,:),rlat_corner(:,:)
681 real,
allocatable :: xpts_corner(:,:),ypts_corner(:,:)
682 real(esmf_kind_r8),
allocatable :: latitude(:,:)
683 real(esmf_kind_r8),
allocatable :: longitude(:,:)
684 real(esmf_kind_r8),
allocatable :: latitude_corner(:,:)
685 real(esmf_kind_r8),
allocatable :: longitude_corner(:,:)
686 real(esmf_kind_r8),
pointer :: lat_src_ptr(:,:), lat_ptr(:,:)
687 real(esmf_kind_r8),
pointer :: lat_corner_src_ptr(:,:)
688 real(esmf_kind_r8),
pointer :: lon_src_ptr(:,:), lon_ptr(:,:)
689 real(esmf_kind_r8),
pointer :: lon_corner_src_ptr(:,:)
691 type(esmf_field) :: lat_corner, lon_corner
693 type(esmf_polekind_flag) :: polekindflag(2)
695 type(gribfield) :: gfld
699 call esmf_vmgetglobal(vm, rc=rc)
700 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
701 call error_handler(
"IN VMGetGlobal", rc)
707 if (localpet == 0)
then
709 print*,
"- OPEN AND READ INPUT DATA GRIB2 FILE: ", trim(the_file)
710 call baopenr(lugb,the_file,rc)
711 if (rc /= 0)
call error_handler(
"OPENING FILE", rc)
725 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
727 if (rc /= 0)
call error_handler(
"DEGRIBBING INPUT FILE.", rc)
729 call baclose(lugb,rc)
732 call gdt_to_gds(gfld%igdtnum, gfld%igdtmpl, gfld%igdtlen, kgds, idum(1), idum(2), res)
734 idum(3) = gfld%igdtnum
738 call esmf_vmbroadcast(vm, idum, 3, 0, rc=rc)
739 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
740 call error_handler(
"IN VMBroadcast", rc)
748 if (idum(3) == 0)
then
749 print*,
"- INPUT DATA ON LAT/LON GRID."
751 elseif (idum(3) == 30)
then
752 print*,
"- INPUT DATA ON LAMBERT CONFORMAL GRID."
754 elseif (idum(3) == 32769 .or. idum(3) == 1)
then
755 print*,
"- INPUT DATA ON ROTATED LAT/LON GRID."
758 call error_handler(
"INPUT GRID TEMPLATE NOT SUPPORTED.", 2)
761 if (localpet == 0)
then
779 print*,
"- COMPUTE GRID CELL CENTER COORDINATES."
780 call gdswzd(kgds,1,(
i_input*
j_input),-9999.,xpts,ypts,rlon,rlat,nret)
783 call error_handler(
"GDSWZD RETURNED WRONG NUMBER OF POINTS.", 2)
786 deallocate(xpts, ypts)
790 xpts_corner(i,j) = float(i) - 0.5
791 ypts_corner(i,j) = float(j) - 0.5
795 print*,
"- COMPUTE GRID CELL CORNER COORDINATES."
796 call gdswzd(kgds,1,(
ip1_input*
jp1_input),-9999.,xpts_corner,ypts_corner,rlon_corner,rlat_corner,nret)
799 call error_handler(
"GDSWZD RETURNED WRONG NUMBER OF POINTS.", 2)
802 deallocate(xpts_corner, ypts_corner)
808 print*,
"- CALL GridCreate1PeriDim FOR INPUT GRID."
810 polekindflag(1:2) = esmf_polekind_monopole
812 input_grid = esmf_gridcreate1peridim(minindex=(/1,1/), &
814 polekindflag=polekindflag, &
817 coordsys=esmf_coordsys_sph_deg, &
818 regdecomp=(/1,npets/), &
819 indexflag=esmf_index_global, rc=rc)
823 print*,
"- CALL GridCreateNoPeriDim FOR INPUT GRID."
826 indexflag=esmf_index_global, &
831 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
832 call error_handler(
"IN GridCreate1PeriDim", rc)
834 print*,
"- CALL FieldCreate FOR INPUT GRID LATITUDE."
836 typekind=esmf_typekind_r8, &
837 staggerloc=esmf_staggerloc_center, &
838 name=
"input_grid_latitude", rc=rc)
839 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
840 call error_handler(
"IN FieldCreate", rc)
842 print*,
"- CALL FieldCreate FOR INPUT GRID LONGITUDE."
844 typekind=esmf_typekind_r8, &
845 staggerloc=esmf_staggerloc_center, &
846 name=
"input_grid_longitude", rc=rc)
847 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
848 call error_handler(
"IN FieldCreate", rc)
850 if (localpet == 0)
then
855 deallocate (rlat, rlon)
857 allocate(latitude(0,0))
858 allocate(longitude(0,0))
861 print*,
"- CALL FieldScatter FOR INPUT GRID LONGITUDE."
863 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
864 call error_handler(
"IN FieldScatter", rc)
866 print*,
"- CALL FieldScatter FOR INPUT GRID LATITUDE."
868 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
869 call error_handler(
"IN FieldScatter", rc)
871 deallocate(latitude, longitude)
873 print*,
"- CALL GridAddCoord FOR INPUT GRID."
875 staggerloc=esmf_staggerloc_center, rc=rc)
876 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
877 call error_handler(
"IN GridAddCoord", rc)
879 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
882 staggerloc=esmf_staggerloc_center, &
884 farrayptr=lon_src_ptr, rc=rc)
885 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
886 call error_handler(
"IN GridGetCoord", rc)
888 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
891 staggerloc=esmf_staggerloc_center, &
893 computationallbound=clb, &
894 computationalubound=cub, &
895 farrayptr=lat_src_ptr, rc=rc)
896 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
897 call error_handler(
"IN GridGetCoord", rc)
900 print*,
"- CALL FieldGet FOR latitude."
902 farrayptr=lat_ptr, rc=rc)
903 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
904 call error_handler(
"IN FieldGet", rc)
907 print*,
"- CALL FieldGet FOR longitude."
909 farrayptr=lon_ptr, rc=rc)
910 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
911 call error_handler(
"IN FieldGet", rc)
913 do j = clb(2), cub(2)
914 do i = clb(1), cub(1)
915 lon_src_ptr(i,j) = lon_ptr(i,j)
916 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
917 lat_src_ptr(i,j) = lat_ptr(i,j)
921 if (localpet == 0)
then
931 longitude_corner = rlon_corner
932 latitude_corner = rlat_corner
934 deallocate (rlat_corner, rlon_corner)
936 allocate(latitude_corner(0,0))
937 allocate(longitude_corner(0,0))
940 print*,
"- CALL FieldCreate FOR INPUT GRID CORNER LATITUDE."
942 typekind=esmf_typekind_r8, &
943 staggerloc=esmf_staggerloc_corner, &
944 name=
"input_grid_corner_latitude", rc=rc)
945 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
946 call error_handler(
"IN FieldCreate", rc)
948 print*,
"- CALL FieldCreate FOR INPUT GRID CORNER LONGITUDE."
950 typekind=esmf_typekind_r8, &
951 staggerloc=esmf_staggerloc_corner, &
952 name=
"input_grid_corner_longitude", rc=rc)
953 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
954 call error_handler(
"IN FieldCreate", rc)
956 print*,
"- CALL FieldScatter FOR INPUT GRID CORNER LONGITUDE."
957 call esmf_fieldscatter(lon_corner, longitude_corner, rootpet=0, rc=rc)
958 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
959 call error_handler(
"IN FieldScatter", rc)
961 print*,
"- CALL FieldScatter FOR INPUT GRID CORNER LATITUDE."
962 call esmf_fieldscatter(lat_corner, latitude_corner, rootpet=0, rc=rc)
963 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
964 call error_handler(
"IN FieldScatter", rc)
966 deallocate(latitude_corner, longitude_corner)
968 print*,
"- CALL GridAddCoord FOR INPUT GRID."
970 staggerloc=esmf_staggerloc_corner, rc=rc)
971 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
972 call error_handler(
"IN GridAddCoord", rc)
974 print*,
"- CALL GridGetCoord FOR INPUT GRID X-COORD."
975 nullify(lon_corner_src_ptr)
977 staggerloc=esmf_staggerloc_corner, &
979 farrayptr=lon_corner_src_ptr, rc=rc)
980 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
981 call error_handler(
"IN GridGetCoord", rc)
983 print*,
"- CALL GridGetCoord FOR INPUT GRID Y-COORD."
984 nullify(lat_corner_src_ptr)
986 staggerloc=esmf_staggerloc_corner, &
988 computationallbound=clb, &
989 computationalubound=cub, &
990 farrayptr=lat_corner_src_ptr, rc=rc)
991 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
992 call error_handler(
"IN GridGetCoord", rc)
995 print*,
"- CALL FieldGet FOR corner latitude."
996 call esmf_fieldget(lat_corner, &
997 farrayptr=lat_ptr, rc=rc)
998 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
999 call error_handler(
"IN FieldGet", rc)
1002 print*,
"- CALL FieldGet FOR corner longitude."
1003 call esmf_fieldget(lon_corner, &
1004 farrayptr=lon_ptr, rc=rc)
1005 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1006 call error_handler(
"IN FieldGet", rc)
1008 do j = clb(2), cub(2)
1009 do i = clb(1), cub(1)
1010 lon_corner_src_ptr(i,j) = lon_ptr(i,j)
1011 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
1012 lat_corner_src_ptr(i,j) = lat_ptr(i,j)
1016 call esmf_fielddestroy(lon_corner, rc=rc)
1017 call esmf_fielddestroy(lat_corner, rc=rc)
1036 integer,
intent(in) :: localpet, npets
1038 character(len=500) :: the_file
1040 integer :: error, ncid, extra
1042 integer :: id_dim, id_grid_tiles
1043 integer :: tile, idum1(1), idum2(2)
1044 integer,
allocatable :: decomptile(:,:)
1045 integer(esmf_kind_i8),
allocatable :: landmask_one_tile(:,:)
1046 integer(esmf_kind_i8),
allocatable :: seamask_one_tile(:,:)
1048 real(esmf_kind_r8),
allocatable :: land_frac_one_tile(:,:)
1049 real(esmf_kind_r8),
allocatable :: latitude_one_tile(:,:)
1050 real(esmf_kind_r8),
allocatable :: latitude_s_one_tile(:,:)
1051 real(esmf_kind_r8),
allocatable :: latitude_w_one_tile(:,:)
1052 real(esmf_kind_r8),
allocatable :: longitude_one_tile(:,:)
1053 real(esmf_kind_r8),
allocatable :: longitude_s_one_tile(:,:)
1054 real(esmf_kind_r8),
allocatable :: longitude_w_one_tile(:,:)
1055 real(esmf_kind_r8),
allocatable :: terrain_one_tile(:,:)
1061 call esmf_vmgetglobal(vm, rc=error)
1062 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1063 call error_handler(
"IN VMGetGlobal", error)
1065 if (localpet == 0)
then
1068 call netcdf_err(error,
'opening grid mosaic file')
1069 print*,
"- READ NUMBER OF TILES"
1070 error=nf90_inq_dimid(ncid,
'ntiles', id_tiles)
1071 call netcdf_err(error,
'reading ntile id')
1072 error=nf90_inquire_dimension(ncid,id_tiles,len=idum1(1))
1073 call netcdf_err(error,
'reading ntiles')
1076 call esmf_vmbroadcast(vm, idum1, 1, 0, rc=error)
1077 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1078 call error_handler(
"IN VMBroadcast", error)
1085 if (localpet == 0)
then
1086 error=nf90_inq_varid(ncid,
'gridtiles', id_grid_tiles)
1087 call netcdf_err(error,
'reading gridtiles id')
1088 print*,
"- READ TILE NAMES"
1090 call netcdf_err(error,
'reading gridtiles')
1091 error = nf90_close(ncid)
1095 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1096 call error_handler(
"IN VMBroadcast", error)
1101 call error_handler(
"MUST RUN WITH TASK COUNT THAT IS A MULTIPLE OF # OF TILES.", 1)
1110 if (localpet == 0)
then
1111 print*,
'- OPEN FIRST TARGET GRID OROGRAPHY FILE: ',trim(the_file)
1112 error=nf90_open(trim(the_file),nf90_nowrite,ncid)
1113 call netcdf_err(error,
'opening orography file')
1114 print*,
"- READ GRID DIMENSIONS"
1115 error=nf90_inq_dimid(ncid,
'lon', id_dim)
1116 call netcdf_err(error,
'reading lon id')
1117 error=nf90_inquire_dimension(ncid,id_dim,len=idum2(1))
1118 call netcdf_err(error,
'reading lon')
1119 error=nf90_inq_dimid(ncid,
'lat', id_dim)
1120 call netcdf_err(error,
'reading lat id')
1121 error=nf90_inquire_dimension(ncid,id_dim,len=idum2(2))
1122 call netcdf_err(error,
'reading lat')
1123 error = nf90_close(ncid)
1126 call esmf_vmbroadcast(vm, idum2, 2, 0, rc=error)
1127 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1128 call error_handler(
"IN VMBroadcast", error)
1147 decomptile(:,tile)=(/1,extra/)
1150 print*,
"- CALL GridCreateMosaic FOR TARGET GRID"
1152 regdecompptile=decomptile, &
1153 staggerloclist=(/esmf_staggerloc_center, esmf_staggerloc_corner, &
1154 esmf_staggerloc_edge1, esmf_staggerloc_edge2/), &
1155 indexflag=esmf_index_global, &
1157 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1158 call error_handler(
"IN GridCreateMosaic", error)
1165 print*,
"- CALL FieldCreate FOR TARGET GRID LAND FRACTION."
1167 typekind=esmf_typekind_r8, &
1168 staggerloc=esmf_staggerloc_center, &
1169 name=
"target_grid_landmask", rc=error)
1170 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1171 call error_handler(
"IN FieldCreate", error)
1173 print*,
"- CALL FieldCreate FOR TARGET GRID LANDMASK."
1175 typekind=esmf_typekind_i8, &
1176 staggerloc=esmf_staggerloc_center, &
1177 name=
"target_grid_landmask", rc=error)
1178 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1179 call error_handler(
"IN FieldCreate", error)
1181 print*,
"- CALL FieldCreate FOR TARGET GRID SEAMASK."
1183 typekind=esmf_typekind_i8, &
1184 staggerloc=esmf_staggerloc_center, &
1185 name=
"target_grid_seamask", rc=error)
1186 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1187 call error_handler(
"IN FieldCreate", error)
1189 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE."
1191 typekind=esmf_typekind_r8, &
1192 staggerloc=esmf_staggerloc_center, &
1193 name=
"target_grid_latitude", rc=error)
1194 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1195 call error_handler(
"IN FieldCreate", error)
1197 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE_S."
1199 typekind=esmf_typekind_r8, &
1200 staggerloc=esmf_staggerloc_edge2, &
1201 name=
"target_grid_latitude_s", rc=error)
1202 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1203 call error_handler(
"IN FieldCreate", error)
1205 print*,
"- CALL FieldCreate FOR TARGET GRID LATITUDE_W."
1207 typekind=esmf_typekind_r8, &
1208 staggerloc=esmf_staggerloc_edge1, &
1209 name=
"target_grid_latitude_w", &
1211 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1212 call error_handler(
"IN FieldCreate", error)
1214 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE."
1216 typekind=esmf_typekind_r8, &
1217 staggerloc=esmf_staggerloc_center, &
1218 name=
"target_grid_longitude", &
1220 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1221 call error_handler(
"IN FieldCreate", error)
1223 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE_S."
1225 typekind=esmf_typekind_r8, &
1226 staggerloc=esmf_staggerloc_edge2, &
1227 name=
"target_grid_longitude_s", &
1229 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1230 call error_handler(
"IN FieldCreate", error)
1232 print*,
"- CALL FieldCreate FOR TARGET GRID LONGITUDE_W."
1234 typekind=esmf_typekind_r8, &
1235 staggerloc=esmf_staggerloc_edge1, &
1236 name=
"target_grid_longitude_w", &
1238 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1239 call error_handler(
"IN FieldCreate", error)
1241 print*,
"- CALL FieldCreate FOR TARGET GRID TERRAIN."
1243 typekind=esmf_typekind_r8, &
1244 staggerloc=esmf_staggerloc_center, &
1245 name=
"target_grid_terrain", &
1247 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1248 call error_handler(
"IN FieldCreate", error)
1250 if (localpet == 0)
then
1262 allocate(land_frac_one_tile(0,0))
1263 allocate(landmask_one_tile(0,0))
1264 allocate(seamask_one_tile(0,0))
1265 allocate(longitude_one_tile(0,0))
1266 allocate(longitude_s_one_tile(0,0))
1267 allocate(longitude_w_one_tile(0,0))
1268 allocate(latitude_one_tile(0,0))
1269 allocate(latitude_s_one_tile(0,0))
1270 allocate(latitude_w_one_tile(0,0))
1271 allocate(terrain_one_tile(0,0))
1275 if (localpet == 0)
then
1278 terrain_one_tile, land_frac_one_tile)
1280 seamask_one_tile = 0
1281 where(floor(land_frac_one_tile) == 0) seamask_one_tile = 1
1282 landmask_one_tile = 0
1283 where(ceiling(land_frac_one_tile) == 1) landmask_one_tile = 1
1287 latitude_s_one_tile, latitude_w_one_tile, longitude_one_tile, &
1288 longitude_s_one_tile, longitude_w_one_tile)
1290 print*,
"- CALL FieldScatter FOR TARGET GRID LAND FRACTION. TILE IS: ", tile
1292 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1293 call error_handler(
"IN FieldScatter", error)
1294 print*,
"- CALL FieldScatter FOR TARGET GRID LANDMASK. TILE IS: ", tile
1295 call esmf_fieldscatter(
landmask_target_grid, landmask_one_tile, rootpet=0, tile=tile, rc=error)
1296 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1297 call error_handler(
"IN FieldScatter", error)
1298 print*,
"- CALL FieldScatter FOR TARGET GRID SEAMASK. TILE IS: ", tile
1299 call esmf_fieldscatter(
seamask_target_grid, seamask_one_tile, rootpet=0, tile=tile, rc=error)
1300 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1301 call error_handler(
"IN FieldScatter", error)
1302 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE. TILE IS: ", tile
1304 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1305 call error_handler(
"IN FieldScatter", error)
1306 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE_S. TILE IS: ", tile
1308 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1309 call error_handler(
"IN FieldScatter", error)
1310 print*,
"- CALL FieldScatter FOR TARGET GRID LONGITUDE_W. TILE IS: ", tile
1312 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1313 call error_handler(
"IN FieldScatter", error)
1314 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE. TILE IS: ", tile
1315 call esmf_fieldscatter(
latitude_target_grid, latitude_one_tile, rootpet=0, tile=tile, rc=error)
1316 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1317 call error_handler(
"IN FieldScatter", error)
1318 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE_S. TILE IS: ", tile
1320 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1321 call error_handler(
"IN FieldScatter", error)
1322 print*,
"- CALL FieldScatter FOR TARGET GRID LATITUDE_W. TILE IS: ", tile
1324 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1325 call error_handler(
"IN FieldScatter", error)
1326 print*,
"- CALL FieldScatter FOR TARGET GRID TERRAIN. TILE IS: ", tile
1327 call esmf_fieldscatter(
terrain_target_grid, terrain_one_tile, rootpet=0, tile=tile, rc=error)
1328 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1329 call error_handler(
"IN FieldScatter", error)
1332 deallocate(land_frac_one_tile)
1333 deallocate(landmask_one_tile)
1334 deallocate(seamask_one_tile)
1335 deallocate(longitude_one_tile)
1336 deallocate(longitude_s_one_tile)
1337 deallocate(longitude_w_one_tile)
1338 deallocate(latitude_one_tile)
1339 deallocate(latitude_s_one_tile)
1340 deallocate(latitude_w_one_tile)
1341 deallocate(terrain_one_tile)
1364 i_tile, j_tile, ip1_tile, jp1_tile, &
1365 latitude, latitude_s, latitude_w, &
1366 longitude, longitude_s, longitude_w)
1372 character(len=*),
intent(in) :: mosaic_file, orog_dir
1374 integer,
intent(in) :: num_tiles, tile
1375 integer,
intent(in) :: i_tile, j_tile
1376 integer,
intent(in) :: ip1_tile, jp1_tile
1378 real(esmf_kind_r8),
intent(out) :: latitude(i_tile, j_tile)
1379 real(esmf_kind_r8),
intent(out) :: latitude_s(i_tile, jp1_tile)
1380 real(esmf_kind_r8),
intent(out) :: latitude_w(ip1_tile, j_tile)
1381 real(esmf_kind_r8),
intent(out) :: longitude(i_tile, j_tile)
1382 real(esmf_kind_r8),
intent(out) :: longitude_s(i_tile, jp1_tile)
1383 real(esmf_kind_r8),
intent(out) :: longitude_w(ip1_tile, j_tile)
1385 character(len=50) :: grid_files(num_tiles)
1386 character(len=255) :: grid_file
1388 integer :: error, id_var, ncid
1389 integer :: id_dim, nxp, nyp, i, j, ii, jj
1391 real(esmf_kind_r8),
allocatable :: tmpvar(:,:)
1393 print*,
"- READ MODEL GRID FILE"
1395 print*,
'- OPEN MOSAIC FILE: ', trim(mosaic_file)
1396 error=nf90_open(trim(mosaic_file), nf90_nowrite, ncid)
1397 call netcdf_err(error,
'opening mosaic file')
1399 print*,
"- READ GRID FILE NAMES"
1400 error=nf90_inq_varid(ncid,
'gridfiles', id_var)
1401 call netcdf_err(error,
'reading gridfiles id')
1402 error=nf90_get_var(ncid, id_var, grid_files)
1403 call netcdf_err(error,
'reading gridfiles')
1405 error = nf90_close(ncid)
1407 grid_file = trim(orog_dir) // trim(grid_files(tile))
1409 print*,
'- OPEN GRID FILE: ', trim(grid_file)
1410 error=nf90_open(trim(grid_file), nf90_nowrite, ncid)
1411 call netcdf_err(error,
'opening grid file')
1413 print*,
'- READ NXP ID'
1414 error=nf90_inq_dimid(ncid,
'nxp', id_dim)
1415 call netcdf_err(error,
'reading nxp id')
1418 error=nf90_inquire_dimension(ncid,id_dim,len=nxp)
1419 call netcdf_err(error,
'reading nxp')
1421 print*,
'- READ NYP ID'
1422 error=nf90_inq_dimid(ncid,
'nyp', id_dim)
1423 call netcdf_err(error,
'reading nyp id')
1426 error=nf90_inquire_dimension(ncid,id_dim,len=nyp)
1427 call netcdf_err(error,
'reading nyp')
1429 if ((nxp/2 /= i_tile) .or. (nyp/2 /= j_tile))
then
1430 call error_handler(
"DIMENSION MISMATCH IN GRID FILE.", 1)
1433 allocate(tmpvar(nxp,nyp))
1435 print*,
'- READ LONGITUDE ID'
1436 error=nf90_inq_varid(ncid,
'x', id_var)
1437 call netcdf_err(error,
'reading longitude id')
1439 print*,
'- READ LONGITUDE'
1440 error=nf90_get_var(ncid, id_var, tmpvar)
1441 call netcdf_err(error,
'reading longitude')
1447 longitude(i,j) = tmpvar(ii,jj)
1455 longitude_s(i,j) = tmpvar(ii,jj)
1463 longitude_w(i,j) = tmpvar(ii,jj)
1467 print*,
'- READ LATITUDE ID'
1468 error=nf90_inq_varid(ncid,
'y', id_var)
1469 call netcdf_err(error,
'reading latitude id')
1471 print*,
'- READ LATIITUDE'
1472 error=nf90_get_var(ncid, id_var, tmpvar)
1473 call netcdf_err(error,
'reading latitude')
1479 latitude(i,j) = tmpvar(ii,jj)
1487 latitude_s(i,j) = tmpvar(ii,jj)
1495 latitude_w(i,j) = tmpvar(ii,jj)
1501 error = nf90_close(ncid)
1646 subroutine gdt_to_gds(igdtnum, igdstmpl, igdtlen, kgds, ni, nj, res)
1650 integer,
intent(in ) :: igdtnum, igdtlen, igdstmpl(igdtlen)
1651 integer,
intent( out) :: kgds(200), ni, nj
1652 integer :: iscale, i
1654 real,
intent( out) :: res
1656 real :: clatr, slatr, clonr, dpr, slat
1657 real :: slat0, clat0, clat, clon, rlat
1658 real :: rlon0, rlon, hs
1662 if (igdtnum.eq.32769)
then
1664 iscale=igdstmpl(10)*igdstmpl(11)
1665 if (iscale == 0) iscale = 1e6
1672 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1674 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1678 if (igdstmpl(1)==2 ) kgds(6)=64
1679 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1680 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1682 kgds(7)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1684 kgds(8)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1686 kgds(9)=nint(float(igdstmpl(17))/float(iscale)*1000.)
1688 kgds(10)=nint(float(igdstmpl(18))/float(iscale)*1000.)
1692 if (btest(igdstmpl(19),7)) kgds(11) = 128
1693 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1694 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
1696 kgds(12)=nint(float(igdstmpl(20))/float(iscale)*1000.)
1698 kgds(13)=nint(float(igdstmpl(21))/float(iscale)*1000.)
1704 res = ((float(kgds(9)) / 1000.0) + (float(kgds(10)) / 1000.0)) &
1707 elseif (igdtnum.eq.1)
then
1710 iscale=igdstmpl(10)*igdstmpl(11)
1711 if (iscale == 0) iscale = 1e6
1719 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1721 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1725 if (igdstmpl(1)==2 ) kgds(6)=64
1726 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1727 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1729 kgds(7)=nint(float(igdstmpl(20))/float(iscale)*1000.)
1731 kgds(8)=nint(float(igdstmpl(21))/float(iscale)*1000.)
1733 kgds(7) = kgds(7) + 90000.0
1734 print*,
"INPUT LAT, LON CENTER ", kgds(7), kgds(8)
1736 dpr = 180.0/3.1415926
1737 clatr=cos((float(kgds(4))/1000.0)/dpr)
1738 slatr=sin((float(kgds(4))/1000.0)/dpr)
1739 clonr=cos((float(kgds(5))/1000.0)/dpr)
1740 slat0=sin((float(kgds(7))/1000.0)/dpr)
1741 clat0=cos((float(kgds(7))/1000.0)/dpr)
1743 slat=clat0*slatr+slat0*clatr*clonr
1744 clat=sqrt(1-slat**2)
1745 clon=(clat0*clatr*clonr-slat0*slatr)/clat
1746 clon=min(max(clon,-1.0),1.0)
1750 rlon0=float(kgds(8))/1000.0
1752 if ((kgds(5)-kgds(8)) > 0)
then
1758 rlon = mod(rlon0+hs*dpr*acos(clon)+3600,360.0)
1760 kgds(4)=nint(rlat*1000.)
1761 kgds(5)=nint(rlon*1000.)
1763 kgds(12)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1765 kgds(13)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1768 clatr=cos((float(kgds(12))/1000.0)/dpr)
1769 slatr=sin((float(kgds(12))/1000.0)/dpr)
1770 clonr=cos((float(kgds(13))/1000.0)/dpr)
1772 slat=clat0*slatr+slat0*clatr*clonr
1775 clat=sqrt(1-slat**2)
1776 clon=(clat0*clatr*clonr-slat0*slatr)/clat
1777 clon=min(max(clon,-1.0),1.0)
1779 if ((kgds(13)-kgds(8)) > 0)
then
1785 rlon = mod(rlon0+hs*dpr*acos(clon)+3600,360.0)
1787 print*,
'got here last point ',kgds(12), kgds(13)
1788 print*,
'got here last point rotated ', rlat, rlon
1790 kgds(12)=nint(rlat*1000.)
1791 kgds(13)=nint(rlon*1000.)
1793 kgds(9)=igdstmpl(17)
1794 kgds(10)=igdstmpl(18)
1797 if (btest(igdstmpl(19),7)) kgds(11) = 128
1798 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1799 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
1804 res = ((float(kgds(9)) / 1.e6) + (float(kgds(10)) / 1.e6)) &
1809 print*,
'final kgds ',i,kgds(i)
1813 elseif(igdtnum==30)
then
1822 kgds(4) = nint(float(igdstmpl(10))/1000.0)
1823 kgds(5) = nint(float(igdstmpl(11))/1000.0)
1826 if (igdstmpl(1)==2 ) kgds(6)=64
1827 if ( btest(igdstmpl(12),4).OR.btest(igdstmpl(12),5) ) kgds(6)=kgds(6)+128
1828 if ( btest(igdstmpl(12),3) ) kgds(6)=kgds(6)+8
1830 kgds(7) = nint(float(igdstmpl(14))/1000.0)
1831 kgds(8) = nint(float(igdstmpl(15))/1000.0)
1832 kgds(9) = nint(float(igdstmpl(16))/1000.0)
1836 if (btest(igdstmpl(18),7)) kgds(11) = 128
1837 if (btest(igdstmpl(18),6)) kgds(11) = kgds(11) + 64
1838 if (btest(igdstmpl(18),5)) kgds(11) = kgds(11) + 32
1840 kgds(12) = nint(float(igdstmpl(19))/1000.0)
1841 kgds(13) = nint(float(igdstmpl(20))/1000.0)
1845 elseif(igdtnum==0)
then
1847 iscale=igdstmpl(10)*igdstmpl(11)
1848 if (iscale == 0) iscale = 1e6
1854 kgds(4)=nint(float(igdstmpl(12))/float(iscale)*1000.)
1855 kgds(5)=nint(float(igdstmpl(13))/float(iscale)*1000.)
1858 if (igdstmpl(1)==2 ) kgds(6)=64
1859 if ( btest(igdstmpl(14),4).OR.btest(igdstmpl(14),5) ) kgds(6)=kgds(6)+128
1860 if ( btest(igdstmpl(14),3) ) kgds(6)=kgds(6)+8
1862 kgds(7)=nint(float(igdstmpl(15))/float(iscale)*1000.)
1863 kgds(8)=nint(float(igdstmpl(16))/float(iscale)*1000.)
1864 kgds(9)=nint(float(igdstmpl(17))/float(iscale)*1000.)
1865 kgds(10)=nint(float(igdstmpl(18))/float(iscale)*1000.)
1868 if (btest(igdstmpl(19),7)) kgds(11) = 128
1869 if (btest(igdstmpl(19),6)) kgds(11) = kgds(11) + 64
1870 if (btest(igdstmpl(19),5)) kgds(11) = kgds(11) + 32
1878 call error_handler(
"UNRECOGNIZED INPUT GRID TYPE ", 1)