68 use write_data,
only : write_fv3_atm_header_netcdf, &
69 write_fv3_atm_bndy_data_netcdf, &
70 write_fv3_atm_data_netcdf
72 use utilities,
only : error_handler
113 integer,
intent(in) :: localpet
115 integer :: isrctermprocessing
118 type(esmf_regridmethod_flag) :: method
119 type(esmf_routehandle) :: regrid_bl
121 real(esmf_kind_r8),
parameter :: p0=101325.0
122 real(esmf_kind_r8),
parameter :: rd = 287.058
123 real(esmf_kind_r8),
parameter :: grav = 9.81
124 real(esmf_kind_r8),
parameter :: lapse = -6.5e-03
126 real(esmf_kind_r8),
parameter :: exponent = rd*lapse/grav
127 real(esmf_kind_r8),
parameter :: one_over_exponent = 1.0 / exponent
129 real(esmf_kind_r8),
pointer :: psptr(:,:), tempptr(:,:,:)
153 isrctermprocessing = 1
157 print*,
"- CALL FieldSMMStore FOR ATMOSPHERIC FIELDS." 162 routehandle=regrid_bl, &
163 srctermprocessing=isrctermprocessing, rc=rc)
164 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
165 call error_handler(
"IN FieldSMMStore", rc)
169 print*,
"- CALL FieldRegridStore FOR ATMOSPHERIC FIELDS." 171 method=esmf_regridmethod_bilinear
175 polemethod=esmf_polemethod_allavg, &
176 srctermprocessing=isrctermprocessing, &
177 routehandle=regrid_bl, &
178 regridmethod=method, rc=rc)
179 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
180 call error_handler(
"IN FieldRegridStore", rc)
184 print*,
"- CALL Field_Regrid FOR TEMPERATURE." 187 routehandle=regrid_bl, &
188 termorderflag=esmf_termorder_srcseq, &
190 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
191 call error_handler(
"IN FieldRegrid", rc)
193 print*,
"- CALL Field_Regrid FOR PRESSURE." 196 routehandle=regrid_bl, &
197 termorderflag=esmf_termorder_srcseq, &
199 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
200 call error_handler(
"IN FieldRegrid", rc)
203 print*,
"- CALL Field_Regrid FOR TRACER ", trim(
tracers(n))
206 routehandle=regrid_bl, &
207 termorderflag=esmf_termorder_srcseq, rc=rc)
208 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
209 call error_handler(
"IN FieldRegrid", rc)
213 print*,
"- CALL Field_Regrid FOR VERTICAL VELOCITY." 216 routehandle=regrid_bl, &
217 termorderflag=esmf_termorder_srcseq, rc=rc)
218 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
219 call error_handler(
"IN FieldRegrid", rc)
222 print*,
"- CALL FieldGet FOR INPUT GRID VERTICAL VEL." 224 farrayptr=tempptr, rc=rc)
225 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
226 call error_handler(
"IN FieldGet", rc)
228 print*,
"MIN MAX W INPUT = ", minval(tempptr), maxval(tempptr)
231 print*,
"- CALL FieldGet FOR VERTICAL VEL B4ADJ." 233 farrayptr=tempptr, rc=rc)
234 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
235 call error_handler(
"IN FieldGet", rc)
237 print*,
"MIN MAX W B4ADJ = ", minval(tempptr), maxval(tempptr)
240 print*,
"- CALL FieldGet FOR INPUT SURFACE PRESSURE." 242 farrayptr=psptr, rc=rc)
243 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
244 call error_handler(
"IN FieldGet", rc)
250 psptr = (psptr/p0)**exponent
252 print*,
"- CALL Field_Regrid FOR SURFACE PRESSURE." 255 routehandle=regrid_bl, &
256 termorderflag=esmf_termorder_srcseq, &
258 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
259 call error_handler(
"IN FieldRegrid", rc)
262 print*,
"- CALL FieldGet FOR INPUT SURFACE PRESSURE B4ADJ." 264 farrayptr=psptr, rc=rc)
265 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
266 call error_handler(
"IN FieldGet", rc)
268 psptr = p0 * psptr**one_over_exponent
270 print*,
"- CALL Field_Regrid FOR TERRAIN." 273 routehandle=regrid_bl, &
274 termorderflag=esmf_termorder_srcseq, &
276 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
277 call error_handler(
"IN FieldRegrid", rc)
279 print*,
"- CALL Field_Regrid FOR 3-D WIND." 282 routehandle=regrid_bl, &
283 termorderflag=esmf_termorder_srcseq, rc=rc)
284 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
285 call error_handler(
"IN FieldRegrid", rc)
287 print*,
"- CALL FieldRegridRelease." 288 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
289 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
290 call error_handler(
"IN FieldRegridRelease", rc)
342 isrctermprocessing = 1
343 method=esmf_regridmethod_bilinear
345 print*,
"- CALL FieldRegridStore FOR 3D-WIND WEST EDGE." 348 polemethod=esmf_polemethod_allavg, &
349 srctermprocessing=isrctermprocessing, &
350 routehandle=regrid_bl, &
351 extrapmethod=esmf_extrapmethod_nearest_stod, &
352 regridmethod=method, rc=rc)
353 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
354 call error_handler(
"IN FieldRegridStore", rc)
356 print*,
"- CALL Field_Regrid FOR 3-D WIND WEST EDGE." 359 routehandle=regrid_bl, &
360 termorderflag=esmf_termorder_srcseq, rc=rc)
361 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
362 call error_handler(
"IN FieldRegrid", rc)
364 print*,
"- CALL FieldRegridRelease." 365 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
366 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
367 call error_handler(
"IN FieldRegridRelease", rc)
369 isrctermprocessing = 1
370 method=esmf_regridmethod_bilinear
372 print*,
"- CALL FieldRegridStore FOR 3D-WIND SOUTH EDGE." 375 polemethod=esmf_polemethod_allavg, &
376 srctermprocessing=isrctermprocessing, &
377 routehandle=regrid_bl, &
378 extrapmethod=esmf_extrapmethod_nearest_stod, &
379 regridmethod=method, rc=rc)
380 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
381 call error_handler(
"IN FieldRegridStore", rc)
383 print*,
"- CALL Field_Regrid FOR 3-D WIND SOUTH EDGE." 386 routehandle=regrid_bl, &
387 termorderflag=esmf_termorder_srcseq, rc=rc)
388 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
389 call error_handler(
"IN FieldRegrid", rc)
391 print*,
"- CALL FieldRegridRelease." 392 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
393 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
394 call error_handler(
"IN FieldRegridRelease", rc)
409 call vintg_thomp_mp_climo
416 call write_fv3_atm_header_netcdf(localpet)
417 if (
regional <= 1)
call write_fv3_atm_data_netcdf(localpet)
418 if (
regional >= 1)
call write_fv3_atm_bndy_data_netcdf(localpet)
442 print*,
"- CALL FieldCreate FOR TARGET GRID TRACER BEFORE ADJUSTMENT ", trim(
tracers(n))
444 typekind=esmf_typekind_r8, &
445 staggerloc=esmf_staggerloc_center, &
446 ungriddedlbound=(/1/), &
448 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
449 call error_handler(
"IN FieldCreate", rc)
452 print*,
"- CALL FieldCreate FOR TARGET GRID TEMPERATURE BEFORE ADJUSTMENT." 454 typekind=esmf_typekind_r8, &
455 staggerloc=esmf_staggerloc_center, &
456 ungriddedlbound=(/1/), &
458 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
459 call error_handler(
"IN FieldCreate", rc)
461 print*,
"- CALL FieldCreate FOR TARGET GRID PRESSURE BEFORE ADJUSTMENT." 463 typekind=esmf_typekind_r8, &
464 staggerloc=esmf_staggerloc_center, &
465 ungriddedlbound=(/1/), &
467 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
468 call error_handler(
"IN FieldCreate", rc)
470 print*,
"- CALL FieldCreate FOR TARGET GRID VERTICAL VELOCITY BEFORE ADJUSTMENT." 472 typekind=esmf_typekind_r8, &
473 staggerloc=esmf_staggerloc_center, &
474 ungriddedlbound=(/1/), &
476 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
477 call error_handler(
"IN FieldCreate", rc)
479 print*,
"- CALL FieldCreate FOR TARGET GRID UNSTAGGERED WINDS BEFORE ADJUSTMENT." 481 typekind=esmf_typekind_r8, &
482 staggerloc=esmf_staggerloc_center, &
483 ungriddedlbound=(/1,1/), &
485 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
486 call error_handler(
"IN FieldCreate", rc)
488 print*,
"- CALL FieldCreate FOR TARGET TERRAIN." 490 typekind=esmf_typekind_r8, &
491 staggerloc=esmf_staggerloc_center, rc=rc)
492 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
493 call error_handler(
"IN FieldCreate", rc)
495 print*,
"- CALL FieldCreate FOR TARGET SURFACE PRESSURE BEFORE ADJUSTMENT." 497 typekind=esmf_typekind_r8, &
498 staggerloc=esmf_staggerloc_center, rc=rc)
499 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
500 call error_handler(
"IN FieldCreate", rc)
516 print*,
"- CALL FieldCreate FOR TARGET GRID TRACERS ", trim(
tracers(n))
518 typekind=esmf_typekind_r8, &
519 staggerloc=esmf_staggerloc_center, &
520 ungriddedlbound=(/1/), &
522 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
523 call error_handler(
"IN FieldCreate", rc)
526 print*,
"- CALL FieldCreate FOR TARGET GRID TEMPERATURE." 528 typekind=esmf_typekind_r8, &
529 staggerloc=esmf_staggerloc_center, &
530 ungriddedlbound=(/1/), &
532 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
533 call error_handler(
"IN FieldCreate", rc)
535 print*,
"- CALL FieldCreate FOR TARGET GRID PRESSURE." 537 typekind=esmf_typekind_r8, &
538 staggerloc=esmf_staggerloc_center, &
539 ungriddedlbound=(/1/), &
541 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
542 call error_handler(
"IN FieldCreate", rc)
544 print*,
"- CALL FieldCreate FOR TARGET GRID VERTICAL VELOCITY." 546 typekind=esmf_typekind_r8, &
547 staggerloc=esmf_staggerloc_center, &
548 ungriddedlbound=(/1/), &
550 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
551 call error_handler(
"IN FieldCreate", rc)
553 print*,
"- CALL FieldCreate FOR TARGET GRID DELP." 555 typekind=esmf_typekind_r8, &
556 staggerloc=esmf_staggerloc_center, &
557 ungriddedlbound=(/1/), &
559 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
560 call error_handler(
"IN FieldCreate", rc)
562 print*,
"- CALL FieldCreate FOR TARGET HEIGHT." 564 typekind=esmf_typekind_r8, &
565 staggerloc=esmf_staggerloc_center, &
566 ungriddedlbound=(/1/), &
568 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
569 call error_handler(
"IN FieldCreate", rc)
571 print*,
"- CALL FieldCreate FOR TARGET UNSTAGGERED 3D-WIND." 573 typekind=esmf_typekind_r8, &
574 staggerloc=esmf_staggerloc_center, &
575 ungriddedlbound=(/1,1/), &
577 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
578 call error_handler(
"IN FieldCreate", rc)
580 print*,
"- CALL FieldCreate FOR TARGET U_S." 582 typekind=esmf_typekind_r8, &
583 staggerloc=esmf_staggerloc_edge2, &
584 ungriddedlbound=(/1/), &
586 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
587 call error_handler(
"IN FieldCreate", rc)
589 print*,
"- CALL FieldCreate FOR TARGET V_S." 591 typekind=esmf_typekind_r8, &
592 staggerloc=esmf_staggerloc_edge2, &
593 ungriddedlbound=(/1/), &
595 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
596 call error_handler(
"IN FieldCreate", rc)
598 print*,
"- CALL FieldCreate FOR TARGET 3D-WIND_S." 600 typekind=esmf_typekind_r8, &
601 staggerloc=esmf_staggerloc_edge2, &
602 ungriddedlbound=(/1,1/), &
604 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
605 call error_handler(
"IN FieldCreate", rc)
607 print*,
"- CALL FieldCreate FOR TARGET U_W." 609 typekind=esmf_typekind_r8, &
610 staggerloc=esmf_staggerloc_edge1, &
611 ungriddedlbound=(/1/), &
613 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
614 call error_handler(
"IN FieldCreate", rc)
616 print*,
"- CALL FieldCreate FOR TARGET V_W." 618 typekind=esmf_typekind_r8, &
619 staggerloc=esmf_staggerloc_edge1, &
620 ungriddedlbound=(/1/), &
622 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
623 call error_handler(
"IN FieldCreate", rc)
625 print*,
"- CALL FieldCreate FOR TARGET 3D-WIND_W." 627 typekind=esmf_typekind_r8, &
628 staggerloc=esmf_staggerloc_edge1, &
629 ungriddedlbound=(/1,1/), &
631 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
632 call error_handler(
"IN FieldCreate", rc)
634 print*,
"- CALL FieldCreate FOR TARGET SURFACE PRESSURE." 636 typekind=esmf_typekind_r8, &
637 staggerloc=esmf_staggerloc_center, rc=rc)
638 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
639 call error_handler(
"IN FieldCreate", rc)
650 integer :: clb(4), cub(4)
651 integer :: i, j, k, rc
653 real(esmf_kind_r8),
pointer :: latptr(:,:)
654 real(esmf_kind_r8),
pointer :: lonptr(:,:)
655 real(esmf_kind_r8),
pointer :: uptr(:,:,:)
656 real(esmf_kind_r8),
pointer :: vptr(:,:,:)
657 real(esmf_kind_r8),
pointer :: windptr(:,:,:,:)
658 real(esmf_kind_r8) :: latrad, lonrad
664 print*,
'- CONVERT WINDS.' 666 print*,
"- CALL FieldGet FOR 3-D WIND_S." 668 computationallbound=clb, &
669 computationalubound=cub, &
670 farrayptr=windptr, rc=rc)
671 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
672 call error_handler(
"IN FieldGet", rc)
674 print*,
"- CALL FieldGet FOR U_S." 676 farrayptr=uptr, rc=rc)
677 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
678 call error_handler(
"IN FieldGet", rc)
680 print*,
"- CALL FieldGet FOR V_S." 682 farrayptr=vptr, rc=rc)
683 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
684 call error_handler(
"IN FieldGet", rc)
686 print*,
"- CALL FieldGet FOR LATITUDE_S." 688 farrayptr=latptr, rc=rc)
689 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
690 call error_handler(
"IN FieldGet", rc)
692 print*,
"- CALL FieldGet FOR LONGITUDE_S." 694 farrayptr=lonptr, rc=rc)
695 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
696 call error_handler(
"IN FieldGet", rc)
698 do i = clb(1), cub(1)
699 do j = clb(2), cub(2)
700 latrad = latptr(i,j) * acos(-1.) / 180.0
701 lonrad = lonptr(i,j) * acos(-1.) / 180.0
702 do k = clb(3), cub(3)
703 uptr(i,j,k) = windptr(i,j,k,1) * cos(lonrad) + windptr(i,j,k,2) * sin(lonrad)
704 vptr(i,j,k) = -windptr(i,j,k,1) * sin(latrad) * sin(lonrad) + &
705 windptr(i,j,k,2) * sin(latrad) * cos(lonrad) + &
706 windptr(i,j,k,3) * cos(latrad)
712 print*,
"- CALL FieldGet FOR 3-D WIND_W." 714 computationallbound=clb, &
715 computationalubound=cub, &
716 farrayptr=windptr, rc=rc)
717 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
718 call error_handler(
"IN FieldGet", rc)
720 print*,
"- CALL FieldGet FOR U_W." 722 farrayptr=uptr, rc=rc)
723 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
724 call error_handler(
"IN FieldGet", rc)
726 print*,
"- CALL FieldGet FOR V_W." 728 farrayptr=vptr, rc=rc)
729 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
730 call error_handler(
"IN FieldGet", rc)
732 print*,
"- CALL FieldGet FOR LATITUDE_W." 734 farrayptr=latptr, rc=rc)
735 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
736 call error_handler(
"IN FieldGet", rc)
738 print*,
"- CALL FieldGet FOR LONGITUDE_W." 740 farrayptr=lonptr, rc=rc)
741 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
742 call error_handler(
"IN FieldGet", rc)
744 do i = clb(1), cub(1)
745 do j = clb(2), cub(2)
746 latrad = latptr(i,j) * acos(-1.) / 180.0
747 lonrad = lonptr(i,j) * acos(-1.) / 180.0
748 do k = clb(3), cub(3)
749 uptr(i,j,k) = windptr(i,j,k,1) * cos(lonrad) + windptr(i,j,k,2) * sin(lonrad)
750 vptr(i,j,k) = -windptr(i,j,k,1) * sin(latrad) * sin(lonrad) + &
751 windptr(i,j,k,2) * sin(latrad) * cos(lonrad) + &
752 windptr(i,j,k,3) * cos(latrad)
790 subroutine newpr1(localpet)
793 integer,
intent(in) :: localpet
795 integer :: idsl, idvc, rc
796 integer :: i, j, k, clb(3), cub(3)
798 real(esmf_kind_r8),
parameter :: rd=287.05
799 real(esmf_kind_r8),
parameter :: cp=1004.6
800 real(esmf_kind_r8),
parameter :: rocp=rd/cp
801 real(esmf_kind_r8),
parameter :: rocp1=rocp+1
802 real(esmf_kind_r8),
parameter :: rocpr=1/rocp
804 real(esmf_kind_r8),
pointer :: delp_ptr(:,:,:)
805 real(esmf_kind_r8),
pointer :: pptr(:,:,:)
806 real(esmf_kind_r8),
pointer :: psptr(:,:)
807 real(esmf_kind_r8) :: ak, bk
808 real(esmf_kind_r8),
allocatable :: pi(:,:,:)
810 print*,
"COMPUTE 3-D PRESSURE FROM ADJUSTED SURFACE PRESSURE." 815 print*,
"- CALL FieldGet FOR 3-D PRES." 817 computationallbound=clb, &
818 computationalubound=cub, &
819 farrayptr=pptr, rc=rc)
820 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
821 call error_handler(
"IN FieldGet", rc)
823 print*,
"- CALL FieldGet FOR DELP." 825 computationallbound=clb, &
826 computationalubound=cub, &
827 farrayptr=delp_ptr, rc=rc)
828 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
829 call error_handler(
"IN FieldGet", rc)
831 print*,
"- CALL FieldGet FOR SURFACE PRESSURE AFTER ADJUSTMENT" 833 farrayptr=psptr, rc=rc)
834 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
835 call error_handler(
"IN FieldGet", rc)
837 allocate(pi(clb(1):cub(1),clb(2):cub(2),1:
levp1_target))
845 pi(i,j,k) = ak + bk*psptr(i,j)
852 delp_ptr(i,j,k) = pi(i,j,k) - pi(i,j,k+1)
857 call error_handler(
"PROGRAM ONLY WORKS WITH IDVC 2", 1)
864 pptr(i,j,k) = (pi(i,j,k)+pi(i,j,k+1))/2.0
872 pptr(i,j,k) = ((pi(i,j,k)**rocp1-pi(i,j,k+1)**rocp1)/ &
873 (rocp1*(pi(i,j,k)-pi(i,j,k+1))))**rocpr
881 if (localpet == 0)
then 882 print*,
'new pres ',pptr(clb(1),clb(2),:)
883 print*,
'delp ',delp_ptr(clb(1),clb(2),:)
901 subroutine newps(localpet)
905 integer,
intent(in) :: localpet
906 integer :: i, j, k, ii
907 integer :: clb(3), cub(3), ls, rc
909 real(esmf_kind_r8),
pointer :: pptr(:,:,:)
910 real(esmf_kind_r8),
pointer :: psptr(:,:)
911 real(esmf_kind_r8),
pointer :: psnewptr(:,:)
912 real(esmf_kind_r8),
pointer :: tptr(:,:,:)
913 real(esmf_kind_r8),
pointer :: qptr(:,:,:)
914 real(esmf_kind_r8),
pointer :: zsptr(:,:)
915 real(esmf_kind_r8),
pointer :: zsnewptr(:,:)
916 real(esmf_kind_r8),
allocatable :: zu(:,:)
917 real(esmf_kind_r8),
parameter :: beta=-6.5e-3
918 real(esmf_kind_r8),
parameter :: epsilon=1.e-9
919 real(esmf_kind_r8),
parameter :: g=9.80665
920 real(esmf_kind_r8),
parameter :: rd=287.05
921 real(esmf_kind_r8),
parameter :: rv=461.50
922 real(esmf_kind_r8),
parameter :: gor=g/rd
923 real(esmf_kind_r8),
parameter :: fv=rv/rd-1.
924 real(esmf_kind_r8) :: ftv, fgam, apu, fz0
925 real(esmf_kind_r8) :: atvu, atv, fz1, fp0
926 real(esmf_kind_r8) :: apd, azd, agam, azu
927 real(esmf_kind_r8) :: atvd, fp1, gamma, pu
928 real(esmf_kind_r8) :: tvu, pd, tvd
929 real(esmf_kind_r8) :: at, aq, ap, az
931 ftv(at,aq)=at*(1+fv*aq)
932 fgam(apu,atvu,apd,atvd)=-gor*log(atvd/atvu)/log(apd/apu)
933 fz0(ap,atv,azd,apd)=azd+atv/gor*log(apd/ap)
934 fz1(ap,atv,azd,apd,agam)=azd-atv/agam*((apd/ap)**(-agam/gor)-1)
935 fp0(az,azu,apu,atvu)=apu*exp(-gor/atvu*(az-azu))
936 fp1(az,azu,apu,atvu,agam)=apu*(1+agam/atvu*(az-azu))**(-gor/agam)
938 print*,
"- ADJUST SURFACE PRESSURE FOR NEW TERRAIN." 940 print*,
"- CALL FieldGet FOR 3-D PRES." 942 computationallbound=clb, &
943 computationalubound=cub, &
944 farrayptr=pptr, rc=rc)
945 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
946 call error_handler(
"IN FieldGet", rc)
949 print*,
'old pres ',pptr(clb(1),clb(2),:)
952 print*,
"- CALL FieldGet FOR TEMPERATURE" 954 farrayptr=tptr, rc=rc)
955 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
956 call error_handler(
"IN FieldGet", rc)
961 if (trim(
tracers(ii)) ==
"sphum")
exit 964 print*,
"- CALL FieldGet FOR SPECIFIC HUMIDITY" 966 farrayptr=qptr, rc=rc)
967 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
968 call error_handler(
"IN FieldGet", rc)
970 print*,
"- CALL FieldGet FOR SURFACE PRESSURE BEFORE ADJUSTMENT" 972 farrayptr=psptr, rc=rc)
973 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
974 call error_handler(
"IN FieldGet", rc)
976 print*,
"- CALL FieldGet FOR SURFACE PRESSURE AFTER ADJUSTMENT" 978 farrayptr=psnewptr, rc=rc)
979 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
980 call error_handler(
"IN FieldGet", rc)
982 print*,
"- CALL FieldGet FOR OLD TERRAIN" 984 farrayptr=zsptr, rc=rc)
985 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
986 call error_handler(
"IN FieldGet", rc)
988 print*,
"- CALL FieldGet FOR NEW TERRAIN" 990 farrayptr=zsnewptr, rc=rc)
991 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
992 call error_handler(
"IN FieldGet", rc)
994 allocate(zu(clb(1):cub(1),clb(2):cub(2)))
1011 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1012 zu(i,j)=fz1(pu,tvu,zsptr(i,j),psptr(i,j),gamma)
1013 if(zsnewptr(i,j).le.zu(i,j))
then 1015 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1016 if(abs(gamma).gt.epsilon)
then 1017 psnewptr(i,j)=fp1(zsnewptr(i,j),zu(i,j),pu,tvu,gamma)
1019 psnewptr(i,j)=fp0(zsnewptr(i,j),zu(i,j),pu,tvu)
1036 if(psnewptr(i,j).eq.0)
then 1038 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1040 tvd=ftv(tptr(i,j,k-1),qptr(i,j,k-1))
1041 gamma=fgam(pu,tvu,pd,tvd)
1042 if(abs(gamma).gt.epsilon)
then 1043 zu(i,j)=fz1(pu,tvu,zu(i,j),pd,gamma)
1045 zu(i,j)=fz0(pu,tvu,zu(i,j),pd)
1047 if(zsnewptr(i,j).le.zu(i,j))
then 1048 if(abs(gamma).gt.epsilon)
then 1049 psnewptr(i,j)=fp1(zsnewptr(i,j),zu(i,j),pu,tvu,gamma)
1051 psnewptr(i,j)=fp0(zsnewptr(i,j),zu(i,j),pu,tvu)
1071 if(psnewptr(i,j).eq.0)
then 1073 tvu=ftv(tptr(i,j,k),qptr(i,j,k))
1074 psnewptr(i,j)=fp0(zsnewptr(i,j),zu(i,j),pu,tvu)
1082 if (localpet == 0)
then 1087 print*,
'sfcp adjust ',(zsnewptr(i,j)-zsptr(i,j)), psptr(i,j),psnewptr(i,j)
1092 end subroutine newps 1101 integer :: istat, n, k
1106 if (istat /= 0)
then 1107 call error_handler(
"OPENING VERTICAL COORD FILE", istat)
1111 if (istat /= 0)
then 1112 call error_handler(
"READING VERTICAL COORD FILE", istat)
1119 if (istat /= 0)
then 1120 call error_handler(
"READING VERTICAL COORD FILE", istat)
1137 integer :: isrctermprocessing, rc
1139 type(esmf_regridmethod_flag) :: method
1140 type(esmf_routehandle) :: regrid_bl
1142 isrctermprocessing=1
1144 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNIFA BEFORE ADJUSTMENT." 1146 typekind=esmf_typekind_r8, &
1147 staggerloc=esmf_staggerloc_center, &
1148 ungriddedlbound=(/1/), &
1150 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1151 call error_handler(
"IN FieldCreate", rc)
1153 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNWFA BEFORE ADJUSTMENT." 1155 typekind=esmf_typekind_r8, &
1156 staggerloc=esmf_staggerloc_center, &
1157 ungriddedlbound=(/1/), &
1159 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1160 call error_handler(
"IN FieldCreate", rc)
1162 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO PRESSURE BEFORE ADJUSTMENT." 1164 typekind=esmf_typekind_r8, &
1165 staggerloc=esmf_staggerloc_center, &
1166 ungriddedlbound=(/1/), &
1168 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1169 call error_handler(
"IN FieldCreate", rc)
1171 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNIFA." 1173 typekind=esmf_typekind_r8, &
1174 staggerloc=esmf_staggerloc_center, &
1175 ungriddedlbound=(/1/), &
1177 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1178 call error_handler(
"IN FieldCreate", rc)
1180 print*,
"- CALL FieldCreate FOR TARGET GRID THOMP CLIMO QNWFA." 1182 typekind=esmf_typekind_r8, &
1183 staggerloc=esmf_staggerloc_center, &
1184 ungriddedlbound=(/1/), &
1186 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1187 call error_handler(
"IN FieldCreate", rc)
1189 print*,
"- CALL FieldRegridStore FOR THOMPSON CLIMO FIELDS." 1191 method=esmf_regridmethod_bilinear
1195 polemethod=esmf_polemethod_allavg, &
1196 srctermprocessing=isrctermprocessing, &
1197 routehandle=regrid_bl, &
1198 regridmethod=method, rc=rc)
1199 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1200 call error_handler(
"IN FieldRegridStore", rc)
1202 print*,
"- CALL Field_Regrid FOR THOMP CLIMO QNIFA." 1205 routehandle=regrid_bl, &
1206 termorderflag=esmf_termorder_srcseq, rc=rc)
1207 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1208 call error_handler(
"IN FieldRegrid", rc)
1210 print*,
"- CALL Field_Regrid FOR THOMP CLIMO QNWFA." 1213 routehandle=regrid_bl, &
1214 termorderflag=esmf_termorder_srcseq, rc=rc)
1215 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1216 call error_handler(
"IN FieldRegrid", rc)
1218 print*,
"- CALL Field_Regrid FOR THOMP PRESSURE." 1221 routehandle=regrid_bl, &
1222 termorderflag=esmf_termorder_srcseq, rc=rc)
1223 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1224 call error_handler(
"IN FieldRegrid", rc)
1226 print*,
"- CALL FieldRegridRelease." 1227 call esmf_fieldregridrelease(routehandle=regrid_bl, rc=rc)
1228 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1229 call error_handler(
"IN FieldRegridRelease", rc)
1245 SUBROUTINE vintg_thomp_mp_climo
1249 INTEGER :: CLB(3), CUB(3), RC
1250 INTEGER :: IM, KM1, KM2, NT
1253 REAL(ESMF_KIND_R8),
ALLOCATABLE :: Z1(:,:,:), Z2(:,:,:)
1254 REAL(ESMF_KIND_R8),
ALLOCATABLE :: C1(:,:,:,:),C2(:,:,:,:)
1256 REAL(ESMF_KIND_R8),
POINTER :: QNIFA1PTR(:,:,:)
1257 REAL(ESMF_KIND_R8),
POINTER :: QNIFA2PTR(:,:,:)
1258 REAL(ESMF_KIND_R8),
POINTER :: QNWFA1PTR(:,:,:)
1259 REAL(ESMF_KIND_R8),
POINTER :: QNWFA2PTR(:,:,:)
1260 REAL(ESMF_KIND_R8),
POINTER :: P1PTR(:,:,:)
1261 REAL(ESMF_KIND_R8),
POINTER :: P2PTR(:,:,:)
1263 print*,
"- VERTICALY INTERPOLATE THOMP MP CLIMO TRACERS." 1265 print*,
"- CALL FieldGet FOR 3-D THOMP PRES." 1267 computationallbound=clb, &
1268 computationalubound=cub, &
1269 farrayptr=p1ptr, rc=rc)
1270 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1271 call error_handler(
"IN FieldGet", rc)
1280 ALLOCATE(z2(clb(1):cub(1),clb(2):cub(2),
lev_target))
1282 ALLOCATE(c2(clb(1):cub(1),clb(2):cub(2),
lev_target,nt))
1286 print*,
"- CALL FieldGet FOR 3-D ADJUSTED PRESS" 1288 farrayptr=p2ptr, rc=rc)
1289 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1290 call error_handler(
"IN FieldGet", rc)
1297 print*,
"- CALL FieldGet FOR qnifa before vertical adjustment." 1299 farrayptr=qnifa1ptr, rc=rc)
1300 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1301 call error_handler(
"IN FieldGet", rc)
1303 c1(:,:,:,1) = qnifa1ptr(:,:,:)
1305 print*,
"- CALL FieldGet FOR qnwfa before vertical adjustment." 1307 farrayptr=qnwfa1ptr, rc=rc)
1308 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1309 call error_handler(
"IN FieldGet", rc)
1311 c1(:,:,:,2) = qnwfa1ptr(:,:,:)
1319 im = (cub(1)-clb(1)+1) * (cub(2)-clb(2)+1)
1323 CALL terp3(im,1,1,1,1,nt,(im*km1),(im*km2), &
1324 km1,im,im,z1,c1,km2,im,im,z2,c2)
1326 print*,
"- CALL FieldGet FOR ADJUSTED climo qnifa." 1328 farrayptr=qnifa2ptr, rc=rc)
1329 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1330 call error_handler(
"IN FieldGet", rc)
1332 print*,
"- CALL FieldGet FOR ADJUSTED climo qnwfa." 1334 farrayptr=qnwfa2ptr, rc=rc)
1335 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1336 call error_handler(
"IN FieldGet", rc)
1341 qnifa2ptr(i,j,k) = c2(i,j,k,1)
1342 qnwfa2ptr(i,j,k) = c2(i,j,k,2)
1347 DEALLOCATE (z1, z2, c1, c2)
1353 END SUBROUTINE vintg_thomp_mp_climo
1368 SUBROUTINE vintg_wam (YEAR,MONTH,DAY,HOUR)
1374 INTEGER,
INTENT(IN) :: YEAR,MONTH,DAY,HOUR
1376 REAL(ESMF_KIND_R8),
PARAMETER :: AMO = 15.9994
1377 REAL(ESMF_KIND_R8),
PARAMETER :: AMO2 = 31.999
1378 REAL(ESMF_KIND_R8),
PARAMETER :: AMN2 = 28.013
1380 REAL(ESMF_KIND_R8) :: COE,WFUN(10),DEGLAT,HOLD
1381 REAL(ESMF_KIND_R8) :: SUMMASS,QVMASS,O3MASS
1382 INTEGER :: I, J, K, II, CLB(3), CUB(3), RC, KREF
1383 INTEGER :: IDAT(8),JDOW,JDAY,ICDAY
1385 REAL(ESMF_KIND_R8),
ALLOCATABLE :: TEMP(:),ON(:),O2N(:),N2N(:),PRMB(:)
1387 REAL(ESMF_KIND_R8),
POINTER :: LATPTR(:,:)
1388 REAL(ESMF_KIND_R8),
POINTER :: P1PTR(:,:,:)
1389 REAL(ESMF_KIND_R8),
POINTER :: P2PTR(:,:,:)
1390 REAL(ESMF_KIND_R8),
POINTER :: DZDT2PTR(:,:,:)
1391 REAL(ESMF_KIND_R8),
POINTER :: T2PTR(:,:,:)
1392 REAL(ESMF_KIND_R8),
POINTER :: Q2PTR(:,:,:)
1393 REAL(ESMF_KIND_R8),
POINTER :: QVPTR(:,:,:)
1394 REAL(ESMF_KIND_R8),
POINTER :: QOPTR(:,:,:)
1395 REAL(ESMF_KIND_R8),
POINTER :: O2PTR(:,:,:)
1396 REAL(ESMF_KIND_R8),
POINTER :: O3PTR(:,:,:)
1397 REAL(ESMF_KIND_R8),
POINTER :: WIND2PTR(:,:,:,:)
1401 print*,
"VINTG_WAM:- VERTICALY EXTEND FIELDS FOR WAM COLD START." 1412 CALL w3doxdat(idat,jdow,icday,jday)
1413 print *,
"VINTG_WAM: WAM START DATE FOR ICDAY=",icday
1417 wfun(k) = (k-1.0) / 9.0
1427 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D PRES." 1429 computationallbound=clb, &
1430 computationalubound=cub, &
1431 farrayptr=p1ptr, rc=rc)
1432 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1433 call error_handler(
"IN FieldGet", rc)
1437 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D ADJUSTED PRESS" 1439 farrayptr=p2ptr, rc=rc)
1440 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1441 call error_handler(
"IN FieldGet", rc)
1445 print*,
"VINTG_WAM - CALL FieldGet FOR LATITUDE_S." 1447 farrayptr=latptr, rc=rc)
1448 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1449 call error_handler(
"IN FieldGet", rc)
1453 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D ADJUSTED TEMP." 1455 farrayptr=t2ptr, rc=rc)
1456 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1457 call error_handler(
"IN FieldGet", rc)
1460 print*,
"VINTG_WAM:- CALL FieldGet FOR ADJUSTED VERTICAL VELOCITY." 1462 farrayptr=dzdt2ptr, rc=rc)
1463 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1464 call error_handler(
"IN FieldGet", rc)
1467 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D ADJUSTED WIND." 1469 farrayptr=wind2ptr, rc=rc)
1470 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1471 call error_handler(
"IN FieldGet", rc)
1480 IF(p2ptr(i,j,k).le.p1ptr(i,j,
lev_input))
THEN 1489 coe = p2ptr(i,j,k) / p2ptr(i,j,kref)
1490 wind2ptr(i,j,k,1) = coe*wind2ptr(i,j,k,1)
1491 wind2ptr(i,j,k,2) = coe*wind2ptr(i,j,k,2)
1492 wind2ptr(i,j,k,3) = coe*wind2ptr(i,j,k,3)
1493 dzdt2ptr(i,j,k) = coe*dzdt2ptr(i,j,k)
1504 print*,
"VINTG_WAM:- CALL FieldGet FOR 3-D TRACER ", trim(
tracers(ii))
1506 farrayptr=q2ptr, rc=rc)
1507 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1508 call error_handler(
"IN FieldGet", rc)
1513 IF(p2ptr(i,j,k).le.p1ptr(i,j,
lev_input))
THEN 1521 coe = min(1.0, p2ptr(i,j,k) / p2ptr(i,j,kref) )
1522 q2ptr(i,j,k) = coe * q2ptr(i,j,k)
1527 IF (trim(
tracers(ii)) ==
"sphum") qvptr => q2ptr
1528 IF (trim(
tracers(ii)) ==
"spo" ) qoptr => q2ptr
1529 IF (trim(
tracers(ii)) ==
"spo2" ) o2ptr => q2ptr
1530 IF (trim(
tracers(ii)) ==
"spo3" ) o3ptr => q2ptr
1540 deglat = latptr(i,j)
1542 prmb(k) = p2ptr(i,j,k) * 0.01
1547 summass = on(k)*amo+o2n(k)*amo2+n2n(k)*amn2
1548 qvmass = summass*qvptr(i,j,k)/(1.-qvptr(i,j,k))
1549 summass = summass+qvmass
1550 o3mass = summass*o3ptr(i,j,k)
1551 summass = summass+o3mass
1552 hold = 1.0 / summass
1553 qoptr(i,j,k) = on(k)*amo *hold
1554 o2ptr(i,j,k) = o2n(k)*amo2*hold
1555 o3ptr(i,j,k) = o3mass * hold
1556 qvptr(i,j,k) = qvmass * hold
1560 IF(p2ptr(i,j,k).le.p1ptr(i,j,
lev_input))
THEN 1568 t2ptr(i,j,k) = temp(k)
1571 t2ptr(i,j,k) = wfun(k-kref+11) * temp(k) + &
1572 (1.- wfun(k-kref+11)) * t2ptr(i,j,k)
1577 DEALLOCATE (temp, prmb, on, o2n, n2n)
1579 END SUBROUTINE vintg_wam
1599 REAL(ESMF_KIND_R8),
PARAMETER :: DLTDZ=-6.5e-3*287.05/9.80665
1600 REAL(ESMF_KIND_R8),
PARAMETER :: DLPVDRT=-2.5e6/461.50
1601 REAL(ESMF_KIND_R8),
PARAMETER :: ONE = 1.0_esmf_kind_r8
1603 INTEGER :: I, J, K, CLB(3), CUB(3), RC
1604 INTEGER :: IM, KM1, KM2, NT, II
1606 REAL(ESMF_KIND_R8) :: DZ
1607 REAL(ESMF_KIND_R8),
ALLOCATABLE :: Z1(:,:,:), Z2(:,:,:)
1608 REAL(ESMF_KIND_R8),
ALLOCATABLE :: C1(:,:,:,:),C2(:,:,:,:)
1610 REAL(ESMF_KIND_R8),
POINTER :: P1PTR(:,:,:)
1611 REAL(ESMF_KIND_R8),
POINTER :: P2PTR(:,:,:)
1612 REAL(ESMF_KIND_R8),
POINTER :: DZDT1PTR(:,:,:)
1613 REAL(ESMF_KIND_R8),
POINTER :: DZDT2PTR(:,:,:)
1614 REAL(ESMF_KIND_R8),
POINTER :: T1PTR(:,:,:)
1615 REAL(ESMF_KIND_R8),
POINTER :: T2PTR(:,:,:)
1616 REAL(ESMF_KIND_R8),
POINTER :: Q1PTR(:,:,:)
1617 REAL(ESMF_KIND_R8),
POINTER :: Q2PTR(:,:,:)
1618 REAL(ESMF_KIND_R8),
POINTER :: WIND1PTR(:,:,:,:)
1619 REAL(ESMF_KIND_R8),
POINTER :: WIND2PTR(:,:,:,:)
1626 print*,
"- VERTICALY INTERPOLATE FIELDS." 1628 print*,
"- CALL FieldGet FOR 3-D PRES." 1630 computationallbound=clb, &
1631 computationalubound=cub, &
1632 farrayptr=p1ptr, rc=rc)
1633 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1634 call error_handler(
"IN FieldGet", rc)
1642 ALLOCATE(z1(clb(1):cub(1),clb(2):cub(2),
lev_input))
1643 ALLOCATE(z2(clb(1):cub(1),clb(2):cub(2),
lev_target))
1649 print*,
"- CALL FieldGet FOR 3-D ADJUSTED PRESS" 1651 farrayptr=p2ptr, rc=rc)
1652 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1653 call error_handler(
"IN FieldGet", rc)
1657 print*,
"- CALL FieldGet FOR 3-D WIND." 1659 farrayptr=wind1ptr, rc=rc)
1660 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1661 call error_handler(
"IN FieldGet", rc)
1663 c1(:,:,:,1) = wind1ptr(:,:,:,1)
1664 c1(:,:,:,2) = wind1ptr(:,:,:,2)
1665 c1(:,:,:,3) = wind1ptr(:,:,:,3)
1667 print*,
"- CALL FieldGet FOR VERTICAL VELOCITY." 1669 farrayptr=dzdt1ptr, rc=rc)
1670 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1671 call error_handler(
"IN FieldGet", rc)
1673 c1(:,:,:,4) = dzdt1ptr(:,:,:)
1674 print*,
"MIN MAX W TARGETB4 IN VINTG = ", minval(dzdt1ptr(:,:,:)), maxval(dzdt1ptr(:,:,:))
1676 print*,
"- CALL FieldGet FOR 3-D TEMP." 1678 farrayptr=t1ptr, rc=rc)
1679 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1680 call error_handler(
"IN FieldGet", rc)
1682 c1(:,:,:,5) = t1ptr(:,:,:)
1686 print*,
"- CALL FieldGet FOR 3-D TRACERS ", trim(
tracers(i))
1688 farrayptr=q1ptr, rc=rc)
1689 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1690 call error_handler(
"IN FieldGet", rc)
1692 c1(:,:,:,5+i) = q1ptr(:,:,:)
1702 im = (cub(1)-clb(1)+1) * (cub(2)-clb(2)+1)
1707 CALL terp3(im,1,1,1,1,4+nt,(im*km1),(im*km2), &
1708 km1,im,im,z1,c1,km2,im,im,z2,c2)
1715 print*,
"- CALL FieldGet FOR 3-D ADJUSTED TEMP." 1717 farrayptr=t2ptr, rc=rc)
1718 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1719 call error_handler(
"IN FieldGet", rc)
1721 print*,
"- CALL FieldGet FOR ADJUSTED VERTICAL VELOCITY." 1723 farrayptr=dzdt2ptr, rc=rc)
1724 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1725 call error_handler(
"IN FieldGet", rc)
1727 print*,
"- CALL FieldGet FOR 3-D ADJUSTED WIND." 1729 farrayptr=wind2ptr, rc=rc)
1730 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1731 call error_handler(
"IN FieldGet", rc)
1736 wind2ptr(i,j,k,1)=c2(i,j,k,1)
1737 wind2ptr(i,j,k,2)=c2(i,j,k,2)
1738 wind2ptr(i,j,k,3)=c2(i,j,k,3)
1739 dzdt2ptr(i,j,k)=c2(i,j,k,4)
1740 dz=z2(i,j,k)-z1(i,j,1)
1742 t2ptr(i,j,k)=c2(i,j,k,5)
1744 t2ptr(i,j,k)=c1(i,j,1,5)*exp(dltdz*dz)
1752 print*,
"- CALL FieldGet FOR 3-D TRACER ", trim(
tracers(ii))
1754 farrayptr=q2ptr, rc=rc)
1755 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
1756 call error_handler(
"IN FieldGet", rc)
1758 IF (trim(
tracers(ii)) ==
"sphum")
THEN 1763 dz=z2(i,j,k)-z1(i,j,1)
1765 q2ptr(i,j,k) = c2(i,j,k,5+ii)
1767 q2ptr(i,j,k) = c1(i,j,1,5+ii)*exp(dlpvdrt*(one/t2ptr(i,j,k)-one/t1ptr(i,j,1))-dz)
1778 q2ptr(i,j,k) = c2(i,j,k,5+ii)
1787 DEALLOCATE (z1, z2, c1, c2)
1789 END SUBROUTINE vintg
1827 SUBROUTINE terp3(IM,IXZ1,IXQ1,IXZ2,IXQ2,NM,NXQ1,NXQ2, &
1828 KM1,KXZ1,KXQ1,Z1,Q1,KM2,KXZ2,KXQ2,Z2,Q2)
1830 INTEGER IM,IXZ1,IXQ1,IXZ2,IXQ2,NM,NXQ1,NXQ2
1831 INTEGER KM1,KXZ1,KXQ1,KM2,KXZ2,KXQ2
1834 REAL(ESMF_KIND_R8),
PARAMETER :: ONE = 1.0_esmf_kind_r8
1835 REAL(ESMF_KIND_R8) :: Z1(1+(IM-1)*IXZ1+(KM1-1)*KXZ1)
1836 REAL(ESMF_KIND_R8) :: Q1(1+(IM-1)*IXQ1+(KM1-1)*KXQ1+(NM-1)*NXQ1)
1837 REAL(ESMF_KIND_R8) :: Z2(1+(IM-1)*IXZ2+(KM2-1)*KXZ2)
1838 REAL(ESMF_KIND_R8) :: Q2(1+(IM-1)*IXQ2+(KM2-1)*KXQ2+(NM-1)*NXQ2)
1840 REAL(ESMF_KIND_R8) :: FFA(IM),FFB(IM),FFC(IM),FFD(IM)
1841 REAL(ESMF_KIND_R8) :: GGA(IM),GGB(IM),GGC(IM),GGD(IM)
1842 REAL(ESMF_KIND_R8) :: Z1A,Z1B,Z1C,Z1D,Q1A,Q1B,Q1C,Q1D,Z2S,Q2S
1847 CALL rsearch(im,km1,ixz1,kxz1,z1,km2,ixz2,kxz2,z2,1,im,k1s)
1861 IF(k1.EQ.1.OR.k1.EQ.km1-1)
THEN 1862 z2s=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
1863 z1a=z1(1+(i-1)*ixz1+(k1-1)*kxz1)
1864 z1b=z1(1+(i-1)*ixz1+(k1+0)*kxz1)
1865 ffa(i)=(z2s-z1b)/(z1a-z1b)
1866 ffb(i)=(z2s-z1a)/(z1b-z1a)
1867 gga(i)=one/(z1a-z1b)
1868 ggb(i)=one/(z1b-z1a)
1869 ELSEIF(k1.GT.1.AND.k1.LT.km1-1)
THEN 1870 z2s=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
1871 z1a=z1(1+(i-1)*ixz1+(k1-2)*kxz1)
1872 z1b=z1(1+(i-1)*ixz1+(k1-1)*kxz1)
1873 z1c=z1(1+(i-1)*ixz1+(k1+0)*kxz1)
1874 z1d=z1(1+(i-1)*ixz1+(k1+1)*kxz1)
1875 ffa(i)=(z2s-z1b)/(z1a-z1b)* &
1876 (z2s-z1c)/(z1a-z1c)* &
1878 ffb(i)=(z2s-z1a)/(z1b-z1a)* &
1879 (z2s-z1c)/(z1b-z1c)* &
1881 ffc(i)=(z2s-z1a)/(z1c-z1a)* &
1882 (z2s-z1b)/(z1c-z1b)* &
1884 ffd(i)=(z2s-z1a)/(z1d-z1a)* &
1885 (z2s-z1b)/(z1d-z1b)* &
1887 gga(i)= one/(z1a-z1b)* &
1888 (z2s-z1c)/(z1a-z1c)* &
1889 (z2s-z1d)/(z1a-z1d)+ &
1890 (z2s-z1b)/(z1a-z1b)* &
1892 (z2s-z1d)/(z1a-z1d)+ &
1893 (z2s-z1b)/(z1a-z1b)* &
1894 (z2s-z1c)/(z1a-z1c)* &
1896 ggb(i)= one/(z1b-z1a)* &
1897 (z2s-z1c)/(z1b-z1c)* &
1898 (z2s-z1d)/(z1b-z1d)+ &
1899 (z2s-z1a)/(z1b-z1a)* &
1901 (z2s-z1d)/(z1b-z1d)+ &
1902 (z2s-z1a)/(z1b-z1a)* &
1903 (z2s-z1c)/(z1b-z1c)* &
1905 ggc(i)= one/(z1c-z1a)* &
1906 (z2s-z1b)/(z1c-z1b)* &
1907 (z2s-z1d)/(z1c-z1d)+ &
1908 (z2s-z1a)/(z1c-z1a)* &
1910 (z2s-z1d)/(z1c-z1d)+ &
1911 (z2s-z1a)/(z1c-z1a)* &
1912 (z2s-z1b)/(z1c-z1b)* &
1914 ggd(i)= one/(z1d-z1a)* &
1915 (z2s-z1b)/(z1d-z1b)* &
1916 (z2s-z1c)/(z1d-z1c)+ &
1917 (z2s-z1a)/(z1d-z1a)* &
1919 (z2s-z1c)/(z1d-z1c)+ &
1920 (z2s-z1a)/(z1d-z1a)* &
1921 (z2s-z1b)/(z1d-z1b)* &
1931 q2s=q1(1+(i-1)*ixq1+(n-1)*nxq1)
1933 ELSEIF(k1.EQ.km1)
THEN 1934 q2s=q1(1+(i-1)*ixq1+(km1-1)*kxq1+(n-1)*nxq1)
1936 ELSEIF(k1.EQ.1.OR.k1.EQ.km1-1)
THEN 1937 q1a=q1(1+(i-1)*ixq1+(k1-1)*kxq1+(n-1)*nxq1)
1938 q1b=q1(1+(i-1)*ixq1+(k1+0)*kxq1+(n-1)*nxq1)
1939 q2s=ffa(i)*q1a+ffb(i)*q1b
1942 q1a=q1(1+(i-1)*ixq1+(k1-2)*kxq1+(n-1)*nxq1)
1943 q1b=q1(1+(i-1)*ixq1+(k1-1)*kxq1+(n-1)*nxq1)
1944 q1c=q1(1+(i-1)*ixq1+(k1+0)*kxq1+(n-1)*nxq1)
1945 q1d=q1(1+(i-1)*ixq1+(k1+1)*kxq1+(n-1)*nxq1)
1946 q2s=ffa(i)*q1a+ffb(i)*q1b+ffc(i)*q1c+ffd(i)*q1d
1948 IF(q2s.LT.min(q1b,q1c))
THEN 1951 ELSEIF(q2s.GT.max(q1b,q1c))
THEN 1956 q2(1+(i-1)*ixq2+(k2-1)*kxq2+(n-1)*nxq2)=q2s
1963 END SUBROUTINE terp3
2021 SUBROUTINE rsearch(IM,KM1,IXZ1,KXZ1,Z1,KM2,IXZ2,KXZ2,Z2,IXL2,KXL2,L2)
2024 INTEGER,
INTENT(IN) :: IM,KM1,IXZ1,KXZ1,KM2,IXZ2,KXZ2,IXL2,KXL2
2025 INTEGER,
INTENT(OUT) :: L2(1+(IM-1)*IXL2+(KM2-1)*KXL2)
2027 REAL(ESMF_KIND_R8),
INTENT(IN) :: Z1(1+(IM-1)*IXZ1+(KM1-1)*KXZ1)
2028 REAL(ESMF_KIND_R8),
INTENT(IN) :: Z2(1+(IM-1)*IXZ2+(KM2-1)*KXZ2)
2032 REAL(ESMF_KIND_R8) :: Z
2038 IF (z1(1+(i-1)*ixz1).LE.z1(1+(i-1)*ixz1+(km1-1)*kxz1))
THEN 2041 z=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
2044 IF(z.LT.z1(1+(i-1)*ixz1+l*kxz1))
EXIT 2048 l2(1+(i-1)*ixl2+(k2-1)*kxl2)=l
2053 z=z2(1+(i-1)*ixz2+(k2-1)*kxz2)
2056 IF(z.GT.z1(1+(i-1)*ixz1+l*kxz1))
EXIT 2060 l2(1+(i-1)*ixl2+(k2-1)*kxl2)=l
2065 END SUBROUTINE rsearch
2073 integer :: i,ii, j,k, rc, clb(2), cub(2)
2075 real(esmf_kind_r8),
allocatable :: pe0(:), pn0(:)
2076 real(esmf_kind_r8),
pointer :: psptr(:,:)
2077 real(esmf_kind_r8),
pointer :: zhsfcptr(:,:)
2078 real(esmf_kind_r8),
pointer :: zhptr(:,:,:)
2079 real(esmf_kind_r8),
pointer :: tptr(:,:,:)
2080 real(esmf_kind_r8),
pointer :: qptr(:,:,:)
2081 real(esmf_kind_r8) :: ak, bk, zvir, grd
2082 real(esmf_kind_r8),
parameter :: grav = 9.80665
2083 real(esmf_kind_r8),
parameter :: rdgas = 287.05
2084 real(esmf_kind_r8),
parameter :: rvgas = 461.50
2086 print*,
"- COMPUTE HEIGHT" 2088 print*,
"- CALL FieldGet FOR SURFACE PRESSURE" 2090 computationallbound=clb, &
2091 computationalubound=cub, &
2092 farrayptr=psptr, rc=rc)
2093 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2094 call error_handler(
"IN FieldGet", rc)
2096 print*,
"- CALL FieldGet FOR TERRAIN HEIGHT" 2098 farrayptr=zhsfcptr, rc=rc)
2099 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2100 call error_handler(
"IN FieldGet", rc)
2102 print*,
"- CALL FieldGet FOR HEIGHT" 2104 farrayptr=zhptr, rc=rc)
2105 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2106 call error_handler(
"IN FieldGet", rc)
2108 print*,
"- CALL FieldGet FOR TEMPERATURE" 2110 farrayptr=tptr, rc=rc)
2111 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2112 call error_handler(
"IN FieldGet", rc)
2115 if (trim(
tracers(ii)) ==
"sphum")
exit 2118 print*,
"- CALL FieldGet FOR SPECIFIC HUMIDITY" 2120 farrayptr=qptr, rc=rc)
2121 if(esmf_logfounderror(rctocheck=rc,msg=esmf_logerr_passthru,line=__line__,file=__file__)) &
2122 call error_handler(
"IN FieldGet", rc)
2125 zvir = rvgas/rdgas - 1.0_esmf_kind_r8
2130 do j = clb(2), cub(2)
2131 do i = clb(1), cub(1)
2138 pe0(k) = ak + bk*psptr(i,j)
2139 pn0(k) = log(pe0(k))
2142 zhptr(i,j,1) = zhsfcptr(i,j)
2145 zhptr(i,j,k) = zhptr(i,j,k-1)+tptr(i,j,k-1)*(1.+zvir*qptr(i,j,k-1))* &
2146 (pn0(k-1)-pn0(k))/grd
2152 deallocate(pe0, pn0)
2165 print*,
"- DESTROY TARGET GRID ATMOSPHERIC BEFORE ADJUSTMENT FIELDS." 2192 print*,
"- DESTROY LOCAL TARGET GRID ATMOSPHERIC FIELDS." subroutine compute_zh
Compute vertical level height.
subroutine newps(localpet)
Computes adjusted surface pressure given a new terrain height.
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.
type(esmf_field), public v_w_target_grid
V-wind, 'west' edge of grid cell.
integer, public lev_thomp_mp_climo
number of vert lvls of Thompson climo data
type(esmf_field), public longitude_w_target_grid
longitude of 'west' edge of grid box, target grid
subroutine cleanup_target_atm_b4adj_data
Cleanup atmospheric field (before adjustment) objects.
subroutine create_atm_esmf_fields
Create target grid field objects.
type(esmf_field) wind_target_grid
3-d wind, grid box center
integer, public cycle_mon
Cycle month.
type(esmf_field) temp_b4adj_target_grid
temp before vert adj
integer, public regional
For regional target grids.
type(esmf_field), public qnifa_climo_input_grid
number concentration of ice friendly nuclei.
character(len=20), dimension(max_tracers), public tracers
Name of each atmos tracer to be processed.
real(esmf_kind_r8), dimension(:,:), allocatable, public vcoord_target
Vertical coordinate.
subroutine, public atmosphere_driver(localpet)
Driver routine to process for atmospheric fields.
type(esmf_field), public qnwfa_climo_input_grid
number concentration of water friendly nuclei.
integer, public cycle_year
Cycle year.
subroutine, public read_thomp_mp_climo_data
Read Thompson climatological MP data file and time interpolate data to current cycle time...
subroutine, public read_vcoord_info
Reads model vertical coordinate definition file (as specified by namelist variable vcoord_file_target...
type(esmf_field), public longitude_s_target_grid
longitude of 'south' edge of grid box, target grid
Sets up the ESMF grid objects for the input data grid and target FV3 grid.
type(esmf_field), public qnifa_climo_target_grid
Number concentration of ice friendly aerosols.
integer, public cycle_day
Cycle day.
type(esmf_field), public latitude_s_target_grid
latitude of 'south' edge of grid box, target grid
type(esmf_field), public zh_target_grid
3-d height.
type(esmf_field) pres_b4adj_target_grid
3-d pres before terrain adj
type(esmf_grid), public target_grid
target grid esmf grid object.
type(esmf_field), public latitude_w_target_grid
latitude of 'west' edge of grid box, target grid
type(esmf_field), public delp_target_grid
Pressure thickness.
integer, public lev_target
Number of vertical levels.
Module to read the Thompson climatological MP data file and set up the associated esmf field and grid...
subroutine cleanup_all_target_atm_data
Cleanup target grid atmospheric field objects.
logical, public wam_cold_start
When true, cold start for whole atmosphere model.
subroutine horiz_interp_thomp_mp_climo
Horizontally interpolate thompson microphysics data to the target model grid.
character(len=500), public vcoord_file_target_grid
Vertical coordinate definition file.
Module to hold variables and ESMF fields associated with the target grid atmospheric data...
subroutine newpr1(localpet)
Computes 3-D pressure given an adjusted surface pressure.
subroutine convert_winds
Convert 3-d component winds to u and v.
type(esmf_field) pres_target_grid
3-d pressure
type(esmf_field) terrain_interp_to_target_grid
Input grid terrain interpolated to target grid.
type(esmf_field) wind_b4adj_target_grid
3-d wind before vert adj
character(len=500), public atm_weight_file
File containing pre-computed weights to horizontally interpolate atmospheric fields.
type(esmf_field), public qnwfa_climo_target_grid
Number concentration of water friendly aerosols.
type(esmf_field), public v_s_target_grid
V-wind, 'south' edge of grid cell.
type(esmf_field) thomp_pres_climo_b4adj_target_grid
pressure of each level on target grid
integer, public nvcoord_target
Number of vertical coordinate variables.
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), dimension(:), allocatable tracers_b4adj_target_grid
tracers before vert adj
type(esmf_field), public u_w_target_grid
U-wind, 'west' edge of grid cell.
subroutine gettemp(iday, nday, xlat, nlat, pr, np, temp, n_o, n_o2, n_n2)
Entry routine to get WAM needed temperature and composition profiles.
type(esmf_field), public thomp_pres_climo_input_grid
3-d pressure of the Thompson climo data points
Process atmospheric fields.
type(esmf_field) wind_w_target_grid
3-d wind, 'west' edge
subroutine, public cleanup_thomp_mp_climo_input_data
Free up memory associated with this module.
integer, public num_tracers
Number of atmospheric tracers to be processed.
type(esmf_field), public terrain_target_grid
terrain height target grid
type(esmf_field) ps_b4adj_target_grid
sfc pres before terrain adj
type(esmf_field), public temp_target_grid
Temperautre.
integer, public levp1_target
Number of vertical levels plus 1.
logical, public use_thomp_mp_climo
When true, read and process Thompson MP climatological tracers.
type(esmf_field), dimension(:), allocatable, public tracers_target_grid
Tracers.
integer, public cycle_hour
Cycle hour.
type(esmf_field) wind_s_target_grid
3-d wind, 'south' edge
type(esmf_field), public dzdt_target_grid
Vertical velocity.
type(esmf_field) qnifa_climo_b4adj_target_grid
number concentration of ice friendly aerosols before vert adj
subroutine, public cleanup_atmosphere_target_data
Free up memory for fields and variables in this module.
subroutine create_atm_b4adj_esmf_fields
Create target grid field objects to hold data before vertical interpolation.
type(esmf_field) dzdt_b4adj_target_grid
vertical vel before vert adj
type(esmf_field) qnwfa_climo_b4adj_target_grid
number concentration of water friendly aerosols before vert adj