source: palm/trunk/SOURCE/subsidence.f90 @ 671

Last change on this file since 671 was 671, checked in by heinze, 13 years ago

bugfix: access to ddzu(nzt+2) which is not defined

  • Property svn:keywords set to Id
File size: 7.7 KB
Line 
1 MODULE subsidence_mod
2
3!-----------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6! bugfix: access to ddzu(nzt+2) which is not defined
7!
8! Former revisions:
9! -----------------
10! $Id: subsidence.f90 671 2011-01-11 12:04:00Z heinze $
11!
12! 667 2010-12-23 12:06:00Z suehring
13! nxl-1, nxr+1, nys-1, nyn+1 replaced by nxlg, nxrg, nysg, nyng
14!
15! 580 2010-10-05 13:59:11Z heinze
16! Renaming of ws_vertical_gradient to subs_vertical_gradient,
17! ws_vertical_gradient_level to subs_vertical_gradient_level and
18! ws_vertical_gradient_level_ind to subs_vertical_gradient_level_i
19!
20! Revision 3.7 2009-12-11 14:15:58Z heinze
21! Initial revision
22!
23! Description:
24! ------------
25! Impact of large-scale subsidence or ascent as tendency term for use
26! in the prognostic equation of potential temperature. This enables the
27! construction of a constant boundary layer height z_i with time.
28!-----------------------------------------------------------------------------!
29
30
31    IMPLICIT NONE
32
33    PRIVATE
34    PUBLIC  init_w_subsidence, subsidence
35
36    INTERFACE init_w_subsidence
37       MODULE PROCEDURE init_w_subsidence
38    END INTERFACE init_w_subsidence
39
40    INTERFACE subsidence
41       MODULE PROCEDURE subsidence
42       MODULE PROCEDURE subsidence_ij
43    END INTERFACE subsidence
44
45 CONTAINS
46
47    SUBROUTINE init_w_subsidence 
48
49       USE arrays_3d
50       USE control_parameters
51       USE grid_variables
52       USE indices
53       USE pegrid
54       USE statistics 
55
56       IMPLICIT NONE
57
58       INTEGER :: i, k
59       REAL    :: gradient, ws_surface
60
61       IF ( .NOT. ALLOCATED( w_subs )) THEN
62          ALLOCATE( w_subs(nzb:nzt+1) )
63          w_subs = 0.0
64       ENDIF
65
66      IF ( ocean )  THEN
67          message_string = 'Applying large scale vertical motion is not ' // &
68                           'allowed for ocean runs'
69          CALL message( 'init_w_subsidence', 'PA0324', 2, 2, 0, 6, 0 )
70       ENDIF
71
72!
73!--   Compute the profile of the subsidence/ascent velocity
74!--   using the given gradients
75      i = 1
76      gradient = 0.0
77      ws_surface = 0.0
78     
79
80      subs_vertical_gradient_level_i(1) = 0
81      DO  k = 1, nzt+1
82         IF ( i < 11 ) THEN
83            IF ( subs_vertical_gradient_level(i) < zu(k)  .AND. &
84                 subs_vertical_gradient_level(i) >= 0.0 )  THEN
85               gradient = subs_vertical_gradient(i) / 100.0
86               subs_vertical_gradient_level_i(i) = k - 1
87               i = i + 1
88            ENDIF
89         ENDIF
90         IF ( gradient /= 0.0 )  THEN
91            IF ( k /= 1 )  THEN
92               w_subs(k) = w_subs(k-1) + dzu(k) * gradient
93            ELSE
94               w_subs(k) = ws_surface   + 0.5 * dzu(k) * gradient
95            ENDIF
96         ELSE
97            w_subs(k) = w_subs(k-1)
98         ENDIF
99      ENDDO
100
101!
102!--   In case of no given gradients for the subsidence/ascent velocity,
103!--   choose zero gradient
104      IF ( subs_vertical_gradient_level(1) == -9999999.9 )  THEN
105         subs_vertical_gradient_level(1) = 0.0
106      ENDIF
107
108    END SUBROUTINE init_w_subsidence
109
110
111    SUBROUTINE subsidence( tendency, var, var_init ) 
112
113       USE arrays_3d
114       USE control_parameters
115       USE grid_variables
116       USE indices
117       USE pegrid
118       USE statistics 
119
120       IMPLICIT NONE
121 
122       INTEGER :: i, j, k
123
124       REAL :: tmp_grad
125   
126       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: var, tendency
127       REAL, DIMENSION(nzb:nzt+1) :: var_init, var_mod
128
129       var_mod = var_init
130
131!
132!--    Influence of w_subsidence on the current tendency term
133       DO  i = nxl, nxr
134          DO  j = nys, nyn
135             DO  k = nzb_s_inner(j,i)+1, nzt 
136                IF ( w_subs(k) < 0.0 ) THEN    ! large-scale subsidence
137                   tendency(k,j,i) = tendency(k,j,i) - w_subs(k) *  &
138                                     ( var(k+1,j,i) - var(k,j,i) ) * ddzu(k+1)
139                ELSE                           ! large-scale ascent
140                   tendency(k,j,i) = tendency(k,j,i) - w_subs(k) *  &
141                                     ( var(k,j,i) - var(k-1,j,i) ) * ddzu(k)
142                ENDIF
143             ENDDO
144          ENDDO
145       ENDDO
146
147!
148!--    Shifting of the initial profile is especially necessary with Rayleigh
149!--    damping switched on
150
151       DO  k = nzb, nzt
152          IF ( w_subs(k) < 0.0 ) THEN      ! large-scale subsidence
153             var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
154                               ( var_init(k+1) - var_init(k) ) * ddzu(k+1)
155          ENDIF
156       ENDDO
157!
158!--   At the upper boundary, the initial profile is shifted with aid of
159!--   the gradient tmp_grad. (This is ok if the gradients are linear.)
160      IF ( w_subs(nzt) < 0.0 ) THEN
161         tmp_grad = ( var_init(nzt+1) - var_init(nzt) ) * ddzu(nzt+1)
162         var_mod(nzt+1) = var_init(nzt+1) -  &
163                              dt_3d * w_subs(nzt+1) * tmp_grad
164      ENDIF
165       
166
167      DO  k = nzt+1, nzb+1, -1
168         IF ( w_subs(k) >= 0.0 ) THEN  ! large-scale ascent
169            var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
170                               ( var_init(k) - var_init(k-1) ) * ddzu(k) 
171         ENDIF
172      ENDDO
173!
174!--   At the lower boundary shifting is not necessary because the
175!--   subsidence velocity w_subs(nzb) vanishes.
176
177
178      IF ( w_subs(nzb+1) >= 0.0 ) THEN
179         var_mod(nzb) = var_init(nzb)
180      ENDIF
181
182      var_init = var_mod
183
184
185 END SUBROUTINE subsidence
186
187 SUBROUTINE subsidence_ij( i, j, tendency, var, var_init ) 
188
189       USE arrays_3d
190       USE control_parameters
191       USE grid_variables
192       USE indices
193       USE pegrid
194       USE statistics 
195
196       IMPLICIT NONE
197 
198       INTEGER :: i, j, k
199
200       REAL :: tmp_grad
201   
202       REAL, DIMENSION(nzb:nzt+1,nysg:nyng,nxlg:nxrg) :: var, tendency
203       REAL, DIMENSION(nzb:nzt+1) :: var_init, var_mod
204
205       var_mod = var_init
206
207!
208!--    Influence of w_subsidence on the current tendency term
209       DO  k = nzb_s_inner(j,i)+1, nzt 
210          IF ( w_subs(k) < 0.0 ) THEN      ! large-scale subsidence
211             tendency(k,j,i) = tendency(k,j,i) - w_subs(k) *  &
212                               ( var(k+1,j,i) - var(k,j,i) ) * ddzu(k+1)
213          ELSE                             ! large-scale ascent
214             tendency(k,j,i) = tendency(k,j,i) - w_subs(k) *  &
215                               ( var(k,j,i) - var(k-1,j,i) ) * ddzu(k)
216          ENDIF
217       ENDDO
218
219
220!
221!--    Shifting of the initial profile is especially necessary with Rayleigh
222!--    damping switched on
223       IF ( i == nxl .AND. j == nys ) THEN ! shifting only once per PE
224
225          DO  k = nzb, nzt
226             IF ( w_subs(k) < 0.0 ) THEN      ! large-scale subsidence
227                var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
228                                  ( var_init(k+1) - var_init(k) ) * ddzu(k+1)
229             ENDIF
230          ENDDO
231!
232!--       At the upper boundary, the initial profile is shifted with aid of
233!--       the gradient tmp_grad. (This is ok if the gradients are linear.)
234          IF ( w_subs(nzt) < 0.0 ) THEN
235             tmp_grad = ( var_init(nzt+1) - var_init(nzt) ) * ddzu(nzt+1)
236             var_mod(nzt+1) = var_init(nzt+1) -  &
237                                  dt_3d * w_subs(nzt+1) * tmp_grad
238          ENDIF
239       
240
241          DO  k = nzt+1, nzb+1, -1
242             IF ( w_subs(k) >= 0.0 ) THEN  ! large-scale ascent
243                var_mod(k) = var_init(k) - dt_3d * w_subs(k) *  &
244                                   ( var_init(k) - var_init(k-1) ) * ddzu(k)
245             ENDIF
246          ENDDO
247!
248!--       At the lower boundary shifting is not necessary because the
249!--       subsidence velocity w_subs(nzb) vanishes.
250
251
252          IF ( w_subs(nzb+1) >= 0.0 ) THEN
253             var_mod(nzb) = var_init(nzb)
254          ENDIF
255
256          var_init = var_mod 
257
258       ENDIF
259
260 END SUBROUTINE subsidence_ij
261
262
263 END MODULE subsidence_mod
Note: See TracBrowser for help on using the repository browser.