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

Last change on this file since 668 was 668, checked in by suehring, 13 years ago

last commit documented

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