/[MITgcm]/MITgcm/pkg/fizhi/fizhi_fillnegs.F
ViewVC logotype

Annotation of /MITgcm/pkg/fizhi/fizhi_fillnegs.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (hide annotations) (download)
Mon Jul 26 18:45:17 2004 UTC (19 years, 11 months ago) by molod
Branch: MAIN
CVS Tags: checkpoint54d_post
Changes since 1.3: +21 -21 lines
Went to use of FIZHI_OPTIONS and _RL in all routines

1 molod 1.4 C $Header: $
2     C $Name: $
3    
4     #include "FIZHI_OPTIONS.h"
5 molod 1.2 SUBROUTINE PQCHECK ( PQZ,PZ,DP,IM,JM,LM,delt)
6 molod 1.1 C***********************************************************************
7     C Purpose
8     C Check Specific Humidity Field for Negative values
9     C
10     C Argument Description
11     C PQZ ........ (ps-ptop)*Specific Humidity (mb g/g)
12     C PZ ......... Pi = ps-ptop (mb)
13 molod 1.2 C DP ....... Delta Pressure
14 molod 1.1 C IM ......... Zonal Dimension
15     C JM ......... Meridional Dimension
16     C LM ......... Vertical Dimension
17     C DELT ....... Timestep (Seconds)
18     C
19     C***********************************************************************
20    
21     implicit none
22    
23     integer im,jm,lm
24 molod 1.4 _RL delt
25 molod 1.1
26 molod 1.4 _RL PQZ(IM,JM,LM), DP(IM,JM,LM)
27     _RL PZ(IM,JM)
28 molod 1.1
29     integer i,j,L,LM1
30 molod 1.4 _RL getcon,grav,ddsig
31 molod 1.1
32     grav = getcon('GRAVITY')
33    
34     c Fill Negative Specific Humidities
35     c ---------------------------------
36     DO L = 2,LM
37     LM1 = L-1
38     do j=1,jm
39     do i=1,im
40 molod 1.2 DDSIG = DP(I,J,LM1)/DP(I,J,L)
41 molod 1.1 IF( PQZ(I,j,LM1).LT.0.0 ) THEN
42     PQZ(I,j,L ) = PQZ(I,j,L) + PQZ(I,j,LM1)*DDSIG
43     PQZ(I,j,LM1) = 0.0
44     ENDIF
45     ENDDO
46     ENDDO
47     ENDDO
48    
49     do j=1,jm
50     do i=1,im
51     IF( PQZ(I,j,LM).LT.0.0 ) PQZ(I,j,LM) = 0.0
52     ENDDO
53     ENDDO
54    
55     RETURN
56     END
57    
58 molod 1.2 subroutine tracer_fill ( pq,im,jm,lm,dlam,dphi,dp)
59 molod 1.1 C***********************************************************************
60     C PURPOSE
61     C Fill negative tracer values using local borrowing
62     C
63     C INPUT
64     C pq ..... Mass-weighted (PI) Tracer
65     C im ..... Zonal Dimension
66     C jm ..... Meridional Dimension
67     C lm ..... Vertical Dimension
68     C dlam ... Zonal Grid Increment
69     C dphi ... Meridional Grid Increment
70 molod 1.2 C dp ..... Vertical Grid Increment
71 molod 1.1 C
72     C Note:
73 molod 1.2 C If no immediate surrounding value is large enough to fill negative
74     C value,
75 molod 1.1 C the sum of immediate surrounding positive values is tried.
76     C If sum is not large enough, tracer is simply set to zero.
77     C
78     C***********************************************************************
79    
80     implicit none
81    
82     c Input Variables
83     c ---------------
84     integer im,jm,lm
85 molod 1.4 _RL pq(im,jm,lm),dlam(im),dphi(jm),dp(im,jm,lm)
86 molod 1.1
87     c Local Variables
88     c ---------------
89     integer i,j,l,im1,ip1,imax,m
90 molod 1.4 _RL lam(im), phi(jm)
91     _RL array(6)
92     _RL pi,a,getcon,undef
93     _RL qmax,qval,sum,fact
94    
95     _RL dxu(im,jm)
96     _RL dxv(im,jm)
97     _RL dxp(im,jm)
98     _RL dyv(im,jm)
99     _RL dyp(im,jm)
100 molod 1.1
101 molod 1.4 _RL d2p(im,jm)
102 molod 1.1
103     C *********************************************************
104     C **** Initialization ****
105     C *********************************************************
106    
107     pi = 4.0*atan(1.0)
108     a = getcon('EARTH RADIUS')
109    
110     c Compute Longitudes
111     c ------------------
112     lam(1) = -pi
113     do i=2,im
114     lam(i) = lam(i-1) + dlam(i-1)
115     enddo
116    
117     c Compute Latitudes
118     c -----------------
119     phi(1) = -pi/2.
120     do j=2,jm-1
121     phi(j) = phi(j-1) + dphi(j-1)
122     enddo
123     phi(jm) = pi/2.
124    
125     c Compute DXU and DYV
126     c -------------------
127     do j=2,jm-1
128     do i=1,im
129     dxu(i,j) = a*cos(phi(j))*dlam(i)
130     enddo
131     enddo
132    
133     do j=2,jm-2
134     do i=1,im
135     dyv(i,j) = a*dphi(j)
136     enddo
137     enddo
138     do i=1,im
139     dyv(i,1) = a*(dphi(1) +0.5*dphi(2) )
140     dyv(i,jm-1) = a*(dphi(jm-1)+0.5*dphi(jm-2))
141     enddo
142    
143     c Compute DXP and DXV
144     c -------------------
145     do j=2,jm-1
146     im1 = im
147     do i=1,im
148     dxp(i,j) = ( dxu(i,j)+dxu(im1,j) )*0.5
149     im1 = i
150     enddo
151     enddo
152    
153     do j=2,jm-2
154     do i=1,im
155     dxv(i,j) = ( dxp(i,j)+dxp(i,j+1) )*0.5
156     enddo
157     enddo
158    
159     c Compute DYP
160     c -----------
161     do j=3,jm-2
162     do i=1,im
163     dyp(i,j) = ( dyv(i,j)+dyv(i,j-1) )*0.5
164     enddo
165     enddo
166     do i=1,im
167     dyp(i,2) = dyv(i,1)
168     dyp(i,jm-1) = dyv(i,jm-1)
169     enddo
170    
171     c Compute Area Factor D2P
172     c -----------------------
173     do j=3,jm-2
174     do i=1,im
175     d2p(i,j) = 0.5*( dxv(i,j)+dxv(i,j-1) )*dyp(i,j)
176     enddo
177     enddo
178     do i=1,im
179     d2p(i,2) = dxv(i,2) *dyp(i,2)
180     d2p(i,jm-1) = dxv(i,jm-2)*dyp(i,jm-1)
181     enddo
182    
183     undef = getcon('UNDEF')
184    
185     C *********************************************************
186     C **** Fill Negative Values ****
187     C *********************************************************
188    
189     do l=1,lm
190     do j=2,jm-1
191    
192     im1 = im-1
193     i = im
194     do ip1=1,im
195    
196     if( pq(i,j,L).lt.0.0 ) then
197    
198 molod 1.2 qval = pq(i ,j,L)*d2p(i ,j)*dp(i,j,L)
199     array(1) = pq(ip1,j,L)*d2p(ip1,j)*dp(i,j,L)
200     array(2) = pq(im1,j,L)*d2p(im1,j)*dp(i,j,L)
201 molod 1.1
202     if( j.eq.jm-1 ) then
203     array(3) = -undef
204     else
205 molod 1.2 array(3) = pq(i,j+1,L)*d2p(i,j+1)*dp(i,j,L)
206 molod 1.1 endif
207     if( j.eq.2 ) then
208     array(4) = -undef
209     else
210 molod 1.2 array(4) = pq(i,j-1,L)*d2p(i,j-1)*dp(i,j,L)
211 molod 1.1 endif
212     if( L.eq.1 ) then
213     array(5) = -undef
214     else
215 molod 1.3 array(5) = pq(i,j,L-1)*d2p(i,j)*dp(i,j,L)
216 molod 1.1 endif
217     if( L.eq.lm ) then
218     array(6) = -undef
219     else
220 molod 1.3 array(6) = pq(i,j,L+1)*d2p(i,j)*dp(i,j,L)
221 molod 1.1 endif
222    
223 molod 1.3 call maxval1 (array,6,-qval,qmax,imax)
224 molod 1.1
225     if( imax.eq.0 ) then
226     sum = 0.0
227     do m=1,6
228     if( array(m).gt.0.0 ) sum = sum + array(m)
229     enddo
230     if( sum.gt.-qval ) then
231     fact = 1.0 + qval/sum
232     if( array(1).gt.0 ) pq(ip1,j,L) = pq(ip1,j,L) * fact
233     if( array(2).gt.0 ) pq(im1,j,L) = pq(im1,j,L) * fact
234     if( array(3).gt.0 ) pq(i,j+1,L) = pq(i,j+1,L) * fact
235     if( array(4).gt.0 ) pq(i,j-1,L) = pq(i,j-1,L) * fact
236     if( array(5).gt.0 ) pq(i,j,L-1) = pq(i,j,L-1) * fact
237     if( array(6).gt.0 ) pq(i,j,L+1) = pq(i,j,L+1) * fact
238     pq(i,j,L) = 0.0
239     else
240     pq(i,j,L) = 0.0
241     endif
242     else
243 molod 1.2 if( imax.eq.1 ) pq(ip1,j,L) = pq(ip1,j,L) +
244     . pq(i,j,L)*d2p(i,j)/d2p(ip1,j)
245     if( imax.eq.2 ) pq(im1,j,L) = pq(im1,j,L) +
246     . pq(i,j,L)*d2p(i,j)/d2p(im1,j)
247     if( imax.eq.3 ) pq(i,j+1,L) = pq(i,j+1,L) +
248     . pq(i,j,L)*d2p(i,j)/d2p(i,j+1)
249     if( imax.eq.4 ) pq(i,j-1,L) = pq(i,j-1,L) +
250     . pq(i,j,L)*d2p(i,j)/d2p(i,j-1)
251     if( imax.eq.5 ) pq(i,j,L-1) = pq(i,j,L-1) +
252     . pq(i,j,L)*dp(i,j,L) /dp(i,j,L-1)
253     if( imax.eq.6 ) pq(i,j,L+1) = pq(i,j,L+1) +
254     . pq(i,j,L)*dp(i,j,L) /dp(i,j,L+1)
255 molod 1.1 pq(i,j,L) = 0.0
256     endif
257    
258     endif ! End pq<0 Test
259    
260     im1 = i
261     i = ip1
262     enddo
263     enddo
264     enddo
265    
266     return
267     end
268    
269 molod 1.3 subroutine maxval1 (q,im,qval,qmax,imax)
270 molod 1.1 C***********************************************************************
271     C PURPOSE
272     C Find the location and value of the array element which is greater
273     C than a prescribed value.
274     C
275     C INPUT
276     C q ...... Array Elements
277     C im ..... Dimension of Array q
278     C qval ... Prescribed Value
279     C
280     C OUTPUT
281     C qmax ... Largest Array element which is greater than qval
282     C imax ... Location of Largest Array Element
283     C
284     C Note:
285     C If no array element is larger than qval, then imax = 0
286     C
287     C***********************************************************************
288     implicit none
289     integer im, i, imax
290 molod 1.4 _RL q(im), qmax, qval
291 molod 1.1 qmax = qval
292     imax = 0
293     do i=1,im
294     if( q(i).gt.qmax ) then
295     qmax = q(i)
296     imax = i
297     endif
298     enddo
299     return
300     end

  ViewVC Help
Powered by ViewVC 1.1.22