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

Last change on this file since 580 was 580, checked in by heinze, 14 years ago

Renaming of ws_vertical_gradient to subs_vertical_gradient, ws_vertical_gradient_level to subs_vertical_gradient_level and ws_vertical_gradient_level_ind to subs_vertical_gradient_level_i

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