37 use utilities,
only : error_handler, &
63 character(len=50),
private,
allocatable ::
slevs(:)
79 integer,
intent(in) :: localpet
93 elseif (trim(
input_type) ==
"gaussian_netcdf")
then 109 elseif (trim(
input_type) ==
"gaussian_nemsio")
then 117 elseif (trim(
input_type) ==
"gfs_gaussian_nemsio")
then 151 print*,
"- INITIALIZE ATMOSPHERIC ESMF FIELDS." 153 print*,
"- CALL FieldCreate FOR INPUT GRID 3-D WIND." 155 typekind=esmf_typekind_r8, &
156 staggerloc=esmf_staggerloc_center, &
157 ungriddedlbound=(/1,1/), &
159 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
160 call error_handler(
"IN FieldCreate", rc)
162 print*,
"- CALL FieldCreate FOR INPUT GRID SURFACE PRESSURE." 164 typekind=esmf_typekind_r8, &
165 staggerloc=esmf_staggerloc_center, rc=rc)
166 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
167 call error_handler(
"IN FieldCreate", rc)
169 print*,
"- CALL FieldCreate FOR INPUT GRID TERRAIN." 171 typekind=esmf_typekind_r8, &
172 staggerloc=esmf_staggerloc_center, rc=rc)
173 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
174 call error_handler(
"IN FieldCreate", rc)
176 print*,
"- CALL FieldCreate FOR INPUT GRID TEMPERATURE." 178 typekind=esmf_typekind_r8, &
179 staggerloc=esmf_staggerloc_center, &
180 ungriddedlbound=(/1/), &
182 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
183 call error_handler(
"IN FieldCreate", rc)
188 print*,
"- CALL FieldCreate FOR INPUT GRID TRACER ", trim(
tracers_input(i))
190 typekind=esmf_typekind_r8, &
191 staggerloc=esmf_staggerloc_center, &
192 ungriddedlbound=(/1/), &
194 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
195 call error_handler(
"IN FieldCreate", rc)
198 print*,
"- CALL FieldCreate FOR INPUT GRID DZDT." 200 typekind=esmf_typekind_r8, &
201 staggerloc=esmf_staggerloc_center, &
202 ungriddedlbound=(/1/), &
204 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
205 call error_handler(
"IN FieldCreate", rc)
207 print*,
"- CALL FieldCreate FOR INPUT GRID U." 209 typekind=esmf_typekind_r8, &
210 staggerloc=esmf_staggerloc_center, &
211 ungriddedlbound=(/1/), &
213 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
214 call error_handler(
"IN FieldCreate", rc)
216 print*,
"- CALL FieldCreate FOR INPUT GRID V." 218 typekind=esmf_typekind_r8, &
219 staggerloc=esmf_staggerloc_center, &
220 ungriddedlbound=(/1/), &
222 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
223 call error_handler(
"IN FieldCreate", rc)
225 print*,
"- CALL FieldCreate FOR INPUT GRID PRESSURE." 227 typekind=esmf_typekind_r8, &
228 staggerloc=esmf_staggerloc_center, &
229 ungriddedlbound=(/1/), &
231 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
232 call error_handler(
"IN FieldCreate", rc)
247 integer,
intent(in) :: localpet
249 character(len=300) :: the_file
251 integer(sigio_intkind) :: iret
252 integer :: rc, i, j, k
253 integer :: clb(3), cub(3)
255 real(esmf_kind_r8) :: ak, bk
256 real(esmf_kind_r8),
allocatable :: dummy2d(:,:)
257 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:)
258 real(esmf_kind_r8),
allocatable :: dummy3d2(:,:,:)
259 real(esmf_kind_r8),
pointer :: pptr(:,:,:), psptr(:,:)
260 real(esmf_kind_r8),
allocatable :: pi(:,:,:)
262 type(sigio_head) :: sighead
263 type(sigio_dbta) :: sigdata
267 print*,
"- ATMOSPHERIC DATA IN SIGIO FORMAT." 268 print*,
"- OPEN AND READ: ", trim(the_file)
270 call sigio_sropen(21, trim(the_file), iret)
273 call error_handler(
"OPENING SPECTRAL GFS SIGIO FILE.", rc)
275 call sigio_srhead(21, sighead, iret)
278 call error_handler(
"READING SPECTRAL GFS SIGIO FILE.", rc)
285 call error_handler(
"WRONG NUMBER OF TRACERS EXPECTED.", 99)
288 if (sighead%idvt == 0 .or. sighead%idvt == 21)
then 292 call error_handler(
"TRACERS SELECTED DO NOT MATCH FILE CONTENTS.", 99)
295 print*,
'- UNRECOGNIZED IDVT: ', sighead%idvt
296 call error_handler(
"UNRECOGNIZED IDVT", 99)
305 if (localpet == 0)
then 310 allocate(dummy2d(0,0))
311 allocate(dummy3d(0,0,0))
312 allocate(dummy3d2(0,0,0))
315 if (localpet == 0)
then 316 call sigio_aldbta(sighead, sigdata, iret)
319 call error_handler(
"ALLOCATING SIGDATA.", rc)
321 call sigio_srdbta(21, sighead, sigdata, iret)
324 call error_handler(
"READING SIGDATA.", rc)
326 call sptez(0,sighead%jcap,4,
i_input,
j_input, sigdata%ps, dummy2d, 1)
327 dummy2d = exp(dummy2d) * 1000.0
328 print*,
'surface pres ',maxval(dummy2d),minval(dummy2d)
331 print*,
"- CALL FieldScatter FOR SURFACE PRESSURE." 332 call esmf_fieldscatter(
ps_input_grid, dummy2d, rootpet=0, rc=rc)
333 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
334 call error_handler(
"IN FieldScatter", rc)
336 if (localpet == 0)
then 337 call sptez(0,sighead%jcap,4,
i_input,
j_input, sigdata%hs, dummy2d, 1)
338 print*,
'terrain ',maxval(dummy2d),minval(dummy2d)
341 print*,
"- CALL FieldScatter FOR TERRAIN." 343 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
344 call error_handler(
"IN FieldScatter", rc)
348 if (localpet == 0)
then 349 call sptezm(0,sighead%jcap,4,
i_input,
j_input,
lev_input, sigdata%q(:,:,k), dummy3d, 1)
350 print*,trim(
tracers_input(k)),maxval(dummy3d),minval(dummy3d)
353 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(k))
355 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
356 call error_handler(
"IN FieldScatter", rc)
360 if (localpet == 0)
then 362 print*,
'temp ',maxval(dummy3d),minval(dummy3d)
365 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 367 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
368 call error_handler(
"IN FieldScatter", rc)
375 if (localpet == 0)
then 376 print*,
"- NO VERTICAL VELOCITY RECORD. SET TO ZERO." 380 print*,
"- CALL FieldScatter FOR INPUT DZDT." 382 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
383 call error_handler(
"IN FieldScatter", rc)
385 if (localpet == 0)
then 386 call sptezmv(0, sighead%jcap, 4,
i_input,
j_input,
lev_input, sigdata%d, sigdata%z, dummy3d, dummy3d2, 1)
387 print*,
'u ',maxval(dummy3d),minval(dummy3d)
388 print*,
'v ',maxval(dummy3d2),minval(dummy3d2)
391 print*,
"- CALL FieldScatter FOR INPUT U-WIND." 392 call esmf_fieldscatter(
u_input_grid, dummy3d, rootpet=0, rc=rc)
393 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
394 call error_handler(
"IN FieldScatter", rc)
396 print*,
"- CALL FieldScatter FOR INPUT V-WIND." 397 call esmf_fieldscatter(
v_input_grid, dummy3d2, rootpet=0, rc=rc)
398 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
399 call error_handler(
"IN FieldScatter", rc)
401 deallocate(dummy2d, dummy3d, dummy3d2)
403 if (localpet == 0)
call sigio_axdbta(sigdata, iret)
405 call sigio_sclose(21, iret)
417 print*,
"- COMPUTE 3-D PRESSURE." 419 print*,
"- CALL FieldGet FOR 3-D PRES." 422 computationallbound=clb, &
423 computationalubound=cub, &
424 farrayptr=pptr, rc=rc)
425 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
426 call error_handler(
"IN FieldGet", rc)
428 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 431 farrayptr=psptr, rc=rc)
432 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
433 call error_handler(
"IN FieldGet", rc)
439 allocate(pi(clb(1):cub(1),clb(2):cub(2),1:
levp1_input),stat=rc)
442 ak = sighead%vcoord(k,1)
443 bk = sighead%vcoord(k,2)
446 pi(i,j,k) = ak + bk*psptr(i,j)
451 if (localpet == 0)
then 452 print*,
'pres int ',psptr(clb(1),clb(2)),pi(clb(1),clb(2),:)
462 pptr(i,j,k) = (pi(i,j,k)+pi(i,j,k+1))/2.0_esmf_kind_r8
469 if (localpet == 0)
then 470 print*,
'pres ',psptr(clb(1),clb(2)),pptr(clb(1),clb(2),:)
484 integer,
intent(in) :: localpet
486 character(len=300) :: the_file
487 character(len=20) :: vlevtyp, vname
489 integer(nemsio_intkind) :: vlev, iret
490 integer :: i, j, k, n, rc
491 integer :: clb(3), cub(3)
493 real(nemsio_realkind),
allocatable :: vcoord(:,:,:)
494 real(nemsio_realkind),
allocatable :: dummy(:)
495 real(esmf_kind_r8),
allocatable :: dummy2d(:,:)
496 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:)
497 real(esmf_kind_r8) :: ak, bk
498 real(esmf_kind_r8),
allocatable :: pi(:,:,:)
499 real(esmf_kind_r8),
pointer :: pptr(:,:,:), psptr(:,:)
501 type(nemsio_gfile) :: gfile
505 print*,
"- READ ATMOS DATA FROM SPECTRAL GFS NEMSIO FILE: ", trim(the_file)
507 print*,
"- OPEN FILE." 508 call nemsio_open(gfile, the_file,
"read", iret=iret)
509 if (iret /= 0)
call error_handler(
"OPENING SPECTRAL GFS NEMSIO ATM FILE.", iret)
511 print*,
"- READ NUMBER OF VERTICAL LEVELS." 512 call nemsio_getfilehead(gfile, iret=iret, dimz=
lev_input)
513 if (iret /= 0)
call error_handler(
"READING NUMBER OF VERTICAL LEVLES.", iret)
519 print*,
"- READ VERTICAL COORDINATE INFO." 520 call nemsio_getfilehead(gfile, iret=iret, vcoord=vcoord)
521 if (iret /= 0)
call error_handler(
"READING VERTICAL COORDINATE INFO.", iret)
529 if (localpet == 0)
then 535 allocate(dummy2d(0,0))
536 allocate(dummy3d(0,0,0))
544 if (localpet == 0)
then 545 print*,
"- READ TEMPERATURE." 547 vlevtyp =
"mid layer" 549 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
550 if (iret /= 0)
call error_handler(
"READING TEMPERATURE RECORD.", iret)
556 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 558 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
559 call error_handler(
"IN FieldScatter", rc)
563 if (localpet == 0)
then 566 vlevtyp =
"mid layer" 568 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
569 if (iret /= 0)
call error_handler(
"READING TRACER RECORD.", iret)
575 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(n))
577 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
578 call error_handler(
"IN FieldScatter", rc)
582 if (localpet == 0)
then 583 print*,
"- READ U-WINDS." 585 vlevtyp =
"mid layer" 587 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
588 if (iret /= 0)
call error_handler(
"READING U-WIND RECORD.", iret)
594 print*,
"- CALL FieldScatter FOR INPUT U-WIND." 595 call esmf_fieldscatter(
u_input_grid, dummy3d, rootpet=0, rc=rc)
596 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
597 call error_handler(
"IN FieldScatter", rc)
599 if (localpet == 0)
then 600 print*,
"- READ V-WINDS." 602 vlevtyp =
"mid layer" 604 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
605 if (iret /= 0)
call error_handler(
"READING V-WIND RECORD.", iret)
611 print*,
"- CALL FieldScatter FOR INPUT V-WIND." 612 call esmf_fieldscatter(
v_input_grid, dummy3d, rootpet=0, rc=rc)
613 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
614 call error_handler(
"IN FieldScatter", rc)
621 if (localpet == 0)
then 622 print*,
"- NO VERTICAL VELOCITY RECORD. SET TO ZERO." 626 print*,
"- CALL FieldScatter FOR INPUT DZDT." 628 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
629 call error_handler(
"IN FieldScatter", rc)
631 if (localpet == 0)
then 636 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
637 if (iret /= 0)
call error_handler(
"READING HGT RECORD.", iret)
642 print*,
"- CALL FieldScatter FOR TERRAIN." 644 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
645 call error_handler(
"IN FieldScatter", rc)
647 if (localpet == 0)
then 648 print*,
"- READ PRES." 652 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
653 if (iret /= 0)
call error_handler(
"READING PRES RECORD.", iret)
658 print*,
"- CALL FieldScatter FOR SURFACE PRESSURE." 659 call esmf_fieldscatter(
ps_input_grid, dummy2d, rootpet=0, rc=rc)
660 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
661 call error_handler(
"IN FieldScatter", rc)
663 call nemsio_close(gfile)
665 deallocate(dummy, dummy2d, dummy3d)
677 print*,
"- COMPUTE 3-D PRESSURE." 679 print*,
"- CALL FieldGet FOR 3-D PRES." 682 computationallbound=clb, &
683 computationalubound=cub, &
684 farrayptr=pptr, rc=rc)
685 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
686 call error_handler(
"IN FieldGet", rc)
688 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 691 farrayptr=psptr, rc=rc)
692 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
693 call error_handler(
"IN FieldGet", rc)
699 allocate(pi(clb(1):cub(1),clb(2):cub(2),1:
levp1_input))
706 pi(i,j,k) = ak + bk*psptr(i,j)
720 pptr(i,j,k) = (pi(i,j,k)+pi(i,j,k+1))/2.0
737 integer,
intent(in) :: localpet
739 character(len=300) :: the_file
740 character(len=20) :: vlevtyp, vname
742 integer :: i, j, k, n
743 integer :: rc, clb(3), cub(3)
744 integer(nemsio_intkind) :: vlev, iret
746 real(nemsio_realkind),
allocatable :: vcoord(:,:,:)
747 real(nemsio_realkind),
allocatable :: dummy(:)
748 real(esmf_kind_r8),
allocatable :: dummy2d(:,:)
749 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:)
750 real(esmf_kind_r8),
pointer :: presptr(:,:,:), psptr(:,:)
751 real(esmf_kind_r8),
pointer :: dpresptr(:,:,:)
752 real(esmf_kind_r8),
allocatable :: pres_interface(:)
754 type(nemsio_gfile) :: gfile
758 print*,
"- READ ATMOS DATA FROM GAUSSIAN NEMSIO FILE: ", trim(the_file)
760 print*,
"- OPEN FILE." 761 call nemsio_open(gfile, the_file,
"read", iret=iret)
762 if (iret /= 0)
call error_handler(
"OPENING GAUSSIAN NEMSIO ATM FILE.", iret)
764 print*,
"- READ NUMBER OF VERTICAL LEVELS." 765 call nemsio_getfilehead(gfile, iret=iret, dimz=
lev_input)
766 if (iret /= 0)
call error_handler(
"READING NUMBER OF VERTICAL LEVLES.", iret)
772 print*,
"- READ VERTICAL COORDINATE INFO." 773 call nemsio_getfilehead(gfile, iret=iret, vcoord=vcoord)
774 if (iret /= 0)
call error_handler(
"READING VERTICAL COORDINATE INFO.", iret)
782 print*,
"- CALL FieldCreate FOR INPUT DPRES." 784 typekind=esmf_typekind_r8, &
785 staggerloc=esmf_staggerloc_center, &
786 ungriddedlbound=(/1/), &
788 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
789 call error_handler(
"IN FieldCreate", rc)
791 if (localpet == 0)
then 797 allocate(dummy2d(0,0))
798 allocate(dummy3d(0,0,0))
806 if (localpet == 0)
then 807 print*,
"- READ TEMPERATURE." 809 vlevtyp =
"mid layer" 811 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
812 if (iret /= 0)
call error_handler(
"READING TEMPERATURE RECORD.", iret)
814 print*,
'temp check after read ',vlev, dummy3d(1,1,vlev)
818 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 820 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
821 call error_handler(
"IN FieldScatter", rc)
825 if (localpet == 0)
then 828 vlevtyp =
"mid layer" 830 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
831 if (iret /= 0)
call error_handler(
"READING TRACER RECORD.", iret)
832 print*,
'tracer ',vlev, maxval(dummy),minval(dummy)
837 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(n))
839 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
840 call error_handler(
"IN FieldScatter", rc)
844 if (localpet == 0)
then 845 print*,
"- READ U-WINDS." 847 vlevtyp =
"mid layer" 849 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
850 if (iret /= 0)
call error_handler(
"READING U-WIND RECORD.", iret)
851 print*,
'ugrd ',vlev, maxval(dummy),minval(dummy)
856 print*,
"- CALL FieldScatter FOR INPUT U-WIND." 857 call esmf_fieldscatter(
u_input_grid, dummy3d, rootpet=0, rc=rc)
858 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
859 call error_handler(
"IN FieldScatter", rc)
861 if (localpet == 0)
then 862 print*,
"- READ V-WINDS." 864 vlevtyp =
"mid layer" 866 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
867 if (iret /= 0)
call error_handler(
"READING V-WIND RECORD.", iret)
868 print*,
'vgrd ',vlev, maxval(dummy),minval(dummy)
873 print*,
"- CALL FieldScatter FOR INPUT V-WIND." 874 call esmf_fieldscatter(
v_input_grid, dummy3d, rootpet=0, rc=rc)
875 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
876 call error_handler(
"IN FieldScatter", rc)
878 if (localpet == 0)
then 879 print*,
"- READ DPRES." 881 vlevtyp =
"mid layer" 883 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
884 if (iret /= 0)
call error_handler(
"READING DPRES RECORD.", iret)
885 print*,
'dpres ',vlev, maxval(dummy),minval(dummy)
890 print*,
"- CALL FieldScatter FOR INPUT DPRES." 892 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
893 call error_handler(
"IN FieldScatter", rc)
895 if (localpet == 0)
then 896 print*,
"- READ DZDT." 898 vlevtyp =
"mid layer" 900 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
901 if (iret /= 0)
call error_handler(
"READING DZDT RECORD.", iret)
902 print*,
'dzdt ',vlev, maxval(dummy),minval(dummy)
907 print*,
"- CALL FieldScatter FOR INPUT DZDT." 909 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
910 call error_handler(
"IN FieldScatter", rc)
912 if (localpet == 0)
then 917 call nemsio_readrecv(gfile, vname, vlevtyp, vlev, dummy, 0, iret)
918 if (iret /= 0)
call error_handler(
"READING HGT RECORD.", iret)
919 print*,
'hgt ',vlev, maxval(dummy),minval(dummy)
923 print*,
"- CALL FieldScatter FOR TERRAIN." 925 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
926 call error_handler(
"IN FieldScatter", rc)
928 call nemsio_close(gfile)
930 deallocate(dummy, dummy2d, dummy3d)
946 print*,
"- COMPUTE 3-D PRESSURE." 948 print*,
"- CALL FieldGet FOR DELTA PRESSURE." 951 computationallbound=clb, &
952 computationalubound=cub, &
953 farrayptr=dpresptr, rc=rc)
954 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
955 call error_handler(
"IN FieldGet", rc)
957 print*,
"- CALL FieldGet FOR 3-D PRESSURE." 960 farrayptr=presptr, rc=rc)
961 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
962 call error_handler(
"IN FieldGet", rc)
964 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 967 farrayptr=psptr, rc=rc)
968 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
969 call error_handler(
"IN FieldGet", rc)
973 if (localpet == 0)
then 974 do k = clb(3), cub(3)
975 print*,
'dpres is ',cub(1),cub(2),k, dpresptr(cub(1),cub(2),k)
979 do i = clb(1), cub(1)
980 do j = clb(2), cub(2)
983 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
985 psptr(i,j) = pres_interface(1)
987 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
994 if (localpet == 0)
then 995 print*,
'psfc is ',clb(1),clb(2),psptr(clb(1),clb(2))
996 print*,
'pres is ',clb(1),clb(2),presptr(clb(1),clb(2),:)
999 print*,
'pres check 1',localpet,maxval(presptr(:,:,1)),minval(presptr(:,:,1))
1000 print*,
'pres check lev',localpet,maxval(presptr(:,:,
lev_input)),minval(presptr(:,:,
lev_input))
1002 deallocate(pres_interface)
1020 integer,
intent(in) :: localpet
1022 character(len=500) :: tilefile
1025 integer :: clb(3), cub(3)
1026 integer :: rc, tile, ncid, id_var
1027 integer :: error, id_dim
1029 real(esmf_kind_r8),
allocatable :: ak(:)
1030 real(esmf_kind_r8),
pointer :: presptr(:,:,:), psptr(:,:)
1031 real(esmf_kind_r8),
pointer :: dpresptr(:,:,:)
1032 real(esmf_kind_r8),
allocatable :: data_one_tile(:,:)
1033 real(esmf_kind_r8),
allocatable :: data_one_tile_3d(:,:,:)
1034 real(esmf_kind_r8),
allocatable :: pres_interface(:)
1041 print*,
"- READ ATM VERTICAL LEVELS FROM: ", trim(tilefile)
1042 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1043 call netcdf_err(error,
'opening: '//trim(tilefile) )
1045 error=nf90_inq_dimid(ncid,
'xaxis_1', id_dim)
1046 call netcdf_err(error,
'reading xaxis_1 id' )
1047 error=nf90_inquire_dimension(ncid,id_dim,len=
levp1_input)
1048 call netcdf_err(error,
'reading xaxis_1 value' )
1054 error=nf90_inq_varid(ncid,
'ak', id_var)
1055 call netcdf_err(error,
'reading field id' )
1056 error=nf90_get_var(ncid, id_var, ak)
1057 call netcdf_err(error,
'reading ak' )
1059 error = nf90_close(ncid)
1067 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE." 1069 typekind=esmf_typekind_r8, &
1070 staggerloc=esmf_staggerloc_center, &
1071 ungriddedlbound=(/1/), &
1073 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1074 call error_handler(
"IN FieldCreate", rc)
1080 allocate(data_one_tile_3d(0,0,0))
1081 allocate(data_one_tile(0,0))
1087 print*,
"- READ ATMOSPHERIC CORE FILE: ", trim(tilefile)
1088 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1089 call netcdf_err(error,
'opening: '//trim(tilefile) )
1093 error=nf90_inq_varid(ncid,
'phis', id_var)
1094 call netcdf_err(error,
'reading field id' )
1095 error=nf90_get_var(ncid, id_var, data_one_tile)
1096 call netcdf_err(error,
'reading field' )
1097 data_one_tile = data_one_tile / 9.806_8
1101 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN for tile ",tile
1102 call esmf_fieldscatter(
terrain_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1103 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1104 call error_handler(
"IN FieldScatter", rc)
1115 data_one_tile_3d = 0.0_8
1119 print*,
"- CALL FieldScatter FOR INPUT GRID VERTICAL VELOCITY for tile ",tile
1120 call esmf_fieldscatter(
dzdt_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1121 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1122 call error_handler(
"IN FieldScatter", rc)
1126 error=nf90_inq_varid(ncid,
'T', id_var)
1127 call netcdf_err(error,
'reading field id' )
1128 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1129 call netcdf_err(error,
'reading field' )
1134 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 1135 call esmf_fieldscatter(
temp_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1136 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1137 call error_handler(
"IN FieldScatter", rc)
1141 error=nf90_inq_varid(ncid,
'delp', id_var)
1142 call netcdf_err(error,
'reading field id' )
1143 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1144 call netcdf_err(error,
'reading field' )
1149 print*,
"- CALL FieldScatter FOR INPUT DELTA PRESSURE." 1150 call esmf_fieldscatter(
dpres_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1151 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1152 call error_handler(
"IN FieldScatter", rc)
1156 error=nf90_inq_varid(ncid,
'ua', id_var)
1157 call netcdf_err(error,
'reading field id' )
1158 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1159 call netcdf_err(error,
'reading field' )
1164 print*,
"- CALL FieldScatter FOR INPUT GRID U." 1165 call esmf_fieldscatter(
u_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1166 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1167 call error_handler(
"IN FieldScatter", rc)
1171 error=nf90_inq_varid(ncid,
'va', id_var)
1172 call netcdf_err(error,
'reading field id' )
1173 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1174 call netcdf_err(error,
'reading field' )
1179 print*,
"- CALL FieldScatter FOR INPUT GRID V." 1180 call esmf_fieldscatter(
v_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1181 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1182 call error_handler(
"IN FieldScatter", rc)
1190 print*,
"- READ ATMOSPHERIC TRACER FILE: ", trim(tilefile)
1191 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1192 call netcdf_err(error,
'opening: '//trim(tilefile) )
1199 call netcdf_err(error,
'reading field id' )
1200 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1201 call netcdf_err(error,
'reading field' )
1206 print*,
"- CALL FieldScatter FOR INPUT ", trim(
tracers_input(i))
1207 call esmf_fieldscatter(
tracers_input_grid(i), data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1208 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1209 call error_handler(
"IN FieldScatter", rc)
1226 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 1228 farrayptr=psptr, rc=rc)
1229 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1230 call error_handler(
"IN FieldGet", rc)
1232 print*,
"- CALL FieldGet FOR PRESSURE." 1234 computationallbound=clb, &
1235 computationalubound=cub, &
1236 farrayptr=presptr, rc=rc)
1237 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1238 call error_handler(
"IN FieldGet", rc)
1240 print*,
"- CALL FieldGet FOR DELTA PRESSURE." 1242 farrayptr=dpresptr, rc=rc)
1243 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1244 call error_handler(
"IN FieldGet", rc)
1248 do i = clb(1), cub(1)
1249 do j = clb(2), cub(2)
1252 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
1255 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1257 psptr(i,j) = pres_interface(1)
1262 deallocate(pres_interface)
1266 deallocate(data_one_tile_3d, data_one_tile)
1281 integer,
intent(in) :: localpet
1283 character(len=500) :: tilefile
1285 integer :: start(3), count(3), iscnt
1286 integer :: error, ncid, num_tracers_file
1287 integer :: id_dim, idim_input, jdim_input
1288 integer :: id_var, rc, nprocs, max_procs
1289 integer :: kdim, remainder, myrank, i, j, k, n
1290 integer :: clb(3), cub(3)
1291 integer,
allocatable :: kcount(:), startk(:), displ(:)
1292 integer,
allocatable :: ircnt(:)
1294 real(esmf_kind_r8),
allocatable :: phalf(:)
1295 real(esmf_kind_r8),
allocatable :: pres_interface(:)
1296 real(kind=4),
allocatable :: dummy3d(:,:,:)
1297 real(kind=4),
allocatable :: dummy3dall(:,:,:)
1298 real(esmf_kind_r8),
allocatable :: dummy3dflip(:,:,:)
1299 real(esmf_kind_r8),
allocatable :: dummy(:,:)
1300 real(esmf_kind_r8),
pointer :: presptr(:,:,:), dpresptr(:,:,:)
1301 real(esmf_kind_r8),
pointer :: psptr(:,:)
1303 print*,
"- READ INPUT ATMOS DATA FROM GAUSSIAN NETCDF FILE." 1306 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1307 call netcdf_err(error,
'opening: '//trim(tilefile) )
1309 error=nf90_inq_dimid(ncid,
'grid_xt', id_dim)
1310 call netcdf_err(error,
'reading grid_xt id' )
1311 error=nf90_inquire_dimension(ncid,id_dim,len=idim_input)
1312 call netcdf_err(error,
'reading grid_xt value' )
1314 error=nf90_inq_dimid(ncid,
'grid_yt', id_dim)
1315 call netcdf_err(error,
'reading grid_yt id' )
1316 error=nf90_inquire_dimension(ncid,id_dim,len=jdim_input)
1317 call netcdf_err(error,
'reading grid_yt value' )
1320 call error_handler(
"DIMENSION MISMATCH BETWEEN SFC AND OROG FILES.", 2)
1323 error=nf90_inq_dimid(ncid,
'pfull', id_dim)
1324 call netcdf_err(error,
'reading pfull id' )
1325 error=nf90_inquire_dimension(ncid,id_dim,len=
lev_input)
1326 call netcdf_err(error,
'reading pfull value' )
1328 error=nf90_inq_dimid(ncid,
'phalf', id_dim)
1329 call netcdf_err(error,
'reading phalf id' )
1330 error=nf90_inquire_dimension(ncid,id_dim,len=
levp1_input)
1331 call netcdf_err(error,
'reading phalf value' )
1333 error=nf90_inq_varid(ncid,
'phalf', id_var)
1334 call netcdf_err(error,
'getting phalf varid' )
1335 error=nf90_get_var(ncid, id_var, phalf)
1336 call netcdf_err(error,
'reading phalf varid' )
1338 error=nf90_get_att(ncid, nf90_global,
'ncnsto', num_tracers_file)
1339 call netcdf_err(error,
'reading ntracer value' )
1341 call mpi_comm_size(mpi_comm_world, nprocs, error)
1342 print*,
'- Running with ', nprocs,
' processors' 1344 call mpi_comm_rank(mpi_comm_world, myrank, error)
1345 print*,
'- myrank/localpet is ',myrank,localpet
1353 remainder =
lev_input - (max_procs*kdim)
1355 allocate(kcount(0:nprocs-1))
1357 allocate(startk(0:nprocs-1))
1359 allocate(displ(0:nprocs-1))
1361 allocate(ircnt(0:nprocs-1))
1364 do k = 0, max_procs-2
1367 kcount(max_procs-1) = kdim + remainder
1370 do k = 1, max_procs-1
1371 startk(k) = startk(k-1) + kcount(k-1)
1374 ircnt(:) = idim_input * jdim_input * kcount(:)
1377 do k = 1, max_procs-1
1378 displ(k) = displ(k-1) + ircnt(k-1)
1381 iscnt=idim_input*jdim_input*kcount(myrank)
1385 if (myrank <= max_procs-1)
then 1386 allocate(dummy3d(idim_input,jdim_input,kcount(myrank)))
1388 allocate(dummy3d(0,0,0))
1391 if (myrank == 0)
then 1392 allocate(dummy3dall(idim_input,jdim_input,
lev_input))
1394 allocate(dummy3dflip(idim_input,jdim_input,
lev_input))
1396 allocate(dummy(idim_input,jdim_input))
1399 allocate(dummy3dall(0,0,0))
1400 allocate(dummy3dflip(0,0,0))
1401 allocate(dummy(0,0))
1410 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE." 1412 typekind=esmf_typekind_r8, &
1413 staggerloc=esmf_staggerloc_center, &
1414 ungriddedlbound=(/1/), &
1416 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1417 call error_handler(
"IN FieldCreate", rc)
1421 if (myrank <= max_procs-1)
then 1422 start = (/1,1,startk(myrank)/)
1423 count = (/idim_input,jdim_input,kcount(myrank)/)
1424 error=nf90_inq_varid(ncid,
'tmp', id_var)
1425 call netcdf_err(error,
'reading tmp field id' )
1426 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1427 call netcdf_err(error,
'reading tmp field' )
1430 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1431 dummy3dall, ircnt, displ, mpi_real, &
1432 0, mpi_comm_world, error)
1433 if (error /= 0)
call error_handler(
"IN mpi_gatherv of temperature", error)
1435 if (myrank == 0)
then 1439 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE " 1440 call esmf_fieldscatter(
temp_input_grid, dummy3dflip, rootpet=0, rc=rc)
1441 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1442 call error_handler(
"IN FieldScatter", rc)
1446 if (myrank <= max_procs-1)
then 1447 error=nf90_inq_varid(ncid,
'dpres', id_var)
1448 call netcdf_err(error,
'reading dpres field id' )
1449 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1450 call netcdf_err(error,
'reading dpres field' )
1453 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1454 dummy3dall, ircnt, displ, mpi_real, &
1455 0, mpi_comm_world, error)
1456 if (error /= 0)
call error_handler(
"IN mpi_gatherv of dpres", error)
1458 if (myrank == 0)
then 1462 print*,
"- CALL FieldScatter FOR INPUT GRID DPRES " 1464 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1465 call error_handler(
"IN FieldScatter", rc)
1469 if (myrank <= max_procs-1)
then 1470 error=nf90_inq_varid(ncid,
'ugrd', id_var)
1471 call netcdf_err(error,
'reading ugrd field id' )
1472 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1473 call netcdf_err(error,
'reading ugrd field' )
1476 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1477 dummy3dall, ircnt, displ, mpi_real, &
1478 0, mpi_comm_world, error)
1479 if (error /= 0)
call error_handler(
"IN mpi_gatherv of ugrd", error)
1481 if (myrank == 0)
then 1485 print*,
"- CALL FieldScatter FOR INPUT GRID UGRD " 1486 call esmf_fieldscatter(
u_input_grid, dummy3dflip, rootpet=0, rc=rc)
1487 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1488 call error_handler(
"IN FieldScatter", rc)
1492 if (myrank <= max_procs-1)
then 1493 error=nf90_inq_varid(ncid,
'vgrd', id_var)
1494 call netcdf_err(error,
'reading vgrd field id' )
1495 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1496 call netcdf_err(error,
'reading vgrd field' )
1499 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1500 dummy3dall, ircnt, displ, mpi_real, &
1501 0, mpi_comm_world, error)
1502 if (error /= 0)
call error_handler(
"IN mpi_gatherv of vgrd", error)
1504 if (myrank == 0)
then 1508 print*,
"- CALL FieldScatter FOR INPUT GRID VGRD " 1509 call esmf_fieldscatter(
v_input_grid, dummy3dflip, rootpet=0, rc=rc)
1510 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1511 call error_handler(
"IN FieldScatter", rc)
1517 if (myrank <= max_procs-1)
then 1519 call netcdf_err(error,
'reading tracer field id' )
1520 error=nf90_get_var(ncid, id_var, dummy3d, start=start, count=count)
1521 call netcdf_err(error,
'reading tracer field' )
1524 call mpi_gatherv(dummy3d, iscnt, mpi_real, &
1525 dummy3dall, ircnt, displ, mpi_real, &
1526 0, mpi_comm_world, error)
1527 if (error /= 0)
call error_handler(
"IN mpi_gatherv of tracer", error)
1529 if (myrank == 0)
then 1531 where(dummy3dflip < 0.0) dummy3dflip = 0.0
1534 print*,
"- CALL FieldScatter FOR INPUT GRID ",
tracers_input(n)
1536 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1537 call error_handler(
"IN FieldScatter", rc)
1543 if (myrank == 0)
then 1547 print*,
"- CALL FieldScatter FOR INPUT GRID DZDT" 1548 call esmf_fieldscatter(
dzdt_input_grid, dummy3dflip, rootpet=0, rc=rc)
1549 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1550 call error_handler(
"IN FieldScatter", rc)
1552 deallocate(dummy3dflip, dummy3dall, dummy3d)
1557 print*,
"- READ TERRAIN." 1558 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
1559 call netcdf_err(error,
'reading hgtsfc field id' )
1560 error=nf90_get_var(ncid, id_var, dummy)
1561 call netcdf_err(error,
'reading hgtsfc field' )
1564 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN." 1566 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1567 call error_handler(
"IN FieldScatter", rc)
1572 print*,
"- READ SURFACE P." 1573 error=nf90_inq_varid(ncid,
'pressfc', id_var)
1574 call netcdf_err(error,
'reading pressfc field id' )
1575 error=nf90_get_var(ncid, id_var, dummy)
1576 call netcdf_err(error,
'reading pressfc field' )
1579 print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE P." 1580 call esmf_fieldscatter(
ps_input_grid, dummy, 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(kcount, startk, displ, ircnt, dummy)
1596 print*,
"- CALL FieldGet FOR PRESSURE." 1598 computationallbound=clb, &
1599 computationalubound=cub, &
1600 farrayptr=presptr, rc=rc)
1601 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1602 call error_handler(
"IN FieldGet", rc)
1604 print*,
"- CALL FieldGet FOR DELTA PRESSURE." 1606 farrayptr=dpresptr, rc=rc)
1607 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1608 call error_handler(
"IN FieldGet", rc)
1610 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 1612 farrayptr=psptr, rc=rc)
1613 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1614 call error_handler(
"IN FieldGet", rc)
1631 do i = clb(1), cub(1)
1632 do j = clb(2), cub(2)
1635 pres_interface(k) = pres_interface(k+1) + dpresptr(i,j,k)
1637 psptr(i,j) = pres_interface(1)
1639 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1644 deallocate(pres_interface, phalf)
1665 integer,
intent(in) :: localpet
1667 character(len=500) :: tilefile
1669 integer :: error, ncid, rc, tile
1670 integer :: id_dim, idim_input, jdim_input
1671 integer :: id_var, i, j, k, n
1672 integer :: clb(3), cub(3), num_tracers_file
1674 real(esmf_kind_r8),
allocatable :: data_one_tile(:,:)
1675 real(esmf_kind_r8),
allocatable :: data_one_tile_3d(:,:,:)
1676 real(esmf_kind_r8),
pointer :: presptr(:,:,:), dpresptr(:,:,:)
1677 real(esmf_kind_r8),
pointer :: psptr(:,:)
1678 real(esmf_kind_r8),
allocatable :: pres_interface(:), phalf(:)
1680 print*,
"- READ INPUT ATMOS DATA FROM TILED HISTORY FILES." 1683 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1684 call netcdf_err(error,
'opening: '//trim(tilefile) )
1686 error=nf90_inq_dimid(ncid,
'grid_xt', id_dim)
1687 call netcdf_err(error,
'reading grid_xt id' )
1688 error=nf90_inquire_dimension(ncid,id_dim,len=idim_input)
1689 call netcdf_err(error,
'reading grid_xt value' )
1691 error=nf90_inq_dimid(ncid,
'grid_yt', id_dim)
1692 call netcdf_err(error,
'reading grid_yt id' )
1693 error=nf90_inquire_dimension(ncid,id_dim,len=jdim_input)
1694 call netcdf_err(error,
'reading grid_yt value' )
1697 call error_handler(
"DIMENSION MISMATCH BETWEEN SFC AND OROG FILES.", 2)
1700 error=nf90_inq_dimid(ncid,
'pfull', id_dim)
1701 call netcdf_err(error,
'reading pfull id' )
1702 error=nf90_inquire_dimension(ncid,id_dim,len=
lev_input)
1703 call netcdf_err(error,
'reading pfull value' )
1705 error=nf90_inq_dimid(ncid,
'phalf', id_dim)
1706 call netcdf_err(error,
'reading phalf id' )
1707 error=nf90_inquire_dimension(ncid,id_dim,len=
levp1_input)
1708 call netcdf_err(error,
'reading phalf value' )
1710 error=nf90_inq_varid(ncid,
'phalf', id_var)
1711 call netcdf_err(error,
'getting phalf varid' )
1712 error=nf90_get_var(ncid, id_var, phalf)
1713 call netcdf_err(error,
'reading phalf varid' )
1715 error=nf90_get_att(ncid, nf90_global,
'ncnsto', num_tracers_file)
1716 call netcdf_err(error,
'reading ntracer value' )
1718 error = nf90_close(ncid)
1720 print*,
'- FILE HAS ', num_tracers_file,
' TRACERS.' 1729 print*,
"- CALL FieldCreate FOR INPUT GRID DELTA PRESSURE." 1731 typekind=esmf_typekind_r8, &
1732 staggerloc=esmf_staggerloc_center, &
1733 ungriddedlbound=(/1/), &
1735 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1736 call error_handler(
"IN FieldCreate", rc)
1742 allocate(data_one_tile(0,0))
1743 allocate(data_one_tile_3d(0,0,0))
1749 print*,
"- READ ATMOSPHERIC DATA FROM: ", trim(tilefile)
1750 error=nf90_open(trim(tilefile),nf90_nowrite,ncid)
1751 call netcdf_err(error,
'opening: '//trim(tilefile) )
1764 data_one_tile_3d = 0.0_8
1768 print*,
"- CALL FieldScatter FOR INPUT GRID VERTICAL VELOCITY." 1769 call esmf_fieldscatter(
dzdt_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1770 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1771 call error_handler(
"IN FieldScatter", rc)
1779 call netcdf_err(error,
'reading field id' )
1780 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1781 call netcdf_err(error,
'reading field' )
1786 print*,
"- CALL FieldScatter FOR INPUT GRID TRACER ", trim(
tracers_input(n))
1787 call esmf_fieldscatter(
tracers_input_grid(n), data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1788 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1789 call error_handler(
"IN FieldScatter", rc)
1795 print*,
"- READ TEMPERATURE." 1796 error=nf90_inq_varid(ncid,
'tmp', id_var)
1797 call netcdf_err(error,
'reading field id' )
1798 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1799 call netcdf_err(error,
'reading field' )
1804 print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 1805 call esmf_fieldscatter(
temp_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1806 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1807 call error_handler(
"IN FieldScatter", rc)
1811 print*,
"- READ U-WIND." 1812 error=nf90_inq_varid(ncid,
'ugrd', id_var)
1813 call netcdf_err(error,
'reading field id' )
1814 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1815 call netcdf_err(error,
'reading field' )
1820 print*,
"- CALL FieldScatter FOR INPUT GRID U." 1821 call esmf_fieldscatter(
u_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1822 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1823 call error_handler(
"IN FieldScatter", rc)
1827 print*,
"- READ V-WIND." 1828 error=nf90_inq_varid(ncid,
'vgrd', 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 V." 1837 call esmf_fieldscatter(
v_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 SURFACE PRESSURE." 1844 error=nf90_inq_varid(ncid,
'pressfc', id_var)
1845 call netcdf_err(error,
'reading field id' )
1846 error=nf90_get_var(ncid, id_var, data_one_tile)
1847 call netcdf_err(error,
'reading field' )
1851 print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE PRESSURE." 1852 call esmf_fieldscatter(
ps_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1853 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1854 call error_handler(
"IN FieldScatter", rc)
1858 print*,
"- READ TERRAIN." 1859 error=nf90_inq_varid(ncid,
'hgtsfc', id_var)
1860 call netcdf_err(error,
'reading field id' )
1861 error=nf90_get_var(ncid, id_var, data_one_tile)
1862 call netcdf_err(error,
'reading field' )
1866 print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN." 1867 call esmf_fieldscatter(
terrain_input_grid, data_one_tile, rootpet=tile-1, tile=tile, rc=rc)
1868 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1869 call error_handler(
"IN FieldScatter", rc)
1873 print*,
"- READ DELTA PRESSURE." 1874 error=nf90_inq_varid(ncid,
'dpres', id_var)
1875 call netcdf_err(error,
'reading field id' )
1876 error=nf90_get_var(ncid, id_var, data_one_tile_3d)
1877 call netcdf_err(error,
'reading field' )
1882 print*,
"- CALL FieldScatter FOR INPUT DELTA PRESSURE." 1883 call esmf_fieldscatter(
dpres_input_grid, data_one_tile_3d, rootpet=tile-1, tile=tile, rc=rc)
1884 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1885 call error_handler(
"IN FieldScatter", rc)
1890 deallocate(data_one_tile_3d, data_one_tile)
1902 print*,
"- CALL FieldGet FOR PRESSURE." 1904 computationallbound=clb, &
1905 computationalubound=cub, &
1906 farrayptr=presptr, rc=rc)
1907 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1908 call error_handler(
"IN FieldGet", rc)
1910 print*,
"- CALL FieldGet FOR DELTA PRESSURE." 1912 farrayptr=dpresptr, rc=rc)
1913 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1914 call error_handler(
"IN FieldGet", rc)
1916 print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 1918 farrayptr=psptr, rc=rc)
1919 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1920 call error_handler(
"IN FieldGet", rc)
1928 do i = clb(1), cub(1)
1929 do j = clb(2), cub(2)
1930 pres_interface(1) = psptr(i,j)
1932 pres_interface(k) = pres_interface(k-1) - dpresptr(i,j,k-1)
1935 presptr(i,j,k) = (pres_interface(k) + pres_interface(k+1)) / 2.0_8
1940 deallocate(pres_interface, phalf)
1959 integer,
intent(in) :: localpet
1961 integer,
parameter :: ntrac_max=14
1962 integer,
parameter :: max_levs=1000
1964 character(len=300) :: the_file
1965 character(len=20) :: vname, &
1966 trac_names_vmap(ntrac_max), &
1968 method, tracers_input_vmap(num_tracers_input), &
1969 tracers_default(ntrac_max)
1971 integer :: i, j, k, n
1973 integer :: rc, clb(3), cub(3)
1974 integer :: vlev, iret,varnum, o3n, pdt_num
1975 integer :: intrp_ier, done_print
1976 integer :: trac_names_oct10(ntrac_max)
1977 integer :: tracers_input_oct10(num_tracers_input)
1978 integer :: trac_names_oct11(ntrac_max)
1979 integer :: tracers_input_oct11(num_tracers_input)
1980 integer :: lugb, lugi, jdisc, jpdt(200), jgdt(200), iscale
1981 integer :: jids(200), jpdtn, jgdtn, octet_23, octet_29
1982 integer :: count_spfh, count_rh, count_icmr, count_scliwc
1983 integer :: count_cice, count_rwmr, count_scllwc, count
1985 logical :: conv_omega=.false., &
1988 use_rh=.false. , unpack, &
1989 all_empty, is_missing
1991 real(esmf_kind_r8),
allocatable :: dum2d_1(:,:)
1994 real(esmf_kind_r8) :: rlevs_hold(max_levs)
1995 real(esmf_kind_r8),
allocatable :: rlevs(:)
1996 real(esmf_kind_r4),
allocatable :: dummy2d(:,:)
1997 real(esmf_kind_r8),
allocatable :: dummy3d(:,:,:), dummy2d_8(:,:),&
1998 u_tmp_3d(:,:,:), v_tmp_3d(:,:,:)
1999 real(esmf_kind_r8),
pointer :: presptr(:,:,:), psptr(:,:),tptr(:,:,:), &
2000 qptr(:,:,:), wptr(:,:,:), &
2001 uptr(:,:,:), vptr(:,:,:)
2002 real(esmf_kind_r4) :: value
2003 real(esmf_kind_r8),
parameter :: p0 = 100000.0
2004 real(esmf_kind_r8),
allocatable :: dummy3d_col_in(:),dummy3d_col_out(:)
2005 real(esmf_kind_r8),
parameter :: intrp_missing = -999.0
2006 real(esmf_kind_r4),
parameter :: lev_no_tr_fill = 20000.0
2007 real(esmf_kind_r4),
parameter :: lev_no_o3_fill = 40000.0
2009 type(gribfield) :: gfld
2013 trac_names_oct10 = (/1, 1, 14, 1, 1, 1, 1, 6, 6, 1, 6, 13, 13, 2 /)
2014 trac_names_oct11 = (/0, 22, 192, 23, 24, 25, 32, 1, 29, 100, 28, 193, 192, 2 /)
2016 trac_names_vmap = (/
"sphum ",
"liq_wat ",
"o3mr ",
"ice_wat ", &
2017 "rainwat ",
"snowwat ",
"graupel ",
"cld_amt ",
"ice_nc ", &
2018 "rain_nc ",
"water_nc",
"liq_aero",
"ice_aero", &
2021 tracers_default = (/
"sphum ",
"liq_wat ",
"o3mr ",
"ice_wat ", &
2022 "rainwat ",
"snowwat ",
"graupel ",
"cld_amt ",
"ice_nc ", &
2023 "rain_nc ",
"water_nc",
"liq_aero",
"ice_aero", &
2028 print*,
"- READ ATMOS DATA FROM GRIB2 FILE: ", trim(the_file)
2030 if (localpet == 0)
then 2034 call baopenr(lugb,the_file,iret)
2035 if (iret /= 0)
call error_handler(
"ERROR OPENING GRIB2 FILE.", iret)
2046 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2047 unpack, k, gfld, iret)
2059 if (gfld%idsect(1) == 7 .and. gfld%idsect(2) == 2)
then 2060 print*,
'- THIS IS NCEP GEFS DATA.' 2068 call error_handler(
"READING GRIB2 FILE", iret)
2085 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2086 unpack, k, gfld, iret)
2089 print*,
'- DATA IS ON HYBRID LEVELS.' 2094 print*,
'- DATA IS ON ISOBARIC LEVELS.' 2111 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2112 unpack, k, gfld, iret)
2116 if (gfld%discipline == 0)
then 2117 if (gfld%ipdtnum == pdt_num)
then 2118 if (gfld%ipdtmpl(1) == 2 .and. gfld%ipdtmpl(2) == 2)
then 2120 if (gfld%ipdtmpl(10) == octet_23 .and. gfld%ipdtmpl(13) == octet_29)
then 2124 iscale = 10 ** gfld%ipdtmpl(11)
2125 rlevs_hold(
lev_input) = float(gfld%ipdtmpl(12))/float(iscale)
2136 call mpi_barrier(mpi_comm_world, iret)
2137 call mpi_bcast(isnative,1,mpi_logical,0,mpi_comm_world,iret)
2138 call mpi_bcast(
lev_input,1,mpi_integer,0,mpi_comm_world,iret)
2139 call mpi_bcast(pdt_num,1,mpi_integer,0,mpi_comm_world,iret)
2140 call mpi_bcast(rlevs_hold, max_levs, mpi_integer,0,mpi_comm_world,iret)
2152 rlevs(i) = rlevs_hold(i)
2159 write(
slevs(i),
'(i6)') nint(rlevs(i))
2162 write(
slevs(i),
'(f11.2)') rlevs(i)
2167 if(localpet == 0)
then 2169 print*,
"- LEVEL AFTER SORT = ",trim(
slevs(i))
2175 if (localpet == 0)
then 2188 jpdt(12) = nint(rlevs(vlev))
2190 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2191 unpack, k, gfld, iret)
2194 count_spfh = count_spfh + 1
2204 jpdt(12) = nint(rlevs(vlev))
2206 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2207 unpack, k, gfld, iret)
2210 count_rh = count_rh + 1
2218 if (count_spfh == 0 .or. use_rh)
then 2219 if (count_rh == 0)
then 2220 call error_handler(
"READING ATMOSPHERIC WATER VAPOR VARIABLE.", 2)
2223 trac_names_oct10(1) = 1
2224 trac_names_oct11(1) = 1
2225 print*,
"- FILE CONTAINS RH." 2227 print*,
"- FILE CONTAINS SPFH." 2232 call mpi_barrier(mpi_comm_world, rc)
2233 call mpi_bcast(hasspfh,1,mpi_logical,0,mpi_comm_world,rc)
2237 if (localpet == 0)
then 2255 jpdt(12) = nint(rlevs(vlev))
2257 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2258 unpack, k, gfld, iret)
2261 count_icmr = count_icmr + 1
2267 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2268 unpack, k, gfld, iret)
2271 count_scliwc = count_scliwc + 1
2277 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2278 unpack, k, gfld, iret)
2281 count_cice = count_cice + 1
2287 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2288 unpack, k, gfld, iret)
2291 count_rwmr = count_rwmr + 1
2298 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2299 unpack, k, gfld, iret)
2302 count_scllwc = count_scllwc + 1
2307 if (count_icmr == 0)
then 2308 if (count_scliwc == 0)
then 2309 if (count_cice == 0)
then 2310 print*,
'- FILE DOES NOT CONTAIN CICE.' 2312 trac_names_oct10(4) = 6
2313 trac_names_oct11(4) = 0
2314 print*,
"- FILE CONTAINS CICE." 2317 trac_names_oct10(4) = 1
2318 trac_names_oct11(4) = 84
2319 print*,
"- FILE CONTAINS SCLIWC." 2322 print*,
"- FILE CONTAINS ICMR." 2325 if (count_rwmr == 0)
then 2326 if (count_scllwc == 0)
then 2327 print*,
"- FILE DOES NOT CONTAIN SCLLWC." 2329 trac_names_oct10(4) = 1
2330 trac_names_oct11(4) = 83
2332 print*,
"- FILE CONTAINS SCLLWC." 2335 print*,
"- FILE CONTAINS CLWMR." 2340 call mpi_barrier(mpi_comm_world, rc)
2341 call mpi_bcast(trac_names_oct10,ntrac_max,mpi_integer,0,mpi_comm_world,rc)
2342 call mpi_bcast(trac_names_oct11,ntrac_max,mpi_integer,0,mpi_comm_world,rc)
2344 print*,
"- COUNT NUMBER OF TRACERS TO BE READ IN BASED ON PHYSICS SUITE TABLE" 2345 do n = 1, num_tracers_input
2349 i = maxloc(merge(1.,0.,trac_names_vmap == vname),dim=1)
2351 tracers_input_vmap(n)=trac_names_vmap(i)
2353 if(trim(
tracers(n)) .eq.
"o3mr") o3n = n
2355 tracers_input_oct10(n) = trac_names_oct10(i)
2356 tracers_input_oct11(n) = trac_names_oct11(i)
2366 if (localpet == 0)
then 2372 allocate(dummy2d(0,0))
2373 allocate(dummy2d_8(0,0))
2374 allocate(dummy3d(0,0,0))
2375 allocate(dum2d_1(0,0))
2384 if (localpet == 0)
then 2386 print*,
"- READ TEMPERATURE." 2403 jpdt(12) = nint(rlevs(vlev))
2405 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2406 unpack, k, gfld, iret)
2408 call error_handler(
"READING IN TEMPERATURE AT LEVEL "//trim(
slevs(vlev)),iret)
2413 dummy3d(:,:,vlev) = dum2d_1
2419 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID TEMPERATURE." 2421 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2422 call error_handler(
"IN FieldScatter", rc)
2426 do n = 1, num_tracers_input
2428 if (localpet == 0) print*,
"- READ ", trim(tracers_input_vmap(n))
2430 vname = tracers_input_vmap(n)
2431 call get_var_cond(vname,this_miss_var_method=method, this_miss_var_value=
value, &
2432 this_field_var_name=tmpstr,loc=varnum)
2434 if (n==1 .and. .not. hasspfh)
then 2435 print*,
"- CALL FieldGather TEMPERATURE." 2436 call esmf_fieldgather(
temp_input_grid,dummy3d,rootpet=0, tile=1, rc=rc)
2437 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2438 call error_handler(
"IN FieldGet", rc)
2441 if (localpet == 0)
then 2457 jpdt(1) = tracers_input_oct10(n)
2458 jpdt(2) = tracers_input_oct11(n)
2459 jpdt(12) = nint(rlevs(vlev))
2461 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2462 unpack, k, gfld, iret)
2478 is_missing = .false.
2484 jpdt(1) = tracers_input_oct10(n)
2485 jpdt(2) = tracers_input_oct11(n)
2486 jpdt(12) = nint(rlevs(vlev) )
2488 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2489 unpack, k, gfld, iret)
2492 dummy2d =
real((reshape(gfld%fld, (/i_input,j_input/) )), kind=esmf_kind_r4)
2494 if (trim(method) .eq.
'intrp' .and. .not.all_empty)
then 2495 dummy2d = intrp_missing
2500 if (.not.all_empty .and. n == o3n)
then 2501 if (rlevs(vlev) .lt. lev_no_o3_fill) &
2502 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev))//&
2503 ". SET MISSING VARIABLE CONDITION TO 'INTRP' TO AVOID THIS ERROR", 1)
2504 elseif (.not.all_empty .and. n .ne. o3n)
then 2505 if (rlevs(vlev) .gt. lev_no_tr_fill) &
2506 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev))//&
2507 ". SET MISSING VARIABLE CONDITION TO 'INTRP' TO AVOID THIS ERROR.", 1)
2510 if (trim(method) .eq.
'intrp' .and. all_empty) method=
'set_to_fill' 2512 call handle_grib_error(vname,
slevs(vlev),method,
value,varnum,
read_from_input,iret,var=dummy2d)
2514 if ( (tracers_input_oct10(n) == 1 .and. tracers_input_oct11(n) == 0) .or. &
2515 (tracers_input_oct10(n) == 1 .and. tracers_input_oct11(n) == 1) .or. &
2516 (tracers_input_oct10(n) == 14 .and. tracers_input_oct11(n) == 192) )
then 2517 call error_handler(
"READING IN "//trim(
tracers(n))//
" AT LEVEL "//trim(
slevs(vlev))&
2518 //
". SET A FILL VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
2524 if (n==1 .and. .not. hasspfh)
then 2526 print *,
'- CALL CALRH GFS' 2527 call rh2spfh_gfs(dummy2d,rlevs(vlev),dummy3d(:,:,vlev))
2529 print *,
'- CALL CALRH non-GFS' 2530 call rh2spfh(dummy2d,rlevs(vlev),dummy3d(:,:,vlev))
2534 dummy3d(:,:,vlev) =
real(dummy2d,esmf_kind_r8)
2539 if (is_missing .and. trim(method) .eq.
'intrp')
then 2540 print *,
'- INTERPOLATE TRACER '//trim(
tracers(n))
2544 dummy3d_col_in=dummy3d(ii,jj,:)
2545 call dint2p(rlevs,dummy3d_col_in,
lev_input,rlevs,dummy3d_col_out, &
2547 if (intrp_ier .gt. 0)
call error_handler(
"Interpolation failed.",intrp_ier)
2548 dummy3d(ii,jj,:)=dummy3d_col_out
2552 dummy2d =
real(dummy3d(:,:,n) , kind=esmf_kind_r4)
2553 if (any(dummy2d .eq. intrp_missing))
then 2555 if (n == o3n .and. rlevs(vlev) .lt. lev_no_o3_fill)
then 2556 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev)),1)
2557 elseif (n .ne. o3n .and. rlevs(vlev) .gt. lev_no_tr_fill)
then 2558 call error_handler(
"TRACER "//trim(
tracers(n))//
" HAS MISSING DATA AT "//trim(
slevs(vlev)),1)
2560 if (done_print .eq. 0)
then 2561 print*,
"Pressure out of range of existing data. Defaulting to fill value." 2564 where(dummy2d .eq. intrp_missing) dummy2d =
value 2565 dummy3d(:,:,vlev) = dummy2d
2569 where(dummy3d(:,:,vlev) .lt. 0.0) dummy3d(:,:,vlev) = 0.0
2575 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT ", trim(tracers_input_vmap(n))
2577 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2578 call error_handler(
"IN FieldScatter", rc)
2582 deallocate(dummy3d_col_in, dummy3d_col_out)
2584 call read_winds(u_tmp_3d,v_tmp_3d,localpet,octet_23,rlevs,lugb,pdt_num)
2586 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT U-WIND." 2587 call esmf_fieldscatter(
u_input_grid, u_tmp_3d, rootpet=0, rc=rc)
2588 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2589 call error_handler(
"IN FieldScatter", rc)
2591 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT V-WIND." 2592 call esmf_fieldscatter(
v_input_grid, v_tmp_3d, rootpet=0, rc=rc)
2593 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2594 call error_handler(
"IN FieldScatter", rc)
2596 if (localpet == 0)
then 2598 print*,
"- READ SURFACE PRESSURE." 2611 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2612 unpack, k, gfld, iret)
2613 if (iret /= 0)
call error_handler(
"READING SURFACE PRESSURE RECORD.", iret)
2619 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID SURFACE PRESSURE." 2620 call esmf_fieldscatter(
ps_input_grid, dummy2d_8, rootpet=0, rc=rc)
2621 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2622 call error_handler(
"IN FieldScatter", rc)
2626 if (localpet == 0)
then 2628 print*,
"- READ DZDT." 2630 call get_var_cond(vname,this_miss_var_method=method, this_miss_var_value=
value, &
2648 jpdt(12) = nint(rlevs(vlev))
2650 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2651 unpack, k, gfld, iret)
2654 print*,
"DZDT not available at level ", trim(
slevs(vlev)),
" so checking for VVEL" 2656 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2657 unpack, k, gfld, iret)
2659 call handle_grib_error(vname,
slevs(vlev),method,
value,varnum,
read_from_input,iret,var8=dum2d_1)
2671 dummy3d(:,:,vlev) = dum2d_1
2677 call mpi_bcast(conv_omega,1,mpi_logical,0,mpi_comm_world,rc)
2679 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT DZDT." 2681 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2682 call error_handler(
"IN FieldScatter", rc)
2686 if (localpet == 0)
then 2688 print*,
"- READ TERRAIN." 2701 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2702 unpack, k, gfld, iret)
2703 if (iret /= 0)
call error_handler(
"READING TERRAIN HEIGHT RECORD.", iret)
2709 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID TERRAIN." 2711 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2712 call error_handler(
"IN FieldScatter", rc)
2714 deallocate(dummy2d, dummy2d_8)
2716 if (.not. isnative)
then 2723 if (localpet == 0) print*,
"- CALL FieldGet FOR SURFACE PRESSURE." 2726 farrayptr=psptr, rc=rc)
2727 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2728 call error_handler(
"IN FieldGet", rc)
2731 if (localpet == 0) print*,
"- CALL FieldGet FOR 3-D PRESSURE." 2733 computationallbound=clb, &
2734 computationalubound=cub, &
2735 farrayptr=presptr, rc=rc)
2736 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2737 call error_handler(
"IN FieldGet", rc)
2740 if (localpet == 0) print*,
"- CALL FieldGet TEMPERATURE." 2742 farrayptr=tptr, rc=rc)
2743 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2744 call error_handler(
"IN FieldGet", rc)
2747 if (localpet == 0) print*,
"- CALL FieldGet FOR U" 2749 farrayptr=uptr, rc=rc)
2750 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2751 call error_handler(
"IN FieldGet", rc)
2754 if (localpet == 0) print*,
"- CALL FieldGet FOR V" 2756 farrayptr=vptr, rc=rc)
2757 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2758 call error_handler(
"IN FieldGet", rc)
2761 if (localpet == 0) print*,
"- CALL FieldGet FOR W" 2763 farrayptr=wptr, rc=rc)
2764 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2765 call error_handler(
"IN FieldGet", rc)
2767 if (localpet == 0) print*,
"- CALL FieldGet FOR TRACERS." 2768 do n=1,num_tracers_input
2771 farrayptr=qptr, rc=rc)
2772 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2773 call error_handler(
"IN FieldGet", rc)
2774 do i = clb(1),cub(1)
2775 do j = clb(2),cub(2)
2781 do i = clb(1),cub(1)
2782 do j = clb(2),cub(2)
2791 if (localpet == 0)
then 2792 print*,
'psfc is ',clb(1),clb(2),psptr(clb(1),clb(2))
2793 print*,
'pres is ',cub(1),cub(2),presptr(cub(1),cub(2),:)
2795 print*,
'pres check 1',localpet,maxval(presptr(clb(1):cub(1),clb(2):cub(2),1)), &
2796 minval(presptr(clb(1):cub(1),clb(2):cub(2),1))
2797 print*,
'pres check lev',localpet,maxval(presptr(clb(1):cub(1),clb(2):cub(2), &
2805 if (localpet == 0)
then 2807 print*,
"- READ PRESSURE." 2823 jpdt(12) = nint(rlevs(vlev))
2824 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2825 unpack, k, gfld, iret)
2827 call error_handler(
"READING IN PRESSURE AT LEVEL "//trim(
slevs(vlev)),iret)
2832 dummy3d(:,:,vlev) = dum2d_1
2838 if (localpet == 0) print*,
"- CALL FieldScatter FOR INPUT GRID PRESSURE." 2840 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2841 call error_handler(
"IN FieldScatter", rc)
2845 deallocate(dummy3d, dum2d_1)
2857 if (conv_omega)
then 2859 if (localpet == 0) print*,
"- CONVERT FROM OMEGA TO DZDT." 2862 if (localpet == 0) print*,
"- CALL FieldGet TEMPERATURE." 2864 farrayptr=tptr, rc=rc)
2865 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2866 call error_handler(
"IN FieldGet", rc)
2869 if (localpet == 0) print*,
"- CALL FieldGet SPECIFIC HUMIDITY." 2871 computationallbound=clb, &
2872 computationalubound=cub, &
2873 farrayptr=qptr, rc=rc)
2874 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2875 call error_handler(
"IN FieldGet", rc)
2878 if (localpet == 0) print*,
"- CALL FieldGet DZDT." 2880 computationallbound=clb, &
2881 computationalubound=cub, &
2882 farrayptr=wptr, rc=rc)
2883 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2884 call error_handler(
"IN FieldGet", rc)
2888 farrayptr=presptr, rc=rc)
2889 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2890 call error_handler(
"IN FieldGet", rc)
2896 if (localpet == 0)
call baclose(lugb, rc)
2911 subroutine read_winds(u,v,localpet,octet_23,rlevs,lugb,pdt_num)
2918 integer,
intent(in) :: localpet, lugb
2919 integer,
intent(in) :: pdt_num, octet_23
2921 real(esmf_kind_r8),
intent(inout),
allocatable :: u(:,:,:),v(:,:,:)
2922 real(esmf_kind_r8),
intent(in),
dimension(lev_input) :: rlevs
2924 real(esmf_kind_r4),
dimension(i_input,j_input) :: alpha
2925 real(esmf_kind_r8),
dimension(i_input,j_input) :: lon, lat
2926 real(esmf_kind_r4),
allocatable :: u_tmp(:,:),v_tmp(:,:)
2927 real(esmf_kind_r8),
allocatable :: dum2d(:,:)
2928 real(esmf_kind_r4),
dimension(i_input,j_input) :: ws,wd
2929 real(esmf_kind_r4) :: value_u, value_v,lov,latin1,latin2
2930 real(esmf_kind_r8) :: d2r
2932 integer :: varnum_u, varnum_v, vlev, &
2934 integer :: j, k, lugi, jgdtn, jpdtn
2935 integer :: jdisc, jids(200), jgdt(200), jpdt(200)
2937 character(len=20) :: vname
2938 character(len=50) :: method_u, method_v
2942 type(gribfield) :: gfld
2944 d2r=acos(-1.0_esmf_kind_r8) / 180.0_esmf_kind_r8
2945 if (localpet==0)
then 2954 call get_var_cond(vname,this_miss_var_method=method_u, this_miss_var_value=value_u, &
2957 call get_var_cond(vname,this_miss_var_method=method_v, this_miss_var_value=value_v, &
2960 print*,
"- CALL FieldGather FOR INPUT GRID LONGITUDE" 2962 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2963 call error_handler(
"IN FieldGather", error)
2965 print*,
"- CALL FieldGather FOR INPUT GRID LATITUDE" 2967 if(esmf_logfounderror(rctocheck=error,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2968 call error_handler(
"IN FieldGather", error)
2970 if (localpet==0)
then 2982 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
2983 unpack, k, gfld, iret)
2985 if (iret /= 0)
call error_handler(
"ERROR READING GRIB2 FILE.", iret)
2987 if (gfld%igdtnum == 32769)
then 2989 latin1 =
real(float(gfld%igdtmpl(15))/1.0E6, kind=esmf_kind_r4)
2990 lov =
real(float(gfld%igdtmpl(16))/1.0E6, kind=esmf_kind_r4)
2992 print*,
"- CALL CALCALPHA_ROTLATLON with center lat,lon = ",latin1,lov
2995 elseif (gfld%igdtnum == 30)
then 2997 lov =
real(float(gfld%igdtmpl(14))/1.0E6, kind=esmf_kind_r4)
2998 latin1 =
real(float(gfld%igdtmpl(19))/1.0E6, kind=esmf_kind_r4)
2999 latin2 =
real(float(gfld%igdtmpl(20))/1.0E6, kind=esmf_kind_r4)
3001 print*,
"- CALL GRIDROT for LC grid with lov,latin1/2 = ",lov,latin1,latin2
3002 call gridrot(lov,latin1,latin2,lon,alpha)
3020 jpdt(12) = nint(rlevs(vlev))
3022 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3023 unpack, k, gfld, iret)
3026 call handle_grib_error(vname,
slevs(vlev),method_u,value_u,varnum_u,read_from_input,iret,var=u_tmp)
3028 call error_handler(
"READING IN U AT LEVEL "//trim(
slevs(vlev))//
". SET A FILL "// &
3029 "VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
3033 u_tmp(:,:) =
real(dum2d, kind=esmf_kind_r4)
3040 call getgb2(lugb, lugi, j, jdisc, jids, jpdtn, jpdt, jgdtn, jgdt, &
3041 unpack, k, gfld, iret)
3044 call handle_grib_error(vname,
slevs(vlev),method_v,value_v,varnum_v,read_from_input,iret,var=v_tmp)
3046 call error_handler(
"READING IN V AT LEVEL "//trim(
slevs(vlev))//
". SET A FILL "// &
3047 "VALUE IN THE VARMAP TABLE IF THIS ERROR IS NOT DESIRABLE.",iret)
3051 v_tmp(:,:) =
real(dum2d, kind=esmf_kind_r4)
3056 if (gfld%igdtnum == 0)
then 3057 if (external_model ==
'UKMET')
then 3064 else if (gfld%igdtnum == 32769)
then 3065 ws = sqrt(u_tmp**2 + v_tmp**2)
3066 wd =
real((atan2(-u_tmp,-v_tmp) / d2r), kind=esmf_kind_r4) 3067 wd =
real((wd + alpha + 180.0), kind=esmf_kind_r4) 3068 wd =
real((270.0 - wd), kind=esmf_kind_r4) 3069 u(:,:,vlev) = -ws*cos(wd*d2r)
3070 v(:,:,vlev) = -ws*sin(wd*d2r)
3072 u(:,:,vlev) =
real(u_tmp * cos(alpha) + v_tmp * sin(alpha),esmf_kind_r8)
3073 v(:,:,vlev) =
real(v_tmp * cos(alpha) - u_tmp * sin(alpha),esmf_kind_r8)
3076 print*,
'max, min U ', minval(u(:,:,vlev)), maxval(u(:,:,vlev))
3077 print*,
'max, min V ', minval(v(:,:,vlev)), maxval(v(:,:,vlev))
3090 integer :: clb(4), cub(4)
3091 integer :: i, j, k, rc
3093 real(esmf_kind_r8) :: latrad, lonrad
3094 real(esmf_kind_r8),
pointer :: windptr(:,:,:,:)
3095 real(esmf_kind_r8),
pointer :: uptr(:,:,:)
3096 real(esmf_kind_r8),
pointer :: vptr(:,:,:)
3097 real(esmf_kind_r8),
pointer :: latptr(:,:)
3098 real(esmf_kind_r8),
pointer :: lonptr(:,:)
3100 print*,
"- CALL FieldGet FOR 3-D WIND." 3102 computationallbound=clb, &
3103 computationalubound=cub, &
3104 farrayptr=windptr, rc=rc)
3105 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3106 call error_handler(
"IN FieldGet", rc)
3108 print*,
"- CALL FieldGet FOR U." 3110 farrayptr=uptr, rc=rc)
3111 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3112 call error_handler(
"IN FieldGet", rc)
3114 print*,
"- CALL FieldGet FOR V." 3116 farrayptr=vptr, rc=rc)
3117 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3118 call error_handler(
"IN FieldGet", rc)
3120 print*,
"- CALL FieldGet FOR LATITUDE." 3122 farrayptr=latptr, rc=rc)
3123 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3124 call error_handler(
"IN FieldGet", rc)
3126 print*,
"- CALL FieldGet FOR LONGITUDE." 3128 farrayptr=lonptr, rc=rc)
3129 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
3130 call error_handler(
"IN FieldGet", rc)
3132 do i = clb(1), cub(1)
3133 do j = clb(2), cub(2)
3134 latrad = latptr(i,j) * acos(-1.) / 180.0
3135 lonrad = lonptr(i,j) * acos(-1.) / 180.0
3136 do k = clb(3), cub(3)
3137 windptr(i,j,k,1) = uptr(i,j,k) * cos(lonrad) - vptr(i,j,k) * sin(latrad) * sin(lonrad)
3138 windptr(i,j,k,2) = uptr(i,j,k) * sin(lonrad) + vptr(i,j,k) * sin(latrad) * cos(lonrad)
3139 windptr(i,j,k,3) = vptr(i,j,k) * cos(latrad)
3162 subroutine gridrot(lov,latin1,latin2,lon,rot)
3168 real(esmf_kind_r4),
intent(in) :: lov,latin1,latin2
3169 real(esmf_kind_r4),
intent(inout) :: rot(i_input,j_input)
3170 real(esmf_kind_r8),
intent(in) :: lon(i_input,j_input)
3172 real(esmf_kind_r4) :: trot(i_input,j_input), tlon(i_input,j_input)
3173 real(esmf_kind_r4) :: dtor = 3.14159265359_esmf_kind_r4/180.0_esmf_kind_r4
3174 real(esmf_kind_r4) :: an
3180 if ( (latin1 - latin2) .lt. 0.000001 )
then 3181 an = sin(latin1*dtor)
3183 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)
3186 tlon =
real((mod(lon - lov + 180. + 3600., 360.) - 180.), kind=esmf_kind_r4)
3207 real(esmf_kind_r8),
intent(in) :: latgrid(i_input,j_input), &
3208 longrid(i_input,j_input)
3209 real(esmf_kind_r4),
intent(in) :: cenlat, cenlon
3210 real(esmf_kind_r4),
intent(out) :: alpha(i_input,j_input)
3213 real(esmf_kind_r8) :: D2R,lon0_r,lat0_r,sphi0,cphi0
3214 real(esmf_kind_r8),
DIMENSION(i_input,j_input) :: tlat,tlon,tph,sinalpha
3216 d2r = acos(-1.0_esmf_kind_r8) / 180.0_esmf_kind_r8
3217 if (cenlon .lt. 0)
then 3218 lon0_r = (cenlon + 360.0)*d2r
3227 tlat = latgrid * d2r
3228 tlon = longrid * d2r
3231 tlon = -tlon + lon0_r
3232 tph = asin(cphi0*sin(tlat) - sphi0*cos(tlat)*cos(tlon))
3233 sinalpha = sphi0 * sin(tlon) / cos(tph)
3234 alpha =
real((-asin(sinalpha)/D2R), kind=esmf_kind_r4)
3247 print*,
'- DESTROY ATMOSPHERIC INPUT DATA.' 3264 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.