39 use utilities,
only : error_handler, &
67 character(len=50),
private,
allocatable ::
slevs(:)
83 integer,
intent(in) :: localpet
97 elseif (trim(
input_type) ==
"gaussian_netcdf")
then
114 elseif (trim(
input_type) ==
"gaussian_nemsio")
then
116 call read_input_atm_gaussian_nemsio_file(localpet)
122 elseif (trim(
input_type) ==
"gfs_gaussian_nemsio")
then
124 call read_input_atm_gfs_gaussian_nemsio_file(localpet)
132 call read_input_atm_gfs_sigio_file(localpet)
157 print*,
"- INITIALIZE ATMOSPHERIC ESMF FIELDS."
159 print*,
"- CALL FieldCreate FOR INPUT GRID SURFACE PRESSURE."
161 typekind=esmf_typekind_r8, &
162 staggerloc=esmf_staggerloc_center, rc=rc)
163 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
164 call error_handler(
"IN FieldCreate", rc)
166 print*,
"- CALL FieldCreate FOR INPUT GRID TERRAIN."
168 typekind=esmf_typekind_r8, &
169 staggerloc=esmf_staggerloc_center, rc=rc)
170 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
171 call error_handler(
"IN FieldCreate", rc)
173 print*,
"- CALL FieldCreate FOR INPUT GRID xwind."
175 typekind=esmf_typekind_r8, &
176 staggerloc=esmf_staggerloc_center, &
177 ungriddedlbound=(/1/), &
179 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
180 call error_handler(
"IN FieldCreate", rc)
182 print*,
"- CALL FieldCreate FOR INPUT GRID ywind."
184 typekind=esmf_typekind_r8, &
185 staggerloc=esmf_staggerloc_center, &
186 ungriddedlbound=(/1/), &
188 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
189 call error_handler(
"IN FieldCreate", rc)
191 print*,
"- CALL FieldCreate FOR INPUT GRID zwind."
193 typekind=esmf_typekind_r8, &
194 staggerloc=esmf_staggerloc_center, &
195 ungriddedlbound=(/1/), &
197 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
198 call error_handler(
"IN FieldCreate", rc)
200 print*,
"- CALL FieldCreate FOR INPUT GRID TEMPERATURE."
202 typekind=esmf_typekind_r8, &
203 staggerloc=esmf_staggerloc_center, &
204 ungriddedlbound=(/1/), &
206 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
207 call error_handler(
"IN FieldCreate", rc)
212 print*,
"- CALL FieldCreate FOR INPUT GRID TRACER ", trim(
tracers_input(i))
214 typekind=esmf_typekind_r8, &
215 staggerloc=esmf_staggerloc_center, &
216 ungriddedlbound=(/1/), &
218 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
219 call error_handler(
"IN FieldCreate", rc)
222 print*,
"- CALL FieldCreate FOR INPUT GRID DZDT."
224 typekind=esmf_typekind_r8, &
225 staggerloc=esmf_staggerloc_center, &
226 ungriddedlbound=(/1/), &
228 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
229 call error_handler(
"IN FieldCreate", rc)
231 print*,
"- CALL FieldCreate FOR INPUT GRID U."
233 typekind=esmf_typekind_r8, &
234 staggerloc=esmf_staggerloc_center, &
235 ungriddedlbound=(/1/), &
237 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
238 call error_handler(
"IN FieldCreate", rc)
240 print*,
"- CALL FieldCreate FOR INPUT GRID V."
242 typekind=esmf_typekind_r8, &
243 staggerloc=esmf_staggerloc_center, &
244 ungriddedlbound=(/1/), &
246 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
247 call error_handler(
"IN FieldCreate", rc)
249 print*,
"- CALL FieldCreate FOR INPUT GRID PRESSURE."
251 typekind=esmf_typekind_r8, &
252 staggerloc=esmf_staggerloc_center, &
253 ungriddedlbound=(/1/), &
255 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
256 call error_handler(
"IN FieldCreate", rc)
266 subroutine read_input_atm_gfs_sigio_file(localpet)
272 integer,
intent(in) :: localpet
274 character(len=300) :: the_file
276 integer(sigio_intkind) :: iret
277 integer :: rc, i, j, k
278 integer :: clb(3), cub(3)
280 real(esmf_kind_r8) :: ak, bk
281 real(esmf_kind_r8),
allocatable :: dummy2d(:,:)
282 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:)
283 real(esmf_kind_r8),
allocatable :: dummy3d2(:,:,:)
284 real(esmf_kind_r8),
pointer :: pptr(:,:,:), psptr(:,:)
285 real(esmf_kind_r8),
allocatable :: pi(:,:,:)
287 type(sigio_head) :: sighead
288 type(sigio_dbta) :: sigdata
292 print*,
"- ATMOSPHERIC DATA IN SIGIO FORMAT."
293 print*,
"- OPEN AND READ: ", trim(the_file)
295 call sigio_sropen(21, trim(the_file), iret)
298 call error_handler(
"OPENING SPECTRAL GFS SIGIO FILE.", rc)
300 call sigio_srhead(21, sighead, iret)
303 call error_handler(
"READING SPECTRAL GFS SIGIO FILE.", rc)
310 call error_handler(
"WRONG NUMBER OF TRACERS EXPECTED.", 99)
313 if (sighead%idvt == 0 .or. sighead%idvt == 21)
then
317 call error_handler(
"TRACERS SELECTED DO NOT MATCH FILE CONTENTS.", 99)
320 print*,
'- UNRECOGNIZED IDVT: ', sighead%idvt
321 call error_handler(
"UNRECOGNIZED IDVT", 99)
330 if (localpet == 0)
then
335 allocate(dummy2d(0,0))
336 allocate(dummy3d(0,0,0))
337 allocate(dummy3d2(0,0,0))
340 if (localpet == 0)
then
341 call sigio_aldbta(sighead, sigdata, iret)
344 call error_handler(
"ALLOCATING SIGDATA.", rc)
346 call sigio_srdbta(21, sighead, sigdata, iret)
349 call error_handler(
"READING SIGDATA.", rc)
351 call sptez(0,sighead%jcap,4,
i_input,
j_input, sigdata%ps, dummy2d, 1)
352 dummy2d = exp(dummy2d) * 1000.0
353 print*,
'surface pres ',maxval(dummy2d),minval(dummy2d)
356 print*,
"- CALL FieldScatter FOR SURFACE PRESSURE."
357 call esmf_fieldscatter(
ps_input_grid, dummy2d, rootpet=0, rc=rc)
358 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
359 call error_handler(
"IN FieldScatter", rc)
361 if (localpet == 0)
then
362 call sptez(0,sighead%jcap,4,
i_input,
j_input, sigdata%hs, dummy2d, 1)
363 print*,
'terrain ',maxval(dummy2d),minval(dummy2d)
366 print*,
"- CALL FieldScatter FOR TERRAIN."
368 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
369 call error_handler(
"IN FieldScatter", rc)
373 if (localpet == 0)
then
374 call sptezm(0,sighead%jcap,4,
i_input,
j_input,
lev_input, sigdata%q(:,:,k), dummy3d, 1)
375 print*,trim(
tracers_input(k)),maxval(dummy3d),minval(dummy3d)
378 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(k))
380 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
381 call error_handler(
"IN FieldScatter", rc)
385 if (localpet == 0)
then
387 print*,
'temp ',maxval(dummy3d),minval(dummy3d)
390 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE."
392 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
393 call error_handler(
"IN FieldScatter", rc)
400 if (localpet == 0)
then
401 print*,
"- NO VERTICAL VELOCITY RECORD. SET TO ZERO."
405 print*,
"- CALL FieldScatter FOR INPUT DZDT."
407 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
408 call error_handler(
"IN FieldScatter", rc)
410 if (localpet == 0)
then
411 call sptezmv(0, sighead%jcap, 4,
i_input,
j_input,
lev_input, sigdata%d, sigdata%z, dummy3d, dummy3d2, 1)
412 print*,
'u ',maxval(dummy3d),minval(dummy3d)
413 print*,
'v ',maxval(dummy3d2),minval(dummy3d2)
416 print*,
"- CALL FieldScatter FOR INPUT U-WIND."
417 call esmf_fieldscatter(
u_input_grid, dummy3d, rootpet=0, rc=rc)
418 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
419 call error_handler(
"IN FieldScatter", rc)
421 print*,
"- CALL FieldScatter FOR INPUT V-WIND."
422 call esmf_fieldscatter(
v_input_grid, dummy3d2, rootpet=0, rc=rc)
423 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
424 call error_handler(
"IN FieldScatter", rc)
426 deallocate(dummy2d, dummy3d, dummy3d2)
428 if (localpet == 0)
call sigio_axdbta(sigdata, iret)
430 call sigio_sclose(21, iret)
442 print*,
"- COMPUTE 3-D PRESSURE."
444 print*,
"- CALL FieldGet FOR 3-D PRES."
447 computationallbound=clb, &
448 computationalubound=cub, &
449 farrayptr=pptr, rc=rc)
450 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
451 call error_handler(
"IN FieldGet", rc)
453 print*,
"- CALL FieldGet FOR SURFACE PRESSURE."
456 farrayptr=psptr, rc=rc)
457 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
458 call error_handler(
"IN FieldGet", rc)
464 allocate(pi(clb(1):cub(1),clb(2):cub(2),1:
levp1_input),stat=rc)
467 ak = sighead%vcoord(k,1)
468 bk = sighead%vcoord(k,2)
471 pi(i,j,k) = ak + bk*psptr(i,j)
476 if (localpet == 0)
then
477 print*,
'pres int ',psptr(clb(1),clb(2)),pi(clb(1),clb(2),:)
487 pptr(i,j,k) = (pi(i,j,k)+pi(i,j,k+1))/2.0_esmf_kind_r8
494 if (localpet == 0)
then
495 print*,
'pres ',psptr(clb(1),clb(2)),pptr(clb(1),clb(2),:)
498 end subroutine read_input_atm_gfs_sigio_file
508 subroutine read_input_atm_gfs_gaussian_nemsio_file(localpet)
512 integer,
intent(in) :: localpet
514 character(len=300) :: the_file
515 character(len=20) :: vlevtyp, vname
517 integer(nemsio_intkind) :: vlev, iret
518 integer :: i, j, k, n, rc
519 integer :: clb(3), cub(3)
521 real(nemsio_realkind),
allocatable :: vcoord(:,:,:)
522 real(nemsio_realkind),
allocatable :: dummy(:)
523 real(esmf_kind_r8),
allocatable :: dummy2d(:,:)
524 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:)
525 real(esmf_kind_r8) :: ak, bk
526 real(esmf_kind_r8),
allocatable :: pi(:,:,:)
527 real(esmf_kind_r8),
pointer :: pptr(:,:,:), psptr(:,:)
529 type(nemsio_gfile) :: gfile
533 print*,
"- READ ATMOS DATA FROM SPECTRAL GFS NEMSIO FILE: ", trim(the_file)
535 print*,
"- OPEN FILE."
536 call nemsio_open(gfile, the_file,
"read", iret=iret)
537 if (iret /= 0)
call error_handler(
"OPENING SPECTRAL GFS NEMSIO ATM FILE.", iret)
539 print*,
"- READ NUMBER OF VERTICAL LEVELS."
540 call nemsio_getfilehead(gfile, iret=iret, dimz=
lev_input)
541 if (iret /= 0)
call error_handler(
"READING NUMBER OF VERTICAL LEVLES.", iret)
547 print*,
"- READ VERTICAL COORDINATE INFO."
548 call nemsio_getfilehead(gfile, iret=iret, vcoord=vcoord)
549 if (iret /= 0)
call error_handler(
"READING VERTICAL COORDINATE INFO.", iret)
557 if (localpet == 0)
then
563 allocate(dummy2d(0,0))
564 allocate(dummy3d(0,0,0))
572 if (localpet == 0)
then
573 print*,
"- READ TEMPERATURE."
575 vlevtyp =
"mid layer"
577 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
578 if (iret /= 0)
call error_handler(
"READING TEMPERATURE RECORD.", iret)
584 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE."
586 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
587 call error_handler(
"IN FieldScatter", rc)
591 if (localpet == 0)
then
594 vlevtyp =
"mid layer"
596 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
597 if (iret /= 0)
call error_handler(
"READING TRACER RECORD.", iret)
603 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(n))
605 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
606 call error_handler(
"IN FieldScatter", rc)
610 if (localpet == 0)
then
611 print*,
"- READ U-WINDS."
613 vlevtyp =
"mid layer"
615 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
616 if (iret /= 0)
call error_handler(
"READING U-WIND RECORD.", iret)
622 print*,
"- CALL FieldScatter FOR INPUT U-WIND."
623 call esmf_fieldscatter(
u_input_grid, dummy3d, rootpet=0, rc=rc)
624 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
625 call error_handler(
"IN FieldScatter", rc)
627 if (localpet == 0)
then
628 print*,
"- READ V-WINDS."
630 vlevtyp =
"mid layer"
632 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
633 if (iret /= 0)
call error_handler(
"READING V-WIND RECORD.", iret)
639 print*,
"- CALL FieldScatter FOR INPUT V-WIND."
640 call esmf_fieldscatter(
v_input_grid, dummy3d, rootpet=0, rc=rc)
641 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
642 call error_handler(
"IN FieldScatter", rc)
649 if (localpet == 0)
then
650 print*,
"- NO VERTICAL VELOCITY RECORD. SET TO ZERO."
654 print*,
"- CALL FieldScatter FOR INPUT DZDT."
656 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
657 call error_handler(
"IN FieldScatter", rc)
659 if (localpet == 0)
then
664 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
665 if (iret /= 0)
call error_handler(
"READING HGT RECORD.", iret)
670 print*,
"- CALL FieldScatter FOR TERRAIN."
672 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
673 call error_handler(
"IN FieldScatter", rc)
675 if (localpet == 0)
then
676 print*,
"- READ PRES."
680 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
681 if (iret /= 0)
call error_handler(
"READING PRES RECORD.", iret)
686 print*,
"- CALL FieldScatter FOR SURFACE PRESSURE."
687 call esmf_fieldscatter(
ps_input_grid, dummy2d, rootpet=0, rc=rc)
688 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
689 call error_handler(
"IN FieldScatter", rc)
691 call nemsio_close(gfile)
693 deallocate(dummy, dummy2d, dummy3d)
705 print*,
"- COMPUTE 3-D PRESSURE."
707 print*,
"- CALL FieldGet FOR 3-D PRES."
710 computationallbound=clb, &
711 computationalubound=cub, &
712 farrayptr=pptr, rc=rc)
713 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
714 call error_handler(
"IN FieldGet", rc)
716 print*,
"- CALL FieldGet FOR SURFACE PRESSURE."
719 farrayptr=psptr, rc=rc)
720 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
721 call error_handler(
"IN FieldGet", rc)
727 allocate(pi(clb(1):cub(1),clb(2):cub(2),1:
levp1_input))
734 pi(i,j,k) = ak + bk*psptr(i,j)
748 pptr(i,j,k) = (pi(i,j,k)+pi(i,j,k+1))/2.0
755 end subroutine read_input_atm_gfs_gaussian_nemsio_file
764 subroutine read_input_atm_gaussian_nemsio_file(localpet)
768 integer,
intent(in) :: localpet
770 character(len=300) :: the_file
771 character(len=20) :: vlevtyp, vname
773 integer :: i, j, k, n
774 integer :: rc, clb(3), cub(3)
775 integer(nemsio_intkind) :: vlev, iret
777 real(nemsio_realkind),
allocatable :: vcoord(:,:,:)
778 real(nemsio_realkind),
allocatable :: dummy(:)
779 real(esmf_kind_r8),
allocatable :: dummy2d(:,:)
780 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:)
781 real(esmf_kind_r8),
pointer :: presptr(:,:,:), psptr(:,:)
782 real(esmf_kind_r8),
pointer :: dpresptr(:,:,:)
783 real(esmf_kind_r8),
allocatable :: pres_interface(:)
785 type(nemsio_gfile) :: gfile
789 print*,
"- READ ATMOS DATA FROM GAUSSIAN NEMSIO FILE: ", trim(the_file)
791 print*,
"- OPEN FILE."
792 call nemsio_open(gfile, the_file,
"read", iret=iret)
793 if (iret /= 0)
call error_handler(
"OPENING GAUSSIAN NEMSIO ATM FILE.", iret)
795 print*,
"- READ NUMBER OF VERTICAL LEVELS."
796 call nemsio_getfilehead(gfile, iret=iret, dimz=
lev_input)
797 if (iret /= 0)
call error_handler(
"READING NUMBER OF VERTICAL LEVLES.", iret)
803 print*,
"- READ VERTICAL COORDINATE INFO."
804 call nemsio_getfilehead(gfile, iret=iret, vcoord=vcoord)
805 if (iret /= 0)
call error_handler(
"READING VERTICAL COORDINATE INFO.", iret)
813 print*,
"- CALL FieldCreate FOR INPUT DPRES."
815 typekind=esmf_typekind_r8, &
816 staggerloc=esmf_staggerloc_center, &
817 ungriddedlbound=(/1/), &
819 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
820 call error_handler(
"IN FieldCreate", rc)
822 if (localpet == 0)
then
828 allocate(dummy2d(0,0))
829 allocate(dummy3d(0,0,0))
837 if (localpet == 0)
then
838 print*,
"- READ TEMPERATURE."
840 vlevtyp =
"mid layer"
842 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
843 if (iret /= 0)
call error_handler(
"READING TEMPERATURE RECORD.", iret)
845 print*,
'temp check after read ',vlev, dummy3d(1,1,vlev)
849 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE."
851 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
852 call error_handler(
"IN FieldScatter", rc)
856 if (localpet == 0)
then
859 vlevtyp =
"mid layer"
861 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
862 if (iret /= 0)
call error_handler(
"READING TRACER RECORD.", iret)
863 print*,
'tracer ',vlev, maxval(dummy),minval(dummy)
868 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(n))
870 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
871 call error_handler(
"IN FieldScatter", rc)
875 if (localpet == 0)
then
876 print*,
"- READ U-WINDS."
878 vlevtyp =
"mid layer"
880 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
881 if (iret /= 0)
call error_handler(
"READING U-WIND RECORD.", iret)
882 print*,
'ugrd ',vlev, maxval(dummy),minval(dummy)
887 print*,
"- CALL FieldScatter FOR INPUT U-WIND."
888 call esmf_fieldscatter(
u_input_grid, dummy3d, rootpet=0, rc=rc)
889 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
890 call error_handler(
"IN FieldScatter", rc)
892 if (localpet == 0)
then
893 print*,
"- READ V-WINDS."
895 vlevtyp =
"mid layer"
897 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
898 if (iret /= 0)
call error_handler(
"READING V-WIND RECORD.", iret)
899 print*,
'vgrd ',vlev, maxval(dummy),minval(dummy)
904 print*,
"- CALL FieldScatter FOR INPUT V-WIND."
905 call esmf_fieldscatter(
v_input_grid, dummy3d, rootpet=0, rc=rc)
906 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
907 call error_handler(
"IN FieldScatter", rc)
909 if (localpet == 0)
then
910 print*,
"- READ DPRES."
912 vlevtyp =
"mid layer"
914 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
915 if (iret /= 0)
call error_handler(
"READING DPRES RECORD.", iret)
916 print*,
'dpres ',vlev, maxval(dummy),minval(dummy)
921 print*,
"- CALL FieldScatter FOR INPUT DPRES."
923 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
924 call error_handler(
"IN FieldScatter", rc)
926 if (localpet == 0)
then
927 print*,
"- READ DZDT."
929 vlevtyp =
"mid layer"
931 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
932 if (iret /= 0)
call error_handler(
"READING DZDT RECORD.", iret)
933 print*,
'dzdt ',vlev, maxval(dummy),minval(dummy)
938 print*,
"- CALL FieldScatter FOR INPUT DZDT."
940 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
941 call error_handler(
"IN FieldScatter", rc)
943 if (localpet == 0)
then
948 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
949 if (iret /= 0)
call error_handler(
"READING HGT RECORD.", iret)
950 print*,
'hgt ',vlev, maxval(dummy),minval(dummy)
954 print*,
"- CALL FieldScatter FOR TERRAIN."
956 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
957 call error_handler(
"IN FieldScatter", rc)
959 call nemsio_close(gfile)
961 deallocate(dummy, dummy2d, dummy3d)
977 print*,
"- COMPUTE 3-D PRESSURE."
979 print*,
"- CALL FieldGet FOR DELTA PRESSURE."
982 computationallbound=clb, &
983 computationalubound=cub, &
984 farrayptr=dpresptr, rc=rc)
985 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
986 call error_handler(
"IN FieldGet", rc)
988 print*,
"- CALL FieldGet FOR 3-D PRESSURE."
991 farrayptr=presptr, rc=rc)
992 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
993 call error_handler(
"IN FieldGet", rc)
995 print*,
"- CALL FieldGet FOR SURFACE PRESSURE."
998 farrayptr=psptr, rc=rc)
999 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1000 call error_handler(
"IN FieldGet", rc)
1004 if (localpet == 0)
then
1005 do k = clb(3), cub(3)
1006 print*,
'dpres is ',cub(1),cub(2),k, dpresptr(cub(1),cub(2),k)
1010 do i = clb(1), cub(1)
1011 do j = clb(2), cub(2)
1014 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
1016 psptr(i,j) = pres_interface(1)
1018 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1025 if (localpet == 0)
then
1026 print*,
'psfc is ',clb(1),clb(2),psptr(clb(1),clb(2))
1027 print*,
'pres is ',clb(1),clb(2),presptr(clb(1),clb(2),:)
1030 print*,
'pres check 1',localpet,maxval(presptr(:,:,1)),minval(presptr(:,:,1))
1031 print*,
'pres check lev',localpet,maxval(presptr(:,:,
lev_input)),minval(presptr(:,:,
lev_input))
1033 deallocate(pres_interface)
1037 end subroutine read_input_atm_gaussian_nemsio_file
1052 integer,
intent(in) :: localpet
1054 character(len=500) :: tilefile
1057 integer :: clb(3), cub(3)
1058 integer :: rc, tile, ncid, id_var
1059 integer :: error, id_dim, idum(1)
1061 real(esmf_kind_r8),
allocatable :: ak(:)
1062 real(esmf_kind_r8),
pointer :: presptr(:,:,:), psptr(:,:)
1063 real(esmf_kind_r8),
pointer :: dpresptr(:,:,:)
1064 real(esmf_kind_r8),
allocatable :: data_one_tile(:,:)
1065 real(esmf_kind_r8),
allocatable :: data_one_tile_3d(:,:,:)
1066 real(esmf_kind_r8),
allocatable :: pres_interface(:)
1074 call esmf_vmgetglobal(vm, rc=rc)
1075 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1076 call error_handler(
"IN VMGetGlobal", rc)
1080 if (localpet == 0)
then
1081 print*,
"- READ ATM VERTICAL LEVELS FROM: ", trim(tilefile)
1082 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1083 call netcdf_err(error,
'opening: '//trim(tilefile) )
1084 error=nf90_inq_dimid(ncid,
'xaxis_1', id_dim)
1085 call netcdf_err(error,
'reading xaxis_1 id' )
1086 error=nf90_inquire_dimension(ncid,id_dim,len=idum(1))
1087 call netcdf_err(error,
'reading xaxis_1 value' )
1090 call esmf_vmbroadcast(vm, idum, 1, 0, rc=rc)
1091 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1092 call error_handler(
"IN ESMF_VMBroadcast", rc)
1100 if (localpet == 0)
then
1101 error=nf90_inq_varid(ncid,
'ak', id_var)
1102 call netcdf_err(error,
'reading field id' )
1103 error=nf90_get_var(ncid, id_var, ak)
1104 call netcdf_err(error,
'reading ak' )
1105 error = nf90_close(ncid)
1108 call esmf_vmbroadcast(vm, ak,
levp1_input, 0, rc=rc)
1109 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1110 call error_handler(
"IN ESMF_VMBroadcast", rc)
1118 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE."
1120 typekind=esmf_typekind_r8, &
1121 staggerloc=esmf_staggerloc_center, &
1122 ungriddedlbound=(/1/), &
1124 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1125 call error_handler(
"IN FieldCreate", rc)
1131 allocate(data_one_tile_3d(0,0,0))
1132 allocate(data_one_tile(0,0))
1138 print*,
"- READ ATMOSPHERIC CORE FILE: ", trim(tilefile)
1139 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1140 call netcdf_err(error,
'opening: '//trim(tilefile) )
1144 error=nf90_inq_varid(ncid,
'phis', id_var)
1145 call netcdf_err(error,
'reading field id' )
1146 error=nf90_get_var(ncid, id_var, data_one_tile)
1147 call netcdf_err(error,
'reading field' )
1148 data_one_tile = data_one_tile / 9.806_8
1152 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN for tile ",tile
1153 call esmf_fieldscatter(
terrain_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1154 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1155 call error_handler(
"IN FieldScatter", rc)
1166 data_one_tile_3d = 0.0_8
1170 print*,
"- CALL FieldScatter FOR INPUT GRID VERTICAL VELOCITY for tile ",tile
1171 call esmf_fieldscatter(
dzdt_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1172 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1173 call error_handler(
"IN FieldScatter", rc)
1177 error=nf90_inq_varid(ncid,
'T', id_var)
1178 call netcdf_err(error,
'reading field id' )
1179 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1180 call netcdf_err(error,
'reading field' )
1185 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE."
1186 call esmf_fieldscatter(
temp_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1187 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1188 call error_handler(
"IN FieldScatter", rc)
1192 error=nf90_inq_varid(ncid,
'delp', id_var)
1193 call netcdf_err(error,
'reading field id' )
1194 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1195 call netcdf_err(error,
'reading field' )
1200 print*,
"- CALL FieldScatter FOR INPUT DELTA PRESSURE."
1201 call esmf_fieldscatter(
dpres_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1202 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1203 call error_handler(
"IN FieldScatter", rc)
1207 error=nf90_inq_varid(ncid,
'ua', id_var)
1208 call netcdf_err(error,
'reading field id' )
1209 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1210 call netcdf_err(error,
'reading field' )
1215 print*,
"- CALL FieldScatter FOR INPUT GRID U."
1216 call esmf_fieldscatter(
u_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1217 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1218 call error_handler(
"IN FieldScatter", rc)
1222 error=nf90_inq_varid(ncid,
'va', id_var)
1223 call netcdf_err(error,
'reading field id' )
1224 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1225 call netcdf_err(error,
'reading field' )
1230 print*,
"- CALL FieldScatter FOR INPUT GRID V."
1231 call esmf_fieldscatter(
v_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1232 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1233 call error_handler(
"IN FieldScatter", rc)
1241 print*,
"- READ ATMOSPHERIC TRACER FILE: ", trim(tilefile)
1242 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1243 call netcdf_err(error,
'opening: '//trim(tilefile) )
1250 call netcdf_err(error,
'reading field id' )
1251 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1252 call netcdf_err(error,
'reading field' )
1257 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(i))
1258 call esmf_fieldscatter(
tracers_input_grid(i), data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1259 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1260 call error_handler(
"IN FieldScatter", rc)
1277 print*,
"- CALL FieldGet FOR SURFACE PRESSURE."
1279 farrayptr=psptr, rc=rc)
1280 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1281 call error_handler(
"IN FieldGet", rc)
1283 print*,
"- CALL FieldGet FOR PRESSURE."
1285 computationallbound=clb, &
1286 computationalubound=cub, &
1287 farrayptr=presptr, rc=rc)
1288 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1289 call error_handler(
"IN FieldGet", rc)
1291 print*,
"- CALL FieldGet FOR DELTA PRESSURE."
1293 farrayptr=dpresptr, rc=rc)
1294 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1295 call error_handler(
"IN FieldGet", rc)
1299 do i = clb(1), cub(1)
1300 do j = clb(2), cub(2)
1303 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
1306 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1308 psptr(i,j) = pres_interface(1)
1313 deallocate(pres_interface)
1317 deallocate(data_one_tile_3d, data_one_tile)
1333 integer,
intent(in) :: localpet
1335 character(len=500) :: tilefile
1337 integer :: start(3), count(3), iscnt
1338 integer :: error, ncid, num_tracers_file
1339 integer :: id_dim, idim_input, jdim_input
1340 integer :: id_var, rc, npets, max_pets
1341 integer :: kdim, remainder, i, j, k, n
1342 integer :: clb(3), cub(3), idum(5)
1343 integer,
allocatable :: kcount(:), startk(:), displ(:)
1344 integer,
allocatable :: ircnt(:)
1346 real(esmf_kind_r8),
allocatable :: phalf(:)
1347 real(esmf_kind_r8),
allocatable :: pres_interface(:)
1348 real(kind=4), allocatable :: dummy1d(:)
1349 real(kind=4), allocatable :: dummy1dall(:), dummy3dall(:,:,:)
1350 real(esmf_kind_r8),
allocatable :: dummy3dflip(:,:,:)
1351 real(esmf_kind_r8),
allocatable :: dummy(:,:)
1352 real(esmf_kind_r8),
pointer :: presptr(:,:,:), dpresptr(:,:,:)
1353 real(esmf_kind_r8),
pointer :: psptr(:,:)
1357 call esmf_vmgetglobal(vm, rc=rc)
1358 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1359 call error_handler(
"IN VMGetGlobal", rc)
1361 call esmf_vmget(vm, petcount=npets, rc=rc)
1362 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1363 call error_handler(
"IN VMGetGlobal", rc)
1367 if (localpet == 0)
then
1368 print*,
"- READ INPUT ATMOS GAUSSIAN NETCDF FILE HEADER."
1369 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1370 call netcdf_err(error,
'opening: '//trim(tilefile) )
1372 error=nf90_inq_dimid(ncid,
'grid_xt', id_dim)
1373 call netcdf_err(error,
'reading grid_xt id' )
1374 error=nf90_inquire_dimension(ncid,id_dim,len=idum(1))
1375 call netcdf_err(error,
'reading grid_xt value' )
1377 error=nf90_inq_dimid(ncid,
'grid_yt', id_dim)
1378 call netcdf_err(error,
'reading grid_yt id' )
1379 error=nf90_inquire_dimension(ncid,id_dim,len=idum(2))
1380 call netcdf_err(error,
'reading grid_yt value' )
1383 call error_handler(
"DIMENSION MISMATCH BETWEEN ATM AND OROG FILES.", 2)
1386 error=nf90_inq_dimid(ncid,
'pfull', id_dim)
1387 call netcdf_err(error,
'reading pfull id' )
1388 error=nf90_inquire_dimension(ncid,id_dim,len=idum(3))
1389 call netcdf_err(error,
'reading pfull value' )
1391 error=nf90_inq_dimid(ncid,
'phalf', id_dim)
1392 call netcdf_err(error,
'reading phalf id' )
1393 error=nf90_inquire_dimension(ncid,id_dim,len=idum(4))
1394 call netcdf_err(error,
'reading phalf value' )
1396 error=nf90_get_att(ncid, nf90_global,
'ncnsto', idum(5))
1397 call netcdf_err(error,
'reading ntracer value' )
1400 call mpi_barrier(mpi_comm_world,error)
1401 call esmf_vmbroadcast(vm, idum, 5, 0, rc=rc)
1402 idim_input = idum(1)
1403 jdim_input = idum(2)
1406 num_tracers_file = idum(5)
1408 allocate(phalf(idum(4)))
1410 if (localpet == 0)
then
1411 error=nf90_inq_varid(ncid,
'phalf', id_var)
1412 call netcdf_err(error,
'getting phalf varid' )
1413 error=nf90_get_var(ncid, id_var, phalf)
1414 call netcdf_err(error,
'reading phalf varid' )
1415 error = nf90_close(ncid)
1418 call mpi_barrier(mpi_comm_world,error)
1419 call esmf_vmbroadcast(vm, phalf,
levp1_input, 0, rc=rc)
1425 max_pets = min(npets, 6)
1433 allocate(kcount(0:npets-1))
1435 allocate(startk(0:npets-1))
1437 allocate(displ(0:npets-1))
1439 allocate(ircnt(0:npets-1))
1442 do k = 0, max_pets-2
1445 kcount(max_pets-1) = kdim + remainder
1448 do k = 1, max_pets-1
1449 startk(k) = startk(k-1) + kcount(k-1)
1452 ircnt(:) = idim_input * jdim_input * kcount(:)
1455 do k = 1, max_pets-1
1456 displ(k) = displ(k-1) + ircnt(k-1)
1459 iscnt=idim_input*jdim_input*kcount(localpet)
1463 if (localpet <= max_pets-1)
then
1464 print*,
"- OPEN/READ INPUT ATMOS DATA GAUSSIAN NETCDF FILE."
1465 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1466 call netcdf_err(error,
'opening: '//trim(tilefile) )
1467 allocate(dummy1d(idim_input*jdim_input*kcount(localpet)))
1469 allocate(dummy1d(0))
1472 if (localpet == 0)
then
1473 allocate(dummy1dall(idim_input*jdim_input*
lev_input))
1475 allocate(dummy3dall(idim_input,jdim_input,
lev_input))
1477 allocate(dummy3dflip(idim_input,jdim_input,
lev_input))
1479 allocate(dummy(idim_input,jdim_input))
1482 allocate(dummy1dall(0))
1483 allocate(dummy3dall(0,0,0))
1484 allocate(dummy3dflip(0,0,0))
1485 allocate(dummy(0,0))
1494 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE."
1496 typekind=esmf_typekind_r8, &
1497 staggerloc=esmf_staggerloc_center, &
1498 ungriddedlbound=(/1/), &
1500 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1501 call error_handler(
"IN FieldCreate", rc)
1505 if (localpet <= max_pets-1)
then
1506 start = (/1,1,startk(localpet)/)
1507 count = (/idim_input,jdim_input,kcount(localpet)/)
1508 error=nf90_inq_varid(ncid,
'tmp', id_var)
1509 call netcdf_err(error,
'reading tmp field id' )
1510 error=nf90_get_var(ncid, id_var, dummy1d, start=start, count=count)
1511 call netcdf_err(error,
'reading tmp field' )
1514 call esmf_vmgatherv(vm, dummy1d, iscnt, dummy1dall, ircnt, displ, 0, rc=rc)
1515 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1516 call error_handler(
"IN VMGatherV", rc)
1518 if (localpet == 0)
then
1519 dummy3dall = reshape(dummy1dall , (/idim_input,jdim_input,
lev_input/))
1523 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE "
1524 call esmf_fieldscatter(
temp_input_grid, dummy3dflip, rootpet=0, rc=rc)
1525 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1526 call error_handler(
"IN FieldScatter", rc)
1530 if (localpet <= max_pets-1)
then
1531 error=nf90_inq_varid(ncid,
'dpres', id_var)
1532 call netcdf_err(error,
'reading dpres field id' )
1533 error=nf90_get_var(ncid, id_var, dummy1d, start=start, count=count)
1534 call netcdf_err(error,
'reading dpres field' )
1537 call esmf_vmgatherv(vm, dummy1d, iscnt, dummy1dall, ircnt, displ, 0, rc=rc)
1538 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1539 call error_handler(
"IN VMGatherV", rc)
1541 if (localpet == 0)
then
1542 dummy3dall = reshape(dummy1dall , (/idim_input,jdim_input,
lev_input/))
1546 print*,
"- CALL FieldScatter FOR INPUT GRID DPRES "
1548 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1549 call error_handler(
"IN FieldScatter", rc)
1553 if (localpet <= max_pets-1)
then
1554 error=nf90_inq_varid(ncid,
'ugrd', id_var)
1555 call netcdf_err(error,
'reading ugrd field id' )
1556 error=nf90_get_var(ncid, id_var, dummy1d, start=start, count=count)
1557 call netcdf_err(error,
'reading ugrd field' )
1560 call esmf_vmgatherv(vm, dummy1d, iscnt, dummy1dall, ircnt, displ, 0, rc=rc)
1561 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1562 call error_handler(
"IN VMGatherV", rc)
1564 if (localpet == 0)
then
1565 dummy3dall = reshape(dummy1dall , (/idim_input,jdim_input,
lev_input/))
1569 print*,
"- CALL FieldScatter FOR INPUT GRID UGRD "
1570 call esmf_fieldscatter(
u_input_grid, dummy3dflip, rootpet=0, rc=rc)
1571 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1572 call error_handler(
"IN FieldScatter", rc)
1576 if (localpet <= max_pets-1)
then
1577 error=nf90_inq_varid(ncid,
'vgrd', id_var)
1578 call netcdf_err(error,
'reading vgrd field id' )
1579 error=nf90_get_var(ncid, id_var, dummy1d, start=start, count=count)
1580 call netcdf_err(error,
'reading vgrd field' )
1583 call esmf_vmgatherv(vm, dummy1d, iscnt, dummy1dall, ircnt, displ, 0, rc=rc)
1584 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1585 call error_handler(
"IN VMGatherV", rc)
1587 if (localpet == 0)
then
1588 dummy3dall = reshape(dummy1dall , (/idim_input,jdim_input,
lev_input/))
1592 print*,
"- CALL FieldScatter FOR INPUT GRID VGRD "
1593 call esmf_fieldscatter(
v_input_grid, dummy3dflip, rootpet=0, rc=rc)
1594 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1595 call error_handler(
"IN FieldScatter", rc)
1601 if (localpet <= max_pets-1)
then
1603 call netcdf_err(error,
'reading tracer field id' )
1604 error=nf90_get_var(ncid, id_var, dummy1d, start=start, count=count)
1605 call netcdf_err(error,
'reading tracer field' )
1608 call esmf_vmgatherv(vm, dummy1d, iscnt, dummy1dall, ircnt, displ, 0, rc=rc)
1609 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1610 call error_handler(
"IN VMGatherV", rc)
1612 if (localpet == 0)
then
1613 dummy3dall = reshape(dummy1dall , (/idim_input,jdim_input,
lev_input/))
1615 where(dummy3dflip < 0.0) dummy3dflip = 0.0
1618 print*,
"- CALL FieldScatter FOR INPUT GRID ",
tracers_input(n)
1620 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1621 call error_handler(
"IN FieldScatter", rc)
1627 if (localpet == 0)
then
1631 print*,
"- CALL FieldScatter FOR INPUT GRID DZDT"
1632 call esmf_fieldscatter(
dzdt_input_grid, dummy3dflip, rootpet=0, rc=rc)
1633 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1634 call error_handler(
"IN FieldScatter", rc)
1636 deallocate(dummy3dflip, dummy3dall, dummy1d, dummy1dall)
1640 if (localpet==0)
then
1641 print*,
"- READ TERRAIN."
1642 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
1643 call netcdf_err(error,
'reading hgtsfc field id' )
1644 error=nf90_get_var(ncid, id_var, dummy)
1645 call netcdf_err(error,
'reading hgtsfc field' )
1648 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN."
1650 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1651 call error_handler(
"IN FieldScatter", rc)
1655 if (localpet==0)
then
1656 print*,
"- READ SURFACE P."
1657 error=nf90_inq_varid(ncid,
'pressfc', id_var)
1658 call netcdf_err(error,
'reading pressfc field id' )
1659 error=nf90_get_var(ncid, id_var, dummy)
1660 call netcdf_err(error,
'reading pressfc field' )
1663 print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE P."
1664 call esmf_fieldscatter(
ps_input_grid, dummy, rootpet=0, rc=rc)
1665 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1666 call error_handler(
"IN FieldScatter", rc)
1668 deallocate(kcount, startk, displ, ircnt, dummy)
1670 if (localpet <= max_pets-1)
then
1671 error = nf90_close(ncid)
1684 print*,
"- CALL FieldGet FOR PRESSURE."
1686 computationallbound=clb, &
1687 computationalubound=cub, &
1688 farrayptr=presptr, rc=rc)
1689 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1690 call error_handler(
"IN FieldGet", rc)
1692 print*,
"- CALL FieldGet FOR DELTA PRESSURE."
1694 farrayptr=dpresptr, rc=rc)
1695 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1696 call error_handler(
"IN FieldGet", rc)
1698 print*,
"- CALL FieldGet FOR SURFACE PRESSURE."
1700 farrayptr=psptr, rc=rc)
1701 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1702 call error_handler(
"IN FieldGet", rc)
1719 do i = clb(1), cub(1)
1720 do j = clb(2), cub(2)
1723 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
1725 psptr(i,j) = pres_interface(1)
1727 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1732 deallocate(pres_interface, phalf)
1753 integer,
intent(in) :: localpet
1755 character(len=500) :: tilefile
1757 integer :: error, ncid, rc, tile
1758 integer :: id_dim, idim_input, jdim_input
1759 integer :: id_var, i, j, k, n, idum(5)
1760 integer :: clb(3), cub(3), num_tracers_file
1762 real(esmf_kind_r8),
allocatable :: data_one_tile(:,:)
1763 real(esmf_kind_r8),
allocatable :: data_one_tile_3d(:,:,:)
1764 real(esmf_kind_r8),
pointer :: presptr(:,:,:), dpresptr(:,:,:)
1765 real(esmf_kind_r8),
pointer :: psptr(:,:)
1766 real(esmf_kind_r8),
allocatable :: pres_interface(:)
1770 call esmf_vmgetglobal(vm, rc=rc)
1771 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1772 call error_handler(
"IN VMGetGlobal", rc)
1774 if (localpet == 0)
then
1775 print*,
"- READ INPUT ATMOS DATA FROM TILED HISTORY FILES."
1778 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1779 call netcdf_err(error,
'opening: '//trim(tilefile) )
1781 error=nf90_inq_dimid(ncid,
'grid_xt', id_dim)
1782 call netcdf_err(error,
'reading grid_xt id' )
1783 error=nf90_inquire_dimension(ncid,id_dim,len=idum(1))
1784 call netcdf_err(error,
'reading grid_xt value' )
1786 error=nf90_inq_dimid(ncid,
'grid_yt', id_dim)
1787 call netcdf_err(error,
'reading grid_yt id' )
1788 error=nf90_inquire_dimension(ncid,id_dim,len=idum(2))
1789 call netcdf_err(error,
'reading grid_yt value' )
1792 call error_handler(
"DIMENSION MISMATCH BETWEEN SFC AND OROG FILES.", 2)
1795 error=nf90_inq_dimid(ncid,
'pfull', id_dim)
1796 call netcdf_err(error,
'reading pfull id' )
1797 error=nf90_inquire_dimension(ncid,id_dim,len=idum(3))
1798 call netcdf_err(error,
'reading pfull value' )
1800 error=nf90_inq_dimid(ncid,
'phalf', id_dim)
1801 call netcdf_err(error,
'reading phalf id' )
1802 error=nf90_inquire_dimension(ncid,id_dim,len=idum(4))
1803 call netcdf_err(error,
'reading phalf value' )
1805 error=nf90_get_att(ncid, nf90_global,
'ncnsto', idum(5))
1806 call netcdf_err(error,
'reading ntracer value' )
1808 error = nf90_close(ncid)
1811 call esmf_vmbroadcast(vm, idum, 5, 0, rc=rc)
1812 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1813 call error_handler(
"IN ESMF_VMBroadcast", rc)
1815 idim_input = idum(1)
1816 jdim_input = idum(2)
1819 num_tracers_file = idum(5)
1821 print*,
'- FILE HAS ', num_tracers_file,
' TRACERS.'
1830 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE."
1832 typekind=esmf_typekind_r8, &
1833 staggerloc=esmf_staggerloc_center, &
1834 ungriddedlbound=(/1/), &
1836 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1837 call error_handler(
"IN FieldCreate", rc)
1843 allocate(data_one_tile(0,0))
1844 allocate(data_one_tile_3d(0,0,0))
1850 print*,
"- READ ATMOSPHERIC DATA FROM: ", trim(tilefile)
1851 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1852 call netcdf_err(error,
'opening: '//trim(tilefile) )
1865 data_one_tile_3d = 0.0_8
1869 print*,
"- CALL FieldScatter FOR INPUT GRID VERTICAL VELOCITY."
1870 call esmf_fieldscatter(
dzdt_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1871 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1872 call error_handler(
"IN FieldScatter", rc)
1880 call netcdf_err(error,
'reading field id' )
1881 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1882 call netcdf_err(error,
'reading field' )
1887 print*,
"- CALL FieldScatter FOR INPUT GRID TRACER ", trim(
tracers_input(n))
1888 call esmf_fieldscatter(
tracers_input_grid(n), data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1889 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1890 call error_handler(
"IN FieldScatter", rc)
1896 print*,
"- READ TEMPERATURE."
1897 error=nf90_inq_varid(ncid,
'tmp', id_var)
1898 call netcdf_err(error,
'reading field id' )
1899 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1900 call netcdf_err(error,
'reading field' )
1905 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE."
1906 call esmf_fieldscatter(
temp_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1907 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1908 call error_handler(
"IN FieldScatter", rc)
1912 print*,
"- READ U-WIND."
1913 error=nf90_inq_varid(ncid,
'ugrd', id_var)
1914 call netcdf_err(error,
'reading field id' )
1915 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1916 call netcdf_err(error,
'reading field' )
1921 print*,
"- CALL FieldScatter FOR INPUT GRID U."
1922 call esmf_fieldscatter(
u_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1923 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1924 call error_handler(
"IN FieldScatter", rc)
1928 print*,
"- READ V-WIND."
1929 error=nf90_inq_varid(ncid,
'vgrd', id_var)
1930 call netcdf_err(error,
'reading field id' )
1931 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1932 call netcdf_err(error,
'reading field' )
1937 print*,
"- CALL FieldScatter FOR INPUT GRID V."
1938 call esmf_fieldscatter(
v_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1939 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1940 call error_handler(
"IN FieldScatter", rc)
1944 print*,
"- READ SURFACE PRESSURE."
1945 error=nf90_inq_varid(ncid,
'pressfc', id_var)
1946 call netcdf_err(error,
'reading field id' )
1947 error=nf90_get_var(ncid, id_var, data_one_tile)
1948 call netcdf_err(error,
'reading field' )
1952 print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE PRESSURE."
1953 call esmf_fieldscatter(
ps_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1954 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1955 call error_handler(
"IN FieldScatter", rc)
1959 print*,
"- READ TERRAIN."
1960 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
1961 call netcdf_err(error,
'reading field id' )
1962 error=nf90_get_var(ncid, id_var, data_one_tile)
1963 call netcdf_err(error,
'reading field' )
1967 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN."
1968 call esmf_fieldscatter(
terrain_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1969 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1970 call error_handler(
"IN FieldScatter", rc)
1974 print*,
"- READ DELTA PRESSURE."
1975 error=nf90_inq_varid(ncid,
'dpres', id_var)
1976 call netcdf_err(error,
'reading field id' )
1977 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1978 call netcdf_err(error,
'reading field' )
1983 print*,
"- CALL FieldScatter FOR INPUT DELTA PRESSURE."
1984 call esmf_fieldscatter(
dpres_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1985 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1986 call error_handler(
"IN FieldScatter", rc)
1991 deallocate(data_one_tile_3d, data_one_tile)
2003 print*,
"- CALL FieldGet FOR PRESSURE."
2005 computationallbound=clb, &
2006 computationalubound=cub, &
2007 farrayptr=presptr, rc=rc)
2008 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2009 call error_handler(
"IN FieldGet", rc)
2011 print*,
"- CALL FieldGet FOR DELTA PRESSURE."
2013 farrayptr=dpresptr, rc=rc)
2014 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2015 call error_handler(
"IN FieldGet", rc)
2017 print*,
"- CALL FieldGet FOR SURFACE PRESSURE."
2019 farrayptr=psptr, rc=rc)
2020 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2021 call error_handler(
"IN FieldGet", rc)
2029 do i = clb(1), cub(1)
2030 do j = clb(2), cub(2)
2031 pres_interface(1) = psptr(i,j)
2033 pres_interface(k) = pres_interface(k-1) - dpresptr(i,j,k-1)
2036 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
2041 deallocate(pres_interface)
2060 integer,
intent(in) :: localpet
2062 integer,
parameter :: ntrac_max=15
2063 integer,
parameter :: max_levs=1000
2065 character(len=300) :: the_file
2066 character(len=20) :: vname, &
2067 trac_names_vmap(ntrac_max), &
2069 method, tracers_input_vmap(num_tracers_input), &
2070 tracers_default(ntrac_max)
2072 integer :: i, j, k, n
2074 integer :: rc, clb(3), cub(3)
2075 integer :: vlev, iret,varnum, o3n, pdt_num
2076 integer :: intrp_ier, done_print
2077 integer :: trac_names_oct10(ntrac_max)
2078 integer :: tracers_input_oct10(num_tracers_input)
2079 integer :: trac_names_oct11(ntrac_max)
2080 integer :: tracers_input_oct11(num_tracers_input)
2081 integer :: lugb, lugi, jdisc, jpdt(200), jgdt(200), iscale
2082 integer :: jids(200), jpdtn, jgdtn, octet_23, octet_29
2083 integer :: count_spfh, count_rh, count_icmr, count_scliwc
2084 integer :: count_cice, count_rwmr, count_scllwc, count
2086 logical :: conv_omega=.false., &
2089 use_rh=.false. , unpack, &
2090 all_empty, is_missing
2092 real(esmf_kind_r8),
allocatable :: dum2d_1(:,:)
2095 real(esmf_kind_r8) :: rlevs_hold(max_levs)
2096 real(esmf_kind_r8),
allocatable :: rlevs(:)
2097 real(esmf_kind_r4),
allocatable :: dummy2d(:,:)
2098 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:), dummy2d_8(:,:),&
2099 u_tmp_3d(:,:,:), v_tmp_3d(:,:,:),&
2101 real(esmf_kind_r8),
pointer :: presptr(:,:,:), psptr(:,:),tptr(:,:,:), &
2102 qptr(:,:,:), wptr(:,:,:), &
2103 uptr(:,:,:), vptr(:,:,:)
2104 real(esmf_kind_r4) :: value
2105 real(esmf_kind_r8),
parameter :: p0 = 100000.0
2106 real(esmf_kind_r8),
allocatable :: dummy3d_col_in(:),dummy3d_col_out(:)
2107 real(esmf_kind_r8),
parameter :: intrp_missing = -999.0
2108 real(esmf_kind_r4),
parameter :: lev_no_tr_fill = 20000.0
2109 real(esmf_kind_r4),
parameter :: lev_no_o3_fill = 40000.0
2111 type(gribfield) :: gfld
2115 trac_names_oct10 = (/1, 1, 14, 1, 1, 1, 1, 6, 6, 1, 6, 13, 13, 2, 20 /)
2116 trac_names_oct11 = (/0, 22, 192, 23, 24, 25, 32, 1, 29, 100, 28, 193, 192, 2, 0 /)
2119 trac_names_vmap = (/
"sphum ",
"liq_wat ",
"o3mr ",
"ice_wat ", &
2120 "rainwat ",
"snowwat ",
"graupel ",
"cld_amt ",
"ice_nc ", &
2121 "rain_nc ",
"water_nc",
"liq_aero",
"ice_aero", &
2122 "sgs_tke ",
"massden "/)
2124 tracers_default = (/
"sphum ",
"liq_wat ",
"o3mr ",
"ice_wat ", &
2125 "rainwat ",
"snowwat ",
"graupel ",
"cld_amt ",
"ice_nc ", &
2126 "rain_nc ",
"water_nc",
"liq_aero",
"ice_aero", &
2127 "sgs_tke ",
"smoke "/)
2131 print*,
"- READ ATMOS DATA FROM GRIB2 FILE: ", trim(the_file)
2133 if (localpet == 0)
then
2137 call baopenr(lugb,the_file,iret)
2138 if (iret /= 0)
call error_handler(
"ERROR OPENING GRIB2 FILE.", iret)
2149 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2150 unpack, k, gfld, iret)
2162 if (gfld%idsect(1) == 7 .and. gfld%idsect(2) == 2)
then
2163 print*,
'- THIS IS NCEP GEFS DATA.'
2171 call error_handler(
"READING GRIB2 FILE", iret)
2188 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2189 unpack, k, gfld, iret)
2192 print*,
'- DATA IS ON HYBRID LEVELS.'
2197 print*,
'- DATA IS ON ISOBARIC LEVELS.'
2214 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2215 unpack, k, gfld, iret)
2219 if (gfld%discipline == 0)
then
2220 if (gfld%ipdtnum == pdt_num)
then
2221 if (gfld%ipdtmpl(1) == 2 .and. gfld%ipdtmpl(2) == 2)
then
2223 if (gfld%ipdtmpl(10) == octet_23 .and. gfld%ipdtmpl(13) == octet_29)
then
2227 iscale = 10 ** gfld%ipdtmpl(11)
2228 rlevs_hold(
lev_input) = float(gfld%ipdtmpl(12))/float(iscale)
2239 call mpi_barrier(mpi_comm_world, iret)
2240 call mpi_bcast(isnative,1,mpi_logical,0,mpi_comm_world,iret)
2241 call mpi_bcast(
lev_input,1,mpi_integer,0,mpi_comm_world,iret)
2242 call mpi_bcast(pdt_num,1,mpi_integer,0,mpi_comm_world,iret)
2243 call mpi_bcast(rlevs_hold, max_levs, mpi_integer,0,mpi_comm_world,iret)
2255 rlevs(i) = rlevs_hold(i)
2262 write(
slevs(i),
'(i6)') nint(rlevs(i))
2265 if (any(
slevs(1:i-1)==
slevs(i)))
call error_handler(
"Duplicate vertical level entries found.",1)
2268 write(
slevs(i),
'(f11.2)') rlevs(i)
2271 if (any(
slevs(1:i-1)==
slevs(i)))
call error_handler(
"Duplicate vertical level entries found.",1)
2276 if(localpet == 0)
then
2278 print*,
"- LEVEL AFTER SORT = ",trim(
slevs(i))
2284 if (localpet == 0)
then
2297 jpdt(12) = nint(rlevs(vlev))
2299 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2300 unpack, k, gfld, iret)
2303 count_spfh = count_spfh + 1
2313 jpdt(12) = nint(rlevs(vlev))
2315 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2316 unpack, k, gfld, iret)
2319 count_rh = count_rh + 1
2327 if (count_spfh == 0 .or. use_rh)
then
2328 if (count_rh == 0)
then
2329 call error_handler(
"READING ATMOSPHERIC WATER VAPOR VARIABLE.", 2)
2332 trac_names_oct10(1) = 1
2333 trac_names_oct11(1) = 1
2334 print*,
"- FILE CONTAINS RH."
2336 print*,
"- FILE CONTAINS SPFH."
2341 call mpi_barrier(mpi_comm_world, rc)
2342 call mpi_bcast(hasspfh,1,mpi_logical,0,mpi_comm_world,rc)
2346 if (localpet == 0)
then
2364 jpdt(12) = nint(rlevs(vlev))
2366 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2367 unpack, k, gfld, iret)
2370 count_icmr = count_icmr + 1
2376 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2377 unpack, k, gfld, iret)
2380 count_scliwc = count_scliwc + 1
2386 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2387 unpack, k, gfld, iret)
2390 count_cice = count_cice + 1
2396 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2397 unpack, k, gfld, iret)
2400 count_rwmr = count_rwmr + 1
2407 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2408 unpack, k, gfld, iret)
2411 count_scllwc = count_scllwc + 1
2416 if (count_icmr == 0)
then
2417 if (count_scliwc == 0)
then
2418 if (count_cice == 0)
then
2419 print*,
'- FILE DOES NOT CONTAIN CICE.'
2421 trac_names_oct10(4) = 6
2422 trac_names_oct11(4) = 0
2423 print*,
"- FILE CONTAINS CICE."
2426 trac_names_oct10(4) = 1
2427 trac_names_oct11(4) = 84
2428 print*,
"- FILE CONTAINS SCLIWC."
2431 print*,
"- FILE CONTAINS ICMR."
2434 if (count_rwmr == 0)
then
2435 if (count_scllwc == 0)
then
2436 print*,
"- FILE DOES NOT CONTAIN SCLLWC."
2438 trac_names_oct10(4) = 1
2439 trac_names_oct11(4) = 83
2441 print*,
"- FILE CONTAINS SCLLWC."
2444 print*,
"- FILE CONTAINS CLWMR."
2449 call mpi_barrier(mpi_comm_world, rc)
2450 call mpi_bcast(trac_names_oct10,ntrac_max,mpi_integer,0,mpi_comm_world,rc)
2451 call mpi_bcast(trac_names_oct11,ntrac_max,mpi_integer,0,mpi_comm_world,rc)
2453 print*,
"- COUNT NUMBER OF TRACERS TO BE READ IN BASED ON PHYSICS SUITE TABLE"
2454 do n = 1, num_tracers_input
2458 i = maxloc(merge(1.,0.,trac_names_vmap == vname),dim=1)
2460 tracers_input_vmap(n)=trac_names_vmap(i)
2462 if(trim(
tracers(n)) .eq.
"o3mr") o3n = n
2464 tracers_input_oct10(n) = trac_names_oct10(i)
2465 tracers_input_oct11(n) = trac_names_oct11(i)
2475 if (localpet == 0)
then
2485 allocate(dummy2d(0,0))
2486 allocate(dummy2d_8(0,0))
2487 allocate(dummy3d(0,0,0))
2490 allocate(dummy3d_pres(0,0,0))
2492 allocate(dum2d_1(0,0))
2501 if (localpet == 0)
then
2503 print*,
"- READ TEMPERATURE."
2520 jpdt(12) = nint(rlevs(vlev))
2522 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2523 unpack, k, gfld, iret)
2525 call error_handler(
"READING IN TEMPERATURE AT LEVEL "//trim(
slevs(vlev)),iret)
2530 dummy3d(:,:,vlev) = dum2d_1
2536 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE."
2538 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2539 call error_handler(
"IN FieldScatter", rc)
2543 do n = 1, num_tracers_input
2545 if (localpet == 0) print*,
"- READ ", trim(tracers_input_vmap(n))
2547 vname = tracers_input_vmap(n)
2548 call get_var_cond(vname,this_miss_var_method=method, this_miss_var_value=
value, &
2549 this_field_var_name=tmpstr,loc=varnum)
2551 if (n==1 .and. .not. hasspfh .or. &
2554 tracers_input_vmap(n) == trac_names_vmap(15) ))
then
2555 print*,
"- CALL FieldGather TEMPERATURE."
2556 call esmf_fieldgather(
temp_input_grid,dummy3d,rootpet=0, tile=1, rc=rc)
2557 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2558 call error_handler(
"IN FieldGet", rc)
2563 tracers_input_vmap(n) == trac_names_vmap(15))
then
2565 if (localpet == 0)
then
2567 print*,
"- READ PRESSURE FOR SMOKE CONVERSION."
2583 jpdt(12) = nint(rlevs(vlev))
2584 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2585 unpack, k, gfld, iret)
2587 call error_handler(
"READING IN PRESSURE AT LEVEL"//trim(
slevs(vlev)),iret)
2592 dummy3d_pres(:,:,vlev) = dum2d_1
2600 if (tracers_input_vmap(n) == trac_names_vmap(15) .and. &
2607 if (localpet == 0)
then
2623 jpdt(1) = tracers_input_oct10(n)
2624 jpdt(2) = tracers_input_oct11(n)
2625 jpdt(12) = nint(rlevs(vlev))
2627 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2628 unpack, k, gfld, iret)
2644 is_missing = .false.
2650 jpdt(1) = tracers_input_oct10(n)
2651 jpdt(2) = tracers_input_oct11(n)
2652 jpdt(12) = nint(rlevs(vlev) )
2654 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2655 unpack, k, gfld, iret)
2658 dummy2d = real((reshape(gfld%fld, (/
i_input,
j_input/) )), kind=esmf_kind_r4)
2660 if (trim(method) .eq.
'intrp' .and. .not.all_empty)
then
2661 dummy2d = intrp_missing
2666 if (.not.all_empty .and. n == o3n)
then
2667 if (rlevs(vlev) .lt. lev_no_o3_fill) &
2668 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev))//&
2669 ". SET MISSING VARIABLE CONDITION TO 'INTRP' TO AVOID THIS ERROR", 1)
2670 elseif (.not.all_empty .and. n .ne. o3n)
then
2671 if (rlevs(vlev) .gt. lev_no_tr_fill) &
2672 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev))//&
2673 ". SET MISSING VARIABLE CONDITION TO 'INTRP' TO AVOID THIS ERROR.", 1)
2676 if (trim(method) .eq.
'intrp' .and. all_empty) method=
'set_to_fill'
2678 call handle_grib_error(vname,
slevs(vlev),method,
value,varnum,
read_from_input,iret,var=dummy2d)
2680 if ( (tracers_input_oct10(n) == 1 .and. tracers_input_oct11(n) == 0) .or. &
2681 (tracers_input_oct10(n) == 1 .and. tracers_input_oct11(n) == 1) .or. &
2682 (tracers_input_oct10(n) == 14 .and. tracers_input_oct11(n) == 192) )
then
2683 call error_handler(
"READING IN "//trim(
tracers(n))//
" AT LEVEL "//trim(
slevs(vlev))&
2684 //
". SET A FILL VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
2690 if (n==1 .and. .not. hasspfh)
then
2692 print *,
'- CALL CALRH GFS'
2693 call rh2spfh_gfs(dummy2d,rlevs(vlev),dummy3d(:,:,vlev))
2695 print *,
'- CALL CALRH non-GFS'
2696 call rh2spfh(dummy2d,rlevs(vlev),dummy3d(:,:,vlev))
2701 if ( tracers_input_vmap(n) == trac_names_vmap(15) )
then
2704 dummy2d(i,j) = dummy2d(i,j) * 1.0d9 * &
2705 (287.05 * dummy3d(i,j,vlev) / dummy3d_pres(i,j,vlev))
2710 dummy3d(:,:,vlev) = real(dummy2d,esmf_kind_r8)
2715 if (is_missing .and. trim(method) .eq.
'intrp')
then
2716 print *,
'- INTERPOLATE TRACER '//trim(
tracers(n))
2720 dummy3d_col_in=dummy3d(ii,jj,:)
2721 call dint2p(rlevs,dummy3d_col_in,
lev_input,rlevs,dummy3d_col_out, &
2723 if (intrp_ier .gt. 0)
call error_handler(
"Interpolation failed.",intrp_ier)
2724 dummy3d(ii,jj,:)=dummy3d_col_out
2728 dummy2d = real(dummy3d(:,:,n) , kind=esmf_kind_r4)
2729 if (any(dummy2d .eq. intrp_missing))
then
2731 if (n == o3n .and. rlevs(vlev) .lt. lev_no_o3_fill)
then
2732 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev)),1)
2733 elseif (n .ne. o3n .and. rlevs(vlev) .gt. lev_no_tr_fill)
then
2734 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev)),1)
2736 if (done_print .eq. 0)
then
2737 print*,
"Pressure out of range of existing data. Defaulting to fill value."
2740 where(dummy2d .eq. intrp_missing) dummy2d =
value
2741 dummy3d(:,:,vlev) = dummy2d
2745 where(dummy3d(:,:,vlev) .lt. 0.0) dummy3d(:,:,vlev) = 0.0
2751 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT ", trim(tracers_input_vmap(n))
2753 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2754 call error_handler(
"IN FieldScatter", rc)
2758 deallocate(dummy3d_col_in, dummy3d_col_out)
2760 call read_winds(u_tmp_3d,v_tmp_3d,localpet,octet_23,rlevs,lugb,pdt_num)
2762 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT U-WIND."
2763 call esmf_fieldscatter(
u_input_grid, u_tmp_3d, rootpet=0, rc=rc)
2764 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2765 call error_handler(
"IN FieldScatter", rc)
2767 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT V-WIND."
2768 call esmf_fieldscatter(
v_input_grid, v_tmp_3d, rootpet=0, rc=rc)
2769 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2770 call error_handler(
"IN FieldScatter", rc)
2772 if (localpet == 0)
then
2774 print*,
"- READ SURFACE PRESSURE."
2787 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2788 unpack, k, gfld, iret)
2789 if (iret /= 0)
call error_handler(
"READING SURFACE PRESSURE RECORD.", iret)
2795 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE PRESSURE."
2796 call esmf_fieldscatter(
ps_input_grid, dummy2d_8, rootpet=0, rc=rc)
2797 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2798 call error_handler(
"IN FieldScatter", rc)
2802 if (localpet == 0)
then
2804 print*,
"- READ DZDT."
2806 call get_var_cond(vname,this_miss_var_method=method, this_miss_var_value=
value, &
2824 jpdt(12) = nint(rlevs(vlev))
2826 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2827 unpack, k, gfld, iret)
2830 print*,
"DZDT not available at level ", trim(
slevs(vlev)),
" so checking for VVEL"
2832 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2833 unpack, k, gfld, iret)
2835 call handle_grib_error(vname,
slevs(vlev),method,
value,varnum,
read_from_input,iret,var8=dum2d_1)
2847 dummy3d(:,:,vlev) = dum2d_1
2853 call mpi_bcast(conv_omega,1,mpi_logical,0,mpi_comm_world,rc)
2855 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT DZDT."
2857 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2858 call error_handler(
"IN FieldScatter", rc)
2862 if (localpet == 0)
then
2864 print*,
"- READ TERRAIN."
2877 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2878 unpack, k, gfld, iret)
2879 if (iret /= 0)
call error_handler(
"READING TERRAIN HEIGHT RECORD.", iret)
2885 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN."
2887 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2888 call error_handler(
"IN FieldScatter", rc)
2890 deallocate(dummy2d, dummy2d_8)
2892if (.not. isnative)
then
2899 if (localpet == 0) print*,
"- CALL FieldGet FOR SURFACE PRESSURE."
2902 farrayptr=psptr, rc=rc)
2903 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2904 call error_handler(
"IN FieldGet", rc)
2907 if (localpet == 0) print*,
"- CALL FieldGet FOR 3-D PRESSURE."
2909 computationallbound=clb, &
2910 computationalubound=cub, &
2911 farrayptr=presptr, rc=rc)
2912 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2913 call error_handler(
"IN FieldGet", rc)
2916 if (localpet == 0) print*,
"- CALL FieldGet TEMPERATURE."
2918 farrayptr=tptr, rc=rc)
2919 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2920 call error_handler(
"IN FieldGet", rc)
2923 if (localpet == 0) print*,
"- CALL FieldGet FOR U"
2925 farrayptr=uptr, rc=rc)
2926 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2927 call error_handler(
"IN FieldGet", rc)
2930 if (localpet == 0) print*,
"- CALL FieldGet FOR V"
2932 farrayptr=vptr, rc=rc)
2933 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2934 call error_handler(
"IN FieldGet", rc)
2937 if (localpet == 0) print*,
"- CALL FieldGet FOR W"
2939 farrayptr=wptr, rc=rc)
2940 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2941 call error_handler(
"IN FieldGet", rc)
2943 if (localpet == 0) print*,
"- CALL FieldGet FOR TRACERS."
2944 do n=1,num_tracers_input
2947 farrayptr=qptr, rc=rc)
2948 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2949 call error_handler(
"IN FieldGet", rc)
2950 do i = clb(1),cub(1)
2951 do j = clb(2),cub(2)
2957 do i = clb(1),cub(1)
2958 do j = clb(2),cub(2)
2967 if (localpet == 0)
then
2968 print*,
'psfc is ',clb(1),clb(2),psptr(clb(1),clb(2))
2969 print*,
'pres is ',cub(1),cub(2),presptr(cub(1),cub(2),:)
2971 print*,
'pres check 1',localpet,maxval(presptr(clb(1):cub(1),clb(2):cub(2),1)), &
2972 minval(presptr(clb(1):cub(1),clb(2):cub(2),1))
2973 print*,
'pres check lev',localpet,maxval(presptr(clb(1):cub(1),clb(2):cub(2), &
2981 if (localpet == 0)
then
2983 print*,
"- READ PRESSURE."
2999 jpdt(12) = nint(rlevs(vlev))
3000 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3001 unpack, k, gfld, iret)
3003 call error_handler(
"READING IN PRESSURE AT LEVEL "//trim(
slevs(vlev)),iret)
3008 dummy3d(:,:,vlev) = dum2d_1
3014 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID PRESSURE."
3016 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3017 call error_handler(
"IN FieldScatter", rc)
3021 deallocate(dummy3d, dum2d_1)
3022 if (
allocated(dummy3d_pres))
deallocate(dummy3d_pres)
3034 if (conv_omega)
then
3036 if (localpet == 0) print*,
"- CONVERT FROM OMEGA TO DZDT."
3039 if (localpet == 0) print*,
"- CALL FieldGet TEMPERATURE."
3041 farrayptr=tptr, rc=rc)
3042 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3043 call error_handler(
"IN FieldGet", rc)
3046 if (localpet == 0) print*,
"- CALL FieldGet SPECIFIC HUMIDITY."
3048 computationallbound=clb, &
3049 computationalubound=cub, &
3050 farrayptr=qptr, rc=rc)
3051 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3052 call error_handler(
"IN FieldGet", rc)
3055 if (localpet == 0) print*,
"- CALL FieldGet DZDT."
3057 computationallbound=clb, &
3058 computationalubound=cub, &
3059 farrayptr=wptr, rc=rc)
3060 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3061 call error_handler(
"IN FieldGet", rc)
3065 farrayptr=presptr, rc=rc)
3066 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3067 call error_handler(
"IN FieldGet", rc)
3073 if (localpet == 0)
call baclose(lugb, rc)
3095 integer,
intent(in) :: localpet, lugb
3096 integer,
intent(in) :: pdt_num, octet_23
3098 real(esmf_kind_r8),
intent(inout),
allocatable :: u(:,:,:),v(:,:,:)
3099 real(esmf_kind_r8),
intent(in),
dimension(lev_input) :: rlevs
3101 real(esmf_kind_r4),
dimension(i_input,j_input) :: alpha
3102 real(esmf_kind_r8),
dimension(i_input,j_input) :: lon, lat
3103 real(esmf_kind_r4),
allocatable :: u_tmp(:,:),v_tmp(:,:)
3104 real(esmf_kind_r8),
allocatable :: dum2d(:,:)
3105 real(esmf_kind_r4),
dimension(i_input,j_input) :: ws,wd
3106 real(esmf_kind_r4) :: value_u, value_v,lov,latin1,latin2
3107 real(esmf_kind_r8) :: d2r
3109 integer :: varnum_u, varnum_v, vlev, &
3111 integer :: j, k, lugi, jgdtn, jpdtn
3112 integer :: jdisc, jids(200), jgdt(200), jpdt(200)
3114 character(len=20) :: vname
3115 character(len=50) :: method_u, method_v
3119 type(gribfield) :: gfld
3121 d2r=acos(-1.0_esmf_kind_r8) / 180.0_esmf_kind_r8
3122 if (localpet==0)
then
3131 call get_var_cond(vname,this_miss_var_method=method_u, this_miss_var_value=value_u, &
3134 call get_var_cond(vname,this_miss_var_method=method_v, this_miss_var_value=value_v, &
3137 print*,
"- CALL FieldGather FOR INPUT GRID LONGITUDE"
3139 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3140 call error_handler(
"IN FieldGather", error)
3142 print*,
"- CALL FieldGather FOR INPUT GRID LATITUDE"
3144 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3145 call error_handler(
"IN FieldGather", error)
3147 if (localpet==0)
then
3159 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3160 unpack, k, gfld, iret)
3162 if (iret /= 0)
call error_handler(
"ERROR READING GRIB2 FILE.", iret)
3164 if (gfld%igdtnum == 32769)
then
3166 latin1 = real(float(gfld%igdtmpl(15))/1.0e6, kind=esmf_kind_r4)
3167 lov = real(float(gfld%igdtmpl(16))/1.0e6, kind=esmf_kind_r4)
3169 print*,
"- CALL CALCALPHA_ROTLATLON with center lat,lon = ",latin1,lov
3172 elseif (gfld%igdtnum == 1)
then
3174 latin1 = real(float(gfld%igdtmpl(20))/1.0e6, kind=esmf_kind_r4) + 90.0_esmf_kind_r4
3175 lov = real(float(gfld%igdtmpl(21))/1.0e6, kind=esmf_kind_r4)
3177 print*,
"- CALL CALCALPHA_ROTLATLON with center lat,lon = ",latin1,lov
3180 elseif (gfld%igdtnum == 30)
then
3182 lov = real(float(gfld%igdtmpl(14))/1.0e6, kind=esmf_kind_r4)
3183 latin1 = real(float(gfld%igdtmpl(19))/1.0e6, kind=esmf_kind_r4)
3184 latin2 = real(float(gfld%igdtmpl(20))/1.0e6, kind=esmf_kind_r4)
3186 print*,
"- CALL GRIDROT for LC grid with lov,latin1/2 = ",lov,latin1,latin2
3187 call gridrot(lov,latin1,latin2,lon,alpha)
3205 jpdt(12) = nint(rlevs(vlev))
3207 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3208 unpack, k, gfld, iret)
3211 call handle_grib_error(vname,
slevs(vlev),method_u,value_u,varnum_u,
read_from_input,iret,var=u_tmp)
3213 call error_handler(
"READING IN U AT LEVEL "//trim(
slevs(vlev))//
". SET A FILL "// &
3214 "VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
3218 u_tmp(:,:) = real(dum2d, kind=esmf_kind_r4)
3225 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3226 unpack, k, gfld, iret)
3229 call handle_grib_error(vname,
slevs(vlev),method_v,value_v,varnum_v,
read_from_input,iret,var=v_tmp)
3231 call error_handler(
"READING IN V AT LEVEL "//trim(
slevs(vlev))//
". SET A FILL "// &
3232 "VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
3236 v_tmp(:,:) = real(dum2d, kind=esmf_kind_r4)
3241 if (gfld%igdtnum == 0)
then
3249 else if (gfld%igdtnum == 32769 .or. gfld%igdtnum == 1)
then
3250 ws = sqrt(u_tmp**2 + v_tmp**2)
3251 wd = real((atan2(-u_tmp,-v_tmp) / d2r), kind=esmf_kind_r4)
3252 wd = real((wd + alpha + 180.0), kind=esmf_kind_r4)
3253 wd = real((270.0 - wd), kind=esmf_kind_r4)
3254 u(:,:,vlev) = -ws*cos(wd*d2r)
3255 v(:,:,vlev) = -ws*sin(wd*d2r)
3257 u(:,:,vlev) = real(u_tmp * cos(alpha) + v_tmp * sin(alpha),esmf_kind_r8)
3258 v(:,:,vlev) = real(v_tmp * cos(alpha) - u_tmp * sin(alpha),esmf_kind_r8)
3261 print*,
'max, min U ', minval(u(:,:,vlev)), maxval(u(:,:,vlev))
3262 print*,
'max, min V ', minval(v(:,:,vlev)), maxval(v(:,:,vlev))
3275 integer :: clb(3), cub(3)
3276 integer :: i, j, k, rc
3278 real(esmf_kind_r8) :: latrad, lonrad
3279 real(esmf_kind_r8),
pointer :: xptr(:,:,:)
3280 real(esmf_kind_r8),
pointer :: yptr(:,:,:)
3281 real(esmf_kind_r8),
pointer :: zptr(:,:,:)
3282 real(esmf_kind_r8),
pointer :: uptr(:,:,:)
3283 real(esmf_kind_r8),
pointer :: vptr(:,:,:)
3284 real(esmf_kind_r8),
pointer :: latptr(:,:)
3285 real(esmf_kind_r8),
pointer :: lonptr(:,:)
3287 print*,
"- CALL FieldGet FOR xwind."
3289 computationallbound=clb, &
3290 computationalubound=cub, &
3291 farrayptr=xptr, rc=rc)
3292 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3293 call error_handler(
"IN FieldGet", rc)
3295 print*,
"- CALL FieldGet FOR ywind."
3297 farrayptr=yptr, rc=rc)
3298 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3299 call error_handler(
"IN FieldGet", rc)
3301 print*,
"- CALL FieldGet FOR zwind."
3303 farrayptr=zptr, rc=rc)
3304 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3305 call error_handler(
"IN FieldGet", rc)
3307 print*,
"- CALL FieldGet FOR U."
3309 farrayptr=uptr, rc=rc)
3310 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3311 call error_handler(
"IN FieldGet", rc)
3313 print*,
"- CALL FieldGet FOR V."
3315 farrayptr=vptr, rc=rc)
3316 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3317 call error_handler(
"IN FieldGet", rc)
3319 print*,
"- CALL FieldGet FOR LATITUDE."
3321 farrayptr=latptr, rc=rc)
3322 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3323 call error_handler(
"IN FieldGet", rc)
3325 print*,
"- CALL FieldGet FOR LONGITUDE."
3327 farrayptr=lonptr, rc=rc)
3328 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3329 call error_handler(
"IN FieldGet", rc)
3331 do i = clb(1), cub(1)
3332 do j = clb(2), cub(2)
3333 latrad = latptr(i,j) * acos(-1.) / 180.0
3334 lonrad = lonptr(i,j) * acos(-1.) / 180.0
3335 do k = clb(3), cub(3)
3336 xptr(i,j,k) = uptr(i,j,k) * cos(lonrad) - vptr(i,j,k) * sin(latrad) * sin(lonrad)
3337 yptr(i,j,k) = uptr(i,j,k) * sin(lonrad) + vptr(i,j,k) * sin(latrad) * cos(lonrad)
3338 zptr(i,j,k) = vptr(i,j,k) * cos(latrad)
3367 real(esmf_kind_r4),
intent(in) :: lov,latin1,latin2
3368 real(esmf_kind_r4),
intent(inout) :: rot(i_input,j_input)
3369 real(esmf_kind_r8),
intent(in) :: lon(i_input,j_input)
3371 real(esmf_kind_r4) :: trot(i_input,j_input), tlon(i_input,j_input)
3372 real(esmf_kind_r4) :: dtor = 3.14159265359_esmf_kind_r4/180.0_esmf_kind_r4
3373 real(esmf_kind_r4) :: an
3379 if ( (latin1 - latin2) .lt. 0.000001 )
then
3380 an = sin(latin1*dtor)
3382 an = real(log( cos(latin1*dtor) / cos(latin2*dtor) ) / &
3383 log( tan(dtor*(90.0-latin1)/2.) / tan(dtor*(90.0-latin2)/2.)), kind=esmf_kind_r4)
3386 tlon = real((mod(lon - lov + 180. + 3600., 360.) - 180.), kind=esmf_kind_r4)
3407 real(esmf_kind_r8),
intent(in) :: latgrid(i_input,j_input), &
3408 longrid(i_input,j_input)
3409 real(esmf_kind_r4),
intent(in) :: cenlat, cenlon
3410 real(esmf_kind_r4),
intent(out) :: alpha(i_input,j_input)
3413 real(esmf_kind_r8) :: D2R,lon0_r,lat0_r,sphi0,cphi0
3414 real(esmf_kind_r8),
DIMENSION(i_input,j_input) :: tlat,tlon,tph,sinalpha
3416 d2r = acos(-1.0_esmf_kind_r8) / 180.0_esmf_kind_r8
3417 if (cenlon .lt. 0)
then
3418 lon0_r = (cenlon + 360.0)*d2r
3427 tlat = latgrid * d2r
3428 tlon = longrid * d2r
3431 tlon = -tlon + lon0_r
3432 tph = asin(cphi0*sin(tlat) - sphi0*cos(tlat)*cos(tlon))
3433 sinalpha = sphi0 * sin(tlon) / cos(tph)
3434 alpha = real((-asin(sinalpha)/d2r), kind=esmf_kind_r4)
3447 print*,
'- DESTROY ATMOSPHERIC INPUT DATA.'
3458 do n = 1, num_tracers_input
Utilities for use when reading grib2 data.
subroutine, public rh2spfh(rh_sphum, p, t)
Convert relative humidity to specific humidity.
subroutine, public convert_omega(omega, p, t, q, clb, cub)
Convert omega to vertical velocity.
subroutine, public rh2spfh_gfs(rh_sphum, p, t)
Convert relative humidity to specific humidity (GFS formula) Calculation of saturation water vapor pr...
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 longitude_input_grid
longitude of grid center, input grid
type(esmf_grid), public input_grid
input grid esmf grid object
integer, public jp1_input
j_input plus 1
integer, public i_input
i-dimension of input grid (or of each global tile)
integer, public num_tiles_input_grid
Number of tiles, input grid.
integer, public j_input
j-dimension of input grid (or of each global tile)
This module contains code to read the setup namelist file, handle the varmap file for GRIB2 data,...
integer, public num_tracers_input
Number of atmospheric tracers in input file.
logical, dimension(:), allocatable, public read_from_input
When false, variable was not read from GRIB2 input file.
character(len=500), dimension(6), public atm_tracer_files_input_grid
File names of input atmospheric restart tracer files.
character(len=500), public grib2_file_input_grid
REQUIRED.
character(len=500), dimension(7), public atm_core_files_input_grid
File names of input atmospheric restart core files.
character(len=20), dimension(max_tracers), public tracers
Name of each atmos tracer to be processed.
subroutine, public get_var_cond(var_name, this_miss_var_method, this_miss_var_value, this_field_var_name, loc)
Search the variable mapping table to find conditions for handling missing variables.
character(len=500), dimension(6), public atm_files_input_grid
File names of input atmospheric data.
character(len=20), dimension(max_tracers), public tracers_input
Name of each atmos tracer record in the input file.
character(len=500), public data_dir_input_grid
Directory containing input atm or sfc files.
character(len=25), public input_type
Input data type:
character(len=20), public external_model
The model that the input data is derived from.