source: palm/trunk/SOURCE/diffusion_u.f90 @ 1001

Last change on this file since 1001 was 1001, checked in by raasch, 12 years ago

leapfrog timestep scheme and upstream-spline advection scheme completely removed from the code,
reading of dt_fixed from restart file removed

  • Property svn:keywords set to Id
File size: 15.4 KB
Line 
1 MODULE diffusion_u_mod
2
3!------------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6! arrays comunicated by module instead of parameter list
7!
8! Former revisions:
9! -----------------
10! $Id: diffusion_u.f90 1001 2012-09-13 14:08:46Z raasch $
11!
12! 978 2012-08-09 08:28:32Z fricke
13! outflow damping layer removed
14! kmym_x/_y and kmyp_x/_y change to kmym and kmyp
15!
16! 667 2010-12-23 12:06:00Z suehring/gryschka
17! nxl-1, nxr+1, nys-1, nyn+1 replaced by nxlg, nxrg, nysg, nyng
18!
19! 366 2009-08-25 08:06:27Z raasch
20! bc_ns replaced by bc_ns_cyc
21!
22! 106 2007-08-16 14:30:26Z raasch
23! Momentumflux at top (uswst) included as boundary condition,
24! i loop is starting from nxlu (needed for non-cyclic boundary conditions)
25!
26! 75 2007-03-22 09:54:05Z raasch
27! Wall functions now include diabatic conditions, call of routine wall_fluxes,
28! z0 removed from argument list, uxrp eliminated
29!
30! 20 2007-02-26 00:12:32Z raasch
31! Bugfix: ddzw dimensioned 1:nzt"+1"
32!
33! RCS Log replace by Id keyword, revision history cleaned up
34!
35! Revision 1.15  2006/02/23 10:35:35  raasch
36! nzb_2d replaced by nzb_u_outer in horizontal diffusion and by nzb_u_inner
37! or nzb_diff_u, respectively, in vertical diffusion,
38! wall functions added for north and south walls, +z0 in argument list,
39! terms containing w(k-1,..) are removed from the Prandtl-layer equation
40! because they cause errors at the edges of topography
41! WARNING: loops containing the MAX function are still not properly vectorized!
42!
43! Revision 1.1  1997/09/12 06:23:51  raasch
44! Initial revision
45!
46!
47! Description:
48! ------------
49! Diffusion term of the u-component
50! To do: additional damping (needed for non-cyclic bc) causes bad vectorization
51!        and slows down the speed on NEC about 5-10%
52!------------------------------------------------------------------------------!
53
54    USE wall_fluxes_mod
55
56    PRIVATE
57    PUBLIC diffusion_u
58
59    INTERFACE diffusion_u
60       MODULE PROCEDURE diffusion_u
61       MODULE PROCEDURE diffusion_u_ij
62    END INTERFACE diffusion_u
63
64 CONTAINS
65
66
67!------------------------------------------------------------------------------!
68! Call for all grid points
69!------------------------------------------------------------------------------!
70    SUBROUTINE diffusion_u
71
72       USE arrays_3d
73       USE control_parameters
74       USE grid_variables
75       USE indices
76
77       IMPLICIT NONE
78
79       INTEGER ::  i, j, k
80       REAL    ::  kmym, kmyp, kmzm, kmzp
81
82       REAL, DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  usvs
83
84!
85!--    First calculate horizontal momentum flux u'v' at vertical walls,
86!--    if neccessary
87       IF ( topography /= 'flat' )  THEN
88          CALL wall_fluxes( usvs, 1.0, 0.0, 0.0, 0.0, nzb_u_inner, &
89                            nzb_u_outer, wall_u )
90       ENDIF
91
92       DO  i = nxlu, nxr
93          DO  j = nys, nyn
94!
95!--          Compute horizontal diffusion
96             DO  k = nzb_u_outer(j,i)+1, nzt
97!
98!--             Interpolate eddy diffusivities on staggered gridpoints
99                kmyp = 0.25 * &
100                       ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
101                kmym = 0.25 * &
102                       ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
103
104                tend(k,j,i) = tend(k,j,i)                                    &
105                      & + 2.0 * (                                            &
106                      &           km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )  &
107                      &         - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )  &
108                      &         ) * ddx2                                     &
109                      & + ( kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy       &
110                      &   + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx       &
111                      &   - kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy           &
112                      &   - kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx           &
113                      &   ) * ddy
114             ENDDO
115
116!
117!--          Wall functions at the north and south walls, respectively
118             IF ( wall_u(j,i) /= 0.0 )  THEN
119
120                DO  k = nzb_u_inner(j,i)+1, nzb_u_outer(j,i)
121                   kmyp = 0.25 * &
122                          ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
123                   kmym = 0.25 * &
124                          ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
125
126                   tend(k,j,i) = tend(k,j,i)                                   &
127                                 + 2.0 * (                                     &
128                                       km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i) ) &
129                                     - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) &
130                                         ) * ddx2                              &
131                                 + (   fyp(j,i) * (                            &
132                                  kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy   &
133                                + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx   &
134                                                  )                            &
135                                     - fym(j,i) * (                            &
136                                  kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
137                                + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
138                                                  )                            &
139                                     + wall_u(j,i) * usvs(k,j,i)               &
140                                   ) * ddy
141                ENDDO
142             ENDIF
143
144!
145!--          Compute vertical diffusion. In case of simulating a Prandtl layer,
146!--          index k starts at nzb_u_inner+2.
147             DO  k = nzb_diff_u(j,i), nzt_diff
148!
149!--             Interpolate eddy diffusivities on staggered gridpoints
150                kmzp = 0.25 * &
151                       ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
152                kmzm = 0.25 * &
153                       ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
154
155                tend(k,j,i) = tend(k,j,i)                                    &
156                      & + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1) &
157                      &            + ( w(k,j,i)   - w(k,j,i-1) ) * ddx       &
158                      &            )                                         &
159                      &   - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k) &
160                      &            + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx     &
161                      &            )                                          &
162                      &   ) * ddzw(k)
163             ENDDO
164
165!
166!--          Vertical diffusion at the first grid point above the surface,
167!--          if the momentum flux at the bottom is given by the Prandtl law or
168!--          if it is prescribed by the user.
169!--          Difference quotient of the momentum flux is not formed over half
170!--          of the grid spacing (2.0*ddzw(k)) any more, since the comparison
171!--          with other (LES) modell showed that the values of the momentum
172!--          flux becomes too large in this case.
173!--          The term containing w(k-1,..) (see above equation) is removed here
174!--          because the vertical velocity is assumed to be zero at the surface.
175             IF ( use_surface_fluxes )  THEN
176                k = nzb_u_inner(j,i)+1
177!
178!--             Interpolate eddy diffusivities on staggered gridpoints
179                kmzp = 0.25 * &
180                      ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
181                kmzm = 0.25 * &
182                      ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
183
184                tend(k,j,i) = tend(k,j,i)                                    &
185                      & + ( kmzp * ( w(k,j,i)   - w(k,j,i-1)   ) * ddx       &
186                      &   ) * ddzw(k)                                        &
187                      & + ( kmzp * ( u(k+1,j,i) - u(k,j,i)     ) * ddzu(k+1) &
188                      &   + usws(j,i)                                        &
189                      &   ) * ddzw(k)
190             ENDIF
191
192!
193!--          Vertical diffusion at the first gridpoint below the top boundary,
194!--          if the momentum flux at the top is prescribed by the user
195             IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
196                k = nzt
197!
198!--             Interpolate eddy diffusivities on staggered gridpoints
199                kmzp = 0.25 * &
200                       ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
201                kmzm = 0.25 * &
202                       ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
203
204                tend(k,j,i) = tend(k,j,i)                                    &
205                      & - ( kmzm * ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
206                      &   ) * ddzw(k)                                        &
207                      & + ( -uswst(j,i)                                      &
208                      &   - kmzm * ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
209                      &   ) * ddzw(k)
210             ENDIF
211
212          ENDDO
213       ENDDO
214
215    END SUBROUTINE diffusion_u
216
217
218!------------------------------------------------------------------------------!
219! Call for grid point i,j
220!------------------------------------------------------------------------------!
221    SUBROUTINE diffusion_u_ij( i, j )
222
223       USE arrays_3d
224       USE control_parameters
225       USE grid_variables
226       USE indices
227
228       IMPLICIT NONE
229
230       INTEGER ::  i, j, k
231       REAL    ::  kmym, kmyp, kmzm, kmzp
232
233       REAL, DIMENSION(nzb:nzt+1) ::  usvs
234
235!
236!--    Compute horizontal diffusion
237       DO  k = nzb_u_outer(j,i)+1, nzt
238!
239!--       Interpolate eddy diffusivities on staggered gridpoints
240          kmyp = 0.25 * ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
241          kmym = 0.25 * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
242
243          tend(k,j,i) = tend(k,j,i)                                          &
244                      & + 2.0 * (                                            &
245                      &           km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )  &
246                      &         - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )  &
247                      &         ) * ddx2                                     &
248                      & + ( kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy       &
249                      &   + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx       &
250                      &   - kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy           &
251                      &   - kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx           &
252                      &   ) * ddy
253       ENDDO
254
255!
256!--    Wall functions at the north and south walls, respectively
257       IF ( wall_u(j,i) .NE. 0.0 )  THEN
258
259!
260!--       Calculate the horizontal momentum flux u'v'
261          CALL wall_fluxes( i, j, nzb_u_inner(j,i)+1, nzb_u_outer(j,i),  &
262                            usvs, 1.0, 0.0, 0.0, 0.0 )
263
264          DO  k = nzb_u_inner(j,i)+1, nzb_u_outer(j,i)
265             kmyp = 0.25 * ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
266             kmym = 0.25 * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
267
268             tend(k,j,i) = tend(k,j,i)                                         &
269                                 + 2.0 * (                                     &
270                                       km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i) ) &
271                                     - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) &
272                                         ) * ddx2                              &
273                                 + (   fyp(j,i) * (                            &
274                                  kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy   &
275                                + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx   &
276                                                  )                            &
277                                     - fym(j,i) * (                            &
278                                  kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
279                                + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
280                                                  )                            &
281                                     + wall_u(j,i) * usvs(k)                   &
282                                   ) * ddy
283          ENDDO
284       ENDIF
285
286!
287!--    Compute vertical diffusion. In case of simulating a Prandtl layer,
288!--    index k starts at nzb_u_inner+2.
289       DO  k = nzb_diff_u(j,i), nzt_diff
290!
291!--       Interpolate eddy diffusivities on staggered gridpoints
292          kmzp = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
293          kmzm = 0.25 * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
294
295          tend(k,j,i) = tend(k,j,i)                                          &
296                      & + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1) &
297                      &            + ( w(k,j,i)   - w(k,j,i-1) ) * ddx       &
298                      &            )                                         &
299                      &   - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k) &
300                      &            + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx     &
301                      &            )                                         &
302                      &   ) * ddzw(k)
303       ENDDO
304
305!
306!--    Vertical diffusion at the first grid point above the surface, if the
307!--    momentum flux at the bottom is given by the Prandtl law or if it is
308!--    prescribed by the user.
309!--    Difference quotient of the momentum flux is not formed over half of
310!--    the grid spacing (2.0*ddzw(k)) any more, since the comparison with
311!--    other (LES) modell showed that the values of the momentum flux becomes
312!--    too large in this case.
313!--    The term containing w(k-1,..) (see above equation) is removed here
314!--    because the vertical velocity is assumed to be zero at the surface.
315       IF ( use_surface_fluxes )  THEN
316          k = nzb_u_inner(j,i)+1
317!
318!--       Interpolate eddy diffusivities on staggered gridpoints
319          kmzp = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
320          kmzm = 0.25 * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
321
322          tend(k,j,i) = tend(k,j,i)                                          &
323                      & + ( kmzp * ( w(k,j,i)   - w(k,j,i-1)   ) * ddx       &
324                      &   ) * ddzw(k)                                        &
325                      & + ( kmzp * ( u(k+1,j,i) - u(k,j,i)     ) * ddzu(k+1) &
326                      &   + usws(j,i)                                        &
327                      &   ) * ddzw(k)
328       ENDIF
329
330!
331!--    Vertical diffusion at the first gridpoint below the top boundary,
332!--    if the momentum flux at the top is prescribed by the user
333       IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
334          k = nzt
335!
336!--       Interpolate eddy diffusivities on staggered gridpoints
337          kmzp = 0.25 * &
338                 ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
339          kmzm = 0.25 * &
340                 ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
341
342          tend(k,j,i) = tend(k,j,i)                                          &
343                      & - ( kmzm * ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
344                      &   ) * ddzw(k)                                        &
345                      & + ( -uswst(j,i)                                      &
346                      &   - kmzm * ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
347                      &   ) * ddzw(k)
348       ENDIF
349
350    END SUBROUTINE diffusion_u_ij
351
352 END MODULE diffusion_u_mod
Note: See TracBrowser for help on using the repository browser.