UPP  V11.0.0
 All Data Structures Files Functions Pages
CALRCH.f
Go to the documentation of this file.
1 
24  SUBROUTINE calrch(EL,RICHNO)
25 
26 !
27  use vrbls3d, only: pmid, q, t, uh, vh, zmid, q2
28  use masks, only: vtm
29  use params_mod, only: h10e5, capa, d608,h1, epsq2, g, beta
30  use ctlblk_mod, only: jsta, jend, spval, lm1, jsta_m, jend_m, im, &
31  jsta_2l, jend_2u, lm, &
32  ista, iend, ista_m, iend_m, ista_2l, iend_2u
33  use gridspec_mod, only: gridtype
34 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
35  implicit none
36 !
37 ! DECLARE VARIABLES.
38 !
39  REAL,intent(in) :: el(ista_2l:iend_2u,jsta_2l:jend_2u,lm)
40  REAL,intent(inout) :: richno(ista_2l:iend_2u,jsta_2l:jend_2u,lm)
41 !
42  REAL, ALLOCATABLE :: thv(:,:,:)
43  integer i,j,l,iw,ie
44  real ape,uhkl,ulkl,vhkl,vlkl,wndsl,wndslp,rdzkl, &
45  dthvkl,dukl,dvkl,ri,ct,cs
46 ! real APE,UHKL,ULKL,VHKL,VLKL,WNDSL,WNDSLP,DZKL,RDZKL,Q2KL,QROOT,ELKL, &
47 ! ELKLSQ,DTHVKL,DUKL,DVKL,RI,CT,CS
48 !
49 !
50 !*************************************************************************
51 ! START CALRCH HERE.
52 !
53  ALLOCATE ( thv(ista_2l:iend_2u,jsta_2l:jend_2u,lm) )
54 ! INITIALIZE ARRAYS.
55 !
56 !$omp parallel do
57  DO l = 1,lm
58  DO j=jsta,jend
59  DO i=ista,iend
60  richno(i,j,l)=spval
61  ENDDO
62  ENDDO
63  ENDDO
64 !
65 ! COMPUTE VIRTUAL POTENTIAL TEMPERATURE.
66 !
67 !$omp parallel do private(i,j,ape)
68  DO l=lm,1,-1
69  DO j=jsta,jend
70  DO i=ista,iend
71  ape = (h10e5/pmid(i,j,l))**capa
72  thv(i,j,l) = (q(i,j,l)*d608+h1)*t(i,j,l)*ape
73  ENDDO
74  ENDDO
75  ENDDO
76 !
77 ! COMPUTE GRADIENT RICHARDSON NUMBER AS CODED IN ETA MODEL
78 ! SUBROUTINE PROFQ2.F. OUTER LOOP OVER THE VERTICAL.
79 ! INTTER LOOP OVER THE HORIZONTAL.
80 !
81 !!$omp parallel do private(i,j,l,ie,iw,cs,ct,dthvkl,dukl,dvkl, &
82 !!$omp& rdzkl,ri,uhkl,ulkl,vhkl,vlkl,wndsl,wndslp)
83  DO l = 1,lm1
84 !
85  if(gridtype /= 'A')THEN
86  call exch(vtm(1,jsta_2l,l))
87  call exch(uh(1,jsta_2l,l))
88  call exch(vh(1,jsta_2l,l))
89  call exch(vtm(1,jsta_2l,l+1))
90  call exch(uh(1,jsta_2l,l+1))
91  call exch(vh(1,jsta_2l,l+1))
92  end if
93 
94  DO j=jsta_m,jend_m
95  DO i=ista_m,iend_m
96 !
97  IF(gridtype == 'A')THEN
98  uhkl = uh(i,j,l)
99  ulkl = uh(i,j,l+1)
100  vhkl = vh(i,j,l)
101  vlkl = vh(i,j,l+1)
102  ELSE IF(gridtype == 'E')THEN
103  ie = i+mod(j+1,2)
104  iw = i+mod(j+1,2)-1
105 !
106 ! WE NEED (U,V) WINDS AT A MASS POINT. FOUR POINT
107 ! AVERAGE (U,V) WINDS TO MASS POINT. NORMALIZE FOUR
108 ! POINT AVERAGE BY THE ACTUAL NUMBER OF (U,V) WINDS
109 ! USED IN THE AVERAGING. VTM=1 IF WIND POINT IS
110 ! ABOVE GROUND. VTM=0 IF BELOW GROUND.
111 !
112  wndsl = vtm(i,j-1,l)+vtm(iw,j,l)+vtm(ie,j,l)+vtm(i,j+1,l)
113  wndslp = vtm(i,j-1,l+1) + vtm(iw,j,l+1)+ &
114  vtm(ie,j,l+1) + vtm(i,j+1,l+1)
115  IF(wndsl == 0. .OR. wndslp == 0.) cycle
116  uhkl = (uh(i,j-1,l)+uh(iw,j,l)+uh(ie,j,l)+uh(i,j+1,l))/wndsl
117  ulkl = (uh(i,j-1,l+1)+uh(iw,j,l+1)+uh(ie,j,l+1)+ &
118  uh(i,j+1,l+1))/wndslp
119  vhkl = (vh(i,j-1,l)+vh(iw,j,l)+vh(ie,j,l)+vh(i,j+1,l))/wndsl
120  vlkl = (vh(i,j-1,l+1)+vh(iw,j,l+1)+vh(ie,j,l+1)+ &
121  vh(i,j+1,l+1))/wndslp
122  ELSE IF(gridtype == 'B')THEN
123  ie = i
124  iw = i-1
125  uhkl = (uh(iw,j-1,l)+uh(iw,j,l)+uh(ie,j-1,l)+uh(i,j,l))/4.0
126  ulkl = (uh(iw,j-1,l+1)+uh(iw,j,l+1)+uh(ie,j-1,l+1)+ &
127  uh(i,j,l+1))/4.0
128  vhkl = (vh(iw,j-1,l)+vh(iw,j,l)+vh(ie,j-1,l)+vh(i,j,l))/4.0
129  vlkl = (vh(iw,j-1,l+1)+vh(iw,j,l+1)+vh(ie,j-1,l+1)+ &
130  vh(i,j,l+1))/4.0
131  END IF
132 
133  rdzkl = 1.0 / (zmid(i,j,l)-zmid(i,j,l+1))
134 
135 ! Q2KL = MAX(Q2(I,J,L),0.00001)
136 ! QROOT = SQRT(Q2KL)
137 ! ELKL = EL(I,J,L)
138 ! ELKL = MAX(ELKL,EPSQ2)
139 ! ELKLSQ = ELKL*ELKL
140 
141  dthvkl = thv(i,j,l)-thv(i,j,l+1)
142  dukl = (uhkl-ulkl) * rdzkl
143  dvkl = (vhkl-vlkl) * rdzkl
144  cs = dukl*dukl + dvkl*dvkl
145 !
146 ! COMPUTE GRADIENT RICHARDSON NUMBER.
147 !
148  IF(cs <= 1.e-8) THEN
149 !
150 ! WIND SHEAR IS VANISHINGLY SMALL - SO SET RICHARDSON
151 ! NUMBER TO POST PROCESSOR SPECIAL VALUE.
152 !
153  richno(i,j,l) = spval
154 !
155  ELSE
156 !
157 ! WIND SHEAR LARGE ENOUGH TO USE RICHARDSON NUMBER.
158 !
159  ct = -1.*g*beta*dthvkl*rdzkl
160  ri = -ct/cs
161  richno(i,j,l) = ri
162  ENDIF
163 !
164  ENDDO
165  ENDDO
166  ENDDO ! end of l loop
167 !
168  DEALLOCATE (thv)
169 ! END OF ROUTINE.
170 !
171  RETURN
172  END
173 
Definition: MASKS_mod.f:1