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

Last change on this file since 4180 was 4180, checked in by scharf, 22 months ago

removed comments in 'Former revisions' section that are older than 01.01.2019

  • Property svn:keywords set to Id
File size: 24.0 KB
Line 
1!> @file diffusion_u.f90
2!------------------------------------------------------------------------------!
3! This file is part of the PALM model system.
4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! 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-2019 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: diffusion_u.f90 4180 2019-08-21 14:37:54Z scharf $
27! OpenACC port for SPEC
28!
29!
30! Description:
31! ------------
32!> Diffusion term of the u-component
33!> @todo additional damping (needed for non-cyclic bc) causes bad vectorization
34!>       and slows down the speed on NEC about 5-10%
35!------------------------------------------------------------------------------!
36 MODULE diffusion_u_mod
37 
38
39    PRIVATE
40    PUBLIC diffusion_u
41
42    INTERFACE diffusion_u
43       MODULE PROCEDURE diffusion_u
44       MODULE PROCEDURE diffusion_u_ij
45    END INTERFACE diffusion_u
46
47 CONTAINS
48
49
50!------------------------------------------------------------------------------!
51! Description:
52! ------------
53!> Call for all grid points
54!------------------------------------------------------------------------------!
55    SUBROUTINE diffusion_u
56
57       USE arrays_3d,                                                          &
58           ONLY:  ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw
59       
60       USE control_parameters,                                                 &
61           ONLY:  constant_top_momentumflux, use_surface_fluxes,               &
62                  use_top_fluxes
63       
64       USE grid_variables,                                                     &
65           ONLY:  ddx, ddx2, ddy
66       
67       USE indices,                                                            &
68           ONLY:  nxlu, nxr, nyn, nys, nzb, nzt, wall_flags_0
69     
70       USE kinds
71
72       USE surface_mod,                                                        &
73           ONLY :  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, &
74                   surf_usm_v
75
76       IMPLICIT NONE
77
78       INTEGER(iwp) ::  i             !< running index x direction
79       INTEGER(iwp) ::  j             !< running index y direction
80       INTEGER(iwp) ::  k             !< running index z direction
81       INTEGER(iwp) ::  l             !< running index of surface type, south- or north-facing wall
82       INTEGER(iwp) ::  m             !< running index surface elements
83       INTEGER(iwp) ::  surf_e        !< end index of surface elements at (j,i)-gridpoint
84       INTEGER(iwp) ::  surf_s        !< start index of surface elements at (j,i)-gridpoint
85
86       REAL(wp)     ::  flag          !< flag to mask topography grid points
87       REAL(wp)     ::  kmym          !< diffusion coefficient on southward side of the u-gridbox - interpolated onto xu-yv grid
88       REAL(wp)     ::  kmyp          !< diffusion coefficient on northward side of the u-gridbox - interpolated onto xu-yv grid
89       REAL(wp)     ::  kmzm          !< diffusion coefficient on bottom of the gridbox - interpolated onto xu-zw grid
90       REAL(wp)     ::  kmzp          !< diffusion coefficient on top of the gridbox - interpolated onto xu-zw grid
91       REAL(wp)     ::  mask_bottom   !< flag to mask vertical upward-facing surface       
92       REAL(wp)     ::  mask_north    !< flag to mask vertical surface north of the grid point
93       REAL(wp)     ::  mask_south    !< flag to mask vertical surface south of the grid point
94       REAL(wp)     ::  mask_top      !< flag to mask vertical downward-facing surface
95
96
97
98       !$ACC PARALLEL LOOP COLLAPSE(2) PRIVATE(i, j, k, l, m) &
99       !$ACC PRIVATE(surf_e, surf_s, flag, kmym, kmyp, kmzm, kmzp) &
100       !$ACC PRIVATE(mask_bottom, mask_north, mask_south, mask_top) &
101       !$ACC PRESENT(wall_flags_0, km) &
102       !$ACC PRESENT(u, v, w) &
103       !$ACC PRESENT(ddzu, ddzw, drho_air, rho_air_zw) &
104       !$ACC PRESENT(surf_def_h(0:2), surf_def_v(0:1)) &
105       !$ACC PRESENT(surf_lsm_h, surf_lsm_v(0:1)) &
106       !$ACC PRESENT(surf_usm_h, surf_usm_v(0:1)) &
107       !$ACC PRESENT(tend)
108       DO  i = nxlu, nxr
109          DO  j = nys, nyn
110!
111!--          Compute horizontal diffusion
112             DO  k = nzb+1, nzt
113!
114!--             Predetermine flag to mask topography and wall-bounded grid points.
115!--             It is sufficient to masked only north- and south-facing surfaces, which
116!--             need special treatment for the u-component.
117                flag       = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i),   1 ) ) 
118                mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j-1,i), 1 ) )
119                mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j+1,i), 1 ) )
120!
121!--             Interpolate eddy diffusivities on staggered gridpoints
122                kmyp = 0.25_wp *                                               &
123                       ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
124                kmym = 0.25_wp *                                               &
125                       ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
126
127                tend(k,j,i) = tend(k,j,i)                                      &
128                        + 2.0_wp * (                                           &
129                                  km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )    &
130                                - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )    &
131                                   ) * ddx2 * flag                             &
132                        +          ( mask_north * (                            &
133                            kmyp * ( u(k,j+1,i) - u(k,j,i)     ) * ddy         &
134                          + kmyp * ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx         &
135                                                  )                            &
136                                   - mask_south * (                            &
137                            kmym * ( u(k,j,i) - u(k,j-1,i) ) * ddy             &
138                          + kmym * ( v(k,j,i) - v(k,j,i-1) ) * ddx             &
139                                                  )                            &
140                                   ) * ddy  * flag                             
141             ENDDO
142!
143!--          Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1)
144!--          surfaces. Note, in the the flat case, loops won't be entered as
145!--          start_index > end_index. Furtermore, note, no vertical natural surfaces
146!--          so far.           
147!--          Default-type surfaces
148             DO  l = 0, 1
149                surf_s = surf_def_v(l)%start_index(j,i)
150                surf_e = surf_def_v(l)%end_index(j,i)
151                DO  m = surf_s, surf_e
152                   k           = surf_def_v(l)%k(m)
153                   tend(k,j,i) = tend(k,j,i) +                                 &                   
154                                    surf_def_v(l)%mom_flux_uv(m) * ddy
155                ENDDO   
156             ENDDO
157!
158!--          Natural-type surfaces
159             DO  l = 0, 1
160                surf_s = surf_lsm_v(l)%start_index(j,i)
161                surf_e = surf_lsm_v(l)%end_index(j,i)
162                DO  m = surf_s, surf_e
163                   k           = surf_lsm_v(l)%k(m)
164                   tend(k,j,i) = tend(k,j,i) +                                 &                   
165                                    surf_lsm_v(l)%mom_flux_uv(m) * ddy
166                ENDDO   
167             ENDDO
168!
169!--          Urban-type surfaces
170             DO  l = 0, 1
171                surf_s = surf_usm_v(l)%start_index(j,i)
172                surf_e = surf_usm_v(l)%end_index(j,i)
173                DO  m = surf_s, surf_e
174                   k           = surf_usm_v(l)%k(m)
175                   tend(k,j,i) = tend(k,j,i) +                                 &                   
176                                    surf_usm_v(l)%mom_flux_uv(m) * ddy
177                ENDDO   
178             ENDDO
179
180!
181!--          Compute vertical diffusion. In case of simulating a surface layer,
182!--          respective grid diffusive fluxes are masked (flag 8) within this
183!--          loop, and added further below, else, simple gradient approach is
184!--          applied. Model top is also mask if top-momentum flux is given.
185             DO  k = nzb+1, nzt
186!
187!--             Determine flags to mask topography below and above. Flag 1 is
188!--             used to mask topography in general, and flag 8 implies
189!--             information about use_surface_fluxes. Flag 9 is used to control
190!--             momentum flux at model top. 
191                mask_bottom = MERGE( 1.0_wp, 0.0_wp,                           &
192                                     BTEST( wall_flags_0(k-1,j,i), 8 ) ) 
193                mask_top    = MERGE( 1.0_wp, 0.0_wp,                           &
194                                     BTEST( wall_flags_0(k+1,j,i), 8 ) ) *     &
195                              MERGE( 1.0_wp, 0.0_wp,                           &
196                                     BTEST( wall_flags_0(k+1,j,i), 9 ) ) 
197                flag        = MERGE( 1.0_wp, 0.0_wp,                           &
198                                     BTEST( wall_flags_0(k,j,i), 1 ) ) 
199!
200!--             Interpolate eddy diffusivities on staggered gridpoints
201                kmzp = 0.25_wp *                                               &
202                       ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
203                kmzm = 0.25_wp *                                               &
204                       ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
205
206                tend(k,j,i) = tend(k,j,i)                                      &
207                        + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)   &
208                                   + ( w(k,j,i)   - w(k,j,i-1) ) * ddx         &
209                                   ) * rho_air_zw(k)   * mask_top              &
210                          - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
211                                   + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
212                                   ) * rho_air_zw(k-1) * mask_bottom           &
213                          ) * ddzw(k) * drho_air(k) * flag
214             ENDDO
215
216!
217!--          Vertical diffusion at the first grid point above the surface,
218!--          if the momentum flux at the bottom is given by the Prandtl law or
219!--          if it is prescribed by the user.
220!--          Difference quotient of the momentum flux is not formed over half
221!--          of the grid spacing (2.0*ddzw(k)) any more, since the comparison
222!--          with other (LES) models showed that the values of the momentum
223!--          flux becomes too large in this case.
224!--          The term containing w(k-1,..) (see above equation) is removed here
225!--          because the vertical velocity is assumed to be zero at the surface.
226             IF ( use_surface_fluxes )  THEN
227!
228!--             Default-type surfaces, upward-facing
229                surf_s = surf_def_h(0)%start_index(j,i)
230                surf_e = surf_def_h(0)%end_index(j,i)
231                DO  m = surf_s, surf_e
232
233                   k   = surf_def_h(0)%k(m)
234
235                   tend(k,j,i) = tend(k,j,i)                                   &
236                        + ( - ( - surf_def_h(0)%usws(m) )                      &
237                          ) * ddzw(k) * drho_air(k)
238                ENDDO
239!
240!--             Default-type surfaces, dowward-facing
241                surf_s = surf_def_h(1)%start_index(j,i)
242                surf_e = surf_def_h(1)%end_index(j,i)
243                DO  m = surf_s, surf_e
244
245                   k   = surf_def_h(1)%k(m)
246
247                   tend(k,j,i) = tend(k,j,i)                                   &
248                        + ( - surf_def_h(1)%usws(m)                            &
249                          ) * ddzw(k) * drho_air(k)
250                ENDDO
251!
252!--             Natural-type surfaces, upward-facing
253                surf_s = surf_lsm_h%start_index(j,i)
254                surf_e = surf_lsm_h%end_index(j,i)
255                DO  m = surf_s, surf_e
256
257                   k   = surf_lsm_h%k(m)
258
259                   tend(k,j,i) = tend(k,j,i)                                   &
260                        + ( - ( - surf_lsm_h%usws(m) )                         &
261                          ) * ddzw(k) * drho_air(k)
262                ENDDO
263!
264!--             Urban-type surfaces, upward-facing
265                surf_s = surf_usm_h%start_index(j,i)
266                surf_e = surf_usm_h%end_index(j,i)
267                DO  m = surf_s, surf_e
268
269                   k   = surf_usm_h%k(m)
270
271                   tend(k,j,i) = tend(k,j,i)                                   &
272                       + ( - ( - surf_usm_h%usws(m) )                          &
273                         ) * ddzw(k) * drho_air(k)
274                ENDDO
275
276             ENDIF
277!
278!--          Add momentum flux at model top
279             IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
280                surf_s = surf_def_h(2)%start_index(j,i)
281                surf_e = surf_def_h(2)%end_index(j,i)
282                DO  m = surf_s, surf_e
283
284                   k   = surf_def_h(2)%k(m)
285
286                   tend(k,j,i) = tend(k,j,i)                                   &
287                        + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k)
288                ENDDO
289             ENDIF
290
291          ENDDO
292       ENDDO
293
294    END SUBROUTINE diffusion_u
295
296
297!------------------------------------------------------------------------------!
298! Description:
299! ------------
300!> Call for grid point i,j
301!------------------------------------------------------------------------------!
302    SUBROUTINE diffusion_u_ij( i, j )
303
304       USE arrays_3d,                                                          &
305           ONLY:  ddzu, ddzw, km, tend, u, v, w, drho_air, rho_air_zw
306       
307       USE control_parameters,                                                 &
308           ONLY:  constant_top_momentumflux, use_surface_fluxes,               &
309                  use_top_fluxes
310       
311       USE grid_variables,                                                     &
312           ONLY:  ddx, ddx2, ddy
313       
314       USE indices,                                                            &
315           ONLY:  nzb, nzt, wall_flags_0
316     
317       USE kinds
318
319       USE surface_mod,                                                        &
320           ONLY :  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v, surf_usm_h, &
321                   surf_usm_v
322
323       IMPLICIT NONE
324
325       INTEGER(iwp) ::  i             !< running index x direction
326       INTEGER(iwp) ::  j             !< running index y direction
327       INTEGER(iwp) ::  k             !< running index z direction
328       INTEGER(iwp) ::  l             !< running index of surface type, south- or north-facing wall
329       INTEGER(iwp) ::  m             !< running index surface elements
330       INTEGER(iwp) ::  surf_e        !< End index of surface elements at (j,i)-gridpoint
331       INTEGER(iwp) ::  surf_s        !< Start index of surface elements at (j,i)-gridpoint
332
333       REAL(wp)     ::  flag          !< flag to mask topography grid points
334       REAL(wp)     ::  kmym          !< diffusion coefficient on southward side of the u-gridbox - interpolated onto xu-yv grid
335       REAL(wp)     ::  kmyp          !<diffusion coefficient on northward side of the u-gridbox - interpolated onto xu-yv grid
336       REAL(wp)     ::  kmzm          !< diffusion coefficient on bottom of the gridbox - interpolated onto xu-zw grid
337       REAL(wp)     ::  kmzp          !< diffusion coefficient on top of the gridbox - interpolated onto xu-zw grid
338       REAL(wp)     ::  mask_bottom   !< flag to mask vertical upward-facing surface       
339       REAL(wp)     ::  mask_north    !< flag to mask vertical surface north of the grid point
340       REAL(wp)     ::  mask_south    !< flag to mask vertical surface south of the grid point
341       REAL(wp)     ::  mask_top      !< flag to mask vertical downward-facing surface
342!
343!--    Compute horizontal diffusion
344       DO  k = nzb+1, nzt
345!
346!--       Predetermine flag to mask topography and wall-bounded grid points.
347!--       It is sufficient to masked only north- and south-facing surfaces, which
348!--       need special treatment for the u-component.
349          flag       = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j,i),   1 ) ) 
350          mask_south = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j-1,i), 1 ) )
351          mask_north = MERGE( 1.0_wp, 0.0_wp, BTEST( wall_flags_0(k,j+1,i), 1 ) )
352!
353!--       Interpolate eddy diffusivities on staggered gridpoints
354          kmyp = 0.25_wp * ( km(k,j,i)+km(k,j+1,i)+km(k,j,i-1)+km(k,j+1,i-1) )
355          kmym = 0.25_wp * ( km(k,j,i)+km(k,j-1,i)+km(k,j,i-1)+km(k,j-1,i-1) )
356
357          tend(k,j,i) = tend(k,j,i)                                            &
358                       + 2.0_wp * (                                            &
359                                 km(k,j,i)   * ( u(k,j,i+1) - u(k,j,i)   )     &
360                               - km(k,j,i-1) * ( u(k,j,i)   - u(k,j,i-1) )     &
361                                   ) * ddx2 * flag                             &
362                                 + (                                           &
363                  mask_north * kmyp * ( ( u(k,j+1,i) - u(k,j,i)     ) * ddy    &
364                                      + ( v(k,j+1,i) - v(k,j+1,i-1) ) * ddx    &
365                                      )                                        &
366                - mask_south * kmym * ( ( u(k,j,i)   - u(k,j-1,i)   ) * ddy    &
367                                      + ( v(k,j,i)   - v(k,j,i-1)   ) * ddx    &
368                                      )                                        &
369                                   ) * ddy  * flag
370       ENDDO
371
372!
373!--    Add horizontal momentum flux u'v' at north- (l=0) and south-facing (l=1)
374!--    surfaces. Note, in the the flat case, loops won't be entered as
375!--    start_index > end_index. Furtermore, note, no vertical natural surfaces
376!--    so far.           
377!--    Default-type surfaces
378       DO  l = 0, 1
379          surf_s = surf_def_v(l)%start_index(j,i)
380          surf_e = surf_def_v(l)%end_index(j,i)
381          DO  m = surf_s, surf_e
382             k           = surf_def_v(l)%k(m)
383             tend(k,j,i) = tend(k,j,i) + surf_def_v(l)%mom_flux_uv(m) * ddy
384          ENDDO   
385       ENDDO
386!
387!--    Natural-type surfaces
388       DO  l = 0, 1
389          surf_s = surf_lsm_v(l)%start_index(j,i)
390          surf_e = surf_lsm_v(l)%end_index(j,i)
391          DO  m = surf_s, surf_e
392             k           = surf_lsm_v(l)%k(m)
393             tend(k,j,i) = tend(k,j,i) + surf_lsm_v(l)%mom_flux_uv(m) * ddy
394          ENDDO   
395       ENDDO
396!
397!--    Urban-type surfaces
398       DO  l = 0, 1
399          surf_s = surf_usm_v(l)%start_index(j,i)
400          surf_e = surf_usm_v(l)%end_index(j,i)
401          DO  m = surf_s, surf_e
402             k           = surf_usm_v(l)%k(m)
403             tend(k,j,i) = tend(k,j,i) + surf_usm_v(l)%mom_flux_uv(m) * ddy
404          ENDDO   
405       ENDDO
406!
407!--    Compute vertical diffusion. In case of simulating a surface layer,
408!--    respective grid diffusive fluxes are masked (flag 8) within this
409!--    loop, and added further below, else, simple gradient approach is
410!--    applied. Model top is also mask if top-momentum flux is given.
411       DO  k = nzb+1, nzt
412!
413!--       Determine flags to mask topography below and above. Flag 1 is
414!--       used to mask topography in general, and flag 8 implies
415!--       information about use_surface_fluxes. Flag 9 is used to control
416!--       momentum flux at model top.
417          mask_bottom = MERGE( 1.0_wp, 0.0_wp,                                 &
418                               BTEST( wall_flags_0(k-1,j,i), 8 ) ) 
419          mask_top    = MERGE( 1.0_wp, 0.0_wp,                                 &
420                               BTEST( wall_flags_0(k+1,j,i), 8 ) ) *           &
421                        MERGE( 1.0_wp, 0.0_wp,                                 &
422                               BTEST( wall_flags_0(k+1,j,i), 9 ) )
423          flag        = MERGE( 1.0_wp, 0.0_wp,                                 &
424                               BTEST( wall_flags_0(k,j,i), 1 ) ) 
425!
426!--       Interpolate eddy diffusivities on staggered gridpoints
427          kmzp = 0.25_wp * ( km(k,j,i)+km(k+1,j,i)+km(k,j,i-1)+km(k+1,j,i-1) )
428          kmzm = 0.25_wp * ( km(k,j,i)+km(k-1,j,i)+km(k,j,i-1)+km(k-1,j,i-1) )
429
430          tend(k,j,i) = tend(k,j,i)                                            &
431                        + ( kmzp * ( ( u(k+1,j,i) - u(k,j,i)   ) * ddzu(k+1)   &
432                                   + ( w(k,j,i)   - w(k,j,i-1) ) * ddx         &
433                                   ) * rho_air_zw(k)   * mask_top              &
434                          - kmzm * ( ( u(k,j,i)   - u(k-1,j,i)   ) * ddzu(k)   &
435                                   + ( w(k-1,j,i) - w(k-1,j,i-1) ) * ddx       &
436                                   ) * rho_air_zw(k-1) * mask_bottom           &
437                          ) * ddzw(k) * drho_air(k) * flag
438       ENDDO
439
440!
441!--    Vertical diffusion at the first surface grid points, if the
442!--    momentum flux at the bottom is given by the Prandtl law or if it is
443!--    prescribed by the user.
444!--    Difference quotient of the momentum flux is not formed over half of
445!--    the grid spacing (2.0*ddzw(k)) any more, since the comparison with
446!--    other (LES) models showed that the values of the momentum flux becomes
447!--    too large in this case.
448       IF ( use_surface_fluxes )  THEN
449!
450!--       Default-type surfaces, upward-facing
451          surf_s = surf_def_h(0)%start_index(j,i)
452          surf_e = surf_def_h(0)%end_index(j,i)
453          DO  m = surf_s, surf_e
454
455             k   = surf_def_h(0)%k(m)
456
457             tend(k,j,i) = tend(k,j,i)                                         &
458                        + ( - ( - surf_def_h(0)%usws(m) )                      &
459                          ) * ddzw(k) * drho_air(k)
460          ENDDO
461!
462!--       Default-type surfaces, dowward-facing (except for model-top fluxes)
463          surf_s = surf_def_h(1)%start_index(j,i)
464          surf_e = surf_def_h(1)%end_index(j,i)
465          DO  m = surf_s, surf_e
466
467             k   = surf_def_h(1)%k(m)
468
469             tend(k,j,i) = tend(k,j,i)                                         &
470                        + ( - surf_def_h(1)%usws(m)                            &
471                          ) * ddzw(k) * drho_air(k)
472          ENDDO
473!
474!--       Natural-type surfaces, upward-facing
475          surf_s = surf_lsm_h%start_index(j,i)
476          surf_e = surf_lsm_h%end_index(j,i)
477          DO  m = surf_s, surf_e
478
479             k   = surf_lsm_h%k(m)
480
481             tend(k,j,i) = tend(k,j,i)                                         &
482                        + ( - ( - surf_lsm_h%usws(m) )                         &
483                          ) * ddzw(k) * drho_air(k)
484          ENDDO
485!
486!--       Urban-type surfaces, upward-facing
487          surf_s = surf_usm_h%start_index(j,i)
488          surf_e = surf_usm_h%end_index(j,i)
489          DO  m = surf_s, surf_e
490
491             k   = surf_usm_h%k(m)
492
493             tend(k,j,i) = tend(k,j,i)                                         &
494                       + ( - ( - surf_usm_h%usws(m) )                          &
495                         ) * ddzw(k) * drho_air(k)
496          ENDDO
497
498       ENDIF
499!
500!--    Add momentum flux at model top
501       IF ( use_top_fluxes  .AND.  constant_top_momentumflux )  THEN
502          surf_s = surf_def_h(2)%start_index(j,i)
503          surf_e = surf_def_h(2)%end_index(j,i)
504          DO  m = surf_s, surf_e
505
506             k   = surf_def_h(2)%k(m)
507
508             tend(k,j,i) = tend(k,j,i)                                         &
509                           + ( - surf_def_h(2)%usws(m) ) * ddzw(k) * drho_air(k)
510          ENDDO
511       ENDIF
512
513
514    END SUBROUTINE diffusion_u_ij
515
516 END MODULE diffusion_u_mod
Note: See TracBrowser for help on using the repository browser.