1 !-----------------------------------------------------------------------
3 !NCEP_MESO:MODEL_LAYER: PHYSICS
5 !----------------------------------------------------------------------
6 #include "nmm_loop_basemacros.h"
7 #include "nmm_loop_macros.h"
8 !-----------------------------------------------------------------------
10 MODULE MODULE_PRECIP_ADJUST
12 ! This module contains 3 subroutines:
16 !-----------------------------------------------------------------------
18 !*** Specify the diagnostic point here: (i,j) and the processor number.
19 !*** Remember that in WRF, local and global (i,j) are the same, so don't
20 !*** use the "local(i,j)" output from glb2loc.f; use the GLOBAL (I,J)
24 INTEGER :: ITEST=346,JTEST=256,TESTPE=53
25 !-----------------------------------------------------------------------
29 !-----------------------------------------------------------------------
30 SUBROUTINE READPCP(PPTDAT,DDATA,LSPA &
31 & ,IDS,IDE,JDS,JDE,KDS,KDE &
32 & ,IMS,IME,JMS,JME,KMS,KME &
33 & ,ITS,ITE,JTS,JTE,KTS,KTE)
35 ! ****************************************************************
37 ! * PRECIPITATION ASSIMILATION INITIALIZATION. *
38 ! * READ IN PRECIP ANALYSIS AND DATA MASK AND SET UP ALL *
39 ! * APPROPRIATE VARIABLES. *
40 ! * MIKE BALDWIN, MARCH 1994 *
41 ! * Adapted to 2-D code, Ying Lin, Mar 1996 *
42 ! * For WRF/NMM: Y.Lin Mar 2005 *
44 ! ****************************************************************
45 !-----------------------------------------------------------------------
47 ! READ THE BINARY VERSION OF THE PRECIP ANALYSIS.
50 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, &
51 & IMS,IME,JMS,JME,KMS,KME, &
52 & ITS,ITE,JTS,JTE,KTS,KTE
53 REAL,DIMENSION(IDS:IDE,JDS:JDE) :: TEMPG
54 REAL,DIMENSION(IMS:IME,JMS:JME) :: TEMPL
55 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: DDATA, LSPA
56 REAL,DIMENSION(IMS:IME,JMS:JME,3),INTENT(OUT) :: PPTDAT
59 CHARACTER*256 :: MESSAGE
61 ! Get the value of MYPE:
63 CALL WRF_GET_MYPROC(MYPE)
69 READ(40+IHR) ((TEMPG(I,J),I=IDS,IDE-1),J=JDS,JDE-1)
70 WRITE(MESSAGE,*) 'IHR=', IHR, ' FINISHED READING PCP TO TEMPG'
71 CALL WRF_MESSAGE(MESSAGE)
76 ! In the binary version of the precip data, missing data are denoted as '999.'
77 ! Convert the valid data from mm to m:
78 IF (TEMPG(I,J).LT.900.) TEMPG(I,J)=TEMPG(I,J)*0.001
83 ! Distribute to local temp array:
84 CALL DSTRB(TEMPG,TEMPL,1,1,1,1,1 &
85 &, IDS,IDE,JDS,JDE,KDS,KDE &
86 &, IMS,IME,JMS,JME,KMS,KME &
87 &, ITS,ITE,JTS,JTE,KTS,KTE)
89 ! Place into correct hour slot in PPTDAT:
92 PPTDAT(I,J,IHR)=TEMPL(I,J)
97 WRITE(MESSAGE,*) 'ADJPPT-READPCP, IHR',IHR, 'PPTDAT=', &
98 & PPTDAT(ITEST,JTEST,IHR)
99 CALL WRF_MESSAGE(MESSAGE)
104 ! Give DDATA (hourly precipitation analysis partitioned into each physics
105 ! timestep; partitioning done in ADJPPT) an initial value of 999, because
106 ! TURBL/SURFCE is called before ADJPPT. Also initialize LSPA to zero.
112 END SUBROUTINE READPCP
114 SUBROUTINE CHKSNOW(NTSD,DT,NPHS,SR,PPTDAT &
115 & ,IDS,IDE,JDS,JDE,KDS,KDE &
116 & ,IMS,IME,JMS,JME,KMS,KME &
117 & ,ITS,ITE,JTS,JTE,KTS,KTE)
119 ! AT THE FIRST PHYSICS TIME STEP AFTER THE TOP OF EACH HOUR, CHECK THE SNOW
120 ! ARRAY AGAINST THE SR (SNOW/TOTAL PRECIP RATIO). IF SR .GE. 0.9, SET THIS
121 ! POINT TO MISSING (SO WE WON'T DO SNOW ADJUSTMENT HERE).
123 !-----------------------------------------------------------------------
127 !-----------------------------------------------------------------------
129 INTEGER,INTENT(IN) :: NTSD,NPHS
130 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, &
131 & IMS,IME,JMS,JME,KMS,KME, &
132 & ITS,ITE,JTS,JTE,KTS,KTE
133 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: SR
134 REAL,DIMENSION(IMS:IME,JMS:JME,3),INTENT(INOUT) :: PPTDAT
135 REAL,INTENT(IN) :: DT
139 CHARACTER*256 :: MESSAGE
140 !-----------------------------------------------------------------------
142 IF (MOD(TIMES,3600.) < NPHS*DT) THEN
143 IHR=INT(TIMES)/3600+1
144 IF (IHR > 3) go to 10
147 IF (SR(I,J) >= 0.9) PPTDAT(I,J,IHR) = 999.
151 ! Get the value of MYPE:
153 CALL WRF_GET_MYPROC(MYPE)
155 IF (MYPE==TESTPE) THEN
156 WRITE(MESSAGE,1010) TIMES,SR(ITEST,JTEST)
157 1010 FORMAT('ADJPPT-CHKSNOW: TIMES, SR=',F6.0,1X,F6.4)
158 CALL WRF_MESSAGE(MESSAGE)
163 END SUBROUTINE CHKSNOW
165 SUBROUTINE ADJPPT(NTSD,DT,NPHS,PREC,LSPA,PPTDAT,DDATA &
166 & ,IDS,IDE,JDS,JDE,KDS,KDE &
167 & ,IMS,IME,JMS,JME,KMS,KME &
168 & ,ITS,ITE,JTS,JTE,KTS,KTE)
170 !***********************************************************************
171 !$$$ SUBPROGRAM DOCUMENTATION BLOCK
173 ! SUBPROGRAM: ADJPPT PRECIPITATION/CLOUD ADJUSTMENT
174 ! PRGRMMR: Y. LIN ORG: W/NP22 DATE: 2005/03/30
177 ! ADJPPT MAKES ADJUSTMENT TO MODEL'S TEMPERATURE, MOISTURE, HYDROMETEOR
178 ! FIELDS TO BE MORE CONSISTENT WITH THE OBSERVED PRECIPITATION AND CLOUD
181 ! FOR NOW, AS A FIRST STEP, JUST PARTITION THE INPUT HOURLY PRECIPITATION
182 ! OBSERVATION INTO TIME STEPS, AND FEED IT INTO THE SOIL.
183 ! PROGRAM HISTORY LOG:
185 ! 2005/03/30 LIN - BAREBONES PRECIPITATION PARTITION/FEEDING TO GROUND
187 ! LANGUAGE: FORTRAN 90
190 !-----------------------------------------------------------------------
194 !-----------------------------------------------------------------------
195 INTEGER,INTENT(IN) :: NPHS, NTSD
196 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, &
197 & IMS,IME,JMS,JME,KMS,KME, &
198 & ITS,ITE,JTS,JTE,KTS,KTE
199 REAL,INTENT(IN) :: DT
200 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: PREC
201 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: DDATA, LSPA
202 REAL,DIMENSION(IMS:IME,JMS:JME,3),INTENT(OUT) :: PPTDAT
203 !-----------------------------------------------------------------------
207 !-----------------------------------------------------------------------
208 REAL :: DTPHS, FRACT, FRACT1, FRACT2, TIMES, TPHS1, TPHS2
209 INTEGER :: I, J, IHR, IHR1, IHR2, NTSP
211 CHARACTER*256 :: MESSAGE
213 ! Get the value of MYPE:
215 CALL WRF_GET_MYPROC(MYPE)
218 IHR=INT(TIMES)/3600+1
219 ! Size of physics time step:
222 ! Compute the beginning and ending time of the current physics time step,
229 IHR1=INT(TPHS1)/3600+1
230 IHR2=INT(TPHS2)/3600+1
232 ! Fraction of an hour that falls into IHR1 and IHR2. Note that IHR1 and IHR2
233 ! might be identical.
236 ELSEIF (IHR2 > 3) THEN
238 FRACT1=(3600.- MOD(INT(TPHS1),3600))/3600.
240 ELSEIF (IHR1 .EQ. IHR2) THEN
241 FRACT1=0.5*DTPHS/3600.
244 FRACT1=(3600.- MOD(INT(TPHS1),3600))/3600.
245 FRACT2=FLOAT(MOD(INT(TPHS2),3600))/3600.
248 FRACT=FRACT1 + FRACT2
250 IF (MYPE==TESTPE) THEN
251 WRITE(MESSAGE,1010) NTSD,NTSP,TIMES,IHR1,IHR2,TPHS1,TPHS2, &
253 1010 FORMAT('ADJPPT: NTSD,NTSP,TIMES=',I4,1X,I4,1X,F6.0,' IHR1,IHR2=' &
254 & ,I1,1X,I1,' TPHS1,TPHS2=',F6.0,1X,F6.0,' FRACT1,FRACT2=' &
256 CALL WRF_MESSAGE(MESSAGE)
259 !-----------------------------------------------------------------------
260 ! FRACT1/2 IS THE FRACTION OF IHR1/2'S PRECIP THAT WE WANT FOR
261 ! THIS ADJUSTMENT (assuming that the physics time step spans over
262 ! IHR1 and IHR2. If not, then IHR1=IHR2).
263 !-----------------------------------------------------------------------
264 ! SET UP OBSERVED PRECIP FOR THIS TIMESTEP IN DDATA
265 !-----------------------------------------------------------------------
268 ! Note sometimes IHR1=IHR2.
269 IF (PPTDAT(I,J,IHR1).GT.900..OR.PPTDAT(I,J,IHR2).GT.900.) THEN
271 LSPA(I,J) = LSPA(I,J) + PREC(I,J)
274 IF (IHR2 .LE. 3) then
275 DDATA(I,J) = PPTDAT(I,J,IHR1)*FRACT1 &
276 & + PPTDAT(I,J,IHR2)*FRACT2
278 DDATA(I,J) = PPTDAT(I,J,IHR1)*FRACT1
281 LSPA(I,J) = LSPA(I,J) + DDATA(I,J)
283 IF (I.EQ.ITEST .AND. J.EQ.JTEST .AND. MYPE.EQ.TESTPE) THEN
284 WRITE(MESSAGE,1020) DDATA(I,J), PREC(I,J), LSPA(I,J)
285 1020 FORMAT('ADJPPT: DDATA=',E12.6, ' PREC=',E12.6,' LSPA=',E12.6)
286 CALL WRF_MESSAGE(MESSAGE)
296 END SUBROUTINE ADJPPT
297 END MODULE module_PRECIP_ADJUST