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

Last change on this file since 51 was 51, checked in by raasch, 15 years ago

preliminary version, several changes to be explained later

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