@@ -239,7 +239,7 @@ subroutine GFDL_1M_Initialize (MAPL, CLOCK, RC)
239239 call ESMF_AlarmGet(ALARM, RingInterval= TINT, RC= STATUS); VERIFY_(STATUS)
240240 call ESMF_TimeIntervalGet(TINT, S_R8 = DT_R8 ,RC= STATUS); VERIFY_(STATUS)
241241 DT_MOIST = DT_R8
242- DBZ_DT = max (DT_MOIST,300 .0 )
242+ DBZ_DT = max (DT_MOIST,900 .0 )
243243 call MAPL_GetResource(MAPL, DBZ_DT, ' DBZ_DT:' , default= DBZ_DT, RC= STATUS); VERIFY_(STATUS)
244244 call ESMF_ClockGet(CLOCK, calendar= calendar, RC= STATUS); VERIFY_(STATUS)
245245 call ESMF_TimeIntervalSet(ringInterval, S= nint (DBZ_DT), calendar= calendar, RC= STATUS); VERIFY_(STATUS)
@@ -267,7 +267,7 @@ subroutine GFDL_1M_Initialize (MAPL, CLOCK, RC)
267267 call MAPL_GetPointer(INTERNAL, QICN, ' QICN' , RC= STATUS); VERIFY_(STATUS)
268268
269269 call MAPL_GetResource( MAPL, GFDL_MP3, Label= " GFDL_MP3:" , default= .TRUE. , RC= STATUS); VERIFY_(STATUS)
270- if (DT_R8 < 300 .0 ) then
270+ if (DT_R8 <= 150 .0 ) then
271271 do_hail = .true.
272272 ifflag = 1
273273 endif
@@ -393,6 +393,14 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
393393 real , pointer , dimension (:,:) :: EIS, LTS
394394 real , pointer , dimension (:,:) :: DBZ_MAX, DBZ_1KM, DBZ_TOP, DBZ_M10C
395395 real , pointer , dimension (:,:) :: DBZ_MAX_R, DBZ_MAX_S, DBZ_MAX_G
396+ real , pointer , dimension (:,:,:) :: DQVDT_FILL
397+ real , pointer , dimension (:,:,:) :: DQLLSDT_FILL
398+ real , pointer , dimension (:,:,:) :: DQLCNDT_FILL
399+ real , pointer , dimension (:,:,:) :: DQILSDT_FILL
400+ real , pointer , dimension (:,:,:) :: DQICNDT_FILL
401+ real , pointer , dimension (:,:,:) :: DQRDT_FILL
402+ real , pointer , dimension (:,:,:) :: DQSDT_FILL
403+ real , pointer , dimension (:,:,:) :: DQGDT_FILL
396404 real , pointer , dimension (:,:,:) :: PTR3D
397405 real , pointer , dimension (:,: ) :: PTR2D
398406
@@ -401,8 +409,9 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
401409 real :: minrhcrit, turnrhcrit, ALPHA, RHCRIT
402410 integer :: IM,JM,LM
403411 integer :: I, J, L
412+ type ( ESMF_VM ) :: VMG
404413
405- call ESMF_GridCompGet( GC, CONFIG= CF, RC= STATUS )
414+ call ESMF_GridCompGet( GC, VM = VMG, CONFIG= CF, RC= STATUS )
406415 VERIFY_(STATUS)
407416
408417 ! Get my internal MAPL_Generic state
@@ -619,6 +628,21 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
619628 do L= 1 ,LM
620629 do J= 1 ,JM
621630 do I= 1 ,IM
631+ ! cleanup clouds
632+ call FIX_UP_CLOUDS( Q(I,J,L), T(I,J,L), QLLS(I,J,L), QILS(I,J,L), CLLS(I,J,L), &
633+ QLCN(I,J,L), QICN(I,J,L), CLCN(I,J,L), &
634+ REMOVE_CLOUDS= (L < KLID) )
635+ ! Debug large temperature values
636+ if ( DEBUG_TQ_ERRORS .AND. (T(I,J,L) > 333.0 ) ) then
637+ print * , " Temperature spike detected : " , T(I,J,L)
638+ print * , " BEFORE any GFDL Procsess "
639+ print * , " Latitude =" , LATS(I,J)* 180.0 / MAPL_PI
640+ print * , " Longitude =" , LONS(I,J)* 180.0 / MAPL_PI
641+ print * , " Pressure (mb) =" , PLmb(I,J,L)
642+ print * , " CLLS=" , CLLS(I,J,L), " CLCN=" , CLCN(I,J,L)
643+ print * , " QV=" , Q(I,J,L), " QL=" , QLLS(I,J,L)+ QLCN(I,J,L), " QI=" , QILS(I,J,L)+ QICN(I,J,L)
644+ print * , " QR=" , QRAIN(I,J,L), " QS=" , QSNOW(I,J,L), " QG=" , QGRAUPEL(I,J,L)
645+ endif
622646 ! Send the condensates through the pdf after convection [0:1 , unstable:stable]
623647 facEIS = MAX (0.0 ,MIN (1.0 ,EIS(I,J)/ 10.0 ))** 2
624648 ! determine combined minrhcrit in unstable/stable regimes
@@ -737,10 +761,42 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
737761 call FIX_UP_CLOUDS( Q(I,J,L), T(I,J,L), QLLS(I,J,L), QILS(I,J,L), CLLS(I,J,L), &
738762 QLCN(I,J,L), QICN(I,J,L), CLCN(I,J,L), &
739763 REMOVE_CLOUDS= (L < KLID) )
764+ if ( DEBUG_TQ_ERRORS .AND. (T(I,J,L) > 333.0 ) ) then
765+ print * , " Temperature spike detected : " , T(I,J,L)
766+ print * , " AFTER cldmacro in GFDL-MP "
767+ print * , " Latitude =" , LATS(I,J)* 180.0 / MAPL_PI
768+ print * , " Longitude =" , LONS(I,J)* 180.0 / MAPL_PI
769+ print * , " Pressure (mb) =" , PLmb(I,J,L)
770+ print * , " CLLS=" , CLLS(I,J,L), " CLCN=" , CLCN(I,J,L)
771+ print * , " QV=" , Q(I,J,L), " QL=" , QLLS(I,J,L)+ QLCN(I,J,L), " QI=" , QLLS(I,J,L)+ QLCN(I,J,L)
772+ print * , " QR=" , QRAIN(I,J,L), " QS=" , QSNOW(I,J,L), " QG=" , QGRAUPEL(I,J,L)
773+ endif
740774 end do ! IM loop
741775 end do ! JM loop
742776 end do ! LM loop
743777
778+
779+ ! Get fill negative export pointers if requested
780+ ! ----------------------------------------------
781+ call MAPL_GetPointer(EXPORT, DQVDT_FILL, ' DQVDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
782+ call MAPL_GetPointer(EXPORT, DQLLSDT_FILL, ' DQLLSDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
783+ call MAPL_GetPointer(EXPORT, DQLCNDT_FILL, ' DQLCNDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
784+ call MAPL_GetPointer(EXPORT, DQILSDT_FILL, ' DQILSDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
785+ call MAPL_GetPointer(EXPORT, DQICNDT_FILL, ' DQICNDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
786+ call MAPL_GetPointer(EXPORT, DQRDT_FILL, ' DQRDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
787+ call MAPL_GetPointer(EXPORT, DQSDT_FILL, ' DQSDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
788+ call MAPL_GetPointer(EXPORT, DQGDT_FILL, ' DQGDT_FILL_CLDMACRO' , RC= STATUS); VERIFY_(STATUS)
789+ ! Cleanup negative water species
790+ ! ------------------------------
791+ call FILLQ2ZERO( Q , MASS, DT= DT_MOIST, DQDT= DQVDT_FILL, WARNING_LABEL= " QV After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
792+ call FILLQ2ZERO( QLLS , MASS, DT= DT_MOIST, DQDT= DQLLSDT_FILL, WARNING_LABEL= " QLLS After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
793+ call FILLQ2ZERO( QLCN , MASS, DT= DT_MOIST, DQDT= DQLCNDT_FILL, WARNING_LABEL= " QLCN After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
794+ call FILLQ2ZERO( QILS , MASS, DT= DT_MOIST, DQDT= DQILSDT_FILL, WARNING_LABEL= " QILS After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
795+ call FILLQ2ZERO( QICN , MASS, DT= DT_MOIST, DQDT= DQICNDT_FILL, WARNING_LABEL= " QICN After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
796+ call FILLQ2ZERO( QRAIN , MASS, DT= DT_MOIST, DQDT= DQRDT_FILL, WARNING_LABEL= " QR After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
797+ call FILLQ2ZERO( QSNOW , MASS, DT= DT_MOIST, DQDT= DQSDT_FILL, WARNING_LABEL= " QS After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
798+ call FILLQ2ZERO( QGRAUPEL, MASS, DT= DT_MOIST, DQDT= DQGDT_FILL, WARNING_LABEL= " QG After GFDL Cloud Macrophysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
799+
744800 ! Update macrophysics tendencies
745801 DUDT_macro= ( U - DUDT_macro)/ DT_MOIST
746802 DVDT_macro= ( V - DVDT_macro)/ DT_MOIST
@@ -868,27 +924,48 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
868924 U = U + DUDTmic * DT_MOIST
869925 V = V + DVDTmic * DT_MOIST
870926 ! Apply moist/cloud species tendencies
871- RAD_QV = RAD_QV + DQVDTmic * DT_MOIST
872- RAD_QL = RAD_QL + DQLDTmic * DT_MOIST
873- RAD_QR = RAD_QR + DQRDTmic * DT_MOIST
874- RAD_QI = RAD_QI + DQIDTmic * DT_MOIST
875- RAD_QS = RAD_QS + DQSDTmic * DT_MOIST
876- RAD_QG = RAD_QG + DQGDTmic * DT_MOIST
927+ RAD_QV = MAX ( RAD_QV + DQVDTmic * DT_MOIST, 1.e-12 )
928+ RAD_QL = MAX ( RAD_QL + DQLDTmic * DT_MOIST, 0.0 )
929+ RAD_QR = MAX ( RAD_QR + DQRDTmic * DT_MOIST, 0.0 )
930+ RAD_QI = MAX ( RAD_QI + DQIDTmic * DT_MOIST, 0.0 )
931+ RAD_QS = MAX ( RAD_QS + DQSDTmic * DT_MOIST, 0.0 )
932+ RAD_QG = MAX ( RAD_QG + DQGDTmic * DT_MOIST, 0.0 )
877933 RAD_CF = MIN (1.0 ,MAX (0.0 ,RAD_CF + DQADTmic * DT_MOIST))
878934 ! CleanUp Negative Water Vapor, cloud liquid/ice, and condensates
879- call FILLQ2ZERO(RAD_QV, MASS, TMP2D)
880- call FILLQ2ZERO(RAD_QL, MASS, TMP2D)
881- call FILLQ2ZERO(RAD_QI, MASS, TMP2D)
882- call FILLQ2ZERO(RAD_QR, MASS, TMP2D)
883- call FILLQ2ZERO(RAD_QS, MASS, TMP2D)
884- call FILLQ2ZERO(RAD_QG, MASS, TMP2D)
935+ call FILLQ2ZERO(RAD_QV, MASS, WARNING_LABEL= " QV After GFDL Driver" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
936+ call FILLQ2ZERO(RAD_QL, MASS, WARNING_LABEL= " QL After GFDL Driver" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
937+ call FILLQ2ZERO(RAD_QI, MASS, WARNING_LABEL= " QI After GFDL Driver" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
938+ call FILLQ2ZERO(RAD_QR, MASS, WARNING_LABEL= " QR After GFDL Driver" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
939+ call FILLQ2ZERO(RAD_QS, MASS, WARNING_LABEL= " QS After GFDL Driver" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
940+ call FILLQ2ZERO(RAD_QG, MASS, WARNING_LABEL= " QG After GFDL Driver" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
941+ call FILLQ2ZERO(RAD_CF, MASS, WARNING_LABEL= " QA After GFDL Driver" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
885942 ! Redistribute CN/LS CF/QL/QI
886943 call REDISTRIBUTE_CLOUDS(RAD_CF, RAD_QL, RAD_QI, CLCN, CLLS, QLCN, QLLS, QICN, QILS, RAD_QV, T)
887944 ! Fill vapor/rain/snow/graupel state
888945 Q = RAD_QV
889946 QRAIN = RAD_QR
890947 QSNOW = RAD_QS
891948 QGRAUPEL = RAD_QG
949+ ! Get fill negative export pointers if requested
950+ ! ----------------------------------------------
951+ call MAPL_GetPointer(EXPORT, DQVDT_FILL, ' DQVDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
952+ call MAPL_GetPointer(EXPORT, DQLLSDT_FILL, ' DQLLSDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
953+ call MAPL_GetPointer(EXPORT, DQLCNDT_FILL, ' DQLCNDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
954+ call MAPL_GetPointer(EXPORT, DQILSDT_FILL, ' DQILSDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
955+ call MAPL_GetPointer(EXPORT, DQICNDT_FILL, ' DQICNDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
956+ call MAPL_GetPointer(EXPORT, DQRDT_FILL, ' DQRDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
957+ call MAPL_GetPointer(EXPORT, DQSDT_FILL, ' DQSDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
958+ call MAPL_GetPointer(EXPORT, DQGDT_FILL, ' DQGDT_FILL_CLDMICRO' , RC= STATUS); VERIFY_(STATUS)
959+ ! Cleanup negative water species
960+ ! ------------------------------
961+ call FILLQ2ZERO( Q , MASS, DT= DT_MOIST, DQDT= DQVDT_FILL, WARNING_LABEL= " QV After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
962+ call FILLQ2ZERO( QLLS , MASS, DT= DT_MOIST, DQDT= DQLLSDT_FILL, WARNING_LABEL= " QLLS After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
963+ call FILLQ2ZERO( QLCN , MASS, DT= DT_MOIST, DQDT= DQLCNDT_FILL, WARNING_LABEL= " QLCN After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
964+ call FILLQ2ZERO( QILS , MASS, DT= DT_MOIST, DQDT= DQILSDT_FILL, WARNING_LABEL= " QILS After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
965+ call FILLQ2ZERO( QICN , MASS, DT= DT_MOIST, DQDT= DQICNDT_FILL, WARNING_LABEL= " QICN After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
966+ call FILLQ2ZERO( QRAIN , MASS, DT= DT_MOIST, DQDT= DQRDT_FILL, WARNING_LABEL= " QR After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
967+ call FILLQ2ZERO( QSNOW , MASS, DT= DT_MOIST, DQDT= DQSDT_FILL, WARNING_LABEL= " QS After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
968+ call FILLQ2ZERO( QGRAUPEL, MASS, DT= DT_MOIST, DQDT= DQGDT_FILL, WARNING_LABEL= " QG After GFDL Cloud Microphysics" , VM= VMG, RC= STATUS); VERIFY_(STATUS)
892969 ! Convert precip diagnostics from mm/day to kg m-2 s-1
893970 PRCP_WATER = MAX (PRCP_WATER / 86400.0 , 0.0 )
894971 PRCP_RAIN = MAX (PRCP_RAIN / 86400.0 , 0.0 )
@@ -931,32 +1008,33 @@ subroutine GFDL_1M_Run (GC, IMPORT, EXPORT, CLOCK, RC)
9311008 call FIX_UP_CLOUDS( Q(I,J,L), T(I,J,L), QLLS(I,J,L), QILS(I,J,L), CLLS(I,J,L), &
9321009 QLCN(I,J,L), QICN(I,J,L), CLCN(I,J,L), &
9331010 REMOVE_CLOUDS= (L < KLID) )
934- ! Debug large temperature values
935- if (T(I,J,L) > 330.0 ) then
936- print * , " Temperature spike detected: " , T(I,J,L)
937- print * , " Latitude =" , LATS(I,J)* 180.0 / MAPL_PI
938- print * , " Longitude =" , LONS(I,J)* 180.0 / MAPL_PI
939- print * , " Pressure (mb) =" , PLmb(I,J,L)
940- print * , " CLLS=" , CLLS(I,J,L), " CLCN=" , CLCN(I,J,L)
941- print * , " QV=" , Q(I,J,L), " QL=" , QLLS(I,J,L)+ QLCN(I,J,L), " QI=" , QLLS(I,J,L)+ QLCN(I,J,L)
942- print * , " QR=" , QRAIN(I,J,L), " QS=" , QSNOW(I,J,L), " QG=" , QGRAUPEL(I,J,L)
943- endif
9441011 ! get radiative properties
9451012 call RADCOUPLE ( T(I,J,L), PLmb(I,J,L), CLLS(I,J,L), CLCN(I,J,L), &
9461013 Q(I,J,L), QLLS(I,J,L), QILS(I,J,L), QLCN(I,J,L), QICN(I,J,L), QRAIN(I,J,L), QSNOW(I,J,L), QGRAUPEL(I,J,L), NACTL(I,J,L), NACTI(I,J,L), &
9471014 RAD_QV(I,J,L), RAD_QL(I,J,L), RAD_QI(I,J,L), RAD_QR(I,J,L), RAD_QS(I,J,L), RAD_QG(I,J,L), RAD_CF(I,J,L), &
9481015 CLDREFFL(I,J,L), CLDREFFI(I,J,L), &
9491016 FAC_RL, MIN_RL, MAX_RL, FAC_RI, MIN_RI, MAX_RI)
1017+ ! Debug large temperature values
1018+ if ( DEBUG_TQ_ERRORS .AND. (T(I,J,L) > 333.0 ) ) then
1019+ print * , " Temperature spike detected : " , T(I,J,L)
1020+ print * , " GFDL-MP Temp Increment : " , DTDTmic(I,J,L) * DT_MOIST
1021+ print * , " Latitude =" , LATS(I,J)* 180.0 / MAPL_PI
1022+ print * , " Longitude =" , LONS(I,J)* 180.0 / MAPL_PI
1023+ print * , " Pressure (mb) =" , PLmb(I,J,L)
1024+ print * , " CLLS=" , CLLS(I,J,L), " CLCN=" , CLCN(I,J,L)
1025+ print * , " QV=" , Q(I,J,L), " QL=" , QLLS(I,J,L)+ QLCN(I,J,L), " QI=" , QILS(I,J,L)+ QICN(I,J,L)
1026+ print * , " QR=" , QRAIN(I,J,L), " QS=" , QSNOW(I,J,L), " QG=" , QGRAUPEL(I,J,L)
1027+ endif
9501028 enddo
9511029 enddo
9521030 enddo
953- call FILLQ2ZERO(RAD_QV, MASS, TMP2D )
954- call FILLQ2ZERO(RAD_QL, MASS, TMP2D )
955- call FILLQ2ZERO(RAD_QI, MASS, TMP2D )
956- call FILLQ2ZERO(RAD_QR, MASS, TMP2D )
957- call FILLQ2ZERO(RAD_QS, MASS, TMP2D )
958- call FILLQ2ZERO(RAD_QG, MASS, TMP2D )
959- call FILLQ2ZERO(RAD_CF, MASS, TMP2D )
1031+ call FILLQ2ZERO(RAD_QV, MASS, RC = STATUS); VERIFY_(STATUS )
1032+ call FILLQ2ZERO(RAD_QL, MASS, RC = STATUS); VERIFY_(STATUS )
1033+ call FILLQ2ZERO(RAD_QI, MASS, RC = STATUS); VERIFY_(STATUS )
1034+ call FILLQ2ZERO(RAD_QR, MASS, RC = STATUS); VERIFY_(STATUS )
1035+ call FILLQ2ZERO(RAD_QS, MASS, RC = STATUS); VERIFY_(STATUS )
1036+ call FILLQ2ZERO(RAD_QG, MASS, RC = STATUS); VERIFY_(STATUS )
1037+ call FILLQ2ZERO(RAD_CF, MASS, RC = STATUS); VERIFY_(STATUS )
9601038 RAD_QL = MIN ( RAD_QL , 0.001 ) ! Still a ridiculously large
9611039 RAD_QI = MIN ( RAD_QI , 0.001 ) ! value.
9621040 RAD_QR = MIN ( RAD_QR , 0.01 ) ! value.
0 commit comments