70 use write_data,
only : write_fv3_atm_header_netcdf, &
71 write_fv3_atm_bndy_data_netcdf, &
72 write_fv3_atm_data_netcdf
74 use utilities,
only : error_handler
124 integer,
intent(in) :: localpet
126 integer :: isrctermprocessing
129 type(esmf_regridmethod_flag) :: method
130 type(esmf_routehandle) :: regrid_bl
132 real(esmf_kind_r8),
parameter :: p0=101325.0
133 real(esmf_kind_r8),
parameter :: rd = 287.058
134 real(esmf_kind_r8),
parameter :: grav = 9.81
135 real(esmf_kind_r8),
parameter :: lapse = -6.5e-03
137 real(esmf_kind_r8),
parameter :: exponent = rd*lapse/grav
138 real(esmf_kind_r8),
parameter :: one_over_exponent = 1.0 / exponent
140 real(esmf_kind_r8),
pointer :: psptr(:,:), tempptr(:,:,:)
164 isrctermprocessing = 1
168 print*,
"- CALL FieldSMMStore FOR ATMOSPHERIC FIELDS."
173 routehandle=regrid_bl, &
174 srctermprocessing=isrctermprocessing, rc=rc)
175 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
176 call error_handler(
"IN FieldSMMStore", rc)
180 print*,
"- CALL FieldRegridStore FOR ATMOSPHERIC FIELDS."
182 method=esmf_regridmethod_bilinear
186 polemethod=esmf_polemethod_allavg, &
187 srctermprocessing=isrctermprocessing, &
188 routehandle=regrid_bl, &
189 regridmethod=method, rc=rc)
190 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
191 call error_handler(
"IN FieldRegridStore", rc)
195 print*,
"- CALL Field_Regrid FOR TEMPERATURE."
198 routehandle=regrid_bl, &
199 termorderflag=esmf_termorder_srcseq, &
201 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
202 call error_handler(
"IN FieldRegrid", rc)
204 print*,
"- CALL Field_Regrid FOR PRESSURE."
207 routehandle=regrid_bl, &
208 termorderflag=esmf_termorder_srcseq, &
210 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
211 call error_handler(
"IN FieldRegrid", rc)
214 print*,
"- CALL Field_Regrid FOR TRACER ", trim(
tracers(n))
217 routehandle=regrid_bl, &
218 termorderflag=esmf_termorder_srcseq, rc=rc)
219 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
220 call error_handler(
"IN FieldRegrid", rc)
224 print*,
"- CALL Field_Regrid FOR VERTICAL VELOCITY."
227 routehandle=regrid_bl, &
228 termorderflag=esmf_termorder_srcseq, rc=rc)
229 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
230 call error_handler(
"IN FieldRegrid", rc)
233 print*,
"- CALL FieldGet FOR INPUT GRID VERTICAL VEL."
235 farrayptr=tempptr, rc=rc)
236 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
237 call error_handler(
"IN FieldGet", rc)
239 print*,
"MIN MAX W INPUT = ", minval(tempptr), maxval(tempptr)
242 print*,
"- CALL FieldGet FOR VERTICAL VEL B4ADJ."
244 farrayptr=tempptr, rc=rc)
245 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
246 call error_handler(
"IN FieldGet", rc)
248 print*,
"MIN MAX W B4ADJ = ", minval(tempptr), maxval(tempptr)
251 print*,
"- CALL FieldGet FOR INPUT SURFACE PRESSURE."
253 farrayptr=psptr, rc=rc)
254 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
255 call error_handler(
"IN FieldGet", rc)
261 psptr = (psptr/p0)**exponent
263 print*,
"- CALL Field_Regrid FOR SURFACE PRESSURE."
266 routehandle=regrid_bl, &
267 termorderflag=esmf_termorder_srcseq, &
269 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
270 call error_handler(
"IN FieldRegrid", rc)
273 print*,
"- CALL FieldGet FOR INPUT SURFACE PRESSURE B4ADJ."
275 farrayptr=psptr, rc=rc)
276 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
277 call error_handler(
"IN FieldGet", rc)
279 psptr = p0 * psptr**one_over_exponent
281 print*,
"- CALL Field_Regrid FOR TERRAIN."
284 routehandle=regrid_bl, &
285 termorderflag=esmf_termorder_srcseq, &
287 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
288 call error_handler(
"IN FieldRegrid", rc)
290 print*,
"- CALL Field_Regrid FOR x WIND."
293 routehandle=regrid_bl, &
294 termorderflag=esmf_termorder_srcseq, rc=rc)
295 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
296 call error_handler(
"IN FieldRegrid", rc)
298 print*,
"- CALL Field_Regrid FOR y WIND."
301 routehandle=regrid_bl, &
302 termorderflag=esmf_termorder_srcseq, rc=rc)
303 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
304 call error_handler(
"IN FieldRegrid", rc)
306 print*,
"- CALL Field_Regrid FOR z WIND."
309 routehandle=regrid_bl, &
310 termorderflag=esmf_termorder_srcseq, rc=rc)
311 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
312 call error_handler(
"IN FieldRegrid", rc)
316 print*,
"- CALL FieldRegridRelease."
317 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
318 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
319 call error_handler(
"IN FieldRegridRelease", rc)
371 isrctermprocessing = 1
372 method=esmf_regridmethod_bilinear
374 print*,
"- CALL FieldRegridStore FOR X-WIND WEST EDGE."
377 polemethod=esmf_polemethod_allavg, &
378 srctermprocessing=isrctermprocessing, &
379 routehandle=regrid_bl, &
380 extrapmethod=esmf_extrapmethod_nearest_stod, &
381 regridmethod=method, rc=rc)
382 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
383 call error_handler(
"IN FieldRegridStore", rc)
385 print*,
"- CALL Field_Regrid FOR X-WIND WEST EDGE."
388 routehandle=regrid_bl, &
389 termorderflag=esmf_termorder_srcseq, rc=rc)
390 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
391 call error_handler(
"IN FieldRegrid", rc)
393 print*,
"- CALL Field_Regrid FOR Y-WIND WEST EDGE."
396 routehandle=regrid_bl, &
397 termorderflag=esmf_termorder_srcseq, rc=rc)
398 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
399 call error_handler(
"IN FieldRegrid", rc)
401 print*,
"- CALL Field_Regrid FOR Z-WIND WEST EDGE."
404 routehandle=regrid_bl, &
405 termorderflag=esmf_termorder_srcseq, rc=rc)
406 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
407 call error_handler(
"IN FieldRegrid", rc)
409 print*,
"- CALL FieldRegridRelease."
410 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
411 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
412 call error_handler(
"IN FieldRegridRelease", rc)
414 isrctermprocessing = 1
415 method=esmf_regridmethod_bilinear
417 print*,
"- CALL FieldRegridStore FOR X-WIND SOUTH EDGE."
420 polemethod=esmf_polemethod_allavg, &
421 srctermprocessing=isrctermprocessing, &
422 routehandle=regrid_bl, &
423 extrapmethod=esmf_extrapmethod_nearest_stod, &
424 regridmethod=method, rc=rc)
425 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
426 call error_handler(
"IN FieldRegridStore", rc)
428 print*,
"- CALL Field_Regrid FOR X-WIND SOUTH EDGE."
431 routehandle=regrid_bl, &
432 termorderflag=esmf_termorder_srcseq, rc=rc)
433 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
434 call error_handler(
"IN FieldRegrid", rc)
436 print*,
"- CALL Field_Regrid FOR Y-WIND SOUTH EDGE."
439 routehandle=regrid_bl, &
440 termorderflag=esmf_termorder_srcseq, rc=rc)
441 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
442 call error_handler(
"IN FieldRegrid", rc)
444 print*,
"- CALL Field_Regrid FOR Z-WIND SOUTH EDGE."
447 routehandle=regrid_bl, &
448 termorderflag=esmf_termorder_srcseq, rc=rc)
449 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
450 call error_handler(
"IN FieldRegrid", rc)
452 print*,
"- CALL FieldRegridRelease."
453 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
454 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
455 call error_handler(
"IN FieldRegridRelease", rc)
477 call write_fv3_atm_header_netcdf(localpet)
478 if (
regional <= 1)
call write_fv3_atm_data_netcdf(localpet)
479 if (
regional >= 1)
call write_fv3_atm_bndy_data_netcdf(localpet)
503 print*,
"- CALL FieldCreate FOR TARGET GRID TRACER BEFORE ADJUSTMENT ", trim(
tracers(n))
505 typekind=esmf_typekind_r8, &
506 staggerloc=esmf_staggerloc_center, &
507 ungriddedlbound=(/1/), &
509 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
510 call error_handler(
"IN FieldCreate", rc)
513 print*,
"- CALL FieldCreate FOR TARGET GRID TEMPERATURE BEFORE ADJUSTMENT."
515 typekind=esmf_typekind_r8, &
516 staggerloc=esmf_staggerloc_center, &
517 ungriddedlbound=(/1/), &
519 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
520 call error_handler(
"IN FieldCreate", rc)
522 print*,
"- CALL FieldCreate FOR TARGET GRID PRESSURE BEFORE ADJUSTMENT."
524 typekind=esmf_typekind_r8, &
525 staggerloc=esmf_staggerloc_center, &
526 ungriddedlbound=(/1/), &
528 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
529 call error_handler(
"IN FieldCreate", rc)
531 print*,
"- CALL FieldCreate FOR TARGET GRID VERTICAL VELOCITY BEFORE ADJUSTMENT."
533 typekind=esmf_typekind_r8, &
534 staggerloc=esmf_staggerloc_center, &
535 ungriddedlbound=(/1/), &
537 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
538 call error_handler(
"IN FieldCreate", rc)
540 print*,
"- CALL FieldCreate FOR TARGET GRID xwind."
542 typekind=esmf_typekind_r8, &
543 staggerloc=esmf_staggerloc_center, &
544 ungriddedlbound=(/1/), &
546 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
547 call error_handler(
"IN FieldCreate", rc)
549 print*,
"- CALL FieldCreate FOR TARGET GRID ywind."
551 typekind=esmf_typekind_r8, &
552 staggerloc=esmf_staggerloc_center, &
553 ungriddedlbound=(/1/), &
555 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
556 call error_handler(
"IN FieldCreate", rc)
558 print*,
"- CALL FieldCreate FOR TARGET GRID zwind."
560 typekind=esmf_typekind_r8, &
561 staggerloc=esmf_staggerloc_center, &
562 ungriddedlbound=(/1/), &
564 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
565 call error_handler(
"IN FieldCreate", rc)
567 print*,
"- CALL FieldCreate FOR TARGET TERRAIN."
569 typekind=esmf_typekind_r8, &
570 staggerloc=esmf_staggerloc_center, rc=rc)
571 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
572 call error_handler(
"IN FieldCreate", rc)
574 print*,
"- CALL FieldCreate FOR TARGET SURFACE PRESSURE BEFORE ADJUSTMENT."
576 typekind=esmf_typekind_r8, &
577 staggerloc=esmf_staggerloc_center, rc=rc)
578 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
579 call error_handler(
"IN FieldCreate", rc)
595 print*,
"- CALL FieldCreate FOR TARGET GRID TRACERS ", trim(
tracers(n))
597 typekind=esmf_typekind_r8, &
598 staggerloc=esmf_staggerloc_center, &
599 ungriddedlbound=(/1/), &
601 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
602 call error_handler(
"IN FieldCreate", rc)
605 print*,
"- CALL FieldCreate FOR TARGET GRID TEMPERATURE."
607 typekind=esmf_typekind_r8, &
608 staggerloc=esmf_staggerloc_center, &
609 ungriddedlbound=(/1/), &
611 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
612 call error_handler(
"IN FieldCreate", rc)
614 print*,
"- CALL FieldCreate FOR TARGET GRID PRESSURE."
616 typekind=esmf_typekind_r8, &
617 staggerloc=esmf_staggerloc_center, &
618 ungriddedlbound=(/1/), &
620 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
621 call error_handler(
"IN FieldCreate", rc)
623 print*,
"- CALL FieldCreate FOR TARGET GRID VERTICAL VELOCITY."
625 typekind=esmf_typekind_r8, &
626 staggerloc=esmf_staggerloc_center, &
627 ungriddedlbound=(/1/), &
629 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
630 call error_handler(
"IN FieldCreate", rc)
632 print*,
"- CALL FieldCreate FOR TARGET GRID DELP."
634 typekind=esmf_typekind_r8, &
635 staggerloc=esmf_staggerloc_center, &
636 ungriddedlbound=(/1/), &
638 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
639 call error_handler(
"IN FieldCreate", rc)
641 print*,
"- CALL FieldCreate FOR TARGET GRID xwind."
643 typekind=esmf_typekind_r8, &
644 staggerloc=esmf_staggerloc_center, &
645 ungriddedlbound=(/1/), &
647 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
648 call error_handler(
"IN FieldCreate", rc)
650 print*,
"- CALL FieldCreate FOR TARGET GRID ywind."
652 typekind=esmf_typekind_r8, &
653 staggerloc=esmf_staggerloc_center, &
654 ungriddedlbound=(/1/), &
656 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
657 call error_handler(
"IN FieldCreate", rc)
659 print*,
"- CALL FieldCreate FOR TARGET GRID zwind."
661 typekind=esmf_typekind_r8, &
662 staggerloc=esmf_staggerloc_center, &
663 ungriddedlbound=(/1/), &
665 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
666 call error_handler(
"IN FieldCreate", rc)
668 print*,
"- CALL FieldCreate FOR TARGET HEIGHT."
670 typekind=esmf_typekind_r8, &
671 staggerloc=esmf_staggerloc_center, &
672 ungriddedlbound=(/1/), &
674 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
675 call error_handler(
"IN FieldCreate", rc)
677 print*,
"- CALL FieldCreate FOR TARGET U_S."
679 typekind=esmf_typekind_r8, &
680 staggerloc=esmf_staggerloc_edge2, &
681 ungriddedlbound=(/1/), &
683 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
684 call error_handler(
"IN FieldCreate", rc)
686 print*,
"- CALL FieldCreate FOR TARGET V_S."
688 typekind=esmf_typekind_r8, &
689 staggerloc=esmf_staggerloc_edge2, &
690 ungriddedlbound=(/1/), &
692 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
693 call error_handler(
"IN FieldCreate", rc)
695 print*,
"- CALL FieldCreate FOR TARGET xwind_S."
697 typekind=esmf_typekind_r8, &
698 staggerloc=esmf_staggerloc_edge2, &
699 ungriddedlbound=(/1/), &
701 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
702 call error_handler(
"IN FieldCreate", rc)
704 print*,
"- CALL FieldCreate FOR TARGET ywind_S."
706 typekind=esmf_typekind_r8, &
707 staggerloc=esmf_staggerloc_edge2, &
708 ungriddedlbound=(/1/), &
710 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
711 call error_handler(
"IN FieldCreate", rc)
713 print*,
"- CALL FieldCreate FOR TARGET zwind_S."
715 typekind=esmf_typekind_r8, &
716 staggerloc=esmf_staggerloc_edge2, &
717 ungriddedlbound=(/1/), &
719 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
720 call error_handler(
"IN FieldCreate", rc)
722 print*,
"- CALL FieldCreate FOR TARGET U_W."
724 typekind=esmf_typekind_r8, &
725 staggerloc=esmf_staggerloc_edge1, &
726 ungriddedlbound=(/1/), &
728 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
729 call error_handler(
"IN FieldCreate", rc)
731 print*,
"- CALL FieldCreate FOR TARGET V_W."
733 typekind=esmf_typekind_r8, &
734 staggerloc=esmf_staggerloc_edge1, &
735 ungriddedlbound=(/1/), &
737 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
738 call error_handler(
"IN FieldCreate", rc)
740 print*,
"- CALL FieldCreate FOR TARGET xwind_W."
742 typekind=esmf_typekind_r8, &
743 staggerloc=esmf_staggerloc_edge1, &
744 ungriddedlbound=(/1/), &
746 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
747 call error_handler(
"IN FieldCreate", rc)
749 print*,
"- CALL FieldCreate FOR TARGET ywind_W."
751 typekind=esmf_typekind_r8, &
752 staggerloc=esmf_staggerloc_edge1, &
753 ungriddedlbound=(/1/), &
755 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
756 call error_handler(
"IN FieldCreate", rc)
758 print*,
"- CALL FieldCreate FOR TARGET zwind_W."
760 typekind=esmf_typekind_r8, &
761 staggerloc=esmf_staggerloc_edge1, &
762 ungriddedlbound=(/1/), &
764 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
765 call error_handler(
"IN FieldCreate", rc)
767 print*,
"- CALL FieldCreate FOR TARGET SURFACE PRESSURE."
769 typekind=esmf_typekind_r8, &
770 staggerloc=esmf_staggerloc_center, rc=rc)
771 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
772 call error_handler(
"IN FieldCreate", rc)
783 integer :: clb(3), cub(3)
784 integer :: i, j, k, rc
786 real(esmf_kind_r8),
pointer :: latptr(:,:)
787 real(esmf_kind_r8),
pointer :: lonptr(:,:)
788 real(esmf_kind_r8),
pointer :: uptr(:,:,:)
789 real(esmf_kind_r8),
pointer :: vptr(:,:,:)
790 real(esmf_kind_r8),
pointer :: xwindptr(:,:,:)
791 real(esmf_kind_r8),
pointer :: ywindptr(:,:,:)
792 real(esmf_kind_r8),
pointer :: zwindptr(:,:,:)
793 real(esmf_kind_r8) :: latrad, lonrad
799 print*,
'- CONVERT WINDS.'
801 print*,
"- CALL FieldGet FOR xwind_S."
803 computationallbound=clb, &
804 computationalubound=cub, &
805 farrayptr=xwindptr, rc=rc)
806 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
807 call error_handler(
"IN FieldGet", rc)
809 print*,
"- CALL FieldGet FOR ywind_S."
811 farrayptr=ywindptr, rc=rc)
812 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
813 call error_handler(
"IN FieldGet", rc)
815 print*,
"- CALL FieldGet FOR zwind_S."
817 farrayptr=zwindptr, rc=rc)
818 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
819 call error_handler(
"IN FieldGet", rc)
821 print*,
"- CALL FieldGet FOR U_S."
823 farrayptr=uptr, rc=rc)
824 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
825 call error_handler(
"IN FieldGet", rc)
827 print*,
"- CALL FieldGet FOR V_S."
829 farrayptr=vptr, rc=rc)
830 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
831 call error_handler(
"IN FieldGet", rc)
833 print*,
"- CALL FieldGet FOR LATITUDE_S."
835 farrayptr=latptr, rc=rc)
836 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
837 call error_handler(
"IN FieldGet", rc)
839 print*,
"- CALL FieldGet FOR LONGITUDE_S."
841 farrayptr=lonptr, rc=rc)
842 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
843 call error_handler(
"IN FieldGet", rc)
845 do i = clb(1), cub(1)
846 do j = clb(2), cub(2)
847 latrad = latptr(i,j) * acos(-1.) / 180.0
848 lonrad = lonptr(i,j) * acos(-1.) / 180.0
849 do k = clb(3), cub(3)
850 uptr(i,j,k) = xwindptr(i,j,k) * cos(lonrad) + ywindptr(i,j,k) * sin(lonrad)
851 vptr(i,j,k) = -xwindptr(i,j,k) * sin(latrad) * sin(lonrad) + &
852 ywindptr(i,j,k) * sin(latrad) * cos(lonrad) + &
853 zwindptr(i,j,k) * cos(latrad)
858 print*,
"- CALL FieldGet FOR xwind_w."
860 computationallbound=clb, &
861 computationalubound=cub, &
862 farrayptr=xwindptr, rc=rc)
863 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
864 call error_handler(
"IN FieldGet", rc)
866 print*,
"- CALL FieldGet FOR ywind_w."
868 farrayptr=ywindptr, rc=rc)
869 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
870 call error_handler(
"IN FieldGet", rc)
872 print*,
"- CALL FieldGet FOR zwind_w."
874 farrayptr=zwindptr, rc=rc)
875 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
876 call error_handler(
"IN FieldGet", rc)
878 print*,
"- CALL FieldGet FOR U_W."
880 farrayptr=uptr, rc=rc)
881 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
882 call error_handler(
"IN FieldGet", rc)
884 print*,
"- CALL FieldGet FOR V_W."
886 farrayptr=vptr, rc=rc)
887 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
888 call error_handler(
"IN FieldGet", rc)
890 print*,
"- CALL FieldGet FOR LATITUDE_W."
892 farrayptr=latptr, rc=rc)
893 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
894 call error_handler(
"IN FieldGet", rc)
896 print*,
"- CALL FieldGet FOR LONGITUDE_W."
898 farrayptr=lonptr, rc=rc)
899 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
900 call error_handler(
"IN FieldGet", rc)
902 do i = clb(1), cub(1)
903 do j = clb(2), cub(2)
904 latrad = latptr(i,j) * acos(-1.) / 180.0
905 lonrad = lonptr(i,j) * acos(-1.) / 180.0
906 do k = clb(3), cub(3)
907 uptr(i,j,k) = xwindptr(i,j,k) * cos(lonrad) + ywindptr(i,j,k) * sin(lonrad)
908 vptr(i,j,k) = -xwindptr(i,j,k) * sin(latrad) * sin(lonrad) + &
909 ywindptr(i,j,k) * sin(latrad) * cos(lonrad) + &
910 zwindptr(i,j,k) * cos(latrad)
951 integer,
intent(in) :: localpet
953 integer :: idsl, idvc, rc
954 integer :: i, j, k, clb(3), cub(3)
956 real(esmf_kind_r8),
parameter :: rd=287.05
957 real(esmf_kind_r8),
parameter :: cp=1004.6
958 real(esmf_kind_r8),
parameter :: rocp=rd/cp
959 real(esmf_kind_r8),
parameter :: rocp1=rocp+1
960 real(esmf_kind_r8),
parameter :: rocpr=1/rocp
962 real(esmf_kind_r8),
pointer :: delp_ptr(:,:,:)
963 real(esmf_kind_r8),
pointer :: pptr(:,:,:)
964 real(esmf_kind_r8),
pointer :: psptr(:,:)
965 real(esmf_kind_r8) :: ak, bk
966 real(esmf_kind_r8),
allocatable :: pi(:,:,:)
968 print*,
"COMPUTE 3-D PRESSURE FROM ADJUSTED SURFACE PRESSURE."
973 print*,
"- CALL FieldGet FOR 3-D PRES."
975 computationallbound=clb, &
976 computationalubound=cub, &
977 farrayptr=pptr, rc=rc)
978 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
979 call error_handler(
"IN FieldGet", rc)
981 print*,
"- CALL FieldGet FOR DELP."
983 computationallbound=clb, &
984 computationalubound=cub, &
985 farrayptr=delp_ptr, rc=rc)
986 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
987 call error_handler(
"IN FieldGet", rc)
989 print*,
"- CALL FieldGet FOR SURFACE PRESSURE AFTER ADJUSTMENT"
991 farrayptr=psptr, rc=rc)
992 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
993 call error_handler(
"IN FieldGet", rc)
995 allocate(pi(clb(1):cub(1),clb(2):cub(2),1:
levp1_target))
1001 do i= clb(1), cub(1)
1002 do j= clb(2), cub(2)
1003 pi(i,j,k) = ak + bk*psptr(i,j)
1008 do i= clb(1), cub(1)
1009 do j= clb(2), cub(2)
1010 delp_ptr(i,j,k) = pi(i,j,k) - pi(i,j,k+1)
1015 call error_handler(
"PROGRAM ONLY WORKS WITH IDVC 2", 1)
1020 do i= clb(1), cub(1)
1021 do j= clb(2), cub(2)
1022 pptr(i,j,k) = (pi(i,j,k)+pi(i,j,k+1))/2.0
1028 do i= clb(1), cub(1)
1029 do j= clb(2), cub(2)
1030 pptr(i,j,k) = ((pi(i,j,k)**rocp1-pi(i,j,k+1)**rocp1)/ &
1031 (rocp1*(pi(i,j,k)-pi(i,j,k+1))))**rocpr
1039 if (localpet == 0)
then
1040 print*,
'new pres ',pptr(clb(1),clb(2),:)
1041 print*,
'delp ',delp_ptr(clb(1),clb(2),:)
1063 integer,
intent(in) :: localpet
1064 integer :: i, j, k, ii
1065 integer :: clb(3), cub(3), ls, rc
1067 real(esmf_kind_r8),
pointer :: pptr(:,:,:)
1068 real(esmf_kind_r8),
pointer :: psptr(:,:)
1069 real(esmf_kind_r8),
pointer :: psnewptr(:,:)
1070 real(esmf_kind_r8),
pointer :: tptr(:,:,:)
1071 real(esmf_kind_r8),
pointer :: qptr(:,:,:)
1072 real(esmf_kind_r8),
pointer :: zsptr(:,:)
1073 real(esmf_kind_r8),
pointer :: zsnewptr(:,:)
1074 real(esmf_kind_r8),
allocatable :: zu(:,:)
1075 real(esmf_kind_r8),
parameter :: beta=-6.5e-3
1076 real(esmf_kind_r8),
parameter :: epsilon=1.e-9
1077 real(esmf_kind_r8),
parameter :: g=9.80665
1078 real(esmf_kind_r8),
parameter :: rd=287.05
1079 real(esmf_kind_r8),
parameter :: rv=461.50
1080 real(esmf_kind_r8),
parameter :: gor=g/rd
1081 real(esmf_kind_r8),
parameter :: fv=rv/rd-1.
1082 real(esmf_kind_r8) :: ftv, fgam, apu, fz0
1083 real(esmf_kind_r8) :: atvu, atv, fz1, fp0
1084 real(esmf_kind_r8) :: apd, azd, agam, azu
1085 real(esmf_kind_r8) :: atvd, fp1, gamma, pu
1086 real(esmf_kind_r8) :: tvu, pd, tvd
1087 real(esmf_kind_r8) :: at, aq, ap, az
1089 ftv(at,aq)=at*(1+fv*aq)
1090 fgam(apu,atvu,apd,atvd)=-gor*log(atvd/atvu)/log(apd/apu)
1091 fz0(ap,atv,azd,apd)=azd+atv/gor*log(apd/ap)
1092 fz1(ap,atv,azd,apd,agam)=azd-atv/agam*((apd/ap)**(-agam/gor)-1)
1093 fp0(az,azu,apu,atvu)=apu*exp(-gor/atvu*(az-azu))
1094 fp1(az,azu,apu,atvu,agam)=apu*(1+agam/atvu*(az-azu))**(-gor/agam)
1096 print*,
"- ADJUST SURFACE PRESSURE FOR NEW TERRAIN."
1098 print*,
"- CALL FieldGet FOR 3-D PRES."
1100 computationallbound=clb, &
1101 computationalubound=cub, &
1102 farrayptr=pptr, rc=rc)
1103 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1104 call error_handler(
"IN FieldGet", rc)
1106 if(localpet==0)
then
1107 print*,
'old pres ',pptr(clb(1),clb(2),:)
1110 print*,
"- CALL FieldGet FOR TEMPERATURE"
1112 farrayptr=tptr, rc=rc)
1113 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1114 call error_handler(
"IN FieldGet", rc)
1119 if (trim(
tracers(ii)) ==
"sphum")
exit
1122 print*,
"- CALL FieldGet FOR SPECIFIC HUMIDITY"
1124 farrayptr=qptr, rc=rc)
1125 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1126 call error_handler(
"IN FieldGet", rc)
1128 print*,
"- CALL FieldGet FOR SURFACE PRESSURE BEFORE ADJUSTMENT"
1130 farrayptr=psptr, rc=rc)
1131 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1132 call error_handler(
"IN FieldGet", rc)
1134 print*,
"- CALL FieldGet FOR SURFACE PRESSURE AFTER ADJUSTMENT"
1136 farrayptr=psnewptr, rc=rc)
1137 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1138 call error_handler(
"IN FieldGet", rc)
1140 print*,
"- CALL FieldGet FOR OLD TERRAIN"
1142 farrayptr=zsptr, rc=rc)
1143 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1144 call error_handler(
"IN FieldGet", rc)
1146 print*,
"- CALL FieldGet FOR NEW TERRAIN"
1148 farrayptr=zsnewptr, rc=rc)
1149 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1150 call error_handler(
"IN FieldGet", rc)
1152 allocate(zu(clb(1):cub(1),clb(2):cub(2)))
1169 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1170 zu(i,j)=fz1(pu,tvu,zsptr(i,j),psptr(i,j),gamma)
1171 if(zsnewptr(i,j).le.zu(i,j))
then
1173 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1174 if(abs(gamma).gt.epsilon)
then
1175 psnewptr(i,j)=fp1(zsnewptr(i,j),zu(i,j),pu,tvu,gamma)
1177 psnewptr(i,j)=fp0(zsnewptr(i,j),zu(i,j),pu,tvu)
1194 if(psnewptr(i,j).eq.0)
then
1196 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1198 tvd=ftv(tptr(i,j,k-1),qptr(i,j,k-1))
1199 gamma=fgam(pu,tvu,pd,tvd)
1200 if(abs(gamma).gt.epsilon)
then
1201 zu(i,j)=fz1(pu,tvu,zu(i,j),pd,gamma)
1203 zu(i,j)=fz0(pu,tvu,zu(i,j),pd)
1205 if(zsnewptr(i,j).le.zu(i,j))
then
1206 if(abs(gamma).gt.epsilon)
then
1207 psnewptr(i,j)=fp1(zsnewptr(i,j),zu(i,j),pu,tvu,gamma)
1209 psnewptr(i,j)=fp0(zsnewptr(i,j),zu(i,j),pu,tvu)
1229 if(psnewptr(i,j).eq.0)
then
1231 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1232 psnewptr(i,j)=fp0(zsnewptr(i,j),zu(i,j),pu,tvu)
1240 if (localpet == 0)
then
1245 print*,
'sfcp adjust ',(zsnewptr(i,j)-zsptr(i,j)), psptr(i,j),psnewptr(i,j)
1250 end subroutine newps
1259 integer :: istat, n, k, localpet, idum(2)
1261 real(esmf_kind_r8),
allocatable :: dum1d(:)
1265 call esmf_vmgetglobal(vm, rc=istat)
1266 if(esmf_logfounderror(rctocheck=istat,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1267 call error_handler(
"IN VMGetGlobal", istat)
1269 call esmf_vmget(vm, localpet=localpet, rc=istat)
1270 if(esmf_logfounderror(rctocheck=istat,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1271 call error_handler(
"IN VMGet", istat)
1273 if (localpet == 0)
then
1277 if (istat /= 0)
then
1278 call error_handler(
"OPENING VERTICAL COORD FILE", istat)
1281 read(14, *, iostat=istat) idum(1), idum(2)
1282 if (istat /= 0)
then
1283 call error_handler(
"READING VERTICAL COORD FILE", istat)
1287 call esmf_vmbroadcast(vm, idum, 2, 0, rc=istat)
1288 if(esmf_logfounderror(rctocheck=istat,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1289 call error_handler(
"IN VMBroadcast", istat)
1299 if (localpet == 0)
then
1301 if (istat /= 0)
then
1302 call error_handler(
"READING VERTICAL COORD FILE", istat)
1309 if(esmf_logfounderror(rctocheck=istat,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1310 call error_handler(
"IN VMBroadcast", istat)
1326 integer :: isrctermprocessing, rc
1328 type(esmf_regridmethod_flag) :: method
1329 type(esmf_routehandle) :: regrid_bl
1331 isrctermprocessing=1
1333 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNIFA BEFORE ADJUSTMENT."
1335 typekind=esmf_typekind_r8, &
1336 staggerloc=esmf_staggerloc_center, &
1337 ungriddedlbound=(/1/), &
1339 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1340 call error_handler(
"IN FieldCreate", rc)
1342 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNWFA BEFORE ADJUSTMENT."
1344 typekind=esmf_typekind_r8, &
1345 staggerloc=esmf_staggerloc_center, &
1346 ungriddedlbound=(/1/), &
1348 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1349 call error_handler(
"IN FieldCreate", rc)
1351 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO PRESSURE BEFORE ADJUSTMENT."
1353 typekind=esmf_typekind_r8, &
1354 staggerloc=esmf_staggerloc_center, &
1355 ungriddedlbound=(/1/), &
1357 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1358 call error_handler(
"IN FieldCreate", rc)
1360 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNIFA."
1362 typekind=esmf_typekind_r8, &
1363 staggerloc=esmf_staggerloc_center, &
1364 ungriddedlbound=(/1/), &
1366 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1367 call error_handler(
"IN FieldCreate", rc)
1369 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNWFA."
1371 typekind=esmf_typekind_r8, &
1372 staggerloc=esmf_staggerloc_center, &
1373 ungriddedlbound=(/1/), &
1375 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1376 call error_handler(
"IN FieldCreate", rc)
1378 print*,
"- CALL FieldRegridStore FOR THOMPSON CLIMO FIELDS."
1380 method=esmf_regridmethod_bilinear
1384 polemethod=esmf_polemethod_allavg, &
1385 srctermprocessing=isrctermprocessing, &
1386 routehandle=regrid_bl, &
1387 regridmethod=method, rc=rc)
1388 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1389 call error_handler(
"IN FieldRegridStore", rc)
1391 print*,
"- CALL Field_Regrid FOR THOMP CLIMO QNIFA."
1394 routehandle=regrid_bl, &
1395 termorderflag=esmf_termorder_srcseq, rc=rc)
1396 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1397 call error_handler(
"IN FieldRegrid", rc)
1399 print*,
"- CALL Field_Regrid FOR THOMP CLIMO QNWFA."
1402 routehandle=regrid_bl, &
1403 termorderflag=esmf_termorder_srcseq, rc=rc)
1404 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1405 call error_handler(
"IN FieldRegrid", rc)
1407 print*,
"- CALL Field_Regrid FOR THOMP PRESSURE."
1410 routehandle=regrid_bl, &
1411 termorderflag=esmf_termorder_srcseq, rc=rc)
1412 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1413 call error_handler(
"IN FieldRegrid", rc)
1415 print*,
"- CALL FieldRegridRelease."
1416 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
1417 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1418 call error_handler(
"IN FieldRegridRelease", rc)
1438 INTEGER :: CLB(3), CUB(3), RC
1439 INTEGER :: IM, KM1, KM2, NT
1442 REAL(ESMF_KIND_R8),
ALLOCATABLE :: Z1(:,:,:), Z2(:,:,:)
1443 REAL(ESMF_KIND_R8),
ALLOCATABLE :: C1(:,:,:,:),C2(:,:,:,:)
1445 REAL(ESMF_KIND_R8),
POINTER :: QNIFA1PTR(:,:,:)
1446 REAL(ESMF_KIND_R8),
POINTER :: QNIFA2PTR(:,:,:)
1447 REAL(ESMF_KIND_R8),
POINTER :: QNWFA1PTR(:,:,:)
1448 REAL(ESMF_KIND_R8),
POINTER :: QNWFA2PTR(:,:,:)
1449 REAL(ESMF_KIND_R8),
POINTER :: P1PTR(:,:,:)
1450 REAL(ESMF_KIND_R8),
POINTER :: P2PTR(:,:,:)
1452 print*,
"- VERTICALY INTERPOLATE THOMP MP CLIMO TRACERS."
1454 print*,
"- CALL FieldGet FOR 3-D THOMP PRES."
1456 computationallbound=clb, &
1457 computationalubound=cub, &
1458 farrayptr=p1ptr, rc=rc)
1459 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1460 call error_handler(
"IN FieldGet", rc)
1469 ALLOCATE(z2(clb(1):cub(1),clb(2):cub(2),
lev_target))
1471 ALLOCATE(c2(clb(1):cub(1),clb(2):cub(2),
lev_target,nt))
1475 print*,
"- CALL FieldGet FOR 3-D ADJUSTED PRESS"
1477 farrayptr=p2ptr, rc=rc)
1478 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1479 call error_handler(
"IN FieldGet", rc)
1486 print*,
"- CALL FieldGet FOR qnifa before vertical adjustment."
1488 farrayptr=qnifa1ptr, rc=rc)
1489 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1490 call error_handler(
"IN FieldGet", rc)
1492 c1(:,:,:,1) = qnifa1ptr(:,:,:)
1494 print*,
"- CALL FieldGet FOR qnwfa before vertical adjustment."
1496 farrayptr=qnwfa1ptr, rc=rc)
1497 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1498 call error_handler(
"IN FieldGet", rc)
1500 c1(:,:,:,2) = qnwfa1ptr(:,:,:)
1508 im = (cub(1)-clb(1)+1) * (cub(2)-clb(2)+1)
1512 CALL terp3(im,1,1,1,1,nt,(im*km1),(im*km2), &
1513 km1,im,im,z1,c1,km2,im,im,z2,c2)
1515 print*,
"- CALL FieldGet FOR ADJUSTED climo qnifa."
1517 farrayptr=qnifa2ptr, rc=rc)
1518 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1519 call error_handler(
"IN FieldGet", rc)
1521 print*,
"- CALL FieldGet FOR ADJUSTED climo qnwfa."
1523 farrayptr=qnwfa2ptr, rc=rc)
1524 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1525 call error_handler(
"IN FieldGet", rc)
1530 qnifa2ptr(i,j,k) = c2(i,j,k,1)
1531 qnwfa2ptr(i,j,k) = c2(i,j,k,2)
1536 DEALLOCATE (z1, z2, c1, c2)
1564 INTEGER,
INTENT(IN) :: YEAR,MONTH,DAY,HOUR
1565 CHARACTER(*),
INTENT(IN) :: PF
1567 REAL(ESMF_KIND_R8),
PARAMETER :: AMO = 15.9994
1568 REAL(ESMF_KIND_R8),
PARAMETER :: AMO2 = 31.999
1569 REAL(ESMF_KIND_R8),
PARAMETER :: AMN2 = 28.013
1571 REAL(ESMF_KIND_R8) :: COE,WFUN(10),DEGLAT,HOLD
1572 REAL(ESMF_KIND_R8) :: SUMMASS,QVMASS,O3MASS
1573 INTEGER :: I, J, K, II, CLB(3), CUB(3), RC, KREF
1574 INTEGER :: IDAT(8),JDOW,JDAY,ICDAY
1576 REAL(ESMF_KIND_R8),
ALLOCATABLE :: TEMP(:),ON(:),O2N(:),N2N(:),PRMB(:)
1578 REAL(ESMF_KIND_R8),
POINTER :: LATPTR(:,:)
1579 REAL(ESMF_KIND_R8),
POINTER :: P1PTR(:,:,:)
1580 REAL(ESMF_KIND_R8),
POINTER :: P2PTR(:,:,:)
1581 REAL(ESMF_KIND_R8),
POINTER :: DZDT2PTR(:,:,:)
1582 REAL(ESMF_KIND_R8),
POINTER :: T2PTR(:,:,:)
1583 REAL(ESMF_KIND_R8),
POINTER :: Q2PTR(:,:,:)
1584 REAL(ESMF_KIND_R8),
POINTER :: QVPTR(:,:,:)
1585 REAL(ESMF_KIND_R8),
POINTER :: QOPTR(:,:,:)
1586 REAL(ESMF_KIND_R8),
POINTER :: O2PTR(:,:,:)
1587 REAL(ESMF_KIND_R8),
POINTER :: O3PTR(:,:,:)
1588 REAL(ESMF_KIND_R8),
POINTER :: XWIND2PTR(:,:,:)
1589 REAL(ESMF_KIND_R8),
POINTER :: YWIND2PTR(:,:,:)
1590 REAL(ESMF_KIND_R8),
POINTER :: ZWIND2PTR(:,:,:)
1594 print*,
"VINTG_WAM:- VERTICALY EXTEND FIELDS FOR WAM COLD START."
1605 CALL w3doxdat(idat,jdow,icday,jday)
1606 print *,
"VINTG_WAM: WAM START DATE FOR ICDAY=",icday
1610 wfun(k) = (k-1.0) / 9.0
1620 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D PRES."
1622 computationallbound=clb, &
1623 computationalubound=cub, &
1624 farrayptr=p1ptr, rc=rc)
1625 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1626 call error_handler(
"IN FieldGet", rc)
1630 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D ADJUSTED PRESS"
1632 farrayptr=p2ptr, rc=rc)
1633 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1634 call error_handler(
"IN FieldGet", rc)
1638 print*,
"VINTG_WAM - CALL FieldGet FOR LATITUDE_S."
1640 farrayptr=latptr, rc=rc)
1641 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1642 call error_handler(
"IN FieldGet", rc)
1646 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D ADJUSTED TEMP."
1648 farrayptr=t2ptr, rc=rc)
1649 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1650 call error_handler(
"IN FieldGet", rc)
1653 print*,
"VINTG_WAM:- CALL FieldGet FOR ADJUSTED VERTICAL VELOCITY."
1655 farrayptr=dzdt2ptr, rc=rc)
1656 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1657 call error_handler(
"IN FieldGet", rc)
1660 print*,
"VINTG_WAM:- CALL FieldGet FOR ADJUSTED WIND COMPONENTS."
1663 farrayptr=xwind2ptr, rc=rc)
1664 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1665 call error_handler(
"IN FieldGet", rc)
1668 farrayptr=ywind2ptr, rc=rc)
1669 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1670 call error_handler(
"IN FieldGet", rc)
1673 farrayptr=zwind2ptr, rc=rc)
1674 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1675 call error_handler(
"IN FieldGet", rc)
1684 IF(p2ptr(i,j,k).le.p1ptr(i,j,
lev_input))
THEN
1691 coe = p2ptr(i,j,k) / p2ptr(i,j,kref)
1692 xwind2ptr(i,j,k) = coe*xwind2ptr(i,j,k)
1693 ywind2ptr(i,j,k) = coe*ywind2ptr(i,j,k)
1694 zwind2ptr(i,j,k) = coe*zwind2ptr(i,j,k)
1695 dzdt2ptr(i,j,k) = coe*dzdt2ptr(i,j,k)
1706 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D TRACER ", trim(
tracers(ii))
1708 farrayptr=q2ptr, rc=rc)
1709 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1710 call error_handler(
"IN FieldGet", rc)
1715 IF(p2ptr(i,j,k).le.p1ptr(i,j,
lev_input))
THEN
1722 coe = min(1.0, p2ptr(i,j,k) / p2ptr(i,j,kref) )
1723 q2ptr(i,j,k) = coe * q2ptr(i,j,k)
1728 IF (trim(
tracers(ii)) ==
"sphum") qvptr => q2ptr
1729 IF (trim(
tracers(ii)) ==
"spo" ) qoptr => q2ptr
1730 IF (trim(
tracers(ii)) ==
"spo2" ) o2ptr => q2ptr
1731 IF (trim(
tracers(ii)) ==
"spo3" ) o3ptr => q2ptr
1741 deglat = latptr(i,j)
1743 prmb(k) = p2ptr(i,j,k) * 0.01
1748 summass = on(k)*amo+o2n(k)*amo2+n2n(k)*amn2
1749 qvmass = summass*qvptr(i,j,k)/(1.-qvptr(i,j,k))
1750 summass = summass+qvmass
1751 o3mass = summass*o3ptr(i,j,k)
1752 summass = summass+o3mass
1753 hold = 1.0 / summass
1754 qoptr(i,j,k) = on(k)*amo *hold
1755 o2ptr(i,j,k) = o2n(k)*amo2*hold
1756 o3ptr(i,j,k) = o3mass * hold
1757 qvptr(i,j,k) = qvmass * hold
1761 IF(p2ptr(i,j,k).le.p1ptr(i,j,
lev_input))
THEN
1768 t2ptr(i,j,k) = temp(k)
1771 t2ptr(i,j,k) = wfun(k-kref+11) * temp(k) + &
1772 (1.- wfun(k-kref+11)) * t2ptr(i,j,k)
1777 DEALLOCATE (temp, prmb, on, o2n, n2n)
1799 REAL(ESMF_KIND_R8),
PARAMETER :: DLTDZ=-6.5e-3*287.05/9.80665
1800 REAL(ESMF_KIND_R8),
PARAMETER :: DLPVDRT=-2.5e6/461.50
1801 REAL(ESMF_KIND_R8),
PARAMETER :: ONE = 1.0_esmf_kind_r8
1803 INTEGER :: I, J, K, CLB(3), CUB(3), RC
1804 INTEGER :: IM, KM1, KM2, NT, II
1806 REAL(ESMF_KIND_R8) :: DZ
1807 REAL(ESMF_KIND_R8),
ALLOCATABLE :: Z1(:,:,:), Z2(:,:,:)
1808 REAL(ESMF_KIND_R8),
ALLOCATABLE :: C1(:,:,:,:),C2(:,:,:,:)
1810 REAL(ESMF_KIND_R8),
POINTER :: P1PTR(:,:,:)
1811 REAL(ESMF_KIND_R8),
POINTER :: P2PTR(:,:,:)
1812 REAL(ESMF_KIND_R8),
POINTER :: DZDT1PTR(:,:,:)
1813 REAL(ESMF_KIND_R8),
POINTER :: DZDT2PTR(:,:,:)
1814 REAL(ESMF_KIND_R8),
POINTER :: T1PTR(:,:,:)
1815 REAL(ESMF_KIND_R8),
POINTER :: T2PTR(:,:,:)
1816 REAL(ESMF_KIND_R8),
POINTER :: Q1PTR(:,:,:)
1817 REAL(ESMF_KIND_R8),
POINTER :: Q2PTR(:,:,:)
1818 REAL(ESMF_KIND_R8),
POINTER :: XWIND1PTR(:,:,:)
1819 REAL(ESMF_KIND_R8),
POINTER :: YWIND1PTR(:,:,:)
1820 REAL(ESMF_KIND_R8),
POINTER :: ZWIND1PTR(:,:,:)
1821 REAL(ESMF_KIND_R8),
POINTER :: XWIND2PTR(:,:,:)
1822 REAL(ESMF_KIND_R8),
POINTER :: YWIND2PTR(:,:,:)
1823 REAL(ESMF_KIND_R8),
POINTER :: ZWIND2PTR(:,:,:)
1830 print*,
"- VERTICALY INTERPOLATE FIELDS."
1832 print*,
"- CALL FieldGet FOR 3-D PRES."
1834 computationallbound=clb, &
1835 computationalubound=cub, &
1836 farrayptr=p1ptr, rc=rc)
1837 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1838 call error_handler(
"IN FieldGet", rc)
1846 ALLOCATE(z1(clb(1):cub(1),clb(2):cub(2),
lev_input))
1847 ALLOCATE(z2(clb(1):cub(1),clb(2):cub(2),
lev_target))
1853 print*,
"- CALL FieldGet FOR 3-D ADJUSTED PRESS"
1855 farrayptr=p2ptr, rc=rc)
1856 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1857 call error_handler(
"IN FieldGet", rc)
1861 print*,
"- CALL FieldGet FOR x WIND."
1863 farrayptr=xwind1ptr, rc=rc)
1864 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1865 call error_handler(
"IN FieldGet", rc)
1867 c1(:,:,:,1) = xwind1ptr(:,:,:)
1869 print*,
"- CALL FieldGet FOR y WIND."
1871 farrayptr=ywind1ptr, rc=rc)
1872 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1873 call error_handler(
"IN FieldGet", rc)
1875 c1(:,:,:,2) = ywind1ptr(:,:,:)
1877 print*,
"- CALL FieldGet FOR z WIND."
1879 farrayptr=zwind1ptr, rc=rc)
1880 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1881 call error_handler(
"IN FieldGet", rc)
1883 c1(:,:,:,3) = zwind1ptr(:,:,:)
1885 print*,
"- CALL FieldGet FOR VERTICAL VELOCITY."
1887 farrayptr=dzdt1ptr, rc=rc)
1888 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1889 call error_handler(
"IN FieldGet", rc)
1891 c1(:,:,:,4) = dzdt1ptr(:,:,:)
1892 print*,
"MIN MAX W TARGETB4 IN VINTG = ", minval(dzdt1ptr(:,:,:)), maxval(dzdt1ptr(:,:,:))
1894 print*,
"- CALL FieldGet FOR 3-D TEMP."
1896 farrayptr=t1ptr, rc=rc)
1897 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1898 call error_handler(
"IN FieldGet", rc)
1900 c1(:,:,:,5) = t1ptr(:,:,:)
1904 print*,
"- CALL FieldGet FOR 3-D TRACERS ", trim(
tracers(i))
1906 farrayptr=q1ptr, rc=rc)
1907 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1908 call error_handler(
"IN FieldGet", rc)
1910 c1(:,:,:,5+i) = q1ptr(:,:,:)
1920 im = (cub(1)-clb(1)+1) * (cub(2)-clb(2)+1)
1925 CALL terp3(im,1,1,1,1,4+nt,(im*km1),(im*km2), &
1926 km1,im,im,z1,c1,km2,im,im,z2,c2)
1933 print*,
"- CALL FieldGet FOR 3-D ADJUSTED TEMP."
1935 farrayptr=t2ptr, rc=rc)
1936 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1937 call error_handler(
"IN FieldGet", rc)
1939 print*,
"- CALL FieldGet FOR ADJUSTED VERTICAL VELOCITY."
1941 farrayptr=dzdt2ptr, rc=rc)
1942 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1943 call error_handler(
"IN FieldGet", rc)
1945 print*,
"- CALL FieldGet FOR ADJUSTED xwind."
1947 farrayptr=xwind2ptr, rc=rc)
1948 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1949 call error_handler(
"IN FieldGet", rc)
1951 print*,
"- CALL FieldGet FOR ADJUSTED ywind."
1953 farrayptr=ywind2ptr, rc=rc)
1954 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1955 call error_handler(
"IN FieldGet", rc)
1957 print*,
"- CALL FieldGet FOR ADJUSTED zwind."
1959 farrayptr=zwind2ptr, rc=rc)
1960 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1961 call error_handler(
"IN FieldGet", rc)
1966 xwind2ptr(i,j,k)=c2(i,j,k,1)
1967 ywind2ptr(i,j,k)=c2(i,j,k,2)
1968 zwind2ptr(i,j,k)=c2(i,j,k,3)
1969 dzdt2ptr(i,j,k)=c2(i,j,k,4)
1970 dz=z2(i,j,k)-z1(i,j,1)
1972 t2ptr(i,j,k)=c2(i,j,k,5)
1974 t2ptr(i,j,k)=c1(i,j,1,5)*exp(dltdz*dz)
1982 print*,
"- CALL FieldGet FOR 3-D TRACER ", trim(
tracers(ii))
1984 farrayptr=q2ptr, rc=rc)
1985 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1986 call error_handler(
"IN FieldGet", rc)
1988 IF (trim(
tracers(ii)) ==
"sphum")
THEN
1993 dz=z2(i,j,k)-z1(i,j,1)
1995 q2ptr(i,j,k) = c2(i,j,k,5+ii)
1997 q2ptr(i,j,k) = c1(i,j,1,5+ii)*exp(dlpvdrt*(one/t2ptr(i,j,k)-one/t1ptr(i,j,1))-dz)
2008 q2ptr(i,j,k) = c2(i,j,k,5+ii)
2017 DEALLOCATE (z1, z2, c1, c2)
2019 END SUBROUTINE vintg
2057 SUBROUTINE terp3(IM,IXZ1,IXQ1,IXZ2,IXQ2,NM,NXQ1,NXQ2, &
2058 KM1,KXZ1,KXQ1,Z1,Q1,KM2,KXZ2,KXQ2,Z2,Q2)
2060 INTEGER IM,IXZ1,IXQ1,IXZ2,IXQ2,NM,NXQ1,NXQ2
2061 INTEGER KM1,KXZ1,KXQ1,KM2,KXZ2,KXQ2
2064 REAL(ESMF_KIND_R8),
PARAMETER :: ONE = 1.0_esmf_kind_r8
2065 REAL(ESMF_KIND_R8) :: Z1(1+(IM-1)*IXZ1+(KM1-1)*KXZ1)
2066 REAL(ESMF_KIND_R8) :: Q1(1+(IM-1)*IXQ1+(KM1-1)*KXQ1+(NM-1)*NXQ1)
2067 REAL(ESMF_KIND_R8) :: Z2(1+(IM-1)*IXZ2+(KM2-1)*KXZ2)
2068 REAL(ESMF_KIND_R8) :: Q2(1+(IM-1)*IXQ2+(KM2-1)*KXQ2+(NM-1)*NXQ2)
2070 REAL(ESMF_KIND_R8) :: FFA(IM),FFB(IM),FFC(IM),FFD(IM)
2071 REAL(ESMF_KIND_R8) :: GGA(IM),GGB(IM),GGC(IM),GGD(IM)
2072 REAL(ESMF_KIND_R8) :: Z1A,Z1B,Z1C,Z1D,Q1A,Q1B,Q1C,Q1D,Z2S,Q2S
2077 CALL rsearch(im,km1,ixz1,kxz1,z1,km2,ixz2,kxz2,z2,1,im,k1s)
2091 IF(k1.EQ.1.OR.k1.EQ.km1-1)
THEN
2092 z2s=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
2093 z1a=z1(1+(i-1)*ixz1+(k1-1)*kxz1)
2094 z1b=z1(1+(i-1)*ixz1+(k1+0)*kxz1)
2095 ffa(i)=(z2s-z1b)/(z1a-z1b)
2096 ffb(i)=(z2s-z1a)/(z1b-z1a)
2097 gga(i)=one/(z1a-z1b)
2098 ggb(i)=one/(z1b-z1a)
2099 ELSEIF(k1.GT.1.AND.k1.LT.km1-1)
THEN
2100 z2s=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
2101 z1a=z1(1+(i-1)*ixz1+(k1-2)*kxz1)
2102 z1b=z1(1+(i-1)*ixz1+(k1-1)*kxz1)
2103 z1c=z1(1+(i-1)*ixz1+(k1+0)*kxz1)
2104 z1d=z1(1+(i-1)*ixz1+(k1+1)*kxz1)
2105 ffa(i)=(z2s-z1b)/(z1a-z1b)* &
2106 (z2s-z1c)/(z1a-z1c)* &
2108 ffb(i)=(z2s-z1a)/(z1b-z1a)* &
2109 (z2s-z1c)/(z1b-z1c)* &
2111 ffc(i)=(z2s-z1a)/(z1c-z1a)* &
2112 (z2s-z1b)/(z1c-z1b)* &
2114 ffd(i)=(z2s-z1a)/(z1d-z1a)* &
2115 (z2s-z1b)/(z1d-z1b)* &
2117 gga(i)= one/(z1a-z1b)* &
2118 (z2s-z1c)/(z1a-z1c)* &
2119 (z2s-z1d)/(z1a-z1d)+ &
2120 (z2s-z1b)/(z1a-z1b)* &
2122 (z2s-z1d)/(z1a-z1d)+ &
2123 (z2s-z1b)/(z1a-z1b)* &
2124 (z2s-z1c)/(z1a-z1c)* &
2126 ggb(i)= one/(z1b-z1a)* &
2127 (z2s-z1c)/(z1b-z1c)* &
2128 (z2s-z1d)/(z1b-z1d)+ &
2129 (z2s-z1a)/(z1b-z1a)* &
2131 (z2s-z1d)/(z1b-z1d)+ &
2132 (z2s-z1a)/(z1b-z1a)* &
2133 (z2s-z1c)/(z1b-z1c)* &
2135 ggc(i)= one/(z1c-z1a)* &
2136 (z2s-z1b)/(z1c-z1b)* &
2137 (z2s-z1d)/(z1c-z1d)+ &
2138 (z2s-z1a)/(z1c-z1a)* &
2140 (z2s-z1d)/(z1c-z1d)+ &
2141 (z2s-z1a)/(z1c-z1a)* &
2142 (z2s-z1b)/(z1c-z1b)* &
2144 ggd(i)= one/(z1d-z1a)* &
2145 (z2s-z1b)/(z1d-z1b)* &
2146 (z2s-z1c)/(z1d-z1c)+ &
2147 (z2s-z1a)/(z1d-z1a)* &
2149 (z2s-z1c)/(z1d-z1c)+ &
2150 (z2s-z1a)/(z1d-z1a)* &
2151 (z2s-z1b)/(z1d-z1b)* &
2161 q2s=q1(1+(i-1)*ixq1+(n-1)*nxq1)
2163 ELSEIF(k1.EQ.km1)
THEN
2164 q2s=q1(1+(i-1)*ixq1+(km1-1)*kxq1+(n-1)*nxq1)
2166 ELSEIF(k1.EQ.1.OR.k1.EQ.km1-1)
THEN
2167 q1a=q1(1+(i-1)*ixq1+(k1-1)*kxq1+(n-1)*nxq1)
2168 q1b=q1(1+(i-1)*ixq1+(k1+0)*kxq1+(n-1)*nxq1)
2169 q2s=ffa(i)*q1a+ffb(i)*q1b
2172 q1a=q1(1+(i-1)*ixq1+(k1-2)*kxq1+(n-1)*nxq1)
2173 q1b=q1(1+(i-1)*ixq1+(k1-1)*kxq1+(n-1)*nxq1)
2174 q1c=q1(1+(i-1)*ixq1+(k1+0)*kxq1+(n-1)*nxq1)
2175 q1d=q1(1+(i-1)*ixq1+(k1+1)*kxq1+(n-1)*nxq1)
2176 q2s=ffa(i)*q1a+ffb(i)*q1b+ffc(i)*q1c+ffd(i)*q1d
2178 IF(q2s.LT.min(q1b,q1c))
THEN
2181 ELSEIF(q2s.GT.max(q1b,q1c))
THEN
2186 q2(1+(i-1)*ixq2+(k2-1)*kxq2+(n-1)*nxq2)=q2s
2193 END SUBROUTINE terp3
2251 SUBROUTINE rsearch(IM,KM1,IXZ1,KXZ1,Z1,KM2,IXZ2,KXZ2,Z2,IXL2,KXL2,L2)
2254 INTEGER,
INTENT(IN) :: IM,KM1,IXZ1,KXZ1,KM2,IXZ2,KXZ2,IXL2,KXL2
2255 INTEGER,
INTENT(OUT) :: L2(1+(IM-1)*IXL2+(KM2-1)*KXL2)
2257 REAL(ESMF_KIND_R8),
INTENT(IN) :: Z1(1+(IM-1)*IXZ1+(KM1-1)*KXZ1)
2258 REAL(ESMF_KIND_R8),
INTENT(IN) :: Z2(1+(IM-1)*IXZ2+(KM2-1)*KXZ2)
2262 REAL(ESMF_KIND_R8) :: Z
2268 IF (z1(1+(i-1)*ixz1).LE.z1(1+(i-1)*ixz1+(km1-1)*kxz1))
THEN
2271 z=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
2274 IF(z.LT.z1(1+(i-1)*ixz1+l*kxz1))
EXIT
2278 l2(1+(i-1)*ixl2+(k2-1)*kxl2)=l
2283 z=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
2286 IF(z.GT.z1(1+(i-1)*ixz1+l*kxz1))
EXIT
2290 l2(1+(i-1)*ixl2+(k2-1)*kxl2)=l
2303 integer :: i,ii, j,k, rc, clb(2), cub(2)
2305 real(esmf_kind_r8),
allocatable :: pe0(:), pn0(:)
2306 real(esmf_kind_r8),
pointer :: psptr(:,:)
2307 real(esmf_kind_r8),
pointer :: zhsfcptr(:,:)
2308 real(esmf_kind_r8),
pointer :: zhptr(:,:,:)
2309 real(esmf_kind_r8),
pointer :: tptr(:,:,:)
2310 real(esmf_kind_r8),
pointer :: qptr(:,:,:)
2311 real(esmf_kind_r8) :: ak, bk, zvir, grd
2312 real(esmf_kind_r8),
parameter :: grav = 9.80665
2313 real(esmf_kind_r8),
parameter :: rdgas = 287.05
2314 real(esmf_kind_r8),
parameter :: rvgas = 461.50
2316 print*,
"- COMPUTE HEIGHT"
2318 print*,
"- CALL FieldGet FOR SURFACE PRESSURE"
2320 computationallbound=clb, &
2321 computationalubound=cub, &
2322 farrayptr=psptr, rc=rc)
2323 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2324 call error_handler(
"IN FieldGet", rc)
2326 print*,
"- CALL FieldGet FOR TERRAIN HEIGHT"
2328 farrayptr=zhsfcptr, rc=rc)
2329 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2330 call error_handler(
"IN FieldGet", rc)
2332 print*,
"- CALL FieldGet FOR HEIGHT"
2334 farrayptr=zhptr, rc=rc)
2335 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2336 call error_handler(
"IN FieldGet", rc)
2338 print*,
"- CALL FieldGet FOR TEMPERATURE"
2340 farrayptr=tptr, rc=rc)
2341 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2342 call error_handler(
"IN FieldGet", rc)
2345 if (trim(
tracers(ii)) ==
"sphum")
exit
2348 print*,
"- CALL FieldGet FOR SPECIFIC HUMIDITY"
2350 farrayptr=qptr, rc=rc)
2351 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2352 call error_handler(
"IN FieldGet", rc)
2355 zvir = rvgas/rdgas - 1.0_esmf_kind_r8
2360 do j = clb(2), cub(2)
2361 do i = clb(1), cub(1)
2368 pe0(k) = ak + bk*psptr(i,j)
2369 pn0(k) = log(pe0(k))
2372 zhptr(i,j,1) = zhsfcptr(i,j)
2375 zhptr(i,j,k) = zhptr(i,j,k-1)+tptr(i,j,k-1)*(1.+zvir*qptr(i,j,k-1))* &
2376 (pn0(k-1)-pn0(k))/grd
2382 deallocate(pe0, pn0)
2395 print*,
"- DESTROY TARGET GRID ATMOSPHERIC BEFORE ADJUSTMENT FIELDS."
2424 print*,
"- DESTROY LOCAL TARGET GRID ATMOSPHERIC FIELDS."
Module to hold variables and ESMF fields associated with the target grid atmospheric data.
subroutine, public cleanup_atmosphere_target_data
Free up memory for fields and variables in this module.
type(esmf_field), public u_s_target_grid
U-wind, 'south' edge of grid cell.
type(esmf_field), public ps_target_grid
Surface pressure.
type(esmf_field), public v_s_target_grid
V-wind, 'south' edge of grid cell.
type(esmf_field), public dzdt_target_grid
Vertical velocity.
integer, public levp1_target
Number of vertical levels plus 1.
type(esmf_field), public zh_target_grid
3-d height.
integer, public nvcoord_target
Number of vertical coordinate variables.
type(esmf_field), public u_w_target_grid
U-wind, 'west' edge of grid cell.
type(esmf_field), public temp_target_grid
Temperautre.
type(esmf_field), dimension(:), allocatable, public tracers_target_grid
Tracers.
integer, public lev_target
Number of vertical levels.
type(esmf_field), public qnwfa_climo_target_grid
Number concentration of water friendly aerosols.
type(esmf_field), public qnifa_climo_target_grid
Number concentration of ice friendly aerosols.
type(esmf_field), public delp_target_grid
Pressure thickness.
type(esmf_field), public v_w_target_grid
V-wind, 'west' edge of grid cell.
real(esmf_kind_r8), dimension(:,:), allocatable, public vcoord_target
Vertical coordinate.
Process atmospheric fields.
type(esmf_field) zwind_target_grid
z-component wind, grid box center
subroutine create_atm_esmf_fields
Create target grid field objects.
type(esmf_field) ywind_s_target_grid
y-component wind, 'south' edge
type(esmf_field) zwind_s_target_grid
z-component wind, 'south' edge
subroutine vintg_wam(year, month, day, hour, pf)
Vertically extend model top into thermosphere for whole atmosphere model.
type(esmf_field) ywind_w_target_grid
y-component wind, 'west' edge
type(esmf_field) ywind_b4adj_target_grid
y-component wind, before vert adj
type(esmf_field) xwind_b4adj_target_grid
x-component wind, before vert adj
subroutine horiz_interp_thomp_mp_climo
Horizontally interpolate thompson microphysics data to the target model grid.
type(esmf_field) pres_target_grid
3-d pressure
type(esmf_field) pres_b4adj_target_grid
3-d pres before terrain adj
subroutine newpr1(localpet)
Computes 3-D pressure given an adjusted surface pressure.
subroutine vintg_thomp_mp_climo
Vertically interpolate atmospheric fields to target FV3 grid.
type(esmf_field) temp_b4adj_target_grid
temp before vert adj
subroutine, public read_vcoord_info
Reads model vertical coordinate definition file (as specified by namelist variable vcoord_file_target...
subroutine newps(localpet)
Computes adjusted surface pressure given a new terrain height.
subroutine cleanup_target_atm_b4adj_data
Cleanup atmospheric field (before adjustment) objects.
type(esmf_field) terrain_interp_to_target_grid
Input grid terrain interpolated to target grid.
subroutine rsearch(im, km1, ixz1, kxz1, z1, km2, ixz2, kxz2, z2, ixl2, kxl2, l2)
Search for a surrounding real interval.
type(esmf_field) xwind_s_target_grid
x-component wind, 'south' edge
type(esmf_field) ywind_target_grid
y-component wind, grid box center
subroutine create_atm_b4adj_esmf_fields
Create target grid field objects to hold data before vertical interpolation.
type(esmf_field) ps_b4adj_target_grid
sfc pres before terrain adj
subroutine compute_zh
Compute vertical level height.
subroutine, public atmosphere_driver(localpet)
Driver routine to process for atmospheric fields.
subroutine terp3(im, ixz1, ixq1, ixz2, ixq2, nm, nxq1, nxq2, km1, kxz1, kxq1, z1, q1, km2, kxz2, kxq2, z2, q2)
Cubically interpolate in one dimension.
type(esmf_field) xwind_w_target_grid
x-component wind, 'west' edge
type(esmf_field) dzdt_b4adj_target_grid
vertical vel before vert adj
type(esmf_field) xwind_target_grid
x-component wind, grid box center
type(esmf_field) thomp_pres_climo_b4adj_target_grid
pressure of each level on target grid
type(esmf_field) zwind_b4adj_target_grid
z-component wind, before vert adj
subroutine vintg
Vertically interpolate upper-air fields.
type(esmf_field) zwind_w_target_grid
z-component wind, 'west' edge
type(esmf_field), dimension(:), allocatable tracers_b4adj_target_grid
tracers before vert adj
subroutine convert_winds_to_uv
Convert 3-d component winds to u and v.
type(esmf_field) qnifa_climo_b4adj_target_grid
number concentration of ice friendly aerosols before vert adj
type(esmf_field) qnwfa_climo_b4adj_target_grid
number concentration of water friendly aerosols before vert adj
subroutine cleanup_all_target_atm_data
Cleanup target grid atmospheric field objects.
Sets up the ESMF grid objects for the input data grid and target FV3 grid.
type(esmf_field), public latitude_w_target_grid
latitude of 'west' edge of grid box, target grid
type(esmf_field), public longitude_w_target_grid
longitude of 'west' edge of grid box, target grid
type(esmf_field), public terrain_target_grid
terrain height target grid
type(esmf_grid), public target_grid
target grid esmf grid object.
type(esmf_field), public longitude_s_target_grid
longitude of 'south' edge of grid box, target grid
type(esmf_field), public latitude_s_target_grid
latitude of 'south' edge of grid box, target grid
This module contains code to read the setup namelist file, handle the varmap file for GRIB2 data,...
integer, public num_tracers_input
Number of atmospheric tracers in input file.
integer, public regional
For regional target grids.
character(len=500), public wam_parm_file
Full path to msis21.parm for WAM initialization.
character(len=20), dimension(max_tracers), public tracers
Name of each atmos tracer to be processed.
integer, public num_tracers
Number of atmospheric tracers to be processed.
logical, public use_thomp_mp_climo
When true, read and process Thompson MP climatological tracers.
logical, public wam_cold_start
When true, cold start for whole atmosphere model.
integer, public cycle_mon
Cycle month.
integer, public cycle_day
Cycle day.
integer, public cycle_hour
Cycle hour.
character(len=500), public atm_weight_file
File containing pre-computed weights to horizontally interpolate atmospheric fields.
character(len=500), public vcoord_file_target_grid
Vertical coordinate definition file.
integer, public cycle_year
Cycle year.
Module to read the Thompson climatological MP data file and set up the associated esmf field and grid...
type(esmf_field), public qnifa_climo_input_grid
number concentration of ice friendly nuclei.
subroutine, public cleanup_thomp_mp_climo_input_data
Free up memory associated with this module.
type(esmf_field), public qnwfa_climo_input_grid
number concentration of water friendly nuclei.
type(esmf_field), public thomp_pres_climo_input_grid
3-d pressure of the Thompson climo data points
subroutine, public read_thomp_mp_climo_data
Read Thompson climatological MP data file and time interpolate data to current cycle time.
integer, public lev_thomp_mp_climo
number of vert lvls of Thompson climo data
subroutine gettemp(iday, xlat, pr, np, pf, temp, n_o, n_o2, n_n2)
Routine that computes temperature and neutral density values utilizing MSIS 2.1.