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

Last change on this file since 1257 was 1257, checked in by raasch, 10 years ago

New:
---

openACC porting of timestep calculation
(modules, timestep, time_integration)

Changed:


openACC loop directives and vector clauses removed (because they do not give any performance improvement with PGI
compiler versions > 13.6)
(advec_ws, buoyancy, coriolis, diffusion_e, diffusion_s, diffusion_u, diffusion_v, diffusion_w, diffusivities, exchange_horiz, fft_xy, pres, production_e, transpose, tridia_solver, wall_fluxes)

openACC loop independent clauses added
(boundary_conds, prandtl_fluxes, pres)

openACC declare create statements moved after FORTRAN declaration statement
(diffusion_u, diffusion_v, diffusion_w, fft_xy, poisfft, production_e, tridia_solver)

openACC end parallel replaced by end parallel loop
(flow_statistics, pres)

openACC "kernels do" replaced by "kernels loop"
(prandtl_fluxes)

output format for theta* changed to avoid output of *
(run_control)

Errors:


bugfix for calculation of advective timestep (old version may cause wrong timesteps in case of
vertixcally stretched grids)
Attention: standard run-control output has changed!
(timestep)

  • Property svn:keywords set to Id
File size: 24.3 KB
Line 
1 MODULE diffusion_u_mod
2
3!--------------------------------------------------------------------------------!
4! This file is part of PALM.
5!
6! PALM is free software: you can redistribute it and/or modify it under the terms
7! of the GNU General Public License as published by the Free Software Foundation,
8! either version 3 of the License, or (at your option) any later version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2012  Leibniz University Hannover
18!--------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22! openacc loop and loop vector clauses removed, declare create moved after
23! the FORTRAN declaration statement
24!
25! Former revisions:
26! -----------------
27! $Id: diffusion_u.f90 1257 2013-11-08 15:18:40Z raasch $
28!
29! 1128 2013-04-12 06:19:32Z raasch
30! loop index bounds in accelerator version replaced by i_left, i_right, j_south,
31! j_north
32!
33! 1036 2012-10-22 13:43:42Z raasch
34! code put under GPL (PALM 3.9)
35!
36! 1015 2012-09-27 09:23:24Z raasch
37! accelerator version (*_acc) added
38!
39! 1001 2012-09-13 14:08:46Z raasch
40! arrays comunicated by module instead of parameter list
41!
42! 978 2012-08-09 08:28:32Z fricke
43! outflow damping layer removed
44! kmym_x/_y and kmyp_x/_y change to kmym and kmyp
45!
46! 667 2010-12-23 12:06:00Z suehring/gryschka
47! nxl-1, nxr+1, nys-1, nyn+1 replaced by nxlg, nxrg, nysg, nyng
48!
49! 366 2009-08-25 08:06:27Z raasch
50! bc_ns replaced by bc_ns_cyc
51!
52! 106 2007-08-16 14:30:26Z raasch
53! Momentumflux at top (uswst) included as boundary condition,
54! i loop is starting from nxlu (needed for non-cyclic boundary conditions)
55!
56! 75 2007-03-22 09:54:05Z raasch
57! Wall functions now include diabatic conditions, call of routine wall_fluxes,
58! z0 removed from argument list, uxrp eliminated
59!
60! 20 2007-02-26 00:12:32Z raasch
61! Bugfix: ddzw dimensioned 1:nzt"+1"
62!
63! RCS Log replace by Id keyword, revision history cleaned up
64!
65! Revision 1.15  2006/02/23 10:35:35  raasch
66! nzb_2d replaced by nzb_u_outer in horizontal diffusion and by nzb_u_inner
67! or nzb_diff_u, respectively, in vertical diffusion,
68! wall functions added for north and south walls, +z0 in argument list,
69! terms containing w(k-1,..) are removed from the Prandtl-layer equation
70! because they cause errors at the edges of topography
71! WARNING: loops containing the MAX function are still not properly vectorized!
72!
73! Revision 1.1  1997/09/12 06:23:51  raasch
74! Initial revision
75!
76!
77! Description:
78! ------------
79! Diffusion term of the u-component
80! To do: additional damping (needed for non-cyclic bc) causes bad vectorization
81!        and slows down the speed on NEC about 5-10%
82!------------------------------------------------------------------------------!
83
84    USE wall_fluxes_mod
85
86    PRIVATE
87    PUBLIC diffusion_u, diffusion_u_acc
88
89    INTERFACE diffusion_u
90       MODULE PROCEDURE diffusion_u
91       MODULE PROCEDURE diffusion_u_ij
92    END INTERFACE diffusion_u
93
94    INTERFACE diffusion_u_acc
95       MODULE PROCEDURE diffusion_u_acc
96    END INTERFACE diffusion_u_acc
97
98 CONTAINS
99
100
101!------------------------------------------------------------------------------!
102! Call for all grid points
103!------------------------------------------------------------------------------!
104    SUBROUTINE diffusion_u
105
106       USE arrays_3d
107       USE control_parameters
108       USE grid_variables
109       USE indices
110
111       IMPLICIT NONE
112
113       INTEGER ::  i, j, k
114       REAL    ::  kmym, kmyp, kmzm, kmzp
115
116       REAL, DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  usvs
117
118!
119!--    First calculate horizontal momentum flux u'v' at vertical walls,
120!--    if neccessary
121       IF ( topography /= 'flat' )  THEN
122          CALL wall_fluxes( usvs, 1.0, 0.0, 0.0, 0.0, nzb_u_inner, &
123                            nzb_u_outer, wall_u )
124       ENDIF
125
126       DO  i = nxlu, nxr
127          DO  j = nys, nyn
128!
129!--          Compute horizontal diffusion
130             DO  k = nzb_u_outer(j,i)+1, nzt
131!
132!--             Interpolate eddy diffusivities on staggered gridpoints
133                kmyp = 0.25 * &
134                       ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
135                kmym = 0.25 * &
136                       ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
137
138                tend(k,j,i) = tend(k,j,i)                                    &
139                      & + 2.0 * (                                            &
140                      &           km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )  &
141                      &         - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )  &
142                      &         ) * ddx2                                     &
143                      & + ( kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy       &
144                      &   + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx       &
145                      &   - kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy           &
146                      &   - kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx           &
147                      &   ) * ddy
148             ENDDO
149
150!
151!--          Wall functions at the north and south walls, respectively
152             IF ( wall_u(j,i) /= 0.0 )  THEN
153
154                DO  k = nzb_u_inner(j,i)+1, nzb_u_outer(j,i)
155                   kmyp = 0.25 * &
156                          ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
157                   kmym = 0.25 * &
158                          ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
159
160                   tend(k,j,i) = tend(k,j,i)                                   &
161                                 + 2.0 * (                                     &
162                                       km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i) ) &
163                                     - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) &
164                                         ) * ddx2                              &
165                                 + (   fyp(j,i) * (                            &
166                                  kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy   &
167                                + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx   &
168                                                  )                            &
169                                     - fym(j,i) * (                            &
170                                  kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
171                                + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
172                                                  )                            &
173                                     + wall_u(j,i) * usvs(k,j,i)               &
174                                   ) * ddy
175                ENDDO
176             ENDIF
177
178!
179!--          Compute vertical diffusion. In case of simulating a Prandtl layer,
180!--          index k starts at nzb_u_inner+2.
181             DO  k = nzb_diff_u(j,i), nzt_diff
182!
183!--             Interpolate eddy diffusivities on staggered gridpoints
184                kmzp = 0.25 * &
185                       ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
186                kmzm = 0.25 * &
187                       ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
188
189                tend(k,j,i) = tend(k,j,i)                                    &
190                      & + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1) &
191                      &            + ( w(k,j,i)   - w(k,j,i-1) ) * ddx       &
192                      &            )                                         &
193                      &   - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k) &
194                      &            + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx     &
195                      &            )                                          &
196                      &   ) * ddzw(k)
197             ENDDO
198
199!
200!--          Vertical diffusion at the first grid point above the surface,
201!--          if the momentum flux at the bottom is given by the Prandtl law or
202!--          if it is prescribed by the user.
203!--          Difference quotient of the momentum flux is not formed over half
204!--          of the grid spacing (2.0*ddzw(k)) any more, since the comparison
205!--          with other (LES) modell showed that the values of the momentum
206!--          flux becomes too large in this case.
207!--          The term containing w(k-1,..) (see above equation) is removed here
208!--          because the vertical velocity is assumed to be zero at the surface.
209             IF ( use_surface_fluxes )  THEN
210                k = nzb_u_inner(j,i)+1
211!
212!--             Interpolate eddy diffusivities on staggered gridpoints
213                kmzp = 0.25 * &
214                      ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
215                kmzm = 0.25 * &
216                      ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
217
218                tend(k,j,i) = tend(k,j,i)                                    &
219                      & + ( kmzp * ( w(k,j,i)   - w(k,j,i-1)   ) * ddx       &
220                      &   ) * ddzw(k)                                        &
221                      & + ( kmzp * ( u(k+1,j,i) - u(k,j,i)     ) * ddzu(k+1) &
222                      &   + usws(j,i)                                        &
223                      &   ) * ddzw(k)
224             ENDIF
225
226!
227!--          Vertical diffusion at the first gridpoint below the top boundary,
228!--          if the momentum flux at the top is prescribed by the user
229             IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
230                k = nzt
231!
232!--             Interpolate eddy diffusivities on staggered gridpoints
233                kmzp = 0.25 * &
234                       ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
235                kmzm = 0.25 * &
236                       ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
237
238                tend(k,j,i) = tend(k,j,i)                                    &
239                      & - ( kmzm * ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
240                      &   ) * ddzw(k)                                        &
241                      & + ( -uswst(j,i)                                      &
242                      &   - kmzm * ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
243                      &   ) * ddzw(k)
244             ENDIF
245
246          ENDDO
247       ENDDO
248
249    END SUBROUTINE diffusion_u
250
251
252!------------------------------------------------------------------------------!
253! Call for all grid points - accelerator version
254!------------------------------------------------------------------------------!
255    SUBROUTINE diffusion_u_acc
256
257       USE arrays_3d
258       USE control_parameters
259       USE grid_variables
260       USE indices
261
262       IMPLICIT NONE
263
264       INTEGER ::  i, j, k
265       REAL    ::  kmym, kmyp, kmzm, kmzp
266
267       REAL, DIMENSION(nzb:nzt+1,nys:nyn,nxl:nxr) ::  usvs
268       !$acc declare create ( usvs )
269
270!
271!--    First calculate horizontal momentum flux u'v' at vertical walls,
272!--    if neccessary
273       IF ( topography /= 'flat' )  THEN
274          CALL wall_fluxes_acc( usvs, 1.0, 0.0, 0.0, 0.0, nzb_u_inner, &
275                                nzb_u_outer, wall_u )
276       ENDIF
277
278       !$acc kernels present ( u, v, w, km, tend, usws, uswst )   &
279       !$acc         present ( ddzu, ddzw, fym, fyp, wall_u )           &
280       !$acc         present ( nzb_u_inner, nzb_u_outer, nzb_diff_u )
281       DO  i = i_left, i_right
282          DO  j = j_south, j_north
283!
284!--          Compute horizontal diffusion
285             DO  k = 1, nzt
286                IF ( k > nzb_u_outer(j,i) )  THEN
287!
288!--                Interpolate eddy diffusivities on staggered gridpoints
289                   kmyp = 0.25 * &
290                          ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
291                   kmym = 0.25 * &
292                          ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
293
294                   tend(k,j,i) = tend(k,j,i)                                   &
295                         & + 2.0 * (                                           &
296                         &           km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   ) &
297                         &         - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) ) &
298                         &         ) * ddx2                                    &
299                         & + ( kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy      &
300                         &   + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx      &
301                         &   - kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy          &
302                         &   - kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx          &
303                         &   ) * ddy
304                ENDIF
305             ENDDO
306
307!
308!--          Wall functions at the north and south walls, respectively
309             DO  k = 1, nzt
310                IF( k > nzb_u_inner(j,i)  .AND.  k <= nzb_u_outer(j,i)  .AND. &
311                    wall_u(j,i) /= 0.0 )  THEN
312
313                   kmyp = 0.25 * &
314                          ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
315                   kmym = 0.25 * &
316                          ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
317
318                   tend(k,j,i) = tend(k,j,i)                                   &
319                                 + 2.0 * (                                     &
320                                       km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i) ) &
321                                     - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) &
322                                         ) * ddx2                              &
323                                 + (   fyp(j,i) * (                            &
324                                  kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy   &
325                                + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx   &
326                                                  )                            &
327                                     - fym(j,i) * (                            &
328                                  kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
329                                + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
330                                                  )                            &
331                                     + wall_u(j,i) * usvs(k,j,i)               &
332                                   ) * ddy
333                ENDIF
334             ENDDO
335
336!
337!--          Compute vertical diffusion. In case of simulating a Prandtl layer,
338!--          index k starts at nzb_u_inner+2.
339             DO  k = 1, nzt_diff
340                IF ( k >= nzb_diff_u(j,i) )  THEN
341!
342!--                Interpolate eddy diffusivities on staggered gridpoints
343                   kmzp = 0.25 * &
344                          ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
345                   kmzm = 0.25 * &
346                          ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
347
348                   tend(k,j,i) = tend(k,j,i)                                   &
349                         & + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)&
350                         &            + ( w(k,j,i)   - w(k,j,i-1) ) * ddx      &
351                         &            )                                        &
352                         &   - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)&
353                         &            + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx    &
354                         &            )                                        &
355                         &   ) * ddzw(k)
356                ENDIF
357             ENDDO
358
359          ENDDO
360       ENDDO
361
362!
363!--    Vertical diffusion at the first grid point above the surface,
364!--    if the momentum flux at the bottom is given by the Prandtl law or
365!--    if it is prescribed by the user.
366!--    Difference quotient of the momentum flux is not formed over half
367!--    of the grid spacing (2.0*ddzw(k)) any more, since the comparison
368!--    with other (LES) modell showed that the values of the momentum
369!--    flux becomes too large in this case.
370!--    The term containing w(k-1,..) (see above equation) is removed here
371!--    because the vertical velocity is assumed to be zero at the surface.
372       IF ( use_surface_fluxes )  THEN
373
374          DO  i = i_left, i_right
375             DO  j = j_south, j_north
376         
377                k = nzb_u_inner(j,i)+1
378!
379!--             Interpolate eddy diffusivities on staggered gridpoints
380                kmzp = 0.25 * &
381                      ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
382                kmzm = 0.25 * &
383                      ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
384
385                tend(k,j,i) = tend(k,j,i)                                    &
386                      & + ( kmzp * ( w(k,j,i)   - w(k,j,i-1)   ) * ddx       &
387                      &   ) * ddzw(k)                                        &
388                      & + ( kmzp * ( u(k+1,j,i) - u(k,j,i)     ) * ddzu(k+1) &
389                      &   + usws(j,i)                                        &
390                      &   ) * ddzw(k)
391             ENDDO
392          ENDDO
393
394       ENDIF
395
396!
397!--    Vertical diffusion at the first gridpoint below the top boundary,
398!--    if the momentum flux at the top is prescribed by the user
399       IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
400
401          k = nzt
402
403          DO  i = i_left, i_right
404             DO  j = j_south, j_north
405
406!
407!--             Interpolate eddy diffusivities on staggered gridpoints
408                kmzp = 0.25 * &
409                       ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
410                kmzm = 0.25 * &
411                       ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
412
413                tend(k,j,i) = tend(k,j,i)                                    &
414                      & - ( kmzm * ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
415                      &   ) * ddzw(k)                                        &
416                      & + ( -uswst(j,i)                                      &
417                      &   - kmzm * ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
418                      &   ) * ddzw(k)
419             ENDDO
420          ENDDO
421
422       ENDIF
423       !$acc end kernels
424
425    END SUBROUTINE diffusion_u_acc
426
427
428!------------------------------------------------------------------------------!
429! Call for grid point i,j
430!------------------------------------------------------------------------------!
431    SUBROUTINE diffusion_u_ij( i, j )
432
433       USE arrays_3d
434       USE control_parameters
435       USE grid_variables
436       USE indices
437
438       IMPLICIT NONE
439
440       INTEGER ::  i, j, k
441       REAL    ::  kmym, kmyp, kmzm, kmzp
442
443       REAL, DIMENSION(nzb:nzt+1) ::  usvs
444
445!
446!--    Compute horizontal diffusion
447       DO  k = nzb_u_outer(j,i)+1, nzt
448!
449!--       Interpolate eddy diffusivities on staggered gridpoints
450          kmyp = 0.25 * ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
451          kmym = 0.25 * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
452
453          tend(k,j,i) = tend(k,j,i)                                          &
454                      & + 2.0 * (                                            &
455                      &           km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )  &
456                      &         - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )  &
457                      &         ) * ddx2                                     &
458                      & + ( kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy       &
459                      &   + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx       &
460                      &   - kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy           &
461                      &   - kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx           &
462                      &   ) * ddy
463       ENDDO
464
465!
466!--    Wall functions at the north and south walls, respectively
467       IF ( wall_u(j,i) .NE. 0.0 )  THEN
468
469!
470!--       Calculate the horizontal momentum flux u'v'
471          CALL wall_fluxes( i, j, nzb_u_inner(j,i)+1, nzb_u_outer(j,i),  &
472                            usvs, 1.0, 0.0, 0.0, 0.0 )
473
474          DO  k = nzb_u_inner(j,i)+1, nzb_u_outer(j,i)
475             kmyp = 0.25 * ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
476             kmym = 0.25 * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
477
478             tend(k,j,i) = tend(k,j,i)                                         &
479                                 + 2.0 * (                                     &
480                                       km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i) ) &
481                                     - km(k,j,i-1) * ( u(k,j,i) - u(k,j,i-1) ) &
482                                         ) * ddx2                              &
483                                 + (   fyp(j,i) * (                            &
484                                  kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy   &
485                                + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx   &
486                                                  )                            &
487                                     - fym(j,i) * (                            &
488                                  kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy       &
489                                + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx       &
490                                                  )                            &
491                                     + wall_u(j,i) * usvs(k)                   &
492                                   ) * ddy
493          ENDDO
494       ENDIF
495
496!
497!--    Compute vertical diffusion. In case of simulating a Prandtl layer,
498!--    index k starts at nzb_u_inner+2.
499       DO  k = nzb_diff_u(j,i), nzt_diff
500!
501!--       Interpolate eddy diffusivities on staggered gridpoints
502          kmzp = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
503          kmzm = 0.25 * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
504
505          tend(k,j,i) = tend(k,j,i)                                          &
506                      & + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1) &
507                      &            + ( w(k,j,i)   - w(k,j,i-1) ) * ddx       &
508                      &            )                                         &
509                      &   - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k) &
510                      &            + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx     &
511                      &            )                                         &
512                      &   ) * ddzw(k)
513       ENDDO
514
515!
516!--    Vertical diffusion at the first grid point above the surface, if the
517!--    momentum flux at the bottom is given by the Prandtl law or if it is
518!--    prescribed by the user.
519!--    Difference quotient of the momentum flux is not formed over half of
520!--    the grid spacing (2.0*ddzw(k)) any more, since the comparison with
521!--    other (LES) modell showed that the values of the momentum flux becomes
522!--    too large in this case.
523!--    The term containing w(k-1,..) (see above equation) is removed here
524!--    because the vertical velocity is assumed to be zero at the surface.
525       IF ( use_surface_fluxes )  THEN
526          k = nzb_u_inner(j,i)+1
527!
528!--       Interpolate eddy diffusivities on staggered gridpoints
529          kmzp = 0.25 * ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
530          kmzm = 0.25 * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
531
532          tend(k,j,i) = tend(k,j,i)                                          &
533                      & + ( kmzp * ( w(k,j,i)   - w(k,j,i-1)   ) * ddx       &
534                      &   ) * ddzw(k)                                        &
535                      & + ( kmzp * ( u(k+1,j,i) - u(k,j,i)     ) * ddzu(k+1) &
536                      &   + usws(j,i)                                        &
537                      &   ) * ddzw(k)
538       ENDIF
539
540!
541!--    Vertical diffusion at the first gridpoint below the top boundary,
542!--    if the momentum flux at the top is prescribed by the user
543       IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
544          k = nzt
545!
546!--       Interpolate eddy diffusivities on staggered gridpoints
547          kmzp = 0.25 * &
548                 ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
549          kmzm = 0.25 * &
550                 ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
551
552          tend(k,j,i) = tend(k,j,i)                                          &
553                      & - ( kmzm * ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
554                      &   ) * ddzw(k)                                        &
555                      & + ( -uswst(j,i)                                      &
556                      &   - kmzm * ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
557                      &   ) * ddzw(k)
558       ENDIF
559
560    END SUBROUTINE diffusion_u_ij
561
562 END MODULE diffusion_u_mod
Note: See TracBrowser for help on using the repository browser.