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

Last change on this file since 978 was 978, checked in by fricke, 9 years ago

merge fricke branch back into trunk

  • Property svn:keywords set to Id
File size: 12.3 KB
Line 
1 MODULE diffusion_w_mod
2
3!------------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6! outflow damping layer removed
7! kmxm_x/_z and kmxp_x/_z change to kmxm and kmxp
8! kmym_y/_z and kmyp_y/_z change to kmym and kmyp
9!
10! Former revisions:
11! -----------------
12! $Id: diffusion_w.f90 978 2012-08-09 08:28:32Z fricke $
13!
14! 667 2010-12-23 12:06:00Z suehring/gryschka
15! nxl-1, nxr+1, nys-1, nyn+1 replaced by nxlg, nxrg, nysg, nyng
16!
17! 366 2009-08-25 08:06:27Z raasch
18! bc_lr/bc_ns replaced by bc_lr_cyc/bc_ns_cyc
19!
20! 75 2007-03-22 09:54:05Z raasch
21! Wall functions now include diabatic conditions, call of routine wall_fluxes,
22! z0 removed from argument list
23!
24! 20 2007-02-26 00:12:32Z raasch
25! Bugfix: ddzw dimensioned 1:nzt"+1"
26!
27! RCS Log replace by Id keyword, revision history cleaned up
28!
29! Revision 1.12  2006/02/23 10:38:03  raasch
30! nzb_2d replaced by nzb_w_outer, wall functions added for all vertical walls,
31! +z0 in argument list
32! WARNING: loops containing the MAX function are still not properly vectorized!
33!
34! Revision 1.1  1997/09/12 06:24:11  raasch
35! Initial revision
36!
37!
38! Description:
39! ------------
40! Diffusion term of the w-component
41!------------------------------------------------------------------------------!
42
43    USE wall_fluxes_mod
44
45    PRIVATE
46    PUBLIC diffusion_w
47
48    INTERFACE diffusion_w
49       MODULE PROCEDURE diffusion_w
50       MODULE PROCEDURE diffusion_w_ij
51    END INTERFACE diffusion_w
52
53 CONTAINS
54
55
56!------------------------------------------------------------------------------!
57! Call for all grid points
58!------------------------------------------------------------------------------!
59    SUBROUTINE diffusion_w( ddzu, ddzw, km, tend, u, v, w )
60
61       USE control_parameters
62       USE grid_variables
63       USE indices
64
65       IMPLICIT NONE
66
67       INTEGER ::  i, j, k
68       REAL    ::  kmxm, kmxp, kmym, kmyp
69       REAL    ::  ddzu(1:nzt+1), ddzw(1:nzt+1)
70       REAL    ::  tend(nzb:nzt+1,nysg:nyng,nxlg:nxrg)
71       REAL, DIMENSION(:,:,:), POINTER ::  km, u, v, w
72       REAL, DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  wsus, wsvs
73
74
75!
76!--    First calculate horizontal momentum flux w'u' and/or w'v' at vertical
77!--    walls, if neccessary
78       IF ( topography /= 'flat' )  THEN
79          CALL wall_fluxes( wsus, 0.0, 0.0, 0.0, 1.0, nzb_w_inner, &
80                            nzb_w_outer, wall_w_x )
81          CALL wall_fluxes( wsvs, 0.0, 0.0, 1.0, 0.0, nzb_w_inner, &
82                            nzb_w_outer, wall_w_y )
83       ENDIF
84
85       DO  i = nxl, nxr
86          DO  j = nys, nyn
87             DO  k = nzb_w_outer(j,i)+1, nzt-1
88!
89!--             Interpolate eddy diffusivities on staggered gridpoints
90                kmxp = 0.25 * &
91                       ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
92                kmxm = 0.25 * &
93                       ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
94                kmyp = 0.25 * &
95                       ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
96                kmym = 0.25 * &
97                       ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
98
99                tend(k,j,i) = tend(k,j,i)                                      &
100                      & + ( kmxp * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx         &
101                      &   + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1)   &
102                      &   - kmxm * ( w(k,j,i)   - w(k,j,i-1) ) * ddx           &
103                      &   - kmxm * ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)     &
104                      &   ) * ddx                                              &
105                      & + ( kmyp * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy         &
106                      &   + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1)   &
107                      &   - kmym * ( w(k,j,i)   - w(k,j-1,i) ) * ddy           &
108                      &   - kmym * ( v(k+1,j,i) - v(k,j,i)   ) * ddzu(k+1)     &
109                      &   ) * ddy                                              &
110                      & + 2.0 * (                                              &
111                      &   km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1)  &
112                      & - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k)  &
113                      &         ) * ddzu(k+1)
114             ENDDO
115
116!
117!--          Wall functions at all vertical walls, where necessary
118             IF ( wall_w_x(j,i) /= 0.0  .OR.  wall_w_y(j,i) /= 0.0 )  THEN
119
120                DO  k = nzb_w_inner(j,i)+1, nzb_w_outer(j,i)
121!
122!--                Interpolate eddy diffusivities on staggered gridpoints
123                   kmxp = 0.25 * &
124                          ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
125                   kmxm = 0.25 * &
126                          ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
127                   kmyp = 0.25 * &
128                          ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
129                   kmym = 0.25 * &
130                          ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
131
132                   tend(k,j,i) = tend(k,j,i)                                   &
133                                 + (   fwxp(j,i) * (                           &
134                            kmxp * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx         &
135                          + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1)   &
136                                                   )                           &
137                                     - fwxm(j,i) * (                           &
138                            kmxm * ( w(k,j,i)     - w(k,j,i-1) ) * ddx         &
139                          + kmxm * ( u(k+1,j,i)   - u(k,j,i)   ) * ddzu(k+1)   &
140                                                   )                           &
141                                     + wall_w_x(j,i) * wsus(k,j,i)             &
142                                   ) * ddx                                     &
143                                 + (   fwyp(j,i) * (                           &
144                            kmyp * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy         &
145                          + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1)   &
146                                                   )                           &
147                                     - fwym(j,i) * (                           &
148                            kmym * ( w(k,j,i)     - w(k,j-1,i) ) * ddy         &
149                          + kmym * ( v(k+1,j,i)   - v(k,j,i)   ) * ddzu(k+1)   &
150                                                   )                           &
151                                     + wall_w_y(j,i) * wsvs(k,j,i)             &
152                                   ) * ddy                                     &
153                                 + 2.0 * (                                     &
154                           km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) &
155                         - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k) &
156                                         ) * ddzu(k+1)
157                ENDDO
158             ENDIF
159
160          ENDDO
161       ENDDO
162
163    END SUBROUTINE diffusion_w
164
165
166!------------------------------------------------------------------------------!
167! Call for grid point i,j
168!------------------------------------------------------------------------------!
169    SUBROUTINE diffusion_w_ij( i, j, ddzu, ddzw, km, tend, u, v, w )
170
171       USE control_parameters
172       USE grid_variables
173       USE indices
174
175       IMPLICIT NONE
176
177       INTEGER ::  i, j, k
178       REAL    ::  kmxm, kmxp, kmym, kmyp
179       REAL    ::  ddzu(1:nzt+1), ddzw(1:nzt+1)
180       REAL    ::  tend(nzb:nzt+1,nysg:nyng,nxlg:nxrg)
181       REAL, DIMENSION(nzb:nzt+1)      ::  wsus, wsvs
182       REAL, DIMENSION(:,:,:), POINTER ::  km, u, v, w
183
184
185       DO  k = nzb_w_outer(j,i)+1, nzt-1
186!
187!--       Interpolate eddy diffusivities on staggered gridpoints
188          kmxp = 0.25 * ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
189          kmxm = 0.25 * ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
190          kmyp = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
191          kmym = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
192
193          tend(k,j,i) = tend(k,j,i)                                            &
194                      & + ( kmxp * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx         &
195                      &   + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1)   &
196                      &   - kmxm * ( w(k,j,i)   - w(k,j,i-1) ) * ddx           &
197                      &   - kmxm * ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)     &
198                      &   ) * ddx                                              &
199                      & + ( kmyp * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy         &
200                      &   + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1)   &
201                      &   - kmym * ( w(k,j,i)   - w(k,j-1,i) ) * ddy           &
202                      &   - kmym * ( v(k+1,j,i) - v(k,j,i)   ) * ddzu(k+1)     &
203                      &   ) * ddy                                              &
204                      & + 2.0 * (                                              &
205                      &   km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1)  &
206                      & - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k)  &
207                      &         ) * ddzu(k+1)
208       ENDDO
209
210!
211!--    Wall functions at all vertical walls, where necessary
212       IF ( wall_w_x(j,i) /= 0.0  .OR.  wall_w_y(j,i) /= 0.0 )  THEN
213
214!
215!--       Calculate the horizontal momentum fluxes w'u' and/or w'v'
216          IF ( wall_w_x(j,i) /= 0.0 )  THEN
217             CALL wall_fluxes( i, j, nzb_w_inner(j,i)+1, nzb_w_outer(j,i), &
218                               wsus, 0.0, 0.0, 0.0, 1.0 )
219          ELSE
220             wsus = 0.0
221          ENDIF
222
223          IF ( wall_w_y(j,i) /= 0.0 )  THEN
224             CALL wall_fluxes( i, j, nzb_w_inner(j,i)+1, nzb_w_outer(j,i),  &
225                               wsvs, 0.0, 0.0, 1.0, 0.0 )
226          ELSE
227             wsvs = 0.0
228          ENDIF
229
230          DO  k = nzb_w_inner(j,i)+1, nzb_w_outer(j,i)
231!
232!--          Interpolate eddy diffusivities on staggered gridpoints
233             kmxp = 0.25 * ( km(k,j,i)+km(k,j,i+1)+km(k+1,j,i)+km(k+1,j,i+1) )
234             kmxm = 0.25 * ( km(k,j,i)+km(k,j,i-1)+km(k+1,j,i)+km(k+1,j,i-1) )
235             kmyp = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j+1,i)+km(k+1,j+1,i) )
236             kmym = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j-1,i)+km(k+1,j-1,i) )
237
238             tend(k,j,i) = tend(k,j,i)                                         &
239                                 + (   fwxp(j,i) * (                           &
240                            kmxp * ( w(k,j,i+1)   - w(k,j,i)   ) * ddx         &
241                          + kmxp * ( u(k+1,j,i+1) - u(k,j,i+1) ) * ddzu(k+1)   &
242                                                   )                           &
243                                     - fwxm(j,i) * (                           &
244                            kmxm * ( w(k,j,i)     - w(k,j,i-1) ) * ddx         &
245                          + kmxm * ( u(k+1,j,i)   - u(k,j,i)   ) * ddzu(k+1)   &
246                                                   )                           &
247                                     + wall_w_x(j,i) * wsus(k)                 &
248                                   ) * ddx                                     &
249                                 + (   fwyp(j,i) * (                           &
250                            kmyp * ( w(k,j+1,i)   - w(k,j,i)   ) * ddy         &
251                          + kmyp * ( v(k+1,j+1,i) - v(k,j+1,i) ) * ddzu(k+1)   &
252                                                   )                           &
253                                     - fwym(j,i) * (                           &
254                            kmym * ( w(k,j,i)     - w(k,j-1,i) ) * ddy         &
255                          + kmym * ( v(k+1,j,i)   - v(k,j,i)   ) * ddzu(k+1)   &
256                                                   )                           &
257                                     + wall_w_y(j,i) * wsvs(k)                 &
258                                   ) * ddy                                     &
259                                 + 2.0 * (                                     &
260                           km(k+1,j,i) * ( w(k+1,j,i) - w(k,j,i) ) * ddzw(k+1) &
261                         - km(k,j,i)   * ( w(k,j,i)   - w(k-1,j,i) ) * ddzw(k) &
262                                         ) * ddzu(k+1)
263          ENDDO
264       ENDIF
265
266    END SUBROUTINE diffusion_w_ij
267
268 END MODULE diffusion_w_mod
Note: See TracBrowser for help on using the repository browser.