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
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(:)
1073 print*,
"- READ ATM VERTICAL LEVELS FROM: ", trim(tilefile)
1074 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1075 call netcdf_err(error,
'opening: '//trim(tilefile) )
1077 error=nf90_inq_dimid(ncid,
'xaxis_1', id_dim)
1078 call netcdf_err(error,
'reading xaxis_1 id' )
1079 error=nf90_inquire_dimension(ncid,id_dim,len=
levp1_input)
1080 call netcdf_err(error,
'reading xaxis_1 value' )
1086 error=nf90_inq_varid(ncid,
'ak', id_var)
1087 call netcdf_err(error,
'reading field id' )
1088 error=nf90_get_var(ncid, id_var, ak)
1089 call netcdf_err(error,
'reading ak' )
1091 error = nf90_close(ncid)
1099 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE." 1101 typekind=esmf_typekind_r8, &
1102 staggerloc=esmf_staggerloc_center, &
1103 ungriddedlbound=(/1/), &
1105 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1106 call error_handler(
"IN FieldCreate", rc)
1112 allocate(data_one_tile_3d(0,0,0))
1113 allocate(data_one_tile(0,0))
1119 print*,
"- READ ATMOSPHERIC CORE FILE: ", trim(tilefile)
1120 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1121 call netcdf_err(error,
'opening: '//trim(tilefile) )
1125 error=nf90_inq_varid(ncid,
'phis', id_var)
1126 call netcdf_err(error,
'reading field id' )
1127 error=nf90_get_var(ncid, id_var, data_one_tile)
1128 call netcdf_err(error,
'reading field' )
1129 data_one_tile = data_one_tile / 9.806_8
1133 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN for tile ",tile
1134 call esmf_fieldscatter(
terrain_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1135 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1136 call error_handler(
"IN FieldScatter", rc)
1147 data_one_tile_3d = 0.0_8
1151 print*,
"- CALL FieldScatter FOR INPUT GRID VERTICAL VELOCITY for tile ",tile
1152 call esmf_fieldscatter(
dzdt_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1153 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1154 call error_handler(
"IN FieldScatter", rc)
1158 error=nf90_inq_varid(ncid,
'T', id_var)
1159 call netcdf_err(error,
'reading field id' )
1160 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1161 call netcdf_err(error,
'reading field' )
1166 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 1167 call esmf_fieldscatter(
temp_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1168 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1169 call error_handler(
"IN FieldScatter", rc)
1173 error=nf90_inq_varid(ncid,
'delp', id_var)
1174 call netcdf_err(error,
'reading field id' )
1175 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1176 call netcdf_err(error,
'reading field' )
1181 print*,
"- CALL FieldScatter FOR INPUT DELTA PRESSURE." 1182 call esmf_fieldscatter(
dpres_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1183 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1184 call error_handler(
"IN FieldScatter", rc)
1188 error=nf90_inq_varid(ncid,
'ua', id_var)
1189 call netcdf_err(error,
'reading field id' )
1190 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1191 call netcdf_err(error,
'reading field' )
1196 print*,
"- CALL FieldScatter FOR INPUT GRID U." 1197 call esmf_fieldscatter(
u_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1198 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1199 call error_handler(
"IN FieldScatter", rc)
1203 error=nf90_inq_varid(ncid,
'va', id_var)
1204 call netcdf_err(error,
'reading field id' )
1205 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1206 call netcdf_err(error,
'reading field' )
1211 print*,
"- CALL FieldScatter FOR INPUT GRID V." 1212 call esmf_fieldscatter(
v_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1213 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1214 call error_handler(
"IN FieldScatter", rc)
1222 print*,
"- READ ATMOSPHERIC TRACER FILE: ", trim(tilefile)
1223 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1224 call netcdf_err(error,
'opening: '//trim(tilefile) )
1231 call netcdf_err(error,
'reading field id' )
1232 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1233 call netcdf_err(error,
'reading field' )
1238 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(i))
1239 call esmf_fieldscatter(
tracers_input_grid(i), data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1240 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1241 call error_handler(
"IN FieldScatter", rc)
1258 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 1260 farrayptr=psptr, rc=rc)
1261 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1262 call error_handler(
"IN FieldGet", rc)
1264 print*,
"- CALL FieldGet FOR PRESSURE." 1266 computationallbound=clb, &
1267 computationalubound=cub, &
1268 farrayptr=presptr, rc=rc)
1269 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1270 call error_handler(
"IN FieldGet", rc)
1272 print*,
"- CALL FieldGet FOR DELTA PRESSURE." 1274 farrayptr=dpresptr, rc=rc)
1275 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1276 call error_handler(
"IN FieldGet", rc)
1280 do i = clb(1), cub(1)
1281 do j = clb(2), cub(2)
1284 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
1287 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1289 psptr(i,j) = pres_interface(1)
1294 deallocate(pres_interface)
1298 deallocate(data_one_tile_3d, data_one_tile)
1313 integer,
intent(in) :: localpet
1315 character(len=500) :: tilefile
1317 integer :: start(3), count(3), iscnt
1318 integer :: error, ncid, num_tracers_file
1319 integer :: id_dim, idim_input, jdim_input
1320 integer :: id_var, rc, nprocs, max_procs
1321 integer :: kdim, remainder, myrank, i, j, k, n
1322 integer :: clb(3), cub(3)
1323 integer,
allocatable :: kcount(:), startk(:), displ(:)
1324 integer,
allocatable :: ircnt(:)
1326 real(esmf_kind_r8),
allocatable :: phalf(:)
1327 real(esmf_kind_r8),
allocatable :: pres_interface(:)
1328 real(kind=4),
allocatable :: dummy3d(:,:,:)
1329 real(kind=4),
allocatable :: dummy3dall(:,:,:)
1330 real(esmf_kind_r8),
allocatable :: dummy3dflip(:,:,:)
1331 real(esmf_kind_r8),
allocatable :: dummy(:,:)
1332 real(esmf_kind_r8),
pointer :: presptr(:,:,:), dpresptr(:,:,:)
1333 real(esmf_kind_r8),
pointer :: psptr(:,:)
1335 print*,
"- READ INPUT ATMOS DATA FROM GAUSSIAN NETCDF FILE." 1338 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1339 call netcdf_err(error,
'opening: '//trim(tilefile) )
1341 error=nf90_inq_dimid(ncid,
'grid_xt', id_dim)
1342 call netcdf_err(error,
'reading grid_xt id' )
1343 error=nf90_inquire_dimension(ncid,id_dim,len=idim_input)
1344 call netcdf_err(error,
'reading grid_xt value' )
1346 error=nf90_inq_dimid(ncid,
'grid_yt', id_dim)
1347 call netcdf_err(error,
'reading grid_yt id' )
1348 error=nf90_inquire_dimension(ncid,id_dim,len=jdim_input)
1349 call netcdf_err(error,
'reading grid_yt value' )
1352 call error_handler(
"DIMENSION MISMATCH BETWEEN SFC AND OROG FILES.", 2)
1355 error=nf90_inq_dimid(ncid,
'pfull', id_dim)
1356 call netcdf_err(error,
'reading pfull id' )
1357 error=nf90_inquire_dimension(ncid,id_dim,len=
lev_input)
1358 call netcdf_err(error,
'reading pfull value' )
1360 error=nf90_inq_dimid(ncid,
'phalf', id_dim)
1361 call netcdf_err(error,
'reading phalf id' )
1362 error=nf90_inquire_dimension(ncid,id_dim,len=
levp1_input)
1363 call netcdf_err(error,
'reading phalf value' )
1365 error=nf90_inq_varid(ncid,
'phalf', id_var)
1366 call netcdf_err(error,
'getting phalf varid' )
1367 error=nf90_get_var(ncid, id_var, phalf)
1368 call netcdf_err(error,
'reading phalf varid' )
1370 error=nf90_get_att(ncid, nf90_global,
'ncnsto', num_tracers_file)
1371 call netcdf_err(error,
'reading ntracer value' )
1373 call mpi_comm_size(mpi_comm_world, nprocs, error)
1374 print*,
'- Running with ', nprocs,
' processors' 1376 call mpi_comm_rank(mpi_comm_world, myrank, error)
1377 print*,
'- myrank/localpet is ',myrank,localpet
1385 remainder =
lev_input - (max_procs*kdim)
1387 allocate(kcount(0:nprocs-1))
1389 allocate(startk(0:nprocs-1))
1391 allocate(displ(0:nprocs-1))
1393 allocate(ircnt(0:nprocs-1))
1396 do k = 0, max_procs-2
1399 kcount(max_procs-1) = kdim + remainder
1402 do k = 1, max_procs-1
1403 startk(k) = startk(k-1) + kcount(k-1)
1406 ircnt(:) = idim_input * jdim_input * kcount(:)
1409 do k = 1, max_procs-1
1410 displ(k) = displ(k-1) + ircnt(k-1)
1413 iscnt=idim_input*jdim_input*kcount(myrank)
1417 if (myrank <= max_procs-1)
then 1418 allocate(dummy3d(idim_input,jdim_input,kcount(myrank)))
1420 allocate(dummy3d(0,0,0))
1423 if (myrank == 0)
then 1424 allocate(dummy3dall(idim_input,jdim_input,
lev_input))
1426 allocate(dummy3dflip(idim_input,jdim_input,
lev_input))
1428 allocate(dummy(idim_input,jdim_input))
1431 allocate(dummy3dall(0,0,0))
1432 allocate(dummy3dflip(0,0,0))
1433 allocate(dummy(0,0))
1442 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE." 1444 typekind=esmf_typekind_r8, &
1445 staggerloc=esmf_staggerloc_center, &
1446 ungriddedlbound=(/1/), &
1448 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1449 call error_handler(
"IN FieldCreate", rc)
1453 if (myrank <= max_procs-1)
then 1454 start = (/1,1,startk(myrank)/)
1455 count = (/idim_input,jdim_input,kcount(myrank)/)
1456 error=nf90_inq_varid(ncid,
'tmp', id_var)
1457 call netcdf_err(error,
'reading tmp field id' )
1458 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1459 call netcdf_err(error,
'reading tmp field' )
1462 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1463 dummy3dall, ircnt, displ, mpi_real, &
1464 0, mpi_comm_world, error)
1465 if (error /= 0)
call error_handler(
"IN mpi_gatherv of temperature", error)
1467 if (myrank == 0)
then 1471 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE " 1472 call esmf_fieldscatter(
temp_input_grid, dummy3dflip, rootpet=0, rc=rc)
1473 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1474 call error_handler(
"IN FieldScatter", rc)
1478 if (myrank <= max_procs-1)
then 1479 error=nf90_inq_varid(ncid,
'dpres', id_var)
1480 call netcdf_err(error,
'reading dpres field id' )
1481 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1482 call netcdf_err(error,
'reading dpres field' )
1485 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1486 dummy3dall, ircnt, displ, mpi_real, &
1487 0, mpi_comm_world, error)
1488 if (error /= 0)
call error_handler(
"IN mpi_gatherv of dpres", error)
1490 if (myrank == 0)
then 1494 print*,
"- CALL FieldScatter FOR INPUT GRID DPRES " 1496 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1497 call error_handler(
"IN FieldScatter", rc)
1501 if (myrank <= max_procs-1)
then 1502 error=nf90_inq_varid(ncid,
'ugrd', id_var)
1503 call netcdf_err(error,
'reading ugrd field id' )
1504 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1505 call netcdf_err(error,
'reading ugrd field' )
1508 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1509 dummy3dall, ircnt, displ, mpi_real, &
1510 0, mpi_comm_world, error)
1511 if (error /= 0)
call error_handler(
"IN mpi_gatherv of ugrd", error)
1513 if (myrank == 0)
then 1517 print*,
"- CALL FieldScatter FOR INPUT GRID UGRD " 1518 call esmf_fieldscatter(
u_input_grid, dummy3dflip, rootpet=0, rc=rc)
1519 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1520 call error_handler(
"IN FieldScatter", rc)
1524 if (myrank <= max_procs-1)
then 1525 error=nf90_inq_varid(ncid,
'vgrd', id_var)
1526 call netcdf_err(error,
'reading vgrd field id' )
1527 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1528 call netcdf_err(error,
'reading vgrd field' )
1531 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1532 dummy3dall, ircnt, displ, mpi_real, &
1533 0, mpi_comm_world, error)
1534 if (error /= 0)
call error_handler(
"IN mpi_gatherv of vgrd", error)
1536 if (myrank == 0)
then 1540 print*,
"- CALL FieldScatter FOR INPUT GRID VGRD " 1541 call esmf_fieldscatter(
v_input_grid, dummy3dflip, rootpet=0, rc=rc)
1542 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1543 call error_handler(
"IN FieldScatter", rc)
1549 if (myrank <= max_procs-1)
then 1551 call netcdf_err(error,
'reading tracer field id' )
1552 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1553 call netcdf_err(error,
'reading tracer field' )
1556 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1557 dummy3dall, ircnt, displ, mpi_real, &
1558 0, mpi_comm_world, error)
1559 if (error /= 0)
call error_handler(
"IN mpi_gatherv of tracer", error)
1561 if (myrank == 0)
then 1563 where(dummy3dflip < 0.0) dummy3dflip = 0.0
1566 print*,
"- CALL FieldScatter FOR INPUT GRID ",
tracers_input(n)
1568 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1569 call error_handler(
"IN FieldScatter", rc)
1575 if (myrank == 0)
then 1579 print*,
"- CALL FieldScatter FOR INPUT GRID DZDT" 1580 call esmf_fieldscatter(
dzdt_input_grid, dummy3dflip, rootpet=0, rc=rc)
1581 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1582 call error_handler(
"IN FieldScatter", rc)
1584 deallocate(dummy3dflip, dummy3dall, dummy3d)
1589 print*,
"- READ TERRAIN." 1590 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
1591 call netcdf_err(error,
'reading hgtsfc field id' )
1592 error=nf90_get_var(ncid, id_var, dummy)
1593 call netcdf_err(error,
'reading hgtsfc field' )
1596 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN." 1598 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1599 call error_handler(
"IN FieldScatter", rc)
1604 print*,
"- READ SURFACE P." 1605 error=nf90_inq_varid(ncid,
'pressfc', id_var)
1606 call netcdf_err(error,
'reading pressfc field id' )
1607 error=nf90_get_var(ncid, id_var, dummy)
1608 call netcdf_err(error,
'reading pressfc field' )
1611 print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE P." 1612 call esmf_fieldscatter(
ps_input_grid, dummy, rootpet=0, rc=rc)
1613 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1614 call error_handler(
"IN FieldScatter", rc)
1616 deallocate(kcount, startk, displ, ircnt, dummy)
1628 print*,
"- CALL FieldGet FOR PRESSURE." 1630 computationallbound=clb, &
1631 computationalubound=cub, &
1632 farrayptr=presptr, rc=rc)
1633 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1634 call error_handler(
"IN FieldGet", rc)
1636 print*,
"- CALL FieldGet FOR DELTA PRESSURE." 1638 farrayptr=dpresptr, rc=rc)
1639 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1640 call error_handler(
"IN FieldGet", rc)
1642 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 1644 farrayptr=psptr, rc=rc)
1645 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1646 call error_handler(
"IN FieldGet", rc)
1663 do i = clb(1), cub(1)
1664 do j = clb(2), cub(2)
1667 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
1669 psptr(i,j) = pres_interface(1)
1671 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1676 deallocate(pres_interface, phalf)
1697 integer,
intent(in) :: localpet
1699 character(len=500) :: tilefile
1701 integer :: error, ncid, rc, tile
1702 integer :: id_dim, idim_input, jdim_input
1703 integer :: id_var, i, j, k, n
1704 integer :: clb(3), cub(3), num_tracers_file
1706 real(esmf_kind_r8),
allocatable :: data_one_tile(:,:)
1707 real(esmf_kind_r8),
allocatable :: data_one_tile_3d(:,:,:)
1708 real(esmf_kind_r8),
pointer :: presptr(:,:,:), dpresptr(:,:,:)
1709 real(esmf_kind_r8),
pointer :: psptr(:,:)
1710 real(esmf_kind_r8),
allocatable :: pres_interface(:), phalf(:)
1712 print*,
"- READ INPUT ATMOS DATA FROM TILED HISTORY FILES." 1715 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1716 call netcdf_err(error,
'opening: '//trim(tilefile) )
1718 error=nf90_inq_dimid(ncid,
'grid_xt', id_dim)
1719 call netcdf_err(error,
'reading grid_xt id' )
1720 error=nf90_inquire_dimension(ncid,id_dim,len=idim_input)
1721 call netcdf_err(error,
'reading grid_xt value' )
1723 error=nf90_inq_dimid(ncid,
'grid_yt', id_dim)
1724 call netcdf_err(error,
'reading grid_yt id' )
1725 error=nf90_inquire_dimension(ncid,id_dim,len=jdim_input)
1726 call netcdf_err(error,
'reading grid_yt value' )
1729 call error_handler(
"DIMENSION MISMATCH BETWEEN SFC AND OROG FILES.", 2)
1732 error=nf90_inq_dimid(ncid,
'pfull', id_dim)
1733 call netcdf_err(error,
'reading pfull id' )
1734 error=nf90_inquire_dimension(ncid,id_dim,len=
lev_input)
1735 call netcdf_err(error,
'reading pfull value' )
1737 error=nf90_inq_dimid(ncid,
'phalf', id_dim)
1738 call netcdf_err(error,
'reading phalf id' )
1739 error=nf90_inquire_dimension(ncid,id_dim,len=
levp1_input)
1740 call netcdf_err(error,
'reading phalf value' )
1742 error=nf90_inq_varid(ncid,
'phalf', id_var)
1743 call netcdf_err(error,
'getting phalf varid' )
1744 error=nf90_get_var(ncid, id_var, phalf)
1745 call netcdf_err(error,
'reading phalf varid' )
1747 error=nf90_get_att(ncid, nf90_global,
'ncnsto', num_tracers_file)
1748 call netcdf_err(error,
'reading ntracer value' )
1750 error = nf90_close(ncid)
1752 print*,
'- FILE HAS ', num_tracers_file,
' TRACERS.' 1761 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE." 1763 typekind=esmf_typekind_r8, &
1764 staggerloc=esmf_staggerloc_center, &
1765 ungriddedlbound=(/1/), &
1767 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1768 call error_handler(
"IN FieldCreate", rc)
1774 allocate(data_one_tile(0,0))
1775 allocate(data_one_tile_3d(0,0,0))
1781 print*,
"- READ ATMOSPHERIC DATA FROM: ", trim(tilefile)
1782 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1783 call netcdf_err(error,
'opening: '//trim(tilefile) )
1796 data_one_tile_3d = 0.0_8
1800 print*,
"- CALL FieldScatter FOR INPUT GRID VERTICAL VELOCITY." 1801 call esmf_fieldscatter(
dzdt_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1802 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1803 call error_handler(
"IN FieldScatter", rc)
1811 call netcdf_err(error,
'reading field id' )
1812 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1813 call netcdf_err(error,
'reading field' )
1818 print*,
"- CALL FieldScatter FOR INPUT GRID TRACER ", trim(
tracers_input(n))
1819 call esmf_fieldscatter(
tracers_input_grid(n), data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1820 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1821 call error_handler(
"IN FieldScatter", rc)
1827 print*,
"- READ TEMPERATURE." 1828 error=nf90_inq_varid(ncid,
'tmp', id_var)
1829 call netcdf_err(error,
'reading field id' )
1830 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1831 call netcdf_err(error,
'reading field' )
1836 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 1837 call esmf_fieldscatter(
temp_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1838 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1839 call error_handler(
"IN FieldScatter", rc)
1843 print*,
"- READ U-WIND." 1844 error=nf90_inq_varid(ncid,
'ugrd', id_var)
1845 call netcdf_err(error,
'reading field id' )
1846 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1847 call netcdf_err(error,
'reading field' )
1852 print*,
"- CALL FieldScatter FOR INPUT GRID U." 1853 call esmf_fieldscatter(
u_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1854 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1855 call error_handler(
"IN FieldScatter", rc)
1859 print*,
"- READ V-WIND." 1860 error=nf90_inq_varid(ncid,
'vgrd', id_var)
1861 call netcdf_err(error,
'reading field id' )
1862 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1863 call netcdf_err(error,
'reading field' )
1868 print*,
"- CALL FieldScatter FOR INPUT GRID V." 1869 call esmf_fieldscatter(
v_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1870 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1871 call error_handler(
"IN FieldScatter", rc)
1875 print*,
"- READ SURFACE PRESSURE." 1876 error=nf90_inq_varid(ncid,
'pressfc', id_var)
1877 call netcdf_err(error,
'reading field id' )
1878 error=nf90_get_var(ncid, id_var, data_one_tile)
1879 call netcdf_err(error,
'reading field' )
1883 print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE PRESSURE." 1884 call esmf_fieldscatter(
ps_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1885 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1886 call error_handler(
"IN FieldScatter", rc)
1890 print*,
"- READ TERRAIN." 1891 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
1892 call netcdf_err(error,
'reading field id' )
1893 error=nf90_get_var(ncid, id_var, data_one_tile)
1894 call netcdf_err(error,
'reading field' )
1898 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN." 1899 call esmf_fieldscatter(
terrain_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1900 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1901 call error_handler(
"IN FieldScatter", rc)
1905 print*,
"- READ DELTA PRESSURE." 1906 error=nf90_inq_varid(ncid,
'dpres', id_var)
1907 call netcdf_err(error,
'reading field id' )
1908 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1909 call netcdf_err(error,
'reading field' )
1914 print*,
"- CALL FieldScatter FOR INPUT DELTA PRESSURE." 1915 call esmf_fieldscatter(
dpres_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1916 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1917 call error_handler(
"IN FieldScatter", rc)
1922 deallocate(data_one_tile_3d, data_one_tile)
1934 print*,
"- CALL FieldGet FOR PRESSURE." 1936 computationallbound=clb, &
1937 computationalubound=cub, &
1938 farrayptr=presptr, rc=rc)
1939 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1940 call error_handler(
"IN FieldGet", rc)
1942 print*,
"- CALL FieldGet FOR DELTA PRESSURE." 1944 farrayptr=dpresptr, rc=rc)
1945 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1946 call error_handler(
"IN FieldGet", rc)
1948 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 1950 farrayptr=psptr, rc=rc)
1951 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1952 call error_handler(
"IN FieldGet", rc)
1960 do i = clb(1), cub(1)
1961 do j = clb(2), cub(2)
1962 pres_interface(1) = psptr(i,j)
1964 pres_interface(k) = pres_interface(k-1) - dpresptr(i,j,k-1)
1967 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1972 deallocate(pres_interface, phalf)
1991 integer,
intent(in) :: localpet
1993 integer,
parameter :: ntrac_max=15
1994 integer,
parameter :: max_levs=1000
1996 character(len=300) :: the_file
1997 character(len=20) :: vname, &
1998 trac_names_vmap(ntrac_max), &
2000 method, tracers_input_vmap(num_tracers_input), &
2001 tracers_default(ntrac_max)
2003 integer :: i, j, k, n
2005 integer :: rc, clb(3), cub(3)
2006 integer :: vlev, iret,varnum, o3n, pdt_num
2007 integer :: intrp_ier, done_print
2008 integer :: trac_names_oct10(ntrac_max)
2009 integer :: tracers_input_oct10(num_tracers_input)
2010 integer :: trac_names_oct11(ntrac_max)
2011 integer :: tracers_input_oct11(num_tracers_input)
2012 integer :: lugb, lugi, jdisc, jpdt(200), jgdt(200), iscale
2013 integer :: jids(200), jpdtn, jgdtn, octet_23, octet_29
2014 integer :: count_spfh, count_rh, count_icmr, count_scliwc
2015 integer :: count_cice, count_rwmr, count_scllwc, count
2017 logical :: conv_omega=.false., &
2020 use_rh=.false. , unpack, &
2021 all_empty, is_missing
2023 real(esmf_kind_r8),
allocatable :: dum2d_1(:,:)
2026 real(esmf_kind_r8) :: rlevs_hold(max_levs)
2027 real(esmf_kind_r8),
allocatable :: rlevs(:)
2028 real(esmf_kind_r4),
allocatable :: dummy2d(:,:)
2029 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:), dummy2d_8(:,:),&
2030 u_tmp_3d(:,:,:), v_tmp_3d(:,:,:),&
2032 real(esmf_kind_r8),
pointer :: presptr(:,:,:), psptr(:,:),tptr(:,:,:), &
2033 qptr(:,:,:), wptr(:,:,:), &
2034 uptr(:,:,:), vptr(:,:,:)
2035 real(esmf_kind_r4) :: value
2036 real(esmf_kind_r8),
parameter :: p0 = 100000.0
2037 real(esmf_kind_r8),
allocatable :: dummy3d_col_in(:),dummy3d_col_out(:)
2038 real(esmf_kind_r8),
parameter :: intrp_missing = -999.0
2039 real(esmf_kind_r4),
parameter :: lev_no_tr_fill = 20000.0
2040 real(esmf_kind_r4),
parameter :: lev_no_o3_fill = 40000.0
2042 type(gribfield) :: gfld
2046 trac_names_oct10 = (/1, 1, 14, 1, 1, 1, 1, 6, 6, 1, 6, 13, 13, 2, 20 /)
2047 trac_names_oct11 = (/0, 22, 192, 23, 24, 25, 32, 1, 29, 100, 28, 193, 192, 2, 0 /)
2050 trac_names_vmap = (/
"sphum ",
"liq_wat ",
"o3mr ",
"ice_wat ", &
2051 "rainwat ",
"snowwat ",
"graupel ",
"cld_amt ",
"ice_nc ", &
2052 "rain_nc ",
"water_nc",
"liq_aero",
"ice_aero", &
2053 "sgs_tke ",
"massden "/)
2055 tracers_default = (/
"sphum ",
"liq_wat ",
"o3mr ",
"ice_wat ", &
2056 "rainwat ",
"snowwat ",
"graupel ",
"cld_amt ",
"ice_nc ", &
2057 "rain_nc ",
"water_nc",
"liq_aero",
"ice_aero", &
2058 "sgs_tke ",
"smoke "/)
2062 print*,
"- READ ATMOS DATA FROM GRIB2 FILE: ", trim(the_file)
2064 if (localpet == 0)
then 2068 call baopenr(lugb,the_file,iret)
2069 if (iret /= 0)
call error_handler(
"ERROR OPENING GRIB2 FILE.", iret)
2080 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2081 unpack, k, gfld, iret)
2093 if (gfld%idsect(1) == 7 .and. gfld%idsect(2) == 2)
then 2094 print*,
'- THIS IS NCEP GEFS DATA.' 2102 call error_handler(
"READING GRIB2 FILE", iret)
2119 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2120 unpack, k, gfld, iret)
2123 print*,
'- DATA IS ON HYBRID LEVELS.' 2128 print*,
'- DATA IS ON ISOBARIC LEVELS.' 2145 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2146 unpack, k, gfld, iret)
2150 if (gfld%discipline == 0)
then 2151 if (gfld%ipdtnum == pdt_num)
then 2152 if (gfld%ipdtmpl(1) == 2 .and. gfld%ipdtmpl(2) == 2)
then 2154 if (gfld%ipdtmpl(10) == octet_23 .and. gfld%ipdtmpl(13) == octet_29)
then 2158 iscale = 10 ** gfld%ipdtmpl(11)
2159 rlevs_hold(
lev_input) = float(gfld%ipdtmpl(12))/float(iscale)
2170 call mpi_barrier(mpi_comm_world, iret)
2171 call mpi_bcast(isnative,1,mpi_logical,0,mpi_comm_world,iret)
2172 call mpi_bcast(
lev_input,1,mpi_integer,0,mpi_comm_world,iret)
2173 call mpi_bcast(pdt_num,1,mpi_integer,0,mpi_comm_world,iret)
2174 call mpi_bcast(rlevs_hold, max_levs, mpi_integer,0,mpi_comm_world,iret)
2186 rlevs(i) = rlevs_hold(i)
2193 write(
slevs(i),
'(i6)') nint(rlevs(i))
2196 if (any(
slevs(1:i-1)==
slevs(i)))
call error_handler(
"Duplicate vertical level entries found.",1)
2199 write(
slevs(i),
'(f11.2)') rlevs(i)
2202 if (any(
slevs(1:i-1)==
slevs(i)))
call error_handler(
"Duplicate vertical level entries found.",1)
2207 if(localpet == 0)
then 2209 print*,
"- LEVEL AFTER SORT = ",trim(
slevs(i))
2215 if (localpet == 0)
then 2228 jpdt(12) = nint(rlevs(vlev))
2230 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2231 unpack, k, gfld, iret)
2234 count_spfh = count_spfh + 1
2244 jpdt(12) = nint(rlevs(vlev))
2246 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2247 unpack, k, gfld, iret)
2250 count_rh = count_rh + 1
2258 if (count_spfh == 0 .or. use_rh)
then 2259 if (count_rh == 0)
then 2260 call error_handler(
"READING ATMOSPHERIC WATER VAPOR VARIABLE.", 2)
2263 trac_names_oct10(1) = 1
2264 trac_names_oct11(1) = 1
2265 print*,
"- FILE CONTAINS RH." 2267 print*,
"- FILE CONTAINS SPFH." 2272 call mpi_barrier(mpi_comm_world, rc)
2273 call mpi_bcast(hasspfh,1,mpi_logical,0,mpi_comm_world,rc)
2277 if (localpet == 0)
then 2295 jpdt(12) = nint(rlevs(vlev))
2297 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2298 unpack, k, gfld, iret)
2301 count_icmr = count_icmr + 1
2307 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2308 unpack, k, gfld, iret)
2311 count_scliwc = count_scliwc + 1
2317 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2318 unpack, k, gfld, iret)
2321 count_cice = count_cice + 1
2327 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2328 unpack, k, gfld, iret)
2331 count_rwmr = count_rwmr + 1
2338 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2339 unpack, k, gfld, iret)
2342 count_scllwc = count_scllwc + 1
2347 if (count_icmr == 0)
then 2348 if (count_scliwc == 0)
then 2349 if (count_cice == 0)
then 2350 print*,
'- FILE DOES NOT CONTAIN CICE.' 2352 trac_names_oct10(4) = 6
2353 trac_names_oct11(4) = 0
2354 print*,
"- FILE CONTAINS CICE." 2357 trac_names_oct10(4) = 1
2358 trac_names_oct11(4) = 84
2359 print*,
"- FILE CONTAINS SCLIWC." 2362 print*,
"- FILE CONTAINS ICMR." 2365 if (count_rwmr == 0)
then 2366 if (count_scllwc == 0)
then 2367 print*,
"- FILE DOES NOT CONTAIN SCLLWC." 2369 trac_names_oct10(4) = 1
2370 trac_names_oct11(4) = 83
2372 print*,
"- FILE CONTAINS SCLLWC." 2375 print*,
"- FILE CONTAINS CLWMR." 2380 call mpi_barrier(mpi_comm_world, rc)
2381 call mpi_bcast(trac_names_oct10,ntrac_max,mpi_integer,0,mpi_comm_world,rc)
2382 call mpi_bcast(trac_names_oct11,ntrac_max,mpi_integer,0,mpi_comm_world,rc)
2384 print*,
"- COUNT NUMBER OF TRACERS TO BE READ IN BASED ON PHYSICS SUITE TABLE" 2385 do n = 1, num_tracers_input
2389 i = maxloc(merge(1.,0.,trac_names_vmap == vname),dim=1)
2391 tracers_input_vmap(n)=trac_names_vmap(i)
2393 if(trim(
tracers(n)) .eq.
"o3mr") o3n = n
2395 tracers_input_oct10(n) = trac_names_oct10(i)
2396 tracers_input_oct11(n) = trac_names_oct11(i)
2406 if (localpet == 0)
then 2416 allocate(dummy2d(0,0))
2417 allocate(dummy2d_8(0,0))
2418 allocate(dummy3d(0,0,0))
2421 allocate(dummy3d_pres(0,0,0))
2423 allocate(dum2d_1(0,0))
2432 if (localpet == 0)
then 2434 print*,
"- READ TEMPERATURE." 2451 jpdt(12) = nint(rlevs(vlev))
2453 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2454 unpack, k, gfld, iret)
2456 call error_handler(
"READING IN TEMPERATURE AT LEVEL "//trim(
slevs(vlev)),iret)
2461 dummy3d(:,:,vlev) = dum2d_1
2467 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 2469 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2470 call error_handler(
"IN FieldScatter", rc)
2474 do n = 1, num_tracers_input
2476 if (localpet == 0) print*,
"- READ ", trim(tracers_input_vmap(n))
2478 vname = tracers_input_vmap(n)
2479 call get_var_cond(vname,this_miss_var_method=method, this_miss_var_value=
value, &
2480 this_field_var_name=tmpstr,loc=varnum)
2482 if (n==1 .and. .not. hasspfh .or. &
2485 tracers_input_vmap(n) == trac_names_vmap(15) ))
then 2486 print*,
"- CALL FieldGather TEMPERATURE." 2487 call esmf_fieldgather(
temp_input_grid,dummy3d,rootpet=0, tile=1, rc=rc)
2488 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2489 call error_handler(
"IN FieldGet", rc)
2494 tracers_input_vmap(n) == trac_names_vmap(15))
then 2496 if (localpet == 0)
then 2498 print*,
"- READ PRESSURE FOR SMOKE CONVERSION." 2514 jpdt(12) = nint(rlevs(vlev))
2515 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2516 unpack, k, gfld, iret)
2518 call error_handler(
"READING IN PRESSURE AT LEVEL"//trim(
slevs(vlev)),iret)
2523 dummy3d_pres(:,:,vlev) = dum2d_1
2531 if (tracers_input_vmap(n) == trac_names_vmap(15) .and. &
2538 if (localpet == 0)
then 2554 jpdt(1) = tracers_input_oct10(n)
2555 jpdt(2) = tracers_input_oct11(n)
2556 jpdt(12) = nint(rlevs(vlev))
2558 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2559 unpack, k, gfld, iret)
2575 is_missing = .false.
2581 jpdt(1) = tracers_input_oct10(n)
2582 jpdt(2) = tracers_input_oct11(n)
2583 jpdt(12) = nint(rlevs(vlev) )
2585 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2586 unpack, k, gfld, iret)
2589 dummy2d =
real((reshape(gfld%fld, (/i_input,j_input/) )), kind=esmf_kind_r4)
2591 if (trim(method) .eq.
'intrp' .and. .not.all_empty)
then 2592 dummy2d = intrp_missing
2597 if (.not.all_empty .and. n == o3n)
then 2598 if (rlevs(vlev) .lt. lev_no_o3_fill) &
2599 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev))//&
2600 ". SET MISSING VARIABLE CONDITION TO 'INTRP' TO AVOID THIS ERROR", 1)
2601 elseif (.not.all_empty .and. n .ne. o3n)
then 2602 if (rlevs(vlev) .gt. lev_no_tr_fill) &
2603 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev))//&
2604 ". SET MISSING VARIABLE CONDITION TO 'INTRP' TO AVOID THIS ERROR.", 1)
2607 if (trim(method) .eq.
'intrp' .and. all_empty) method=
'set_to_fill' 2609 call handle_grib_error(vname,
slevs(vlev),method,
value,varnum,
read_from_input,iret,var=dummy2d)
2611 if ( (tracers_input_oct10(n) == 1 .and. tracers_input_oct11(n) == 0) .or. &
2612 (tracers_input_oct10(n) == 1 .and. tracers_input_oct11(n) == 1) .or. &
2613 (tracers_input_oct10(n) == 14 .and. tracers_input_oct11(n) == 192) )
then 2614 call error_handler(
"READING IN "//trim(
tracers(n))//
" AT LEVEL "//trim(
slevs(vlev))&
2615 //
". SET A FILL VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
2621 if (n==1 .and. .not. hasspfh)
then 2623 print *,
'- CALL CALRH GFS' 2624 call rh2spfh_gfs(dummy2d,rlevs(vlev),dummy3d(:,:,vlev))
2626 print *,
'- CALL CALRH non-GFS' 2627 call rh2spfh(dummy2d,rlevs(vlev),dummy3d(:,:,vlev))
2632 if ( tracers_input_vmap(n) == trac_names_vmap(15) )
then 2635 dummy2d(i,j) = dummy2d(i,j) * 1.0d9 * &
2636 (287.05 * dummy3d(i,j,vlev) / dummy3d_pres(i,j,vlev))
2641 dummy3d(:,:,vlev) =
real(dummy2d,esmf_kind_r8)
2646 if (is_missing .and. trim(method) .eq.
'intrp')
then 2647 print *,
'- INTERPOLATE TRACER '//trim(
tracers(n))
2651 dummy3d_col_in=dummy3d(ii,jj,:)
2652 call dint2p(rlevs,dummy3d_col_in,
lev_input,rlevs,dummy3d_col_out, &
2654 if (intrp_ier .gt. 0)
call error_handler(
"Interpolation failed.",intrp_ier)
2655 dummy3d(ii,jj,:)=dummy3d_col_out
2659 dummy2d =
real(dummy3d(:,:,n) , kind=esmf_kind_r4)
2660 if (any(dummy2d .eq. intrp_missing))
then 2662 if (n == o3n .and. rlevs(vlev) .lt. lev_no_o3_fill)
then 2663 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev)),1)
2664 elseif (n .ne. o3n .and. rlevs(vlev) .gt. lev_no_tr_fill)
then 2665 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev)),1)
2667 if (done_print .eq. 0)
then 2668 print*,
"Pressure out of range of existing data. Defaulting to fill value." 2671 where(dummy2d .eq. intrp_missing) dummy2d =
value 2672 dummy3d(:,:,vlev) = dummy2d
2676 where(dummy3d(:,:,vlev) .lt. 0.0) dummy3d(:,:,vlev) = 0.0
2682 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT ", trim(tracers_input_vmap(n))
2684 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2685 call error_handler(
"IN FieldScatter", rc)
2689 deallocate(dummy3d_col_in, dummy3d_col_out)
2691 call read_winds(u_tmp_3d,v_tmp_3d,localpet,octet_23,rlevs,lugb,pdt_num)
2693 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT U-WIND." 2694 call esmf_fieldscatter(
u_input_grid, u_tmp_3d, rootpet=0, rc=rc)
2695 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2696 call error_handler(
"IN FieldScatter", rc)
2698 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT V-WIND." 2699 call esmf_fieldscatter(
v_input_grid, v_tmp_3d, rootpet=0, rc=rc)
2700 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2701 call error_handler(
"IN FieldScatter", rc)
2703 if (localpet == 0)
then 2705 print*,
"- READ SURFACE PRESSURE." 2718 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2719 unpack, k, gfld, iret)
2720 if (iret /= 0)
call error_handler(
"READING SURFACE PRESSURE RECORD.", iret)
2726 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE PRESSURE." 2727 call esmf_fieldscatter(
ps_input_grid, dummy2d_8, rootpet=0, rc=rc)
2728 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2729 call error_handler(
"IN FieldScatter", rc)
2733 if (localpet == 0)
then 2735 print*,
"- READ DZDT." 2737 call get_var_cond(vname,this_miss_var_method=method, this_miss_var_value=
value, &
2755 jpdt(12) = nint(rlevs(vlev))
2757 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2758 unpack, k, gfld, iret)
2761 print*,
"DZDT not available at level ", trim(
slevs(vlev)),
" so checking for VVEL" 2763 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2764 unpack, k, gfld, iret)
2766 call handle_grib_error(vname,
slevs(vlev),method,
value,varnum,
read_from_input,iret,var8=dum2d_1)
2778 dummy3d(:,:,vlev) = dum2d_1
2784 call mpi_bcast(conv_omega,1,mpi_logical,0,mpi_comm_world,rc)
2786 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT DZDT." 2788 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2789 call error_handler(
"IN FieldScatter", rc)
2793 if (localpet == 0)
then 2795 print*,
"- READ TERRAIN." 2808 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2809 unpack, k, gfld, iret)
2810 if (iret /= 0)
call error_handler(
"READING TERRAIN HEIGHT RECORD.", iret)
2816 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN." 2818 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2819 call error_handler(
"IN FieldScatter", rc)
2821 deallocate(dummy2d, dummy2d_8)
2823 if (.not. isnative)
then 2830 if (localpet == 0) print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 2833 farrayptr=psptr, rc=rc)
2834 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2835 call error_handler(
"IN FieldGet", rc)
2838 if (localpet == 0) print*,
"- CALL FieldGet FOR 3-D PRESSURE." 2840 computationallbound=clb, &
2841 computationalubound=cub, &
2842 farrayptr=presptr, rc=rc)
2843 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2844 call error_handler(
"IN FieldGet", rc)
2847 if (localpet == 0) print*,
"- CALL FieldGet TEMPERATURE." 2849 farrayptr=tptr, rc=rc)
2850 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2851 call error_handler(
"IN FieldGet", rc)
2854 if (localpet == 0) print*,
"- CALL FieldGet FOR U" 2856 farrayptr=uptr, rc=rc)
2857 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2858 call error_handler(
"IN FieldGet", rc)
2861 if (localpet == 0) print*,
"- CALL FieldGet FOR V" 2863 farrayptr=vptr, rc=rc)
2864 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2865 call error_handler(
"IN FieldGet", rc)
2868 if (localpet == 0) print*,
"- CALL FieldGet FOR W" 2870 farrayptr=wptr, rc=rc)
2871 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2872 call error_handler(
"IN FieldGet", rc)
2874 if (localpet == 0) print*,
"- CALL FieldGet FOR TRACERS." 2875 do n=1,num_tracers_input
2878 farrayptr=qptr, rc=rc)
2879 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2880 call error_handler(
"IN FieldGet", rc)
2881 do i = clb(1),cub(1)
2882 do j = clb(2),cub(2)
2888 do i = clb(1),cub(1)
2889 do j = clb(2),cub(2)
2898 if (localpet == 0)
then 2899 print*,
'psfc is ',clb(1),clb(2),psptr(clb(1),clb(2))
2900 print*,
'pres is ',cub(1),cub(2),presptr(cub(1),cub(2),:)
2902 print*,
'pres check 1',localpet,maxval(presptr(clb(1):cub(1),clb(2):cub(2),1)), &
2903 minval(presptr(clb(1):cub(1),clb(2):cub(2),1))
2904 print*,
'pres check lev',localpet,maxval(presptr(clb(1):cub(1),clb(2):cub(2), &
2912 if (localpet == 0)
then 2914 print*,
"- READ PRESSURE." 2930 jpdt(12) = nint(rlevs(vlev))
2931 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2932 unpack, k, gfld, iret)
2934 call error_handler(
"READING IN PRESSURE AT LEVEL "//trim(
slevs(vlev)),iret)
2939 dummy3d(:,:,vlev) = dum2d_1
2945 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID PRESSURE." 2947 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2948 call error_handler(
"IN FieldScatter", rc)
2952 deallocate(dummy3d, dum2d_1)
2953 if (
allocated(dummy3d_pres))
deallocate(dummy3d_pres)
2965 if (conv_omega)
then 2967 if (localpet == 0) print*,
"- CONVERT FROM OMEGA TO DZDT." 2970 if (localpet == 0) print*,
"- CALL FieldGet TEMPERATURE." 2972 farrayptr=tptr, rc=rc)
2973 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2974 call error_handler(
"IN FieldGet", rc)
2977 if (localpet == 0) print*,
"- CALL FieldGet SPECIFIC HUMIDITY." 2979 computationallbound=clb, &
2980 computationalubound=cub, &
2981 farrayptr=qptr, rc=rc)
2982 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2983 call error_handler(
"IN FieldGet", rc)
2986 if (localpet == 0) print*,
"- CALL FieldGet DZDT." 2988 computationallbound=clb, &
2989 computationalubound=cub, &
2990 farrayptr=wptr, rc=rc)
2991 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2992 call error_handler(
"IN FieldGet", rc)
2996 farrayptr=presptr, rc=rc)
2997 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2998 call error_handler(
"IN FieldGet", rc)
3004 if (localpet == 0)
call baclose(lugb, rc)
3019 subroutine read_winds(u,v,localpet,octet_23,rlevs,lugb,pdt_num)
3026 integer,
intent(in) :: localpet, lugb
3027 integer,
intent(in) :: pdt_num, octet_23
3029 real(esmf_kind_r8),
intent(inout),
allocatable :: u(:,:,:),v(:,:,:)
3030 real(esmf_kind_r8),
intent(in),
dimension(lev_input) :: rlevs
3032 real(esmf_kind_r4),
dimension(i_input,j_input) :: alpha
3033 real(esmf_kind_r8),
dimension(i_input,j_input) :: lon, lat
3034 real(esmf_kind_r4),
allocatable :: u_tmp(:,:),v_tmp(:,:)
3035 real(esmf_kind_r8),
allocatable :: dum2d(:,:)
3036 real(esmf_kind_r4),
dimension(i_input,j_input) :: ws,wd
3037 real(esmf_kind_r4) :: value_u, value_v,lov,latin1,latin2
3038 real(esmf_kind_r8) :: d2r
3040 integer :: varnum_u, varnum_v, vlev, &
3042 integer :: j, k, lugi, jgdtn, jpdtn
3043 integer :: jdisc, jids(200), jgdt(200), jpdt(200)
3045 character(len=20) :: vname
3046 character(len=50) :: method_u, method_v
3050 type(gribfield) :: gfld
3052 d2r=acos(-1.0_esmf_kind_r8) / 180.0_esmf_kind_r8
3053 if (localpet==0)
then 3062 call get_var_cond(vname,this_miss_var_method=method_u, this_miss_var_value=value_u, &
3065 call get_var_cond(vname,this_miss_var_method=method_v, this_miss_var_value=value_v, &
3068 print*,
"- CALL FieldGather FOR INPUT GRID LONGITUDE" 3070 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3071 call error_handler(
"IN FieldGather", error)
3073 print*,
"- CALL FieldGather FOR INPUT GRID LATITUDE" 3075 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3076 call error_handler(
"IN FieldGather", error)
3078 if (localpet==0)
then 3090 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3091 unpack, k, gfld, iret)
3093 if (iret /= 0)
call error_handler(
"ERROR READING GRIB2 FILE.", iret)
3095 if (gfld%igdtnum == 32769)
then 3097 latin1 =
real(float(gfld%igdtmpl(15))/1.0E6, kind=esmf_kind_r4)
3098 lov =
real(float(gfld%igdtmpl(16))/1.0E6, kind=esmf_kind_r4)
3100 print*,
"- CALL CALCALPHA_ROTLATLON with center lat,lon = ",latin1,lov
3103 elseif (gfld%igdtnum == 1)
then 3105 latin1 =
real(float(gfld%igdtmpl(20))/1.0E6, kind=esmf_kind_r4) + 90.0_esmf_kind_r4
3106 lov =
real(float(gfld%igdtmpl(21))/1.0E6, kind=esmf_kind_r4)
3108 print*,
"- CALL CALCALPHA_ROTLATLON with center lat,lon = ",latin1,lov
3111 elseif (gfld%igdtnum == 30)
then 3113 lov =
real(float(gfld%igdtmpl(14))/1.0E6, kind=esmf_kind_r4)
3114 latin1 =
real(float(gfld%igdtmpl(19))/1.0E6, kind=esmf_kind_r4)
3115 latin2 =
real(float(gfld%igdtmpl(20))/1.0E6, kind=esmf_kind_r4)
3117 print*,
"- CALL GRIDROT for LC grid with lov,latin1/2 = ",lov,latin1,latin2
3118 call gridrot(lov,latin1,latin2,lon,alpha)
3136 jpdt(12) = nint(rlevs(vlev))
3138 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3139 unpack, k, gfld, iret)
3142 call handle_grib_error(vname,
slevs(vlev),method_u,value_u,varnum_u,read_from_input,iret,var=u_tmp)
3144 call error_handler(
"READING IN U AT LEVEL "//trim(
slevs(vlev))//
". SET A FILL "// &
3145 "VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
3149 u_tmp(:,:) =
real(dum2d, kind=esmf_kind_r4)
3156 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3157 unpack, k, gfld, iret)
3160 call handle_grib_error(vname,
slevs(vlev),method_v,value_v,varnum_v,read_from_input,iret,var=v_tmp)
3162 call error_handler(
"READING IN V AT LEVEL "//trim(
slevs(vlev))//
". SET A FILL "// &
3163 "VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
3167 v_tmp(:,:) =
real(dum2d, kind=esmf_kind_r4)
3172 if (gfld%igdtnum == 0)
then 3173 if (external_model ==
'UKMET')
then 3180 else if (gfld%igdtnum == 32769 .or. gfld%igdtnum == 1)
then 3181 ws = sqrt(u_tmp**2 + v_tmp**2)
3182 wd =
real((atan2(-u_tmp,-v_tmp) / d2r), kind=esmf_kind_r4) 3183 wd =
real((wd + alpha + 180.0), kind=esmf_kind_r4) 3184 wd =
real((270.0 - wd), kind=esmf_kind_r4) 3185 u(:,:,vlev) = -ws*cos(wd*d2r)
3186 v(:,:,vlev) = -ws*sin(wd*d2r)
3188 u(:,:,vlev) =
real(u_tmp * cos(alpha) + v_tmp * sin(alpha),esmf_kind_r8)
3189 v(:,:,vlev) =
real(v_tmp * cos(alpha) - u_tmp * sin(alpha),esmf_kind_r8)
3192 print*,
'max, min U ', minval(u(:,:,vlev)), maxval(u(:,:,vlev))
3193 print*,
'max, min V ', minval(v(:,:,vlev)), maxval(v(:,:,vlev))
3206 integer :: clb(3), cub(3)
3207 integer :: i, j, k, rc
3209 real(esmf_kind_r8) :: latrad, lonrad
3210 real(esmf_kind_r8),
pointer :: xptr(:,:,:)
3211 real(esmf_kind_r8),
pointer :: yptr(:,:,:)
3212 real(esmf_kind_r8),
pointer :: zptr(:,:,:)
3213 real(esmf_kind_r8),
pointer :: uptr(:,:,:)
3214 real(esmf_kind_r8),
pointer :: vptr(:,:,:)
3215 real(esmf_kind_r8),
pointer :: latptr(:,:)
3216 real(esmf_kind_r8),
pointer :: lonptr(:,:)
3218 print*,
"- CALL FieldGet FOR xwind." 3220 computationallbound=clb, &
3221 computationalubound=cub, &
3222 farrayptr=xptr, rc=rc)
3223 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3224 call error_handler(
"IN FieldGet", rc)
3226 print*,
"- CALL FieldGet FOR ywind." 3228 farrayptr=yptr, rc=rc)
3229 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3230 call error_handler(
"IN FieldGet", rc)
3232 print*,
"- CALL FieldGet FOR zwind." 3234 farrayptr=zptr, rc=rc)
3235 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3236 call error_handler(
"IN FieldGet", rc)
3238 print*,
"- CALL FieldGet FOR U." 3240 farrayptr=uptr, rc=rc)
3241 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3242 call error_handler(
"IN FieldGet", rc)
3244 print*,
"- CALL FieldGet FOR V." 3246 farrayptr=vptr, rc=rc)
3247 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3248 call error_handler(
"IN FieldGet", rc)
3250 print*,
"- CALL FieldGet FOR LATITUDE." 3252 farrayptr=latptr, rc=rc)
3253 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3254 call error_handler(
"IN FieldGet", rc)
3256 print*,
"- CALL FieldGet FOR LONGITUDE." 3258 farrayptr=lonptr, rc=rc)
3259 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3260 call error_handler(
"IN FieldGet", rc)
3262 do i = clb(1), cub(1)
3263 do j = clb(2), cub(2)
3264 latrad = latptr(i,j) * acos(-1.) / 180.0
3265 lonrad = lonptr(i,j) * acos(-1.) / 180.0
3266 do k = clb(3), cub(3)
3267 xptr(i,j,k) = uptr(i,j,k) * cos(lonrad) - vptr(i,j,k) * sin(latrad) * sin(lonrad)
3268 yptr(i,j,k) = uptr(i,j,k) * sin(lonrad) + vptr(i,j,k) * sin(latrad) * cos(lonrad)
3269 zptr(i,j,k) = vptr(i,j,k) * cos(latrad)
3292 subroutine gridrot(lov,latin1,latin2,lon,rot)
3298 real(esmf_kind_r4),
intent(in) :: lov,latin1,latin2
3299 real(esmf_kind_r4),
intent(inout) :: rot(i_input,j_input)
3300 real(esmf_kind_r8),
intent(in) :: lon(i_input,j_input)
3302 real(esmf_kind_r4) :: trot(i_input,j_input), tlon(i_input,j_input)
3303 real(esmf_kind_r4) :: dtor = 3.14159265359_esmf_kind_r4/180.0_esmf_kind_r4
3304 real(esmf_kind_r4) :: an
3310 if ( (latin1 - latin2) .lt. 0.000001 )
then 3311 an = sin(latin1*dtor)
3313 an =
real(log( cos(latin1*dtor) / cos(latin2*dtor) ) / &
log( tan(dtor*(90.0-latin1)/2.) / tan(dtor*(90.0-latin2)/2.)), kind=esmf_kind_r4)
3316 tlon =
real((mod(lon - lov + 180. + 3600., 360.) - 180.), kind=esmf_kind_r4)
3337 real(esmf_kind_r8),
intent(in) :: latgrid(i_input,j_input), &
3338 longrid(i_input,j_input)
3339 real(esmf_kind_r4),
intent(in) :: cenlat, cenlon
3340 real(esmf_kind_r4),
intent(out) :: alpha(i_input,j_input)
3343 real(esmf_kind_r8) :: D2R,lon0_r,lat0_r,sphi0,cphi0
3344 real(esmf_kind_r8),
DIMENSION(i_input,j_input) :: tlat,tlon,tph,sinalpha
3346 d2r = acos(-1.0_esmf_kind_r8) / 180.0_esmf_kind_r8
3347 if (cenlon .lt. 0)
then 3348 lon0_r = (cenlon + 360.0)*d2r
3357 tlat = latgrid * d2r
3358 tlon = longrid * d2r
3361 tlon = -tlon + lon0_r
3362 tph = asin(cphi0*sin(tlat) - sphi0*cos(tlat)*cos(tlon))
3363 sinalpha = sphi0 * sin(tlon) / cos(tph)
3364 alpha =
real((-asin(sinalpha)/D2R), kind=esmf_kind_r4)
3377 print*,
'- DESTROY ATMOSPHERIC INPUT DATA.' 3396 Utilities for use when reading grib2 data.
This module contains code to read the setup namelist file, handle the varmap file for GRIB2 data...
character(len=500), dimension(6), public atm_tracer_files_input_grid
File names of input atmospheric restart tracer files.
integer, public num_tracers_input
Number of atmospheric tracers in input file.
integer, public ip1_input
i_input plus 1
integer, public j_input
j-dimension of input grid (or of each global tile)
character(len=20), dimension(max_tracers), public tracers
Name of each atmos tracer to be processed.
integer, public jp1_input
j_input plus 1
Sets up the ESMF grid objects for the input data grid and target FV3 grid.
character(len=20), dimension(max_tracers), public tracers_input
Name of each atmos tracer record in the input file.
type(esmf_field), public latitude_input_grid
latitude of grid center, input grid
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.
integer, public num_tiles_input_grid
Number of tiles, input grid.
subroutine, public rh2spfh_gfs(rh_sphum, p, t)
Convert relative humidity to specific humidity (GFS formula) Calculation of saturation water vapor pr...
character(len=20), public external_model
The model that the input data is derived from.
character(len=500), dimension(6), public atm_files_input_grid
File names of input atmospheric data.
type(esmf_grid), public input_grid
input grid esmf grid object
character(len=500), public data_dir_input_grid
Directory containing input atm or sfc files.
subroutine, public convert_omega(omega, p, t, q, clb, cub)
Convert omega to vertical velocity.
character(len=25), public input_type
Input data type:
character(len=500), dimension(7), public atm_core_files_input_grid
File names of input atmospheric restart core files.
type(esmf_field), public longitude_input_grid
longitude of grid center, input grid
character(len=500), public grib2_file_input_grid
REQUIRED.
logical, dimension(:), allocatable, public read_from_input
When false, variable was not read from GRIB2 input file.
integer, public i_input
i-dimension of input grid (or of each global tile)
subroutine, public rh2spfh(rh_sphum, p, t)
Convert relative humidity to specific humidity.