source: palm/trunk/SOURCE/diffusion_w.f90 @ 56

Last change on this file since 56 was 56, checked in by raasch, 17 years ago

further checkin of preliminary changes

  • Property svn:keywords set to Id
File size: 15.4 KB
RevLine 
[1]1 MODULE diffusion_w_mod
2
3!------------------------------------------------------------------------------!
4! Actual revisions:
5! -----------------
[53]6! Wall functions now include diabatic conditions, call of routine wall_fluxes
[1]7!
8! Former revisions:
9! -----------------
[3]10! $Id: diffusion_w.f90 56 2007-03-08 13:57:07Z raasch $
[39]11!
12! 20 2007-02-26 00:12:32Z raasch
13! Bugfix: ddzw dimensioned 1:nzt"+1"
14!
[3]15! RCS Log replace by Id keyword, revision history cleaned up
16!
[1]17! Revision 1.12  2006/02/23 10:38:03  raasch
18! nzb_2d replaced by nzb_w_outer, wall functions added for all vertical walls,
19! +z0 in argument list
20! WARNING: loops containing the MAX function are still not properly vectorized!
21!
22! Revision 1.1  1997/09/12 06:24:11  raasch
23! Initial revision
24!
25!
26! Description:
27! ------------
28! Diffusion term of the w-component
29!------------------------------------------------------------------------------!
30
[56]31    USE wall_fluxes_mod
32
[1]33    PRIVATE
34    PUBLIC diffusion_w
35
36    INTERFACE diffusion_w
37       MODULE PROCEDURE diffusion_w
38       MODULE PROCEDURE diffusion_w_ij
39    END INTERFACE diffusion_w
40
41 CONTAINS
42
43
44!------------------------------------------------------------------------------!
45! Call for all grid points
46!------------------------------------------------------------------------------!
47    SUBROUTINE diffusion_w( ddzu, ddzw, km, km_damp_x, km_damp_y, tend, u, v, &
48                            w, z0 )
49
50       USE control_parameters
51       USE grid_variables
52       USE indices
53
54       IMPLICIT NONE
55
56       INTEGER ::  i, j, k
57       REAL    ::  kmxm_x, kmxm_z, kmxp_x, kmxp_z, kmym_y, kmym_z, kmyp_y, &
[51]58                   kmyp_z
[20]59       REAL    ::  ddzu(1:nzt+1), ddzw(1:nzt+1), km_damp_x(nxl-1:nxr+1), &
[1]60                   km_damp_y(nys-1:nyn+1)
61       REAL    ::  z0(nys-1:nyn+1,nxl-1:nxr+1)
62       REAL    ::  tend(nzb:nzt+1,nys-1:nyn+1,nxl-1:nxr+1)
63       REAL, DIMENSION(:,:,:), POINTER ::  km, u, v, w
[56]64       REAL, DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  wsus, wsvs
[1]65
66
[56]67!
68!--    First calculate horizontal momentum flux w'u' and/or w'v' at vertical
69!--    walls, if neccessary
70       IF ( topography /= 'flat' )  THEN
71          CALL wall_fluxes( wsus, 0.0, 0.0, 0.0, 1.0, 0, 0, nzb_w_inner, &
72                            nzb_w_outer, wall_w_x )
73          CALL wall_fluxes( wsvs, 0.0, 0.0, 1.0, 0.0, 0, 0, nzb_w_inner, &
74                            nzb_w_outer, wall_w_y )
75       ENDIF
76
[1]77       DO  i = nxl, nxr
78          DO  j = nys, nyn
79             DO  k = nzb_w_outer(j,i)+1, nzt-1
80!
81!--             Interpolate eddy diffusivities on staggered gridpoints
82                kmxp_x = 0.25 * &
83                         ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
84                kmxm_x = 0.25 * &
85                         ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
86                kmxp_z = kmxp_x
87                kmxm_z = kmxm_x
88                kmyp_y = 0.25 * &
89                         ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
90                kmym_y = 0.25 * &
91                         ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
92                kmyp_z = kmyp_y
93                kmym_z = kmym_y
94!
95!--             Increase diffusion at the outflow boundary in case of
96!--             non-cyclic lateral boundaries. Damping is only needed for
97!--             velocity components parallel to the outflow boundary in
98!--             the direction normal to the outflow boundary.
99                IF ( bc_lr /= 'cyclic' )  THEN
100                   kmxp_x = MAX( kmxp_x, km_damp_x(i) )
101                   kmxm_x = MAX( kmxm_x, km_damp_x(i) )
102                ENDIF
103                IF ( bc_ns /= 'cyclic' )  THEN
104                   kmyp_y = MAX( kmyp_y, km_damp_y(j) )
105                   kmym_y = MAX( kmym_y, km_damp_y(j) )
106                ENDIF
107
108                tend(k,j,i) = tend(k,j,i)                                      &
109                      & + ( kmxp_x * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx       &
110                      &   + kmxp_z * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) &
111                      &   - kmxm_x * ( w(k,j,i)   - w(k,j,i-1) ) * ddx         &
112                      &   - kmxm_z * ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)   &
113                      &   ) * ddx                                              &
114                      & + ( kmyp_y * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy       &
115                      &   + kmyp_z * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) &
116                      &   - kmym_y * ( w(k,j,i)   - w(k,j-1,i) ) * ddy         &
117                      &   - kmym_z * ( v(k+1,j,i) - v(k,j,i)   ) * ddzu(k+1)   &
118                      &   ) * ddy                                              &
119                      & + 2.0 * (                                              &
120                      &   km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1)  &
121                      & - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k)  &
122                      &         ) * ddzu(k+1)
123             ENDDO
124
125!
126!--          Wall functions at all vertical walls, where necessary
127             IF ( wall_w_x(j,i) /= 0.0  .OR.  wall_w_y(j,i) /= 0.0 )  THEN
[51]128
[1]129                DO  k = nzb_w_inner(j,i)+1, nzb_w_outer(j,i)
130!
131!--                Interpolate eddy diffusivities on staggered gridpoints
132                   kmxp_x = 0.25 * &
133                            ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
134                   kmxm_x = 0.25 * &
135                            ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
136                   kmxp_z = kmxp_x
137                   kmxm_z = kmxm_x
138                   kmyp_y = 0.25 * &
139                            ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
140                   kmym_y = 0.25 * &
141                            ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
142                   kmyp_z = kmyp_y
143                   kmym_z = kmym_y
144!
145!--                Increase diffusion at the outflow boundary in case of
146!--                non-cyclic lateral boundaries. Damping is only needed for
147!--                velocity components parallel to the outflow boundary in
148!--                the direction normal to the outflow boundary.
149                   IF ( bc_lr /= 'cyclic' )  THEN
150                      kmxp_x = MAX( kmxp_x, km_damp_x(i) )
151                      kmxm_x = MAX( kmxm_x, km_damp_x(i) )
152                   ENDIF
153                   IF ( bc_ns /= 'cyclic' )  THEN
154                      kmyp_y = MAX( kmyp_y, km_damp_y(j) )
155                      kmym_y = MAX( kmym_y, km_damp_y(j) )
156                   ENDIF
157
158                   tend(k,j,i) = tend(k,j,i)                                   &
159                                 + (   fwxp(j,i) * (                           &
160                            kmxp_x * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx       &
161                          + kmxp_z * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) &
162                                                   )                           &
163                                     - fwxm(j,i) * (                           &
164                            kmxm_x * ( w(k,j,i)     - w(k,j,i-1) ) * ddx       &
165                          + kmxm_z * ( u(k+1,j,i)   - u(k,j,i)   ) * ddzu(k+1) &
166                                                   )                           &
[56]167                                     + wall_w_x(j,i) * wsus(k,j,i)             &
[1]168                                   ) * ddx                                     &
169                                 + (   fwyp(j,i) * (                           &
170                            kmyp_y * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy       &
171                          + kmyp_z * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) &
172                                                   )                           &
173                                     - fwym(j,i) * (                           &
174                            kmym_y * ( w(k,j,i)     - w(k,j-1,i) ) * ddy       &
175                          + kmym_z * ( v(k+1,j,i)   - v(k,j,i)   ) * ddzu(k+1) &
176                                                   )                           &
[56]177                                     + wall_w_y(j,i) * wsvs(k,j,i)             &
[1]178                                   ) * ddy                                     &
179                                 + 2.0 * (                                     &
180                           km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) &
181                         - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k) &
182                                         ) * ddzu(k+1)
183                ENDDO
184             ENDIF
185
186          ENDDO
187       ENDDO
188
189    END SUBROUTINE diffusion_w
190
191
192!------------------------------------------------------------------------------!
193! Call for grid point i,j
194!------------------------------------------------------------------------------!
195    SUBROUTINE diffusion_w_ij( i, j, ddzu, ddzw, km, km_damp_x, km_damp_y, &
196                               tend, u, v, w, z0 )
197
198       USE control_parameters
199       USE grid_variables
200       USE indices
201
202       IMPLICIT NONE
203
204       INTEGER ::  i, j, k
205       REAL    ::  kmxm_x, kmxm_z, kmxp_x, kmxp_z, kmym_y, kmym_z, kmyp_y, &
[51]206                   kmyp_z
[20]207       REAL    ::  ddzu(1:nzt+1), ddzw(1:nzt+1), km_damp_x(nxl-1:nxr+1), &
[1]208                   km_damp_y(nys-1:nyn+1)
209       REAL    ::  z0(nys-1:nyn+1,nxl-1:nxr+1)
210       REAL    ::  tend(nzb:nzt+1,nys-1:nyn+1,nxl-1:nxr+1)
[51]211       REAL, DIMENSION(nzb:nzt+1)      ::  wsus, wsvs
[1]212       REAL, DIMENSION(:,:,:), POINTER ::  km, u, v, w
213
214
215       DO  k = nzb_w_outer(j,i)+1, nzt-1
216!
217!--       Interpolate eddy diffusivities on staggered gridpoints
218          kmxp_x = 0.25 * ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
219          kmxm_x = 0.25 * ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
220          kmxp_z = kmxp_x
221          kmxm_z = kmxm_x
222          kmyp_y = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
223          kmym_y = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
224          kmyp_z = kmyp_y
225          kmym_z = kmym_y
226!
227!--       Increase diffusion at the outflow boundary in case of non-cyclic
228!--       lateral boundaries. Damping is only needed for velocity components
229!--       parallel to the outflow boundary in the direction normal to the
230!--       outflow boundary.
231          IF ( bc_lr /= 'cyclic' )  THEN
232             kmxp_x = MAX( kmxp_x, km_damp_x(i) )
233             kmxm_x = MAX( kmxm_x, km_damp_x(i) )
234          ENDIF
235          IF ( bc_ns /= 'cyclic' )  THEN
236             kmyp_y = MAX( kmyp_y, km_damp_y(j) )
237             kmym_y = MAX( kmym_y, km_damp_y(j) )
238          ENDIF
239
240          tend(k,j,i) = tend(k,j,i)                                            &
241                      & + ( kmxp_x * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx       &
242                      &   + kmxp_z * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) &
243                      &   - kmxm_x * ( w(k,j,i)   - w(k,j,i-1) ) * ddx         &
244                      &   - kmxm_z * ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)   &
245                      &   ) * ddx                                              &
246                      & + ( kmyp_y * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy       &
247                      &   + kmyp_z * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) &
248                      &   - kmym_y * ( w(k,j,i)   - w(k,j-1,i) ) * ddy         &
249                      &   - kmym_z * ( v(k+1,j,i) - v(k,j,i)   ) * ddzu(k+1)   &
250                      &   ) * ddy                                              &
251                      & + 2.0 * (                                              &
252                      &   km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1)  &
253                      & - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k)  &
254                      &         ) * ddzu(k+1)
255       ENDDO
256
257!
258!--    Wall functions at all vertical walls, where necessary
259       IF ( wall_w_x(j,i) /= 0.0  .OR.  wall_w_y(j,i) /= 0.0 )  THEN
[51]260
261!
262!--       Calculate the horizontal momentum fluxes w'u' and/or w'v'
263          IF ( wall_w_x(j,i) /= 0.0 )  THEN
264             CALL wall_fluxes( i, j, nzb_w_inner(j,i)+1, nzb_w_outer(j,i), &
265                               wsus, 0.0, 0.0, 0.0, 1.0 )
266          ELSE
267             wsus = 0.0
268          ENDIF
269
270          IF ( wall_w_y(j,i) /= 0.0 )  THEN
271             CALL wall_fluxes( i, j, nzb_w_inner(j,i)+1, nzb_w_outer(j,i),  &
272                               wsvs, 0.0, 0.0, 1.0, 0.0 )
273          ELSE
274             wsvs = 0.0
275          ENDIF
276
[1]277          DO  k = nzb_w_inner(j,i)+1, nzb_w_outer(j,i)
278!
279!--          Interpolate eddy diffusivities on staggered gridpoints
280             kmxp_x = 0.25 * ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
281             kmxm_x = 0.25 * ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
282             kmxp_z = kmxp_x
283             kmxm_z = kmxm_x
284             kmyp_y = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
285             kmym_y = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
286             kmyp_z = kmyp_y
287             kmym_z = kmym_y
288!
289!--          Increase diffusion at the outflow boundary in case of
290!--          non-cyclic lateral boundaries. Damping is only needed for
291!--          velocity components parallel to the outflow boundary in
292!--          the direction normal to the outflow boundary.
293             IF ( bc_lr /= 'cyclic' )  THEN
294                kmxp_x = MAX( kmxp_x, km_damp_x(i) )
295                kmxm_x = MAX( kmxm_x, km_damp_x(i) )
296             ENDIF
297             IF ( bc_ns /= 'cyclic' )  THEN
298                kmyp_y = MAX( kmyp_y, km_damp_y(j) )
299                kmym_y = MAX( kmym_y, km_damp_y(j) )
300             ENDIF
301
302             tend(k,j,i) = tend(k,j,i)                                         &
303                                 + (   fwxp(j,i) * (                           &
304                            kmxp_x * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx       &
305                          + kmxp_z * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1) &
306                                                   )                           &
307                                     - fwxm(j,i) * (                           &
308                            kmxm_x * ( w(k,j,i)     - w(k,j,i-1) ) * ddx       &
309                          + kmxm_z * ( u(k+1,j,i)   - u(k,j,i)   ) * ddzu(k+1) &
310                                                   )                           &
[51]311                                     + wall_w_x(j,i) * wsus(k)                 &
[1]312                                   ) * ddx                                     &
313                                 + (   fwyp(j,i) * (                           &
314                            kmyp_y * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy       &
315                          + kmyp_z * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1) &
316                                                   )                           &
317                                     - fwym(j,i) * (                           &
318                            kmym_y * ( w(k,j,i)     - w(k,j-1,i) ) * ddy       &
319                          + kmym_z * ( v(k+1,j,i)   - v(k,j,i)   ) * ddzu(k+1) &
320                                                   )                           &
[51]321                                     + wall_w_y(j,i) * wsvs(k)                 &
[1]322                                   ) * ddy                                     &
323                                 + 2.0 * (                                     &
324                           km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) &
325                         - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k) &
326                                         ) * ddzu(k+1)
327          ENDDO
328       ENDIF
329
330    END SUBROUTINE diffusion_w_ij
331
332 END MODULE diffusion_w_mod
Note: See TracBrowser for help on using the repository browser.