1 ! WRF:MODEL_LAYER:PHYSICS
3 MODULE module_diffusion_em
7 USE module_state_description
8 USE module_big_step_utilities_em
9 USE module_model_constants
14 !=======================================================================
15 !=======================================================================
17 SUBROUTINE cal_deform_and_div( config_flags, u, v, w, div, &
18 defor11, defor22, defor33, &
19 defor12, defor13, defor23, &
20 nba_rij, n_nba_rij, & !JDM
21 u_base, v_base, msfux, msfuy, &
22 msfvx, msfvy, msftx, msfty, &
23 rdx, rdy, dn, dnw, rdz, rdzw, &
24 fnm, fnp, cf1, cf2, cf3, zx, zy, &
25 ids, ide, jds, jde, kds, kde, &
26 ims, ime, jms, jme, kms, kme, &
27 its, ite, jts, jte, kts, kte )
29 ! History: Sep 2003 Changes by Jason Knievel and George Bryan, NCAR
30 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
33 ! Purpose: This routine calculates deformation and 3-d divergence.
35 ! References: Klemp and Wilhelmson (JAS 1978)
36 ! Chen and Dudhia (NCAR WRF physics report 2000)
38 !-----------------------------------------------------------------------
40 ! Equations 13a-f, Chen and Dudhia 2000, Appendix A:
41 ! Eqn 13a: D11=defor11= 2m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
42 ! Eqn 13b: D22=defor22= 2m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
43 ! Eqn 13c: D33=defor33= 2 * partial dw/dz [SIMPLER FORM]
44 ! Eqn 13d: D12=defor12= m^2 * (partial dv^/dX + partial du^/dY +
45 ! partial dpsi/dx * partial dv^/dpsi +
46 ! partial dpsi/dy * partial du^/dpsi)
47 ! Eqn 13e: D13=defor13= m^2 * (partial dw^/dX + partial dpsi/dx * partial dw^/dpsi)
48 ! + partial du/dz [SIMPLER FORM]
49 ! Eqn 13f: D23=defor23= m^2 * (partial dw^/dY + partial dpsi/dy * partial dw^/dpsi)
50 ! + partial dv/dz [SIMPLER FORM]
51 !-----------------------------------------------------------------------
56 TYPE( grid_config_rec_type ), INTENT( IN ) &
59 INTEGER, INTENT( IN ) &
60 :: ids, ide, jds, jde, kds, kde, &
61 ims, ime, jms, jme, kms, kme, &
62 its, ite, jts, jte, kts, kte
65 :: rdx, rdy, cf1, cf2, cf3
67 REAL, DIMENSION( kms:kme ), INTENT( IN ) &
68 :: fnm, fnp, dn, dnw, u_base, v_base
70 REAL, DIMENSION( ims:ime , jms:jme ), INTENT( IN ) &
71 :: msfux, msfuy, msfvx, msfvy, msftx, msfty
73 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
74 :: u, v, w, zx, zy, rdz, rdzw
76 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
77 :: defor11, defor22, defor33, defor12, defor13, defor23, div
79 INTEGER, INTENT( IN ) :: n_nba_rij !JDM
81 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_rij), INTENT(INOUT) & !JDM
88 :: i, j, k, ktf, ktes1, ktes2, i_start, i_end, j_start, j_end
91 :: tmp, tmpzx, tmpzy, tmpzeta_z, cft1, cft2
93 REAL, DIMENSION( its:ite, jts:jte ) &
94 :: mm, zzavg, zeta_zd12
96 REAL, DIMENSION( its-2:ite+2, kts:kte, jts-2:jte+2 ) &
100 !-----------------------------------------------------------------------
102 ! Comments 10-MAR-2005
103 ! Treat all differentials as 'div-style' [or 'curl-style'],
104 ! i.e., du/dX becomes (in map coordinate space) mx*my * d(u/my)/dx,
105 ! NB - all equations referred to here are from Chen and Dudhia 2002, from the
106 ! WRF physics documents web pages:
107 ! http://www.mmm.ucar.edu/wrf/users/docs/wrf-doc-physics.pdf
109 !=======================================================================
110 ! In the following section, calculate 3-d divergence and the first three
111 ! (defor11, defor22, defor33) of six deformation terms.
116 cft2 = - 0.5 * dnw(ktes1) / dn(ktes1)
119 ktf = MIN( kte, kde-1 )
122 i_end = MIN( ite, ide-1 )
124 j_end = MIN( jte, jde-1 )
126 ! Square the map scale factor.
128 DO j = j_start, j_end
129 DO i = i_start, i_end
130 mm(i,j) = msftx(i,j) * msfty(i,j)
134 !-----------------------------------------------------------------------
137 ! Apply a coordinate transformation to zonal velocity, u.
139 DO j = j_start, j_end
141 DO i = i_start, i_end+1
142 hat(i,k,j) = u(i,k,j) / msfuy(i,j)
147 ! Average in x and z.
152 hatavg(i,k,j) = 0.5 * &
153 ( fnm(k) * ( hat(i,k ,j) + hat(i+1, k,j) ) + &
154 fnp(k) * ( hat(i,k-1,j) + hat(i+1,k-1,j) ) )
159 ! Extrapolate to top and bottom of domain (to w levels).
161 DO j = j_start, j_end
162 DO i = i_start, i_end
163 hatavg(i,1,j) = 0.5 * ( &
164 cf1 * hat(i ,1,j) + &
165 cf2 * hat(i ,2,j) + &
166 cf3 * hat(i ,3,j) + &
167 cf1 * hat(i+1,1,j) + &
168 cf2 * hat(i+1,2,j) + &
170 hatavg(i,kte,j) = 0.5 * ( &
171 cft1 * ( hat(i,ktes1,j) + hat(i+1,ktes1,j) ) + &
172 cft2 * ( hat(i,ktes2,j) + hat(i+1,ktes2,j) ) )
177 ! Eqn 13a: D11=defor11= 2m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
178 ! Below, D11 is set = 2*tmp1
179 ! => tmp1 = m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
180 ! tmpzx = averaged value of dpsi/dx (=zx)
182 DO j = j_start, j_end
184 DO i = i_start, i_end
186 zx(i,k ,j) + zx(i+1,k ,j) + &
187 zx(i,k+1,j) + zx(i+1,k+1,j) )
188 tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) *tmpzx * rdzw(i,k,j)
189 ! tmp1 to here = partial dpsi/dx * partial du^/dpsi:
194 DO j = j_start, j_end
196 DO i = i_start, i_end
197 tmp1(i,k,j) = mm(i,j) * ( rdx * ( hat(i+1,k,j) - hat(i,k,j) ) - &
203 ! End calculation of du/dx.
204 !-----------------------------------------------------------------------
206 !-----------------------------------------------------------------------
207 ! Calculate defor11 (2*du/dx).
209 ! Eqn 13a: D11=defor11= 2 m^2 * (partial du^/dX + partial dpsi/dx * partial du^/dpsi)
212 DO j = j_start, j_end
214 DO i = i_start, i_end
215 defor11(i,k,j) = 2.0 * tmp1(i,k,j)
220 ! End calculation of defor11.
221 !-----------------------------------------------------------------------
223 !-----------------------------------------------------------------------
224 ! Calculate zonal divergence (du/dx) and add it to the divergence array.
226 DO j = j_start, j_end
228 DO i = i_start, i_end
229 div(i,k,j) = tmp1(i,k,j)
234 ! End calculation of zonal divergence.
235 !-----------------------------------------------------------------------
237 !-----------------------------------------------------------------------
240 ! Apply a coordinate transformation to meridional velocity, v.
242 DO j = j_start, j_end+1
244 DO i = i_start, i_end
245 ! Because msfvx at the poles will be undefined (1./0.), we will have
246 ! trouble. But we are OK since v at the poles is 0., and that takes
247 ! precedence in this case.
248 IF ((config_flags%polar) .AND. ((j == jds) .OR. (j == jde))) THEN
251 hat(i,k,j) = v(i,k,j) / msfvx(i,j)
257 ! Account for the slope in y of eta surfaces.
262 hatavg(i,k,j) = 0.5 * ( &
263 fnm(k) * ( hat(i,k ,j) + hat(i,k ,j+1) ) + &
264 fnp(k) * ( hat(i,k-1,j) + hat(i,k-1,j+1) ) )
269 ! Extrapolate to top and bottom of domain (to w levels).
271 DO j = j_start, j_end
272 DO i = i_start, i_end
273 hatavg(i,1,j) = 0.5 * ( &
274 cf1 * hat(i,1,j ) + &
275 cf2 * hat(i,2,j ) + &
276 cf3 * hat(i,3,j ) + &
277 cf1 * hat(i,1,j+1) + &
278 cf2 * hat(i,2,j+1) + &
280 hatavg(i,kte,j) = 0.5 * ( &
281 cft1 * ( hat(i,ktes1,j) + hat(i,ktes1,j+1) ) + &
282 cft2 * ( hat(i,ktes2,j) + hat(i,ktes2,j+1) ) )
287 ! Eqn 13b: D22=defor22= 2m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
288 ! Below, D22 is set = 2*tmp1
289 ! => tmp1 = m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
290 ! tmpzy = averaged value of dpsi/dy (=zy)
292 DO j = j_start, j_end
294 DO i = i_start, i_end
296 zy(i,k ,j) + zy(i,k ,j+1) + &
297 zy(i,k+1,j) + zy(i,k+1,j+1) )
298 tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) * tmpzy * rdzw(i,k,j)
299 ! tmp1 to here = partial dpsi/dy * partial dv^/dpsi:
304 DO j = j_start, j_end
306 DO i = i_start, i_end
307 tmp1(i,k,j) = mm(i,j) * ( &
308 rdy * ( hat(i,k,j+1) - hat(i,k,j) ) - tmp1(i,k,j) )
313 ! End calculation of dv/dy.
314 !-----------------------------------------------------------------------
316 !-----------------------------------------------------------------------
317 ! Calculate defor22 (2*dv/dy).
319 ! Eqn 13b: D22=defor22= 2 m^2 * (partial dv^/dY + partial dpsi/dy * partial dv^/dpsi)
322 DO j = j_start, j_end
324 DO i = i_start, i_end
325 defor22(i,k,j) = 2.0 * tmp1(i,k,j)
330 ! End calculation of defor22.
331 !-----------------------------------------------------------------------
333 !-----------------------------------------------------------------------
334 ! Calculate meridional divergence (dv/dy) and add it to the divergence
337 DO j = j_start, j_end
339 DO i = i_start, i_end
340 div(i,k,j) = div(i,k,j) + tmp1(i,k,j)
345 ! End calculation of meridional divergence.
346 !-----------------------------------------------------------------------
348 !-----------------------------------------------------------------------
350 ! Eqn 13c: D33=defor33= 2 * partial dw/dz
351 ! Below, D33 is set = 2*tmp1
352 ! => tmp1 = partial dw/dz
356 DO j = j_start, j_end
358 DO i = i_start, i_end
359 tmp1(i,k,j) = ( w(i,k+1,j) - w(i,k,j) ) * rdzw(i,k,j)
364 ! End calculation of dw/dz.
365 !-----------------------------------------------------------------------
367 !-----------------------------------------------------------------------
368 ! Calculate defor33 (2*dw/dz).
370 DO j = j_start, j_end
372 DO i = i_start, i_end
373 defor33(i,k,j) = 2.0 * tmp1(i,k,j)
378 ! End calculation of defor33.
379 !-----------------------------------------------------------------------
381 !-----------------------------------------------------------------------
382 ! Calculate vertical divergence (dw/dz) and add it to the divergence
385 DO j = j_start, j_end
387 DO i = i_start, i_end
388 div(i,k,j) = div(i,k,j) + tmp1(i,k,j)
393 ! End calculation of vertical divergence.
394 !-----------------------------------------------------------------------
396 ! Three-dimensional divergence is now finished and values are in array
397 ! "div." Also, the first three (defor11, defor22, defor33) of six
398 ! deformation terms are now calculated at pressure points.
399 !=======================================================================
401 ! Comments 10-MAR-2005
402 ! Treat all differentials as 'div-style' [or 'curl-style'],
403 ! i.e., du/dY becomes (in map coordinate space) mx*my * d(u/mx)/dy,
404 ! dv/dX becomes (in map coordinate space) mx*my * d(v/my)/dx,
405 ! (see e.g. Haltiner and Williams p. 441)
407 !=======================================================================
408 ! Calculate the final three deformations (defor12, defor13, defor23) at
416 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
417 config_flags%nested) i_start = MAX( ids+1, its )
418 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
419 config_flags%nested) i_end = MIN( ide-1, ite )
420 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
421 config_flags%nested) j_start = MAX( jds+1, jts )
422 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
423 config_flags%nested) j_end = MIN( jde-1, jte )
424 IF ( config_flags%periodic_x ) i_start = its
425 IF ( config_flags%periodic_x ) i_end = ite
428 !-----------------------------------------------------------------------
431 ! First, calculate an average mapscale factor.
434 ! du/dy => need u map scale factor in x (which is defined at u points)
435 ! averaged over j and j-1
436 ! dv/dx => need v map scale factor in y (which is defined at v points)
437 ! averaged over i and i-1
439 DO j = j_start, j_end
440 DO i = i_start, i_end
441 mm(i,j) = 0.25 * ( msfux(i,j-1) + msfux(i,j) ) * ( msfvy(i-1,j) + msfvy(i,j) )
445 ! Apply a coordinate transformation to zonal velocity, u.
447 DO j =j_start-1, j_end
450 ! Fixes to set_physical_bc2/3d for polar boundary conditions
451 ! remove issues with loop over j
452 hat(i,k,j) = u(i,k,j) / msfux(i,j)
457 ! Average in y and z.
462 hatavg(i,k,j) = 0.5 * ( &
463 fnm(k) * ( hat(i,k ,j-1) + hat(i,k ,j) ) + &
464 fnp(k) * ( hat(i,k-1,j-1) + hat(i,k-1,j) ) )
469 ! Extrapolate to top and bottom of domain (to w levels).
471 DO j = j_start, j_end
472 DO i = i_start, i_end
473 hatavg(i,1,j) = 0.5 * ( &
474 cf1 * hat(i,1,j-1) + &
475 cf2 * hat(i,2,j-1) + &
476 cf3 * hat(i,3,j-1) + &
477 cf1 * hat(i,1,j ) + &
478 cf2 * hat(i,2,j ) + &
480 hatavg(i,kte,j) = 0.5 * ( &
481 cft1 * ( hat(i,ktes1,j-1) + hat(i,ktes1,j) ) + &
482 cft2 * ( hat(i,ktes2,j-1) + hat(i,ktes2,j) ) )
486 ! tmpzy = averaged value of dpsi/dy (=zy) on vorticity grid
487 ! tmp1 = partial dpsi/dy * partial du^/dpsi
488 DO j = j_start, j_end
490 DO i = i_start, i_end
492 zy(i-1,k ,j) + zy(i,k ,j) + &
493 zy(i-1,k+1,j) + zy(i,k+1,j) )
494 tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) * &
495 0.25 * tmpzy * ( rdzw(i,k,j) + rdzw(i-1,k,j) + &
496 rdzw(i-1,k,j-1) + rdzw(i,k,j-1) )
501 ! End calculation of du/dy.
502 !----------------------------------------------------------------------
504 !-----------------------------------------------------------------------
505 ! Add the first term to defor12 (du/dy+dv/dx) at vorticity points.
508 ! Eqn 13d: D12=defor12= m^2 * (partial dv^/dX + partial du^/dY +
509 ! partial dpsi/dx * partial dv^/dpsi +
510 ! partial dpsi/dy * partial du^/dpsi)
511 ! Here deal with m^2 * (partial du^/dY + partial dpsi/dy * partial du^/dpsi)
512 ! Still need to add v^ terms:
513 ! m^2 * (partial dv^/dX + partial dpsi/dx * partial dv^/dpsi)
515 DO j = j_start, j_end
517 DO i = i_start, i_end
518 defor12(i,k,j) = mm(i,j) * ( &
519 rdy * ( hat(i,k,j) - hat(i,k,j-1) ) - tmp1(i,k,j) )
524 ! End addition of the first term to defor12.
525 !-----------------------------------------------------------------------
527 !-----------------------------------------------------------------------
530 ! Apply a coordinate transformation to meridional velocity, v.
532 DO j = j_start, j_end
534 DO i = i_start-1, i_end
535 hat(i,k,j) = v(i,k,j) / msfvy(i,j)
540 ! Account for the slope in x of eta surfaces.
542 DO j = j_start, j_end
544 DO i = i_start, i_end
545 hatavg(i,k,j) = 0.5 * ( &
546 fnm(k) * ( hat(i-1,k ,j) + hat(i,k ,j) ) + &
547 fnp(k) * ( hat(i-1,k-1,j) + hat(i,k-1,j) ) )
552 ! Extrapolate to top and bottom of domain (to w levels).
554 DO j = j_start, j_end
555 DO i = i_start, i_end
556 hatavg(i,1,j) = 0.5 * ( &
557 cf1 * hat(i-1,1,j) + &
558 cf2 * hat(i-1,2,j) + &
559 cf3 * hat(i-1,3,j) + &
560 cf1 * hat(i ,1,j) + &
561 cf2 * hat(i ,2,j) + &
563 hatavg(i,kte,j) = 0.5 * ( &
564 cft1 * ( hat(i,ktes1,j) + hat(i-1,ktes1,j) ) + &
565 cft2 * ( hat(i,ktes2,j) + hat(i-1,ktes2,j) ) )
569 ! Fixes to set_physical_bc2/3d have made any check for polar B.C.'s
570 ! unnecessary in this place. zx, rdzw, and hatavg are all defined
571 ! in places they need to be and the values at the poles are replications
572 ! of the values one grid point in, so the averaging over j and j-1 works
573 ! to act as just using the value at j or j-1 (with out extra code).
575 ! tmpzx = averaged value of dpsi/dx (=zx) on vorticity grid
576 ! tmp1 = partial dpsi/dx * partial dv^/dpsi
577 DO j = j_start, j_end
579 DO i = i_start, i_end
581 zx(i,k ,j-1) + zx(i,k ,j) + &
582 zx(i,k+1,j-1) + zx(i,k+1,j) )
583 tmp1(i,k,j) = ( hatavg(i,k+1,j) - hatavg(i,k,j) ) * &
584 0.25 * tmpzx * ( rdzw(i,k,j) + rdzw(i,k,j-1) + &
585 rdzw(i-1,k,j-1) + rdzw(i-1,k,j) )
590 ! End calculation of dv/dx.
591 !-----------------------------------------------------------------------
593 !-----------------------------------------------------------------------
594 ! Add the second term to defor12 (du/dy+dv/dx) at vorticity points.
597 ! Eqn 13d: D12=defor12= m^2 * (partial dv^/dX + partial du^/dY +
598 ! partial dpsi/dx * partial dv^/dpsi +
599 ! partial dpsi/dy * partial du^/dpsi)
600 ! Here adding v^ terms:
601 ! m^2 * (partial dv^/dX + partial dpsi/dx * partial dv^/dpsi)
603 IF ( config_flags%sfs_opt .GT. 0 ) THEN ! NBA--
605 !JDM____________________________________________________________________
607 ! s12 = du/dy + dv/dx
608 ! = (du/dy - dz/dy*du/dz) + (dv/dx - dz/dx*dv/dz)
609 ! ______defor12______ ___tmp1___
611 ! r12 = du/dy - dv/dx
612 ! = (du/dy - dz/dy*du/dz) - (dv/dx - dz/dx*dv/dz)
613 ! ______defor12______ ___tmp1___
614 !_______________________________________________________________________
617 DO j = j_start, j_end
619 DO i = i_start, i_end
621 nba_rij(i,k,j,P_r12) = defor12(i,k,j) - &
623 rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
625 defor12(i,k,j) = defor12(i,k,j) + &
627 rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
632 ! End addition of the second term to defor12.
633 !-----------------------------------------------------------------------
635 !-----------------------------------------------------------------------
636 ! Update the boundary for defor12 (might need to change later).
638 IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1 ) THEN
641 defor12(ids,k,j) = defor12(ids+1,k,j)
642 nba_rij(ids,k,j,P_r12) = nba_rij(ids+1,k,j,P_r12)
647 IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
650 defor12(i,k,jds) = defor12(i,k,jds+1)
651 nba_rij(i,k,jds,P_r12) = nba_rij(i,k,jds+1,P_r12)
656 IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
659 defor12(ide,k,j) = defor12(ide-1,k,j)
660 nba_rij(ide,k,j,P_r12) = nba_rij(ide-1,k,j,P_r12)
665 IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
668 defor12(i,k,jde) = defor12(i,k,jde-1)
669 nba_rij(i,k,jde,P_r12) = nba_rij(i,k,jde-1,P_r12)
674 ELSE ! NOT NBA--------------------------------------------------------
676 DO j = j_start, j_end
678 DO i = i_start, i_end
679 defor12(i,k,j) = defor12(i,k,j) + &
681 rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
686 ! End addition of the second term to defor12.
687 !-----------------------------------------------------------------------
689 !-----------------------------------------------------------------------
690 ! Update the boundary for defor12 (might need to change later).
692 IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1 ) THEN
695 defor12(ids,k,j) = defor12(ids+1,k,j)
700 IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
703 defor12(i,k,jds) = defor12(i,k,jds+1)
708 IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
711 defor12(ide,k,j) = defor12(ide-1,k,j)
716 IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
719 defor12(i,k,jde) = defor12(i,k,jde-1)
724 ENDIF ! NBA-----------------------------------------------------------
726 ! End update of boundary for defor12.
727 !-----------------------------------------------------------------------
730 ! Further deformation terms not needed for 2-dimensional Smagorinsky diffusion,
731 ! so those terms have not been dealt with yet.
732 ! A "y" has simply been added to all map scale factors to allow the model to
733 ! compile without errors.
735 !-----------------------------------------------------------------------
739 i_end = MIN( ite, ide-1 )
741 j_end = MIN( jte, jde-1 )
743 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
744 config_flags%nested) i_start = MAX( ids+1, its )
745 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
746 config_flags%nested) j_start = MAX( jds+1, jts )
748 IF ( config_flags%periodic_x ) i_start = its
749 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide )
750 IF ( config_flags%periodic_y ) j_end = MIN( jte, jde )
752 ! Square the mapscale factor.
756 mm(i,j) = msfux(i,j) * msfuy(i,j)
760 ! Apply a coordinate transformation to vertical velocity, w. This is for both
761 ! defor13 and defor23.
763 DO j = j_start, j_end
765 DO i = i_start, i_end
766 hat(i,k,j) = w(i,k,j) / msfty(i,j)
772 DO j = j_start, MIN( jte, jde-1 )
774 hat(i,k,j) = w(i,k,j) / msfty(i,j)
780 DO i = i_start, MIN( ite, ide-1 )
781 hat(i,k,j) = w(i,k,j) / msfty(i,j)
785 ! QUESTION: What is this for?
787 DO j = j_start, j_end
789 DO i = i_start, i_end
790 hatavg(i,k,j) = 0.25 * ( &
801 DO j = j_start, j_end
803 DO i = i_start, i_end
804 tmp1(i,k,j) = ( hatavg(i,k,j) - hatavg(i,k-1,j) ) * zx(i,k,j) * &
805 0.5 * ( rdz(i,k,j) + rdz(i-1,k,j) )
810 ! End calculation of dw/dx.
811 !-----------------------------------------------------------------------
813 !-----------------------------------------------------------------------
814 ! Add the first term (dw/dx) to defor13 (dw/dx+du/dz) at vorticity
817 DO j = j_start, j_end
819 DO i = i_start, i_end
820 defor13(i,k,j) = mm(i,j) * ( &
821 rdx * ( hat(i,k,j) - hat(i-1,k,j) ) - tmp1(i,k,j) )
826 DO j = j_start, j_end
827 DO i = i_start, i_end
828 defor13(i,kts,j ) = 0.0
829 defor13(i,ktf+1,j) = 0.0
833 ! End addition of the first term to defor13.
834 !-----------------------------------------------------------------------
836 !-----------------------------------------------------------------------
839 IF ( config_flags%mix_full_fields ) THEN
841 DO j = j_start, j_end
843 DO i = i_start, i_end
844 tmp1(i,k,j) = ( u(i,k,j) - u(i,k-1,j) ) * &
845 0.5 * ( rdz(i,k,j) + rdz(i-1,k,j) )
852 DO j = j_start, j_end
854 DO i = i_start, i_end
855 tmp1(i,k,j) = ( u(i,k,j) - u_base(k) - u(i,k-1,j) + u_base(k-1) ) * &
856 0.5 * ( rdz(i,k,j) + rdz(i-1,k,j) )
863 !-----------------------------------------------------------------------
864 ! Add the second term (du/dz) to defor13 (dw/dx+du/dz) at vorticity
868 IF ( config_flags%sfs_opt .GT. 0 ) THEN ! NBA--
870 !JDM____________________________________________________________________
872 ! s13 = du/dz + dw/dx
873 ! = du/dz + (dw/dx - dz/dx*dw/dz)
874 ! = tmp1 + ______defor13______
876 ! r13 = du/dz - dw/dx
877 ! = du/dz - (dw/dx - dz/dx*dw/dz)
878 ! = tmp1 - ______defor13______
879 !_______________________________________________________________________
881 DO j = j_start, j_end
883 DO i = i_start, i_end
884 nba_rij(i,k,j,P_r13) = tmp1(i,k,j) - defor13(i,k,j)
885 defor13(i,k,j) = defor13(i,k,j) + tmp1(i,k,j)
890 DO j = j_start, j_end !change for different surface B. C.
891 DO i = i_start, i_end
892 nba_rij(i,kts ,j,P_r13) = 0.0
893 nba_rij(i,ktf+1,j,P_r13) = 0.0
897 ELSE ! NOT NBA--------------------------------------------------------
899 DO j = j_start, j_end
901 DO i = i_start, i_end
902 defor13(i,k,j) = defor13(i,k,j) + tmp1(i,k,j)
907 ENDIF ! NBA-----------------------------------------------------------
909 ! End addition of the second term to defor13.
910 !-----------------------------------------------------------------------
912 !-----------------------------------------------------------------------
916 i_end = MIN( ite, ide-1 )
918 j_end = MIN( jte, jde-1 )
920 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
921 config_flags%nested) i_start = MAX( ids+1, its )
922 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
923 config_flags%nested) j_start = MAX( jds+1, jts )
924 IF ( config_flags%periodic_y ) j_end = MIN( jte, jde )
925 IF ( config_flags%periodic_x ) i_start = its
926 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
928 ! Square mapscale factor.
932 mm(i,j) = msfvx(i,j) * msfvy(i,j)
936 ! Apply a coordinate transformation to vertical velocity, w. Added by CW 7/19/07
938 DO j = j_start, j_end
940 DO i = i_start, i_end
941 hat(i,k,j) = w(i,k,j) / msftx(i,j)
947 DO j = j_start, MIN( jte, jde-1 )
949 hat(i,k,j) = w(i,k,j) / msftx(i,j)
955 DO i = i_start, MIN( ite, ide-1 )
956 hat(i,k,j) = w(i,k,j) / msftx(i,j)
960 ! QUESTION: What is this for?
962 DO j = j_start, j_end
964 DO i = i_start, i_end
965 hatavg(i,k,j) = 0.25 * ( &
974 ! Calculate dw/dy and store in tmp1.
976 DO j = j_start, j_end
978 DO i = i_start, i_end
979 tmp1(i,k,j) = ( hatavg(i,k,j) - hatavg(i,k-1,j) ) * zy(i,k,j) * &
980 0.5 * ( rdz(i,k,j) + rdz(i,k,j-1) )
985 ! End calculation of dw/dy.
986 !-----------------------------------------------------------------------
988 !-----------------------------------------------------------------------
989 ! Add the first term (dw/dy) to defor23 (dw/dy+dv/dz) at vorticity
992 DO j = j_start, j_end
994 DO i = i_start, i_end
995 defor23(i,k,j) = mm(i,j) * ( &
996 rdy * ( hat(i,k,j) - hat(i,k,j-1) ) - tmp1(i,k,j) )
1001 DO j = j_start, j_end
1002 DO i = i_start, i_end
1003 defor23(i,kts,j ) = 0.0
1004 defor23(i,ktf+1,j) = 0.0
1008 ! End addition of the first term to defor23.
1009 !-----------------------------------------------------------------------
1011 !-----------------------------------------------------------------------
1014 IF ( config_flags%mix_full_fields ) THEN
1016 DO j = j_start, j_end
1018 DO i = i_start, i_end
1019 tmp1(i,k,j) = ( v(i,k,j) - v(i,k-1,j) ) * &
1020 0.5 * ( rdz(i,k,j) + rdz(i,k,j-1) )
1027 DO j = j_start, j_end
1029 DO i = i_start, i_end
1030 tmp1(i,k,j) = ( v(i,k,j) - v_base(k) - v(i,k-1,j) + v_base(k-1) ) * &
1031 0.5 * ( rdz(i,k,j) + rdz(i,k,j-1) )
1038 ! End calculation of dv/dz.
1039 !-----------------------------------------------------------------------
1041 !-----------------------------------------------------------------------
1042 ! Add the second term (dv/dz) to defor23 (dw/dy+dv/dz) at vorticity
1045 IF ( config_flags%sfs_opt .GT. 0 ) THEN ! NBA--
1047 !JDM___________________________________________________________________
1049 ! s23 = dv/dz + dw/dy
1050 ! = dv/dz + (dw/dy - dz/dy*dw/dz)
1051 ! tmp1 + ______defor23______
1053 ! r23 = dv/dz - dw/dy
1054 ! = dv/dz - (dw/dy - dz/dy*dw/dz)
1055 ! = tmp1 - ______defor23______
1057 ! Add tmp1 to defor23.
1059 DO j = j_start, j_end
1061 DO i = i_start, i_end
1062 nba_rij(i,k,j,P_r23) = tmp1(i,k,j) - defor23(i,k,j)
1063 defor23(i,k,j) = defor23(i,k,j) + tmp1(i,k,j)
1068 DO j = j_start, j_end
1069 DO i = i_start, i_end
1070 nba_rij(i,kts ,j,P_r23) = 0.0
1071 nba_rij(i,ktf+1,j,P_r23) = 0.0
1075 ! End addition of the second term to defor23.
1076 !-----------------------------------------------------------------------
1078 !-----------------------------------------------------------------------
1079 ! Update the boundary for defor13 and defor23 (might need to change
1082 IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1) THEN
1085 defor13(ids,k,j) = defor13(ids+1,k,j)
1086 defor23(ids,k,j) = defor23(ids+1,k,j)
1087 nba_rij(ids,k,j,P_r13) = nba_rij(ids+1,k,j,P_r13)
1088 nba_rij(ids,k,j,P_r23) = nba_rij(ids+1,k,j,P_r23)
1093 IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
1096 defor13(i,k,jds) = defor13(i,k,jds+1)
1097 defor23(i,k,jds) = defor23(i,k,jds+1)
1098 nba_rij(i,k,jds,P_r13) = nba_rij(i,k,jds+1,P_r13)
1099 nba_rij(i,k,jds,P_r23) = nba_rij(i,k,jds+1,P_r23)
1104 IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
1107 defor13(ide,k,j) = defor13(ide-1,k,j)
1108 defor23(ide,k,j) = defor23(ide-1,k,j)
1109 nba_rij(ide,k,j,P_r13) = nba_rij(ide-1,k,j,P_r13)
1110 nba_rij(ide,k,j,P_r23) = nba_rij(ide-1,k,j,P_r23)
1115 IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
1118 defor13(i,k,jde) = defor13(i,k,jde-1)
1119 defor23(i,k,jde) = defor23(i,k,jde-1)
1120 nba_rij(i,k,jde,P_r13) = nba_rij(i,k,jde-1,P_r13)
1121 nba_rij(i,k,jde,P_r23) = nba_rij(i,k,jde-1,P_r23)
1126 ELSE ! NOT NBA--------------------------------------------------------
1128 ! Add tmp1 to defor23.
1130 DO j = j_start, j_end
1132 DO i = i_start, i_end
1133 defor23(i,k,j) = defor23(i,k,j) + tmp1(i,k,j)
1138 ! End addition of the second term to defor23.
1139 !-----------------------------------------------------------------------
1141 !-----------------------------------------------------------------------
1142 ! Update the boundary for defor13 and defor23 (might need to change
1145 IF ( .NOT. config_flags%periodic_x .AND. i_start .EQ. ids+1) THEN
1148 defor13(ids,k,j) = defor13(ids+1,k,j)
1149 defor23(ids,k,j) = defor23(ids+1,k,j)
1154 IF ( .NOT. config_flags%periodic_y .AND. j_start .EQ. jds+1) THEN
1157 defor13(i,k,jds) = defor13(i,k,jds+1)
1158 defor23(i,k,jds) = defor23(i,k,jds+1)
1163 IF ( .NOT. config_flags%periodic_x .AND. i_end .EQ. ide-1) THEN
1166 defor13(ide,k,j) = defor13(ide-1,k,j)
1167 defor23(ide,k,j) = defor23(ide-1,k,j)
1172 IF ( .NOT. config_flags%periodic_y .AND. j_end .EQ. jde-1) THEN
1175 defor13(i,k,jde) = defor13(i,k,jde-1)
1176 defor23(i,k,jde) = defor23(i,k,jde-1)
1181 ENDIF ! NBA-----------------------------------------------------------
1183 ! End update of boundary for defor13 and defor23.
1184 !-----------------------------------------------------------------------
1186 ! The second three (defor12, defor13, defor23) of six deformation terms
1187 ! are now calculated at vorticity points.
1188 !=======================================================================
1190 END SUBROUTINE cal_deform_and_div
1192 !=======================================================================
1193 !=======================================================================
1195 SUBROUTINE calculate_km_kh( config_flags, dt, &
1196 dampcoef, zdamp, damp_opt, &
1197 xkmh, xkmv, xkhh, xkhv, &
1198 BN2, khdif, kvdif, div, &
1199 defor11, defor22, defor33, &
1200 defor12, defor13, defor23, &
1201 tke, p8w, t8w, theta, t, p, moist, &
1202 dn, dnw, dx, dy, rdz, rdzw, isotropic, &
1203 n_moist, cf1, cf2, cf3, warm_rain, &
1206 ids, ide, jds, jde, kds, kde, &
1207 ims, ime, jms, jme, kms, kme, &
1208 its, ite, jts, jte, kts, kte )
1210 ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
1211 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
1214 ! Purpose: This routine calculates exchange coefficients for the TKE
1217 ! References: Klemp and Wilhelmson (JAS 1978)
1218 ! Deardorff (B-L Meteor 1980)
1219 ! Chen and Dudhia (NCAR WRF physics report 2000)
1221 !-----------------------------------------------------------------------
1222 ! Begin declarations.
1226 TYPE( grid_config_rec_type ), INTENT( IN ) &
1229 INTEGER, INTENT( IN ) &
1230 :: n_moist, damp_opt, isotropic, &
1231 ids, ide, jds, jde, kds, kde, &
1232 ims, ime, jms, jme, kms, kme, &
1233 its, ite, jts, jte, kts, kte
1235 LOGICAL, INTENT( IN ) &
1238 REAL, INTENT( IN ) &
1239 :: dx, dy, zdamp, dt, dampcoef, cf1, cf2, cf3, khdif, kvdif
1241 REAL, DIMENSION( kms:kme ), INTENT( IN ) &
1244 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, n_moist ), INTENT( INOUT ) &
1247 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
1248 :: xkmv, xkmh, xkhv, xkhh, BN2
1250 REAL, DIMENSION( ims:ime , kms:kme, jms:jme ), INTENT( IN ) &
1251 :: defor11, defor22, defor33, defor12, defor13, defor23, &
1252 div, rdz, rdzw, p8w, t8w, theta, t, p
1254 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
1257 REAL, INTENT( IN ) &
1260 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
1266 :: i_start, i_end, j_start, j_end, ktf, i, j, k
1269 !-----------------------------------------------------------------------
1271 ktf = MIN( kte, kde-1 )
1273 i_end = MIN( ite, ide-1 )
1275 j_end = MIN( jte, jde-1 )
1277 CALL calculate_N2( config_flags, BN2, moist, &
1278 theta, t, p, p8w, t8w, &
1279 dnw, dn, rdz, rdzw, &
1280 n_moist, cf1, cf2, cf3, warm_rain, &
1281 ids, ide, jds, jde, kds, kde, &
1282 ims, ime, jms, jme, kms, kme, &
1283 its, ite, jts, jte, kts, kte )
1285 ! Select a scheme for calculating diffusion coefficients.
1287 km_coef: SELECT CASE( config_flags%km_opt )
1290 CALL isotropic_km( config_flags, xkmh, xkmv, &
1291 xkhh, xkhv, khdif, kvdif, &
1292 ids, ide, jds, jde, kds, kde, &
1293 ims, ime, jms, jme, kms, kme, &
1294 its, ite, jts, jte, kts, kte )
1296 CALL tke_km( config_flags, xkmh, xkmv, &
1297 xkhh, xkhv, BN2, tke, p8w, t8w, theta, &
1298 rdz, rdzw, dx, dy, dt, isotropic, &
1299 mix_upper_bound, msftx, msfty, &
1300 ids, ide, jds, jde, kds, kde, &
1301 ims, ime, jms, jme, kms, kme, &
1302 its, ite, jts, jte, kts, kte )
1304 CALL smag_km( config_flags, xkmh, xkmv, &
1305 xkhh, xkhv, BN2, div, &
1306 defor11, defor22, defor33, &
1307 defor12, defor13, defor23, &
1308 rdzw, dx, dy, dt, isotropic, &
1309 mix_upper_bound, msftx, msfty, &
1310 ids, ide, jds, jde, kds, kde, &
1311 ims, ime, jms, jme, kms, kme, &
1312 its, ite, jts, jte, kts, kte )
1314 CALL smag2d_km( config_flags, xkmh, xkmv, &
1315 xkhh, xkhv, defor11, defor22, defor12, &
1316 rdzw, dx, dy, msftx, msfty, &
1317 ids, ide, jds, jde, kds, kde, &
1318 ims, ime, jms, jme, kms, kme, &
1319 its, ite, jts, jte, kts, kte )
1321 CALL wrf_error_fatal( 'Please choose diffusion coefficient scheme' )
1325 IF ( damp_opt .eq. 1 ) THEN
1326 CALL cal_dampkm( config_flags, xkmh, xkhh, xkmv, xkhv, &
1327 dx, dy, dt, dampcoef, rdz, rdzw, zdamp, &
1329 ids, ide, jds, jde, kds, kde, &
1330 ims, ime, jms, jme, kms, kme, &
1331 its, ite, jts, jte, kts, kte )
1334 END SUBROUTINE calculate_km_kh
1336 !=======================================================================
1338 SUBROUTINE cal_dampkm( config_flags,xkmh,xkhh,xkmv,xkhv, &
1339 dx,dy,dt,dampcoef, &
1342 ids,ide, jds,jde, kds,kde, &
1343 ims,ime, jms,jme, kms,kme, &
1344 its,ite, jts,jte, kts,kte )
1346 !-----------------------------------------------------------------------
1347 ! Begin declarations.
1351 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
1353 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1354 ims, ime, jms, jme, kms, kme, &
1355 its, ite, jts, jte, kts, kte
1357 REAL , INTENT(IN ) :: zdamp,dx,dy,dt,dampcoef
1360 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: xkmh , &
1365 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: rdz, &
1368 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
1372 INTEGER :: i_start, i_end, j_start, j_end, ktf, ktfm1, i, j, k
1373 REAL :: kmmax,kmmvmax,degrad90,dz,tmp
1375 REAL , DIMENSION( its:ite ) :: deltaz
1376 REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: dampk,dampkv
1379 !-----------------------------------------------------------------------
1381 ktf = min(kte,kde-1)
1385 i_end = MIN(ite,ide-1)
1387 j_end = MIN(jte,jde-1)
1389 ! keep upper damping diffusion away from relaxation zones at boundaries if used
1390 IF(config_flags%specified .OR. config_flags%nested)THEN
1391 i_start = MAX(i_start,ids+config_flags%spec_bdy_width-1)
1392 i_end = MIN(i_end,ide-config_flags%spec_bdy_width)
1393 j_start = MAX(j_start,jds+config_flags%spec_bdy_width-1)
1394 j_end = MIN(j_end,jde-config_flags%spec_bdy_width)
1399 DO j = j_start, j_end
1402 DO i = i_start, i_end
1403 ! Unmodified dx used above may produce very large diffusivities
1404 ! when msftx is very large. And the above formula ignores the fact
1405 ! that dy may now be different from dx as well. Let's fix that by
1406 ! defining a "ds" as the minimum of the "real-space" (physical
1407 ! distance) values of dx and dy, and then using that smallest value
1408 ! to calculate a point-by-point kmmax
1409 ds = MIN(dx/msftx(i,j),dy/msfty(i,j))
1412 ! deltaz(i)=0.5*dnw(k)/zeta_z(i,j)
1413 ! dz=dnw(k)/zeta_z(i,j)
1418 tmp=min(deltaz(i)/zdamp,1.)
1419 dampk(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmax*dampcoef
1420 dampkv(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmvmax*dampcoef
1421 ! set upper limit on vertical K (based on horizontal K)
1422 dampkv(i,k,j)=min(dampkv(i,k,j),dampk(i,k,j))
1427 DO i = i_start, i_end
1428 ! Unmodified dx used above may produce very large diffusivities
1429 ! when msftx is very large. And the above formula ignores the fact
1430 ! that dy may now be different from dx as well. Let's fix that by
1431 ! defining a "ds" as the minimum of the "real-space" (physical
1432 ! distance) values of dx and dy, and then using that smallest value
1433 ! to calculate a point-by-point kmmax
1434 ds = MIN(dx/msftx(i,j),dy/msfty(i,j))
1437 ! deltaz(i)=deltaz(i)+dn(k)/zeta_z(i,j)
1438 ! dz=dnw(k)/zeta_z(i,j)
1440 deltaz(i) = deltaz(i) + dz
1444 tmp=min(deltaz(i)/zdamp,1.)
1445 dampk(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmax*dampcoef
1446 dampkv(i,k,j)=cos(degrad90*tmp)*cos(degrad90*tmp)*kmmvmax*dampcoef
1447 ! set upper limit on vertical K (based on horizontal K)
1448 dampkv(i,k,j)=min(dampkv(i,k,j),dampk(i,k,j))
1454 DO j = j_start, j_end
1456 DO i = i_start, i_end
1457 xkmh(i,k,j)=max(xkmh(i,k,j),dampk(i,k,j))
1458 xkhh(i,k,j)=max(xkhh(i,k,j),dampk(i,k,j))
1459 xkmv(i,k,j)=max(xkmv(i,k,j),dampkv(i,k,j))
1460 xkhv(i,k,j)=max(xkhv(i,k,j),dampkv(i,k,j))
1465 END SUBROUTINE cal_dampkm
1467 !=======================================================================
1468 !=======================================================================
1470 SUBROUTINE calculate_N2( config_flags, BN2, moist, &
1471 theta, t, p, p8w, t8w, &
1472 dnw, dn, rdz, rdzw, &
1473 n_moist, cf1, cf2, cf3, warm_rain, &
1474 ids, ide, jds, jde, kds, kde, &
1475 ims, ime, jms, jme, kms, kme, &
1476 its, ite, jts, jte, kts, kte )
1478 !-----------------------------------------------------------------------
1479 ! Begin declarations.
1483 TYPE( grid_config_rec_type ), INTENT( IN ) &
1486 INTEGER, INTENT( IN ) &
1488 ids, ide, jds, jde, kds, kde, &
1489 ims, ime, jms, jme, kms, kme, &
1490 its, ite, jts, jte, kts, kte
1492 LOGICAL, INTENT( IN ) &
1495 REAL, INTENT( IN ) &
1498 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
1501 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
1502 :: rdz, rdzw, theta, t, p, p8w, t8w
1504 REAL, DIMENSION( kms:kme ), INTENT( IN ) &
1507 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), INTENT( INOUT ) &
1513 :: i, j, k, ktf, ispe, ktes1, ktes2, &
1514 i_start, i_end, j_start, j_end
1517 :: coefa, thetaep1, thetaem1, qc_cr, es, tc, qlpqi, qsw, qsi, &
1518 tmpdz, xlvqv, thetaesfc, thetasfc, qvtop, qvsfc, thetatop, thetaetop
1520 REAL, DIMENSION( its:ite, jts:jte ) &
1523 REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
1527 !-----------------------------------------------------------------------
1529 qc_cr = 0.00001 ! in Kg/Kg
1531 ktf = MIN( kte, kde-1 )
1536 i_end = MIN( ite, ide-1 )
1538 j_end = MIN( jte, jde-1 )
1540 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
1541 config_flags%nested) i_start = MAX( ids+1, its )
1542 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
1543 config_flags%nested) i_end = MIN( ide-2, ite )
1544 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
1545 config_flags%nested) j_start = MAX( jds+1, jts )
1546 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
1547 config_flags%nested) j_end = MIN( jde-2 ,jte )
1548 IF ( config_flags%periodic_x ) i_start = its
1549 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
1551 IF ( P_QC .GT. PARAM_FIRST_SCALAR) THEN
1552 DO j = j_start, j_end
1554 DO i = i_start, i_end
1555 qctmp(i,k,j) = moist(i,k,j,P_QC)
1560 DO j = j_start, j_end
1562 DO i = i_start, i_end
1584 DO ispe = PARAM_FIRST_SCALAR, n_moist
1585 IF ( ispe .EQ. P_QV .OR. ispe .EQ. P_QC .OR. ispe .EQ. P_QI) THEN
1586 DO j = j_start, j_end
1588 DO i = i_start, i_end
1589 tmp1(i,k,j) = tmp1(i,k,j) + moist(i,k,j,ispe)
1594 DO j = j_start, j_end
1595 DO i = i_start, i_end
1596 tmp1sfc(i,j) = tmp1sfc(i,j) + &
1597 cf1 * moist(i,1,j,ispe) + &
1598 cf2 * moist(i,2,j,ispe) + &
1599 cf3 * moist(i,3,j,ispe)
1600 tmp1top(i,j) = tmp1top(i,j) + &
1601 moist(i,ktes1,j,ispe) + &
1602 ( moist(i,ktes1,j,ispe) - moist(i,ktes2,j,ispe) ) * &
1603 0.5 * dnw(ktes1) / dn(ktes1)
1609 ! Calculate saturation mixing ratio.
1611 DO j = j_start, j_end
1613 DO i = i_start, i_end
1614 tc = t(i,k,j) - SVPT0
1615 es = 1000.0 * SVP1 * EXP( SVP2 * tc / ( t(i,k,j) - SVP3 ) )
1616 qvs(i,k,j) = EP_2 * es / ( p(i,k,j) - es )
1621 DO j = j_start, j_end
1623 DO i = i_start, i_end
1624 tmpdz = 1.0 / rdz(i,k,j) + 1.0 / rdz(i,k+1,j)
1625 IF ( moist(i,k,j,P_QV) .GE. qvs(i,k,j) .OR. qctmp(i,k,j) .GE. qc_cr) THEN
1626 xlvqv = XLV * moist(i,k,j,P_QV)
1627 coefa = ( 1.0 + xlvqv / R_d / t(i,k,j) ) / &
1628 ( 1.0 + XLV * xlvqv / Cp / R_v / t(i,k,j) / t(i,k,j) ) / &
1630 thetaep1 = theta(i,k+1,j) * &
1631 ( 1.0 + XLV * qvs(i,k+1,j) / Cp / t(i,k+1,j) )
1632 thetaem1 = theta(i,k-1,j) * &
1633 ( 1.0 + XLV * qvs(i,k-1,j) / Cp / t(i,k-1,j) )
1634 BN2(i,k,j) = g * ( coefa * ( thetaep1 - thetaem1 ) / tmpdz - &
1635 ( tmp1(i,k+1,j) - tmp1(i,k-1,j) ) / tmpdz )
1637 BN2(i,k,j) = g * ( (theta(i,k+1,j) - theta(i,k-1,j) ) / &
1638 theta(i,k,j) / tmpdz + &
1639 1.61 * ( moist(i,k+1,j,P_QV) - moist(i,k-1,j,P_QV) ) / &
1641 ( tmp1(i,k+1,j) - tmp1(i,k-1,j) ) / tmpdz )
1648 DO j = j_start, j_end
1649 DO i = i_start, i_end
1650 tmpdz = 1.0 / rdz(i,k+1,j) + 0.5 / rdzw(i,k,j)
1651 thetasfc = T8w(i,kts,j) / ( p8w(i,k,j) / p1000mb )**( R_d / Cp )
1652 IF ( moist(i,k,j,P_QV) .GE. qvs(i,k,j) .OR. qctmp(i,k,j) .GE. qc_cr) THEN
1653 qvsfc = cf1 * qvs(i,1,j) + &
1654 cf2 * qvs(i,2,j) + &
1656 xlvqv = XLV * moist(i,k,j,P_QV)
1657 coefa = ( 1.0 + xlvqv / R_d / t(i,k,j) ) / &
1658 ( 1.0 + XLV * xlvqv / Cp / R_v / t(i,k,j) / t(i,k,j) ) / &
1660 thetaep1 = theta(i,k+1,j) * &
1661 ( 1.0 + XLV * qvs(i,k+1,j) / Cp / t(i,k+1,j) )
1662 thetaesfc = thetasfc * &
1663 ( 1.0 + XLV * qvsfc / Cp / t8w(i,kts,j) )
1664 BN2(i,k,j) = g * ( coefa * ( thetaep1 - thetaesfc ) / tmpdz - &
1665 ( tmp1(i,k+1,j) - tmp1sfc(i,j) ) / tmpdz )
1667 qvsfc = cf1 * moist(i,1,j,P_QV) + &
1668 cf2 * moist(i,2,j,P_QV) + &
1669 cf3 * moist(i,3,j,P_QV)
1670 ! BN2(i,k,j) = g * ( ( theta(i,k+1,j) - thetasfc ) / &
1671 ! theta(i,k,j) / tmpdz + &
1672 ! 1.61 * ( moist(i,k+1,j,P_QV) - qvsfc ) / &
1674 ! ( tmp1(i,k+1,j) - tmp1sfc(i,j) ) / tmpdz )
1675 !...... MARTA: change in computation of BN2 at the surface, WCS 040331
1677 tmpdz= 1./rdzw(i,k,j) ! controlare come calcola rdzw
1678 BN2(i,k,j) = g * ( ( theta(i,k+1,j) - theta(i,k,j)) / &
1679 theta(i,k,j) / tmpdz + &
1680 1.61 * ( moist(i,k+1,j,P_QV) - qvsfc ) / &
1682 ( tmp1(i,k+1,j) - tmp1sfc(i,j) ) / tmpdz )
1683 ! end of MARTA/WCS change
1690 !...... MARTA: change in computation of BN2 at the top, WCS 040331
1691 DO j = j_start, j_end
1692 DO i = i_start, i_end
1693 BN2(i,ktf,j)=BN2(i,ktf-1,j)
1696 ! end of MARTA/WCS change
1698 END SUBROUTINE calculate_N2
1700 !=======================================================================
1701 !=======================================================================
1703 SUBROUTINE isotropic_km( config_flags, &
1704 xkmh,xkmv,xkhh,xkhv,khdif,kvdif, &
1705 ids,ide, jds,jde, kds,kde, &
1706 ims,ime, jms,jme, kms,kme, &
1707 its,ite, jts,jte, kts,kte )
1709 !-----------------------------------------------------------------------
1710 ! Begin declarations.
1714 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
1716 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1717 ims, ime, jms, jme, kms, kme, &
1718 its, ite, jts, jte, kts, kte
1720 REAL , INTENT(IN ) :: khdif,kvdif
1722 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: xkmh, &
1728 INTEGER :: i_start, i_end, j_start, j_end, ktf, i, j, k
1729 REAL :: khdif3,kvdif3
1732 !-----------------------------------------------------------------------
1737 i_end = MIN(ite,ide-1)
1739 j_end = MIN(jte,jde-1)
1743 khdif3=khdif/prandtl
1744 kvdif3=kvdif/prandtl
1746 DO j = j_start, j_end
1748 DO i = i_start, i_end
1757 END SUBROUTINE isotropic_km
1759 !=======================================================================
1760 !=======================================================================
1762 SUBROUTINE smag_km( config_flags,xkmh,xkmv,xkhh,xkhv,BN2, &
1763 div,defor11,defor22,defor33,defor12, &
1765 rdzw,dx,dy,dt,isotropic, &
1766 mix_upper_bound, msftx, msfty, &
1767 ids,ide, jds,jde, kds,kde, &
1768 ims,ime, jms,jme, kms,kme, &
1769 its,ite, jts,jte, kts,kte )
1771 !-----------------------------------------------------------------------
1772 ! Begin declarations.
1776 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
1778 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1779 ims, ime, jms, jme, kms, kme, &
1780 its, ite, jts, jte, kts, kte
1782 INTEGER , INTENT(IN ) :: isotropic
1783 REAL , INTENT(IN ) :: dx, dy, dt, mix_upper_bound
1786 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(IN ) :: BN2, &
1789 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: xkmh, &
1794 REAL , DIMENSION( ims:ime , kms:kme, jms:jme ), INTENT(IN ) :: &
1802 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
1806 INTEGER :: i_start, i_end, j_start, j_end, ktf, i, j, k
1807 REAL :: deltas, tmp, pr, mlen_h, mlen_v, c_s
1809 REAL, DIMENSION( its:ite , kts:kte , jts:jte ) :: def2
1812 !-----------------------------------------------------------------------
1814 ktf = min(kte,kde-1)
1817 i_end = MIN(ite,ide-1)
1819 j_end = MIN(jte,jde-1)
1821 IF ( config_flags%open_xs .or. config_flags%specified .or. &
1822 config_flags%nested) i_start = MAX(ids+1,its)
1823 IF ( config_flags%open_xe .or. config_flags%specified .or. &
1824 config_flags%nested) i_end = MIN(ide-2,ite)
1825 IF ( config_flags%open_ys .or. config_flags%specified .or. &
1826 config_flags%nested) j_start = MAX(jds+1,jts)
1827 IF ( config_flags%open_ye .or. config_flags%specified .or. &
1828 config_flags%nested) j_end = MIN(jde-2,jte)
1829 IF ( config_flags%periodic_x ) i_start = its
1830 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
1833 c_s = config_flags%c_s
1838 def2(i,k,j)=0.5*(defor11(i,k,j)*defor11(i,k,j) + &
1839 defor22(i,k,j)*defor22(i,k,j) + &
1840 defor33(i,k,j)*defor33(i,k,j))
1848 tmp=0.25*(defor12(i ,k,j)+defor12(i ,k,j+1)+ &
1849 defor12(i+1,k,j)+defor12(i+1,k,j+1))
1850 def2(i,k,j)=def2(i,k,j)+tmp*tmp
1858 tmp=0.25*(defor13(i ,k+1,j)+defor13(i ,k,j)+ &
1859 defor13(i+1,k+1,j)+defor13(i+1,k,j))
1860 def2(i,k,j)=def2(i,k,j)+tmp*tmp
1868 tmp=0.25*(defor23(i,k+1,j )+defor23(i,k,j )+ &
1869 defor23(i,k+1,j+1)+defor23(i,k,j+1))
1870 def2(i,k,j)=def2(i,k,j)+tmp*tmp
1875 IF (isotropic .EQ. 0) THEN
1876 DO j = j_start, j_end
1878 DO i = i_start, i_end
1879 mlen_h=sqrt(dx/msftx(i,j) * dy/msfty(i,j))
1880 mlen_v= 1./rdzw(i,k,j)
1881 tmp=max(0.,def2(i,k,j)-BN2(i,k,j)/pr)
1883 xkmh(i,k,j)=max(c_s*c_s*mlen_h*mlen_h*tmp, 1.0E-6*mlen_h*mlen_h )
1884 xkmh(i,k,j)=min(xkmh(i,k,j), mix_upper_bound * mlen_h * mlen_h / dt )
1885 xkmv(i,k,j)=max(c_s*c_s*mlen_v*mlen_v*tmp, 1.0E-6*mlen_v*mlen_v )
1886 xkmv(i,k,j)=min(xkmv(i,k,j), mix_upper_bound * mlen_v * mlen_v / dt )
1887 xkhh(i,k,j)=xkmh(i,k,j)/pr
1888 xkhh(i,k,j)=min(xkhh(i,k,j), mix_upper_bound * mlen_h * mlen_h / dt )
1889 xkhv(i,k,j)=xkmv(i,k,j)/pr
1890 xkhv(i,k,j)=min(xkhv(i,k,j), mix_upper_bound * mlen_v * mlen_v / dt )
1895 DO j = j_start, j_end
1897 DO i = i_start, i_end
1898 deltas=(dx/msftx(i,j) * dy/msfty(i,j)/rdzw(i,k,j))**0.33333333
1899 tmp=max(0.,def2(i,k,j)-BN2(i,k,j)/pr)
1901 xkmh(i,k,j)=max(c_s*c_s*deltas*deltas*tmp, 1.0E-6*deltas*deltas )
1902 xkmh(i,k,j)=min(xkmh(i,k,j), mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt )
1903 xkmv(i,k,j)=xkmh(i,k,j)
1904 xkmv(i,k,j)=min(xkmv(i,k,j), mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt )
1905 xkhh(i,k,j)=xkmh(i,k,j)/pr
1906 xkhh(i,k,j)=min(xkhh(i,k,j), mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt )
1907 xkhv(i,k,j)=xkmv(i,k,j)/pr
1908 xkhv(i,k,j)=min(xkhv(i,k,j), mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt )
1914 END SUBROUTINE smag_km
1916 !=======================================================================
1917 !=======================================================================
1919 SUBROUTINE smag2d_km( config_flags,xkmh,xkmv,xkhh,xkhv, &
1920 defor11,defor22,defor12, &
1921 rdzw,dx,dy,msftx, msfty, &
1922 ids,ide, jds,jde, kds,kde, &
1923 ims,ime, jms,jme, kms,kme, &
1924 its,ite, jts,jte, kts,kte )
1926 !-----------------------------------------------------------------------
1927 ! Begin declarations.
1931 TYPE(grid_config_rec_type) , INTENT(IN ) :: config_flags
1933 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
1934 ims, ime, jms, jme, kms, kme, &
1935 its, ite, jts, jte, kts, kte
1937 REAL , INTENT(IN ) :: dx, dy
1940 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(IN ) :: rdzw
1942 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) :: xkmh, &
1947 REAL , DIMENSION( ims:ime , kms:kme, jms:jme ), INTENT(IN ) :: &
1952 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
1956 INTEGER :: i_start, i_end, j_start, j_end, ktf, i, j, k
1957 REAL :: deltas, tmp, pr, mlen_h, c_s
1959 REAL, DIMENSION( its:ite , kts:kte , jts:jte ) :: def2
1962 !-----------------------------------------------------------------------
1964 ktf = min(kte,kde-1)
1967 i_end = MIN(ite,ide-1)
1969 j_end = MIN(jte,jde-1)
1971 IF ( config_flags%open_xs .or. config_flags%specified .or. &
1972 config_flags%nested) i_start = MAX(ids+1,its)
1973 IF ( config_flags%open_xe .or. config_flags%specified .or. &
1974 config_flags%nested) i_end = MIN(ide-2,ite)
1975 IF ( config_flags%open_ys .or. config_flags%specified .or. &
1976 config_flags%nested) j_start = MAX(jds+1,jts)
1977 IF ( config_flags%open_ye .or. config_flags%specified .or. &
1978 config_flags%nested) j_end = MIN(jde-2,jte)
1979 IF ( config_flags%periodic_x ) i_start = its
1980 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
1983 c_s = config_flags%c_s
1988 def2(i,k,j)=0.25*((defor11(i,k,j)-defor22(i,k,j))*(defor11(i,k,j)-defor22(i,k,j)))
1989 tmp=0.25*(defor12(i ,k,j)+defor12(i ,k,j+1)+ &
1990 defor12(i+1,k,j)+defor12(i+1,k,j+1))
1991 def2(i,k,j)=def2(i,k,j)+tmp*tmp
1996 DO j = j_start, j_end
1998 DO i = i_start, i_end
1999 mlen_h=sqrt(dx/msftx(i,j) * dy/msfty(i,j))
2000 tmp=sqrt(def2(i,k,j))
2001 ! xkmh(i,k,j)=max(c_s*c_s*mlen_h*mlen_h*tmp, 1.0E-6*mlen_h*mlen_h )
2002 xkmh(i,k,j)=c_s*c_s*mlen_h*mlen_h*tmp
2003 xkmh(i,k,j)=min(xkmh(i,k,j), 10.*mlen_h )
2005 xkhh(i,k,j)=xkmh(i,k,j)/pr
2011 END SUBROUTINE smag2d_km
2013 !=======================================================================
2014 !=======================================================================
2016 SUBROUTINE tke_km( config_flags, xkmh, xkmv, xkhh, xkhv, &
2017 bn2, tke, p8w, t8w, theta, &
2018 rdz, rdzw, dx,dy, dt, isotropic, &
2019 mix_upper_bound, msftx, msfty, &
2020 ids, ide, jds, jde, kds, kde, &
2021 ims, ime, jms, jme, kms, kme, &
2022 its, ite, jts, jte, kts, kte )
2024 ! History: Sep 2003 Changes by Jason Knievel and George Bryan, NCAR
2025 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
2028 ! Purpose: This routine calculates the exchange coefficients for the
2029 ! TKE turbulence parameterization.
2031 ! References: Klemp and Wilhelmson (JAS 1978)
2032 ! Chen and Dudhia (NCAR WRF physics report 2000)
2034 !-----------------------------------------------------------------------
2035 ! Begin declarations.
2039 TYPE( grid_config_rec_type ), INTENT( IN ) &
2042 INTEGER, INTENT( IN ) &
2043 :: ids, ide, jds, jde, kds, kde, &
2044 ims, ime, jms, jme, kms, kme, &
2045 its, ite, jts, jte, kts, kte
2047 INTEGER, INTENT( IN ) :: isotropic
2048 REAL, INTENT( IN ) &
2051 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
2052 :: tke, p8w, t8w, theta, rdz, rdzw, bn2
2054 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
2055 :: xkmh, xkmv, xkhh, xkhv
2057 REAL, INTENT( IN ) &
2060 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
2064 REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
2067 REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
2071 :: deltas, tmp, mlen_s, mlen_h, mlen_v, tmpdz, &
2072 thetasfc, thetatop, minkx, pr_inv, pr_inv_h, pr_inv_v, c_k
2075 :: i_start, i_end, j_start, j_end, ktf, i, j, k
2077 REAL, PARAMETER :: tke_seed_value = 1.e-06
2079 REAL, PARAMETER :: epsilon = 1.e-10
2082 !-----------------------------------------------------------------------
2084 ktf = MIN( kte, kde-1 )
2086 i_end = MIN( ite, ide-1 )
2088 j_end = MIN( jte, jde-1 )
2090 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
2091 config_flags%nested) i_start = MAX( ids+1, its )
2092 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
2093 config_flags%nested) i_end = MIN( ide-2, ite )
2094 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
2095 config_flags%nested) j_start = MAX( jds+1, jts )
2096 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
2097 config_flags%nested) j_end = MIN( jde-2, jte)
2098 IF ( config_flags%periodic_x ) i_start = its
2099 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
2101 ! in the absence of surface drag or a surface heat flux, there
2102 ! is no way to generate tke without pre-existing tke. Use
2103 ! tke_seed if the drag and flux are off.
2105 c_k = config_flags%c_k
2106 tke_seed = tke_seed_value
2107 if( (config_flags%tke_drag_coefficient .gt. epsilon) .or. &
2108 (config_flags%tke_heat_flux .gt. epsilon) ) tke_seed = 0.
2110 DO j = j_start, j_end
2112 DO i = i_start, i_end
2113 tmpdz = 1.0 / ( rdz(i,k+1,j) + rdz(i,k,j) )
2114 dthrdn(i,k,j) = ( theta(i,k+1,j) - theta(i,k-1,j) ) / tmpdz
2120 DO j = j_start, j_end
2121 DO i = i_start, i_end
2122 tmpdz = 1.0 / ( rdzw(i,k+1,j) + rdzw(i,k,j) )
2123 thetasfc = T8w(i,kts,j) / ( p8w(i,k,j) / p1000mb )**( R_d / Cp )
2124 dthrdn(i,k,j) = ( theta(i,k+1,j) - thetasfc ) / tmpdz
2129 DO j = j_start, j_end
2130 DO i = i_start, i_end
2131 tmpdz = 1.0 / rdz(i,k,j) + 0.5 / rdzw(i,k,j)
2132 thetatop = T8w(i,kde,j) / ( p8w(i,kde,j) / p1000mb )**( R_d / Cp )
2133 dthrdn(i,k,j) = ( thetatop - theta(i,k-1,j) ) / tmpdz
2137 IF ( isotropic .EQ. 0 ) THEN
2138 DO j = j_start, j_end
2140 DO i = i_start, i_end
2141 mlen_h = SQRT( dx/msftx(i,j) * dy/msfty(i,j) )
2142 tmp = SQRT( MAX( tke(i,k,j), tke_seed ) )
2143 deltas = 1.0 / rdzw(i,k,j)
2145 IF ( dthrdn(i,k,j) .GT. 0.) THEN
2146 mlen_s = 0.76 * tmp / ( ABS( g / theta(i,k,j) * dthrdn(i,k,j) ) )**0.5
2147 mlen_v = MIN( mlen_v, mlen_s )
2149 xkmh(i,k,j) = MAX( c_k * tmp * mlen_h, 1.0E-6 * mlen_h * mlen_h )
2150 xkmh(i,k,j) = MIN( xkmh(i,k,j), mix_upper_bound * mlen_h *mlen_h / dt )
2151 xkmv(i,k,j) = MAX( c_k * tmp * mlen_v, 1.0E-6 * deltas * deltas )
2152 xkmv(i,k,j) = MIN( xkmv(i,k,j), mix_upper_bound * deltas *deltas / dt )
2153 pr_inv_h = 1./prandtl
2154 pr_inv_v = 1.0 + 2.0 * mlen_v / deltas
2155 xkhh(i,k,j) = xkmh(i,k,j) * pr_inv_h
2156 xkhv(i,k,j) = xkmv(i,k,j) * pr_inv_v
2161 CALL calc_l_scale( config_flags, tke, BN2, l_scale, &
2162 i_start, i_end, ktf, j_start, j_end, &
2163 dx, dy, rdzw, msftx, msfty, &
2164 ids, ide, jds, jde, kds, kde, &
2165 ims, ime, jms, jme, kms, kme, &
2166 its, ite, jts, jte, kts, kte )
2167 DO j = j_start, j_end
2169 DO i = i_start, i_end
2170 tmp = SQRT( MAX( tke(i,k,j), tke_seed ) )
2171 deltas = ( dx/msftx(i,j) * dy/msfty(i,j) / rdzw(i,k,j) )**0.33333333
2172 xkmh(i,k,j) = c_k * tmp * l_scale(i,k,j)
2173 xkmh(i,k,j) = MIN( mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt, xkmh(i,k,j) )
2174 xkmv(i,k,j) = c_k * tmp * l_scale(i,k,j)
2175 xkmv(i,k,j) = MIN( mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt , xkmv(i,k,j) )
2176 pr_inv = 1.0 + 2.0 * l_scale(i,k,j) / deltas
2177 xkhh(i,k,j) = MIN( mix_upper_bound * dx/msftx(i,j) * dy/msfty(i,j) / dt, xkmh(i,k,j) * pr_inv )
2178 xkhv(i,k,j) = MIN( mix_upper_bound / rdzw(i,k,j) / rdzw(i,k,j) / dt, xkmv(i,k,j) * pr_inv )
2184 END SUBROUTINE tke_km
2186 !=======================================================================
2187 !=======================================================================
2189 SUBROUTINE calc_l_scale( config_flags, tke, BN2, l_scale, &
2190 i_start, i_end, ktf, j_start, j_end, &
2191 dx, dy, rdzw, msftx, msfty, &
2192 ids, ide, jds, jde, kds, kde, &
2193 ims, ime, jms, jme, kms, kme, &
2194 its, ite, jts, jte, kts, kte )
2196 ! History: Sep 2003 Written by Bryan and Knievel, NCAR
2198 ! Purpose: This routine calculates the length scale, based on stability,
2199 ! for TKE parameterization of subgrid-scale turbulence.
2201 !-----------------------------------------------------------------------
2202 ! Begin declarations.
2206 TYPE( grid_config_rec_type ), INTENT( IN ) &
2209 INTEGER, INTENT( IN ) &
2210 :: i_start, i_end, ktf, j_start, j_end, &
2211 ids, ide, jds, jde, kds, kde, &
2212 ims, ime, jms, jme, kms, kme, &
2213 its, ite, jts, jte, kts, kte
2215 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
2218 REAL, INTENT( IN ) &
2221 REAL, DIMENSION( its:ite, kts:kte, jts:jte ), INTENT( OUT ) &
2224 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: msftx, &
2235 !-----------------------------------------------------------------------
2237 DO j = j_start, j_end
2239 DO i = i_start, i_end
2240 deltas = ( dx/msftx(i,j) * dy/msfty(i,j) / rdzw(i,k,j) )**0.33333333
2241 l_scale(i,k,j) = deltas
2243 IF ( BN2(i,k,j) .gt. 1.0e-6 ) THEN
2244 tmp = SQRT( MAX( tke(i,k,j), 1.0e-6 ) )
2245 l_scale(i,k,j) = 0.76 * tmp / SQRT( BN2(i,k,j) )
2246 l_scale(i,k,j) = MIN( l_scale(i,k,j), deltas)
2247 l_scale(i,k,j) = MAX( l_scale(i,k,j), 0.001 * deltas )
2254 END SUBROUTINE calc_l_scale
2256 !=======================================================================
2257 !=======================================================================
2259 SUBROUTINE horizontal_diffusion_2 ( rt_tendf, ru_tendf, rv_tendf, rw_tendf, &
2261 moist_tendf, n_moist, &
2262 chem_tendf, n_chem, &
2263 scalar_tendf, n_scalar, &
2264 tracer_tendf, n_tracer, &
2265 thp, theta, mu, tke, config_flags, &
2266 defor11, defor22, defor12, &
2268 nba_mij, n_nba_mij, & !JDM
2270 moist, chem, scalar,tracer, &
2271 msfux, msfuy, msfvx, msfvy, &
2272 msftx, msfty, xkmh, xkhh,km_opt, &
2273 rdx, rdy, rdz, rdzw, fnm, fnp, &
2274 cf1, cf2, cf3, zx, zy, dn, dnw, &
2275 ids, ide, jds, jde, kds, kde, &
2276 ims, ime, jms, jme, kms, kme, &
2277 its, ite, jts, jte, kts, kte )
2279 !-----------------------------------------------------------------------
2280 ! Begin declarations.
2284 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
2286 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
2287 ims, ime, jms, jme, kms, kme, &
2288 its, ite, jts, jte, kts, kte
2290 INTEGER , INTENT(IN ) :: n_moist,n_chem,n_scalar,n_tracer,km_opt
2292 REAL , INTENT(IN ) :: cf1, cf2, cf3
2294 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
2295 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
2296 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
2297 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
2299 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfux, &
2307 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::rt_tendf,&
2313 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
2314 INTENT(INOUT) :: moist_tendf
2316 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
2317 INTENT(INOUT) :: chem_tendf
2319 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar), &
2320 INTENT(INOUT) :: scalar_tendf
2322 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer), &
2323 INTENT(INOUT) :: tracer_tendf
2325 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
2326 INTENT(IN ) :: moist
2328 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
2331 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar) , &
2332 INTENT(IN ) :: scalar
2334 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer) , &
2335 INTENT(IN ) :: tracer
2337 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor11, &
2354 REAL , INTENT(IN ) :: rdx, &
2356 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
2358 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
2363 INTEGER :: im, ic, is
2365 ! REAL , DIMENSION(its-1:ite+1, kts:kte, jts-1:jte+1) :: xkhh
2368 !-----------------------------------------------------------------------
2370 !-----------------------------------------------------------------------
2371 ! Call diffusion subroutines.
2373 CALL horizontal_diffusion_u_2( ru_tendf, mu, config_flags, &
2374 defor11, defor12, div, &
2375 nba_mij, n_nba_mij, & !JDM
2377 msfux, msfuy, xkmh, rdx, rdy, fnm, fnp, &
2379 ids, ide, jds, jde, kds, kde, &
2380 ims, ime, jms, jme, kms, kme, &
2381 its, ite, jts, jte, kts, kte )
2383 CALL horizontal_diffusion_v_2( rv_tendf, mu, config_flags, &
2384 defor12, defor22, div, &
2385 nba_mij, n_nba_mij, & !JDM
2387 msfvx, msfvy, xkmh, rdx, rdy, fnm, fnp, &
2389 ids, ide, jds, jde, kds, kde, &
2390 ims, ime, jms, jme, kms, kme, &
2391 its, ite, jts, jte, kts, kte )
2393 CALL horizontal_diffusion_w_2( rw_tendf, mu, config_flags, &
2394 defor13, defor23, div, &
2395 nba_mij, n_nba_mij, & !JDM
2397 msftx, msfty, xkmh, rdx, rdy, fnm, fnp, &
2399 ids, ide, jds, jde, kds, kde, &
2400 ims, ime, jms, jme, kms, kme, &
2401 its, ite, jts, jte, kts, kte )
2403 CALL horizontal_diffusion_s ( rt_tendf, mu, config_flags, thp, &
2404 msftx, msfty, msfux, msfuy, &
2405 msfvx, msfvy, xkhh, rdx, rdy, &
2406 fnm, fnp, cf1, cf2, cf3, &
2407 zx, zy, rdz, rdzw, dnw, dn, &
2409 ids, ide, jds, jde, kds, kde, &
2410 ims, ime, jms, jme, kms, kme, &
2411 its, ite, jts, jte, kts, kte )
2413 IF (km_opt .eq. 2) &
2414 CALL horizontal_diffusion_s ( tke_tendf(ims,kms,jms), &
2417 msftx, msfty, msfux, msfuy, &
2418 msfvx, msfvy, xkhh, rdx, rdy, &
2419 fnm, fnp, cf1, cf2, cf3, &
2420 zx, zy, rdz, rdzw, dnw, dn, &
2422 ids, ide, jds, jde, kds, kde, &
2423 ims, ime, jms, jme, kms, kme, &
2424 its, ite, jts, jte, kts, kte )
2426 IF (n_moist .ge. PARAM_FIRST_SCALAR) THEN
2428 moist_loop: do im = PARAM_FIRST_SCALAR, n_moist
2430 CALL horizontal_diffusion_s( moist_tendf(ims,kms,jms,im), &
2432 moist(ims,kms,jms,im), &
2433 msftx, msfty, msfux, msfuy, &
2434 msfvx, msfvy, xkhh, rdx, rdy, &
2435 fnm, fnp, cf1, cf2, cf3, &
2436 zx, zy, rdz, rdzw, dnw, dn, &
2438 ids, ide, jds, jde, kds, kde, &
2439 ims, ime, jms, jme, kms, kme, &
2440 its, ite, jts, jte, kts, kte )
2446 IF (n_chem .ge. PARAM_FIRST_SCALAR) THEN
2448 chem_loop: do ic = PARAM_FIRST_SCALAR, n_chem
2450 CALL horizontal_diffusion_s( chem_tendf(ims,kms,jms,ic), &
2452 chem(ims,kms,jms,ic), &
2453 msftx, msfty, msfux, msfuy, &
2454 msfvx, msfvy, xkhh, rdx, rdy, &
2455 fnm, fnp, cf1, cf2, cf3, &
2456 zx, zy, rdz, rdzw, dnw, dn, &
2458 ids, ide, jds, jde, kds, kde, &
2459 ims, ime, jms, jme, kms, kme, &
2460 its, ite, jts, jte, kts, kte )
2466 IF (n_tracer .ge. PARAM_FIRST_SCALAR) THEN
2468 tracer_loop: do ic = PARAM_FIRST_SCALAR, n_tracer
2470 CALL horizontal_diffusion_s( tracer_tendf(ims,kms,jms,ic), &
2472 tracer(ims,kms,jms,ic), &
2473 msftx, msfty, msfux, msfuy, &
2474 msfvx, msfvy, xkhh, rdx, rdy, &
2475 fnm, fnp, cf1, cf2, cf3, &
2476 zx, zy, rdz, rdzw, dnw, dn, &
2478 ids, ide, jds, jde, kds, kde, &
2479 ims, ime, jms, jme, kms, kme, &
2480 its, ite, jts, jte, kts, kte )
2485 IF (n_scalar .ge. PARAM_FIRST_SCALAR) THEN
2487 scalar_loop: do is = PARAM_FIRST_SCALAR, n_scalar
2489 CALL horizontal_diffusion_s( scalar_tendf(ims,kms,jms,is), &
2491 scalar(ims,kms,jms,is), &
2492 msftx, msfty, msfux, msfuy, &
2493 msfvx, msfvy, xkhh, rdx, rdy, &
2494 fnm, fnp, cf1, cf2, cf3, &
2495 zx, zy, rdz, rdzw, dnw, dn, &
2497 ids, ide, jds, jde, kds, kde, &
2498 ims, ime, jms, jme, kms, kme, &
2499 its, ite, jts, jte, kts, kte )
2505 END SUBROUTINE horizontal_diffusion_2
2507 !=======================================================================
2508 !=======================================================================
2510 SUBROUTINE horizontal_diffusion_u_2( tendency, mu, config_flags, &
2511 defor11, defor12, div, &
2512 nba_mij, n_nba_mij, & !JDM
2515 xkmh, rdx, rdy, fnm, fnp, &
2517 ids, ide, jds, jde, kds, kde, &
2518 ims, ime, jms, jme, kms, kme, &
2519 its, ite, jts, jte, kts, kte )
2521 !-----------------------------------------------------------------------
2522 ! Begin declarations.
2526 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
2528 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
2529 ims, ime, jms, jme, kms, kme, &
2530 its, ite, jts, jte, kts, kte
2532 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
2533 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
2535 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfux, &
2539 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
2541 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: rdzw
2544 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor11, &
2552 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
2554 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
2557 REAL , INTENT(IN ) :: rdx, &
2561 INTEGER :: i, j, k, ktf
2563 INTEGER :: i_start, i_end, j_start, j_end
2564 INTEGER :: is_ext,ie_ext,js_ext,je_ext
2566 REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau1avg, &
2575 REAL :: mrdx, mrdy, rcoup
2577 REAL :: tmpzy, tmpzeta_z
2579 REAL :: term1, term2, term3
2582 !-----------------------------------------------------------------------
2586 !-----------------------------------------------------------------------
2587 ! u : p (.), u(|), w(-)
2591 ! p | . | . | . | k+1 | . | . | . | k+1
2593 ! w - 13 - - k+1 13 k+1
2595 ! p | 11 O 11 | . | k | 12 O 12 | . | k
2599 ! p | . | . | . | k-1 | . | . | . | k-1
2601 ! i-1 i i i+1 j-1 j j j+1 j+1
2607 j_end = MIN(jte,jde-1)
2609 IF ( config_flags%open_xs .or. config_flags%specified .or. &
2610 config_flags%nested) i_start = MAX(ids+1,its)
2611 IF ( config_flags%open_xe .or. config_flags%specified .or. &
2612 config_flags%nested) i_end = MIN(ide-1,ite)
2613 IF ( config_flags%open_ys .or. config_flags%specified .or. &
2614 config_flags%nested) j_start = MAX(jds+1,jts)
2615 IF ( config_flags%open_ye .or. config_flags%specified .or. &
2616 config_flags%nested) j_end = MIN(jde-2,jte)
2617 IF ( config_flags%periodic_x ) i_start = its
2618 IF ( config_flags%periodic_x ) i_end = ite
2625 CALL cal_titau_11_22_33( config_flags, titau1, &
2626 mu, tke, xkmh, defor11, &
2627 nba_mij(ims,kms,jms,P_m11), & !JDM
2628 is_ext, ie_ext, js_ext, je_ext, &
2629 ids, ide, jds, jde, kds, kde, &
2630 ims, ime, jms, jme, kms, kme, &
2631 its, ite, jts, jte, kts, kte )
2638 CALL cal_titau_12_21( config_flags, titau2, &
2639 mu, xkmh, defor12, &
2640 nba_mij(ims,kms,jms,P_m12), & !JDM
2641 is_ext, ie_ext, js_ext, je_ext, &
2642 ids, ide, jds, jde, kds, kde, &
2643 ims, ime, jms, jme, kms, kme, &
2644 its, ite, jts, jte, kts, kte )
2646 ! titau1avg = titau11avg
2647 ! titau2avg = titau12avg
2649 DO j = j_start, j_end
2651 DO i = i_start, i_end
2652 titau1avg(i,k,j)=0.5*(fnm(k)*(titau1(i-1,k ,j)+titau1(i,k ,j))+ &
2653 fnp(k)*(titau1(i-1,k-1,j)+titau1(i,k-1,j)))
2654 titau2avg(i,k,j)=0.5*(fnm(k)*(titau2(i,k ,j+1)+titau2(i,k ,j))+ &
2655 fnp(k)*(titau2(i,k-1,j+1)+titau2(i,k-1,j)))
2656 tmpzy = 0.25*( zy(i-1,k,j )+zy(i,k,j )+ &
2657 zy(i-1,k,j+1)+zy(i,k,j+1) )
2658 ! tmpzeta_z = 0.5*(zeta_z(i,j)+zeta_z(i-1,j))
2659 ! titau1avg(i,k,j)=titau1avg(i,k,j)*zx(i,k,j)*tmpzeta_z
2660 ! titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy *tmpzeta_z
2662 titau1avg(i,k,j)=titau1avg(i,k,j)*zx(i,k,j)
2663 titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy
2669 DO j = j_start, j_end
2670 DO i = i_start, i_end
2671 titau1avg(i,kts,j)=0.
2672 titau1avg(i,ktf+1,j)=0.
2673 titau2avg(i,kts,j)=0.
2674 titau2avg(i,ktf+1,j)=0.
2678 DO j = j_start, j_end
2680 DO i = i_start, i_end
2684 tendency(i,k,j)=tendency(i,k,j)- &
2685 (mrdx*(titau1(i,k,j )-titau1(i-1,k,j))+ &
2686 mrdy*(titau2(i,k,j+1)-titau2(i,k,j ))- &
2687 msfuy(i,j)*rdzw(i,k,j)*((titau1avg(i,k+1,j)-titau1avg(i,k,j))+ &
2688 (titau2avg(i,k+1,j)-titau2avg(i,k,j)) &
2694 END SUBROUTINE horizontal_diffusion_u_2
2696 !=======================================================================
2697 !=======================================================================
2699 SUBROUTINE horizontal_diffusion_v_2( tendency, mu, config_flags, &
2700 defor12, defor22, div, &
2701 nba_mij, n_nba_mij, & !JDM
2704 xkmh, rdx, rdy, fnm, fnp, &
2706 ids, ide, jds, jde, kds, kde, &
2707 ims, ime, jms, jme, kms, kme, &
2708 its, ite, jts, jte, kts, kte )
2710 !-----------------------------------------------------------------------
2711 ! Begin declarations.
2715 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
2717 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
2718 ims, ime, jms, jme, kms, kme, &
2719 its, ite, jts, jte, kts, kte
2721 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
2722 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
2724 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfvx, &
2728 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency
2730 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor12, &
2739 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
2741 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
2744 REAL , INTENT(IN ) :: rdx, &
2749 INTEGER :: i, j, k, ktf
2751 INTEGER :: i_start, i_end, j_start, j_end
2752 INTEGER :: is_ext,ie_ext,js_ext,je_ext
2754 REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau1avg, &
2764 REAL :: mrdx, mrdy, rcoup
2766 REAL :: tmpzx, tmpzeta_z
2769 !-----------------------------------------------------------------------
2773 !-----------------------------------------------------------------------
2774 ! v : p (.), v(+), w(-)
2778 ! p + . + . + . + k+1 + . + . + . + k+1
2780 ! w - 23 - - k+1 23 k+1
2782 ! p + 22 O 22 + . + k + 21 O 21 + . + k
2786 ! p + . + . + . + k-1 + . + . + . + k-1
2788 ! j-1 j j j+1 i-1 i i i+1 i+1
2792 i_end = MIN(ite,ide-1)
2796 IF ( config_flags%open_xs .or. config_flags%specified .or. &
2797 config_flags%nested) i_start = MAX(ids+1,its)
2798 IF ( config_flags%open_xe .or. config_flags%specified .or. &
2799 config_flags%nested) i_end = MIN(ide-2,ite)
2800 IF ( config_flags%open_ys .or. config_flags%specified .or. &
2801 config_flags%nested) j_start = MAX(jds+1,jts)
2802 IF ( config_flags%open_ye .or. config_flags%specified .or. &
2803 config_flags%nested) j_end = MIN(jde-1,jte)
2804 IF ( config_flags%periodic_x ) i_start = its
2805 IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
2812 CALL cal_titau_12_21( config_flags, titau1, &
2813 mu, xkmh, defor12, &
2814 nba_mij(ims,kms,jms,P_m12), & !JDM
2815 is_ext,ie_ext,js_ext,je_ext, &
2816 ids, ide, jds, jde, kds, kde, &
2817 ims, ime, jms, jme, kms, kme, &
2818 its, ite, jts, jte, kts, kte )
2825 CALL cal_titau_11_22_33( config_flags, titau2, &
2826 mu, tke, xkmh, defor22, &
2827 nba_mij(ims,kms,jms,P_m22), & !JDM
2828 is_ext, ie_ext, js_ext, je_ext, &
2829 ids, ide, jds, jde, kds, kde, &
2830 ims, ime, jms, jme, kms, kme, &
2831 its, ite, jts, jte, kts, kte )
2833 DO j = j_start, j_end
2835 DO i = i_start, i_end
2836 titau1avg(i,k,j)=0.5*(fnm(k)*(titau1(i+1,k ,j)+titau1(i,k ,j))+ &
2837 fnp(k)*(titau1(i+1,k-1,j)+titau1(i,k-1,j)))
2838 titau2avg(i,k,j)=0.5*(fnm(k)*(titau2(i,k ,j-1)+titau2(i,k ,j))+ &
2839 fnp(k)*(titau2(i,k-1,j-1)+titau2(i,k-1,j)))
2841 tmpzx = 0.25*( zx(i,k,j )+zx(i+1,k,j )+ &
2842 zx(i,k,j-1)+zx(i+1,k,j-1) )
2845 titau1avg(i,k,j)=titau1avg(i,k,j)*tmpzx
2846 titau2avg(i,k,j)=titau2avg(i,k,j)*zy(i,k,j)
2853 DO j = j_start, j_end
2854 DO i = i_start, i_end
2855 titau1avg(i,kts,j)=0.
2856 titau1avg(i,ktf+1,j)=0.
2857 titau2avg(i,kts,j)=0.
2858 titau2avg(i,ktf+1,j)=0.
2862 DO j = j_start, j_end
2864 DO i = i_start, i_end
2868 tendency(i,k,j)=tendency(i,k,j)- &
2869 (mrdy*(titau2(i ,k,j)-titau2(i,k,j-1))+ &
2870 mrdx*(titau1(i+1,k,j)-titau1(i,k,j ))- &
2871 msfvy(i,j)*rdzw(i,k,j)*((titau1avg(i,k+1,j)-titau1avg(i,k,j))+ &
2872 (titau2avg(i,k+1,j)-titau2avg(i,k,j)) &
2880 END SUBROUTINE horizontal_diffusion_v_2
2882 !=======================================================================
2883 !=======================================================================
2885 SUBROUTINE horizontal_diffusion_w_2( tendency, mu, config_flags, &
2886 defor13, defor23, div, &
2887 nba_mij, n_nba_mij, & !JDM
2890 xkmh, rdx, rdy, fnm, fnp, &
2892 ids, ide, jds, jde, kds, kde, &
2893 ims, ime, jms, jme, kms, kme, &
2894 its, ite, jts, jte, kts, kte )
2896 !-----------------------------------------------------------------------
2897 ! Begin declarations.
2901 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
2903 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
2904 ims, ime, jms, jme, kms, kme, &
2905 its, ite, jts, jte, kts, kte
2907 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
2908 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
2910 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msftx, &
2914 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency
2916 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor13, &
2925 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
2927 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
2930 REAL , INTENT(IN ) :: rdx, &
2935 INTEGER :: i, j, k, ktf
2937 INTEGER :: i_start, i_end, j_start, j_end
2938 INTEGER :: is_ext,ie_ext,js_ext,je_ext
2940 REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau1avg, &
2950 REAL :: mrdx, mrdy, rcoup
2952 REAL :: tmpzx, tmpzy, tmpzeta_z
2955 !-----------------------------------------------------------------------
2959 !-----------------------------------------------------------------------
2960 ! w : p (.), u(|), v(+), w(-)
2964 ! w - - - k+1 w - - - k+1
2966 ! p . | 33 | . k p . + 33 + . k
2968 ! w - 31 O 31 - k w - 32 O 32 - k
2970 ! p . | 33 | . k-1 p . | 33 | . k-1
2972 ! w - - - k-1 w - - - k-1
2974 ! i-1 i i i+1 j-1 j j j+1
2977 i_end = MIN(ite,ide-1)
2979 j_end = MIN(jte,jde-1)
2981 IF ( config_flags%open_xs .or. config_flags%specified .or. &
2982 config_flags%nested) i_start = MAX(ids+1,its)
2983 IF ( config_flags%open_xe .or. config_flags%specified .or. &
2984 config_flags%nested) i_end = MIN(ide-2,ite)
2985 IF ( config_flags%open_ys .or. config_flags%specified .or. &
2986 config_flags%nested) j_start = MAX(jds+1,jts)
2987 IF ( config_flags%open_ye .or. config_flags%specified .or. &
2988 config_flags%nested) j_end = MIN(jde-2,jte)
2989 IF ( config_flags%periodic_x ) i_start = its
2990 IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
2997 CALL cal_titau_13_31( config_flags, titau1, defor13, &
2998 nba_mij(ims,kms,jms,P_m13), & !JDM
2999 mu, xkmh, fnm, fnp, &
3000 is_ext, ie_ext, js_ext, je_ext, &
3001 ids, ide, jds, jde, kds, kde, &
3002 ims, ime, jms, jme, kms, kme, &
3003 its, ite, jts, jte, kts, kte )
3010 CALL cal_titau_23_32( config_flags, titau2, defor23, &
3011 nba_mij(ims,kms,jms,P_m23), & !JDM
3012 mu, xkmh, fnm, fnp, &
3013 is_ext, ie_ext, js_ext, je_ext, &
3014 ids, ide, jds, jde, kds, kde, &
3015 ims, ime, jms, jme, kms, kme, &
3016 its, ite, jts, jte, kts, kte )
3018 ! titau1avg = titau31avg * zx * zeta_z = titau13avg * zx * zeta_z
3019 ! titau2avg = titau32avg * zy * zeta_z = titau23avg * zy * zeta_z
3021 DO j = j_start, j_end
3023 DO i = i_start, i_end
3024 titau1avg(i,k,j)=0.25*(titau1(i+1,k+1,j)+titau1(i,k+1,j)+ &
3025 titau1(i+1,k ,j)+titau1(i,k ,j))
3026 titau2avg(i,k,j)=0.25*(titau2(i,k+1,j+1)+titau2(i,k+1,j)+ &
3027 titau2(i,k ,j+1)+titau2(i,k ,j))
3029 tmpzx =0.25*( zx(i,k ,j)+zx(i+1,k ,j)+ &
3030 zx(i,k+1,j)+zx(i+1,k+1,j) )
3031 tmpzy =0.25*( zy(i,k ,j)+zy(i,k ,j+1)+ &
3032 zy(i,k+1,j)+zy(i,k+1,j+1) )
3034 titau1avg(i,k,j)=titau1avg(i,k,j)*tmpzx
3035 titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy
3036 ! titau1avg(i,k,j)=titau1avg(i,k,j)*tmpzx*zeta_z(i,j)
3037 ! titau2avg(i,k,j)=titau2avg(i,k,j)*tmpzy*zeta_z(i,j)
3042 DO j = j_start, j_end
3043 DO i = i_start, i_end
3044 titau1avg(i,ktf+1,j)=0.
3045 titau2avg(i,ktf+1,j)=0.
3049 DO j = j_start, j_end
3051 DO i = i_start, i_end
3056 tendency(i,k,j)=tendency(i,k,j)- &
3057 (mrdx*(titau1(i+1,k,j)-titau1(i,k,j))+ &
3058 mrdy*(titau2(i,k,j+1)-titau2(i,k,j))- &
3059 msfty(i,j)*rdz(i,k,j)*(titau1avg(i,k,j)-titau1avg(i,k-1,j)+ &
3060 titau2avg(i,k,j)-titau2avg(i,k-1,j) &
3063 ! msft(i,j)/dn(k)*(titau1avg(i,k,j)-titau1avg(i,k-1,j)+ &
3064 ! titau2avg(i,k,j)-titau2avg(i,k-1,j) &
3071 END SUBROUTINE horizontal_diffusion_w_2
3073 !=======================================================================
3074 !=======================================================================
3076 SUBROUTINE horizontal_diffusion_s (tendency, mu, config_flags, var, &
3077 msftx, msfty, msfux, msfuy, &
3078 msfvx, msfvy, xkhh, rdx, rdy, &
3079 fnm, fnp, cf1, cf2, cf3, &
3080 zx, zy, rdz, rdzw, dnw, dn, &
3082 ids, ide, jds, jde, kds, kde, &
3083 ims, ime, jms, jme, kms, kme, &
3084 its, ite, jts, jte, kts, kte )
3086 !-----------------------------------------------------------------------
3087 ! Begin declarations.
3091 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
3093 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
3094 ims, ime, jms, jme, kms, kme, &
3095 its, ite, jts, jte, kts, kte
3097 LOGICAL, INTENT(IN ) :: doing_tke
3099 REAL , INTENT(IN ) :: cf1, cf2, cf3
3101 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
3102 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
3103 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
3104 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
3106 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfux
3107 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfuy
3108 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfvx
3109 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfvy
3110 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msftx
3111 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: msfty
3113 REAL , DIMENSION( ims:ime, jms:jme) , INTENT(IN ) :: mu
3115 ! REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1), &
3116 ! INTENT(IN ) :: xkhh
3118 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: tendency
3120 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: &
3125 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: var, &
3129 REAL , INTENT(IN ) :: rdx, &
3134 INTEGER :: i, j, k, ktf
3136 INTEGER :: i_start, i_end, j_start, j_end
3138 REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: H1avg, &
3147 REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: tmptendf
3149 REAL :: mrdx, mrdy, rcoup
3150 REAL :: tmpzx, tmpzy, tmpzeta_z, rdzu, rdzv
3151 INTEGER :: ktes1,ktes2
3154 !-----------------------------------------------------------------------
3158 !-----------------------------------------------------------------------
3159 ! scalars: t (.), u(|), v(+), w(-)
3163 ! w - 3 - k+1 w - 3 - k+1
3165 ! t . 1 O 1 . k t . 2 O 2 . k
3167 ! w - 3 - k w - 3 - k
3169 ! t . | . | . k-1 t . + . + . k-1
3171 ! w - - - k-1 w - - - k-1
3173 ! t i-1 i i i+1 j-1 j j j+1
3180 i_end = MIN(ite,ide-1)
3182 j_end = MIN(jte,jde-1)
3184 IF ( config_flags%open_xs .or. config_flags%specified .or. &
3185 config_flags%nested) i_start = MAX(ids+1,its)
3186 IF ( config_flags%open_xe .or. config_flags%specified .or. &
3187 config_flags%nested) i_end = MIN(ide-2,ite)
3188 IF ( config_flags%open_ys .or. config_flags%specified .or. &
3189 config_flags%nested) j_start = MAX(jds+1,jts)
3190 IF ( config_flags%open_ye .or. config_flags%specified .or. &
3191 config_flags%nested) j_end = MIN(jde-2,jte)
3192 IF ( config_flags%periodic_x ) i_start = its
3193 IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
3195 ! diffusion of the TKE needs mutiple 2
3197 IF ( doing_tke ) THEN
3198 DO j = j_start, j_end
3200 DO i = i_start, i_end
3201 tmptendf(i,k,j)=tendency(i,k,j)
3207 ! H1 = partial var over partial x
3209 DO j = j_start, j_end
3211 DO i = i_start, i_end + 1
3213 ! zxavg(i,k,j) =0.5*( zx(i-1,k,j)+ zx(i,k,j))
3214 xkxavg(i,k,j)=0.5*(xkhh(i-1,k,j)+xkhh(i,k,j))
3219 DO j = j_start, j_end
3221 DO i = i_start, i_end + 1
3222 H1avg(i,k,j)=0.5*(fnm(k)*(var(i-1,k ,j)+var(i,k ,j))+ &
3223 fnp(k)*(var(i-1,k-1,j)+var(i,k-1,j)))
3228 DO j = j_start, j_end
3229 DO i = i_start, i_end + 1
3230 H1avg(i,kts ,j)=0.5*(cf1*var(i ,1,j)+cf2*var(i ,2,j)+ &
3231 cf3*var(i ,3,j)+cf1*var(i-1,1,j)+ &
3232 cf2*var(i-1,2,j)+cf3*var(i-1,3,j))
3233 H1avg(i,ktf+1,j)=0.5*(var(i,ktes1,j)+(var(i,ktes1,j)- &
3234 var(i,ktes2,j))*0.5*dnw(ktes1)/dn(ktes1)+ &
3235 var(i-1,ktes1,j)+(var(i-1,ktes1,j)- &
3236 var(i-1,ktes2,j))*0.5*dnw(ktes1)/dn(ktes1))
3240 DO j = j_start, j_end
3242 DO i = i_start, i_end + 1
3244 tmpzx = 0.5*( zx(i,k,j)+ zx(i,k+1,j))
3245 rdzu = 2./(1./rdzw(i,k,j) + 1./rdzw(i-1,k,j))
3246 H1(i,k,j)=-msfuy(i,j)*xkxavg(i,k,j)*( &
3247 rdx*(var(i,k,j)-var(i-1,k,j)) - tmpzx* &
3248 (H1avg(i,k+1,j)-H1avg(i,k,j))*rdzu )
3250 ! tmpzeta_z = 0.5*(zeta_z(i,j)+zeta_z(i-1,j))
3251 ! H1(i,k,j)=-msfuy(i,j)*xkxavg(i,k,j)*( &
3252 ! rdx*(var(i,k,j)-var(i-1,k,j)) - tmpzx*tmpzeta_z* &
3253 ! (H1avg(i,k+1,j)-H1avg(i,k,j))/dnw(k))
3258 ! H2 = partial var over partial y
3260 DO j = j_start, j_end + 1
3262 DO i = i_start, i_end
3264 ! zyavg(i,k,j) =0.5*( zy(i,k,j-1)+ zy(i,k,j))
3265 xkxavg(i,k,j)=0.5*(xkhh(i,k,j-1)+xkhh(i,k,j))
3270 DO j = j_start, j_end + 1
3272 DO i = i_start, i_end
3274 H2avg(i,k,j)=0.5*(fnm(k)*(var(i,k ,j-1)+var(i,k ,j))+ &
3275 fnp(k)*(var(i,k-1,j-1)+var(i,k-1,j)))
3280 DO j = j_start, j_end + 1
3281 DO i = i_start, i_end
3282 H2avg(i,kts ,j)=0.5*(cf1*var(i,1,j )+cf2*var(i ,2,j)+ &
3283 cf3*var(i,3,j )+cf1*var(i,1,j-1)+ &
3284 cf2*var(i,2,j-1)+cf3*var(i,3,j-1))
3285 H2avg(i,ktf+1,j)=0.5*(var(i,ktes1,j)+(var(i,ktes1,j)- &
3286 var(i,ktes2,j))*0.5*dnw(ktes1)/dn(ktes1)+ &
3287 var(i,ktes1,j-1)+(var(i,ktes1,j-1)- &
3288 var(i,ktes2,j-1))*0.5*dnw(ktes1)/dn(ktes1))
3292 DO j = j_start, j_end + 1
3294 DO i = i_start, i_end
3296 tmpzy = 0.5*( zy(i,k,j)+ zy(i,k+1,j))
3297 rdzv = 2./(1./rdzw(i,k,j) + 1./rdzw(i,k,j-1))
3298 H2(i,k,j)=-msfvy(i,j)*xkxavg(i,k,j)*( &
3299 rdy*(var(i,k,j)-var(i,k,j-1)) - tmpzy* &
3300 (H2avg(i ,k+1,j)-H2avg(i,k,j))*rdzv)
3302 ! tmpzeta_z = 0.5*(zeta_z(i,j)+zeta_z(i,j-1))
3303 ! H2(i,k,j)=-msfvy(i,j)*xkxavg(i,k,j)*( &
3304 ! rdy*(var(i,k,j)-var(i,k,j-1)) - tmpzy*tmpzeta_z* &
3305 ! (H2avg(i ,k+1,j)-H2avg(i,k,j))/dnw(k))
3310 DO j = j_start, j_end
3312 DO i = i_start, i_end
3313 H1avg(i,k,j)=0.5*(fnm(k)*(H1(i+1,k ,j)+H1(i,k ,j))+ &
3314 fnp(k)*(H1(i+1,k-1,j)+H1(i,k-1,j)))
3315 H2avg(i,k,j)=0.5*(fnm(k)*(H2(i,k ,j+1)+H2(i,k ,j))+ &
3316 fnp(k)*(H2(i,k-1,j+1)+H2(i,k-1,j)))
3318 ! zxavg(i,k,j)=fnm(k)*zx(i,k,j)+fnp(k)*zx(i,k-1,j)
3319 ! zyavg(i,k,j)=fnm(k)*zy(i,k,j)+fnp(k)*zy(i,k-1,j)
3321 ! H1avg(i,k,j)=zx*H1avg*zeta_z
3322 ! H2avg(i,k,j)=zy*H2avg*zeta_z
3324 tmpzx = 0.5*( zx(i,k,j)+ zx(i+1,k,j ))
3325 tmpzy = 0.5*( zy(i,k,j)+ zy(i ,k,j+1))
3327 H1avg(i,k,j)=H1avg(i,k,j)*tmpzx
3328 H2avg(i,k,j)=H2avg(i,k,j)*tmpzy
3330 ! H1avg(i,k,j)=H1avg(i,k,j)*tmpzx*zeta_z(i,j)
3331 ! H2avg(i,k,j)=H2avg(i,k,j)*tmpzy*zeta_z(i,j)
3336 DO j = j_start, j_end
3337 DO i = i_start, i_end
3345 DO j = j_start, j_end
3347 DO i = i_start, i_end
3352 tendency(i,k,j)=tendency(i,k,j)- &
3353 (mrdx*0.5*((mu(i+1,j)+mu(i,j))*H1(i+1,k,j)- &
3354 (mu(i-1,j)+mu(i,j))*H1(i ,k,j))+ &
3355 mrdy*0.5*((mu(i,j+1)+mu(i,j))*H2(i,k,j+1)- &
3356 (mu(i,j-1)+mu(i,j))*H2(i,k,j ))- &
3357 msfty(i,j)*mu(i,j)*(H1avg(i,k+1,j)-H1avg(i,k,j)+ &
3358 H2avg(i,k+1,j)-H2avg(i,k,j) &
3366 IF ( doing_tke ) THEN
3367 DO j = j_start, j_end
3369 DO i = i_start, i_end
3370 tendency(i,k,j)=tmptendf(i,k,j)+2.* &
3371 (tendency(i,k,j)-tmptendf(i,k,j))
3377 END SUBROUTINE horizontal_diffusion_s
3379 !=======================================================================
3380 !=======================================================================
3382 SUBROUTINE vertical_diffusion_2 ( ru_tendf, rv_tendf, rw_tendf, rt_tendf, &
3383 tke_tendf, moist_tendf, n_moist, &
3384 chem_tendf, n_chem, &
3385 scalar_tendf, n_scalar, &
3386 tracer_tendf, n_tracer, &
3388 thp,u_base,v_base,t_base,qv_base,mu,tke, &
3389 config_flags,defor13,defor23,defor33, &
3390 nba_mij, n_nba_mij, & !JDM
3392 moist,chem,scalar,tracer,xkmv,xkhv,km_opt,&
3393 fnm, fnp, dn, dnw, rdz, rdzw, &
3394 hfx, qfx, ust, rho, &
3395 ids, ide, jds, jde, kds, kde, &
3396 ims, ime, jms, jme, kms, kme, &
3397 its, ite, jts, jte, kts, kte )
3399 !-----------------------------------------------------------------------
3400 ! Begin declarations.
3404 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
3406 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
3407 ims, ime, jms, jme, kms, kme, &
3408 its, ite, jts, jte, kts, kte
3410 INTEGER , INTENT(IN ) :: n_moist,n_chem,n_scalar,n_tracer,km_opt
3412 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
3413 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
3414 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
3415 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
3416 REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: mu
3418 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: qv_base
3419 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: u_base
3420 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: v_base
3421 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: t_base
3423 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::ru_tendf,&
3429 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
3430 INTENT(INOUT) :: moist_tendf
3432 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
3433 INTENT(INOUT) :: chem_tendf
3435 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar) , &
3436 INTENT(INOUT) :: scalar_tendf
3437 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer) , &
3438 INTENT(INOUT) :: tracer_tendf
3440 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_moist), &
3441 INTENT(INOUT) :: moist
3443 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_chem), &
3444 INTENT(INOUT) :: chem
3446 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_scalar) , &
3447 INTENT(IN ) :: scalar
3448 REAL , DIMENSION( ims:ime, kms:kme, jms:jme, n_tracer) , &
3449 INTENT(IN ) :: tracer
3451 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) ::defor13, &
3463 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
3465 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
3468 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(IN ) :: rho
3469 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: hfx, &
3471 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: ust
3472 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) :: thp
3476 REAL , DIMENSION( ims:ime, kms:kme, jms:jme) :: var_mix
3478 INTEGER :: im, i,j,k
3479 INTEGER :: i_start, i_end, j_start, j_end
3481 ! REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: xkhv
3483 !***************************************************************************
3484 !***************************************************************************
3485 !MODIFICA VARIABILI PER I FLUSSI
3487 REAL :: V0_u,V0_v,tao_xz,tao_yz,ustar,cd0
3488 REAL :: xsfc,psi1,vk2,zrough,lnz
3489 REAL :: heat_flux, moist_flux, heat_flux0
3492 !FINE MODIFICA VARIABILI PER I FLUSSI
3493 !***************************************************************************
3497 !-----------------------------------------------------------------------
3500 i_end = MIN(ite,ide-1)
3502 j_end = MIN(jte,jde-1)
3504 !-----------------------------------------------------------------------
3506 CALL vertical_diffusion_u_2( ru_tendf, config_flags, mu, &
3508 nba_mij, n_nba_mij, & !JDM
3509 dnw, rdzw, fnm, fnp, &
3510 ids, ide, jds, jde, kds, kde, &
3511 ims, ime, jms, jme, kms, kme, &
3512 its, ite, jts, jte, kts, kte )
3515 CALL vertical_diffusion_v_2( rv_tendf, config_flags, mu, &
3517 nba_mij, n_nba_mij, & !JDM
3518 dnw, rdzw, fnm, fnp, &
3519 ids, ide, jds, jde, kds, kde, &
3520 ims, ime, jms, jme, kms, kme, &
3521 its, ite, jts, jte, kts, kte )
3523 CALL vertical_diffusion_w_2( rw_tendf, config_flags, mu, &
3524 defor33, tke(ims,kms,jms), &
3525 nba_mij, n_nba_mij, & !JDM
3528 ids, ide, jds, jde, kds, kde, &
3529 ims, ime, jms, jme, kms, kme, &
3530 its, ite, jts, jte, kts, kte )
3532 !*****************************************
3533 !*****************************************
3534 ! MODIFICA al flusso di momento alla parete
3536 vflux: SELECT CASE( config_flags%isfflx )
3537 CASE (0) ! Assume cd a constant, specified in namelist
3538 cd0 = config_flags%tke_drag_coefficient ! constant drag coefficient
3539 ! set in namelist.input
3541 !calcolo del modulo della velocita
3542 DO j = j_start, j_end
3546 V0_u= sqrt((u_2(i,kts,j)**2) + &
3547 (((v_2(i ,kts,j )+ &
3550 v_2(i-1,kts,j+1))/4)**2))+epsilon
3551 tao_xz=cd0*V0_u*u_2(i,kts,j)
3552 ru_tendf(i,kts,j)=ru_tendf(i,kts,j) &
3553 -0.25*(mu(i,j)+mu(i-1,j))*tao_xz*(rdzw(i,kts,j)+rdzw(i-1,kts,j))
3559 DO i = i_start, i_end
3562 V0_v= sqrt((v_2(i,kts,j)**2) + &
3563 (((u_2(i ,kts,j )+ &
3566 u_2(i+1,kts,j-1))/4)**2))+epsilon
3567 tao_yz=cd0*V0_v*v_2(i,kts,j)
3568 rv_tendf(i,kts,j)=rv_tendf(i,kts,j) &
3569 -0.25*(mu(i,j)+mu(i,j-1))*tao_yz*(rdzw(i,kts,j)+rdzw(i,kts,j-1))
3573 CASE (1,2) ! ustar computed from surface routine
3574 DO j = j_start, j_end
3578 V0_u= sqrt((u_2(i,kts,j)**2) + &
3579 (((v_2(i ,kts,j )+ &
3582 v_2(i-1,kts,j+1))/4)**2))+epsilon
3583 ustar=0.5*(ust(i,j)+ust(i-1,j))
3584 tao_xz=ustar*ustar*u_2(i,kts,j)/V0_u
3585 ru_tendf(i,kts,j)=ru_tendf(i,kts,j) &
3586 -0.25*(mu(i,j)+mu(i-1,j))*tao_xz*(rdzw(i,kts,j)+rdzw(i-1,kts,j))
3591 DO i = i_start, i_end
3594 V0_v= sqrt((v_2(i,kts,j)**2) + &
3595 (((u_2(i ,kts,j )+ &
3598 u_2(i+1,kts,j-1))/4)**2))+epsilon
3599 ustar=0.5*(ust(i,j)+ust(i,j-1))
3600 tao_yz=ustar*ustar*v_2(i,kts,j)/V0_v
3601 rv_tendf(i,kts,j)=rv_tendf(i,kts,j) &
3602 -0.25*(mu(i,j)+mu(i,j-1))*tao_yz*(rdzw(i,kts,j)+rdzw(i,kts,j-1))
3607 CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
3611 ! FINE MODIFICA al flusso di momento alla parete
3612 !*****************************************
3613 !*****************************************
3615 IF ( config_flags%mix_full_fields ) THEN
3617 DO j=jts,min(jte,jde-1)
3619 DO i=its,min(ite,ide-1)
3620 var_mix(i,k,j) = thp(i,k,j)
3627 DO j=jts,min(jte,jde-1)
3629 DO i=its,min(ite,ide-1)
3630 var_mix(i,k,j) = thp(i,k,j) - t_base(k)
3637 CALL vertical_diffusion_s( rt_tendf, config_flags, var_mix, mu, xkhv, &
3638 dn, dnw, rdz, rdzw, fnm, fnp, &
3640 ids, ide, jds, jde, kds, kde, &
3641 ims, ime, jms, jme, kms, kme, &
3642 its, ite, jts, jte, kts, kte )
3645 !*****************************************
3646 !*****************************************
3647 !MODIFICA al flusso di calore
3650 hflux: SELECT CASE( config_flags%isfflx )
3651 CASE (0,2) ! with fixed surface heat flux given in the namelist
3652 heat_flux = config_flags%tke_heat_flux ! constant heat flux value
3653 ! set in namelist.input
3654 DO j = j_start, j_end
3655 DO i = i_start, i_end
3656 rt_tendf(i,kts,j)=rt_tendf(i,kts,j) &
3657 +mu(i,j)*heat_flux*rdzw(i,kts,j)
3661 CASE (1) ! use surface heat flux computed from surface routine
3662 DO j = j_start, j_end
3663 DO i = i_start, i_end
3665 cpm = cp * (1. + 0.8 * moist(i,kts,j,P_QV))
3666 heat_flux = hfx(i,j)/cpm/rho(i,1,j)
3667 rt_tendf(i,kts,j)=rt_tendf(i,kts,j) &
3668 +mu(i,j)*heat_flux*rdzw(i,kts,j)
3674 CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
3678 ! FINE MODIFICA al flusso di calore
3679 !*****************************************
3680 !*****************************************
3682 If (km_opt .eq. 2) then
3683 CALL vertical_diffusion_s( tke_tendf(ims,kms,jms), &
3684 config_flags, tke(ims,kms,jms), &
3686 dn, dnw, rdz, rdzw, fnm, fnp, &
3688 ids, ide, jds, jde, kds, kde, &
3689 ims, ime, jms, jme, kms, kme, &
3690 its, ite, jts, jte, kts, kte )
3693 IF (n_moist .ge. PARAM_FIRST_SCALAR) THEN
3695 moist_loop: do im = PARAM_FIRST_SCALAR, n_moist
3697 IF ( (.not. config_flags%mix_full_fields) .and. (im == P_QV) ) THEN
3699 DO j=jts,min(jte,jde-1)
3701 DO i=its,min(ite,ide-1)
3702 var_mix(i,k,j) = moist(i,k,j,im) - qv_base(k)
3709 DO j=jts,min(jte,jde-1)
3711 DO i=its,min(ite,ide-1)
3712 var_mix(i,k,j) = moist(i,k,j,im)
3720 CALL vertical_diffusion_s( moist_tendf(ims,kms,jms,im), &
3721 config_flags, var_mix, &
3723 dn, dnw, rdz, rdzw, fnm, fnp, &
3725 ids, ide, jds, jde, kds, kde, &
3726 ims, ime, jms, jme, kms, kme, &
3727 its, ite, jts, jte, kts, kte )
3729 !*****************************************
3730 !*****************************************
3731 !MODIFICATIONS for water vapor flux
3734 qflux: SELECT CASE( config_flags%isfflx )
3737 CASE (1,2) ! with surface moisture flux
3738 IF ( im == P_QV ) THEN
3739 DO j = j_start, j_end
3740 DO i = i_start, i_end
3741 moist_flux = qfx(i,j)/rho(i,1,j)
3742 moist_tendf(i,kts,j,im)=moist_tendf(i,kts,j,im) &
3743 +mu(i,j)*moist_flux*rdzw(i,kts,j)
3749 CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
3752 ! END MODIFICATIONS for water vapor flux
3753 !*****************************************
3754 !*****************************************
3759 IF (n_chem .ge. PARAM_FIRST_SCALAR) THEN
3761 chem_loop: do im = PARAM_FIRST_SCALAR, n_chem
3763 CALL vertical_diffusion_s( chem_tendf(ims,kms,jms,im), &
3764 config_flags, chem(ims,kms,jms,im), &
3766 dn, dnw, rdz, rdzw, fnm, fnp, &
3768 ids, ide, jds, jde, kds, kde, &
3769 ims, ime, jms, jme, kms, kme, &
3770 its, ite, jts, jte, kts, kte )
3775 IF (n_tracer .ge. PARAM_FIRST_SCALAR) THEN
3777 tracer_loop: do im = PARAM_FIRST_SCALAR, n_tracer
3779 CALL vertical_diffusion_s( tracer_tendf(ims,kms,jms,im), &
3780 config_flags, tracer(ims,kms,jms,im), &
3782 dn, dnw, rdz, rdzw, fnm, fnp, &
3784 ids, ide, jds, jde, kds, kde, &
3785 ims, ime, jms, jme, kms, kme, &
3786 its, ite, jts, jte, kts, kte )
3792 IF (n_scalar .ge. PARAM_FIRST_SCALAR) THEN
3794 scalar_loop: do im = PARAM_FIRST_SCALAR, n_scalar
3796 CALL vertical_diffusion_s( scalar_tendf(ims,kms,jms,im), &
3797 config_flags, scalar(ims,kms,jms,im), &
3799 dn, dnw, rdz, rdzw, fnm, fnp, &
3801 ids, ide, jds, jde, kds, kde, &
3802 ims, ime, jms, jme, kms, kme, &
3803 its, ite, jts, jte, kts, kte )
3808 END SUBROUTINE vertical_diffusion_2
3810 !=======================================================================
3811 !=======================================================================
3813 SUBROUTINE vertical_diffusion_u_2( tendency, config_flags, mu, &
3815 nba_mij, n_nba_mij, & !JDM
3816 dnw, rdzw, fnm, fnp, &
3817 ids, ide, jds, jde, kds, kde, &
3818 ims, ime, jms, jme, kms, kme, &
3819 its, ite, jts, jte, kts, kte )
3821 !-----------------------------------------------------------------------
3822 ! Begin declarations.
3826 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
3828 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
3829 ims, ime, jms, jme, kms, kme, &
3830 its, ite, jts, jte, kts, kte
3832 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
3833 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
3834 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
3835 ! REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: zeta_z
3837 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
3839 REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
3840 INTENT(IN ) ::defor13, &
3844 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
3846 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
3849 REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: mu
3853 INTEGER :: i, j, k, ktf
3855 INTEGER :: i_start, i_end, j_start, j_end
3856 INTEGER :: is_ext,ie_ext,js_ext,je_ext
3858 REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau3
3860 REAL , DIMENSION( its:ite, jts:jte) :: zzavg
3865 !-----------------------------------------------------------------------
3872 j_end = MIN(jte,jde-1)
3874 IF ( config_flags%open_xs .or. config_flags%specified .or. &
3875 config_flags%nested) i_start = MAX(ids+1,its)
3876 IF ( config_flags%open_xe .or. config_flags%specified .or. &
3877 config_flags%nested) i_end = MIN(ide-1,ite)
3878 IF ( config_flags%open_ys .or. config_flags%specified .or. &
3879 config_flags%nested) j_start = MAX(jds+1,jts)
3880 IF ( config_flags%open_ye .or. config_flags%specified .or. &
3881 config_flags%nested) j_end = MIN(jde-2,jte)
3882 IF ( config_flags%periodic_x ) i_start = its
3883 IF ( config_flags%periodic_x ) i_end = ite
3890 CALL cal_titau_13_31( config_flags, titau3, defor13, &
3891 nba_mij(ims,kms,jms,P_m13), & !JDM
3892 mu, xkmv, fnm, fnp, &
3893 is_ext, ie_ext, js_ext, je_ext, &
3894 ids, ide, jds, jde, kds, kde, &
3895 ims, ime, jms, jme, kms, kme, &
3896 its, ite, jts, jte, kts, kte )
3898 DO j = j_start, j_end
3900 DO i = i_start, i_end
3902 rdzu = 2./(1./rdzw(i,k,j) + 1./rdzw(i-1,k,j))
3903 tendency(i,k,j)=tendency(i,k,j)-rdzu*(titau3(i,k+1,j)-titau3(i,k,j))
3910 ! we will pick up the surface drag (titau3(i,kts,j)) later
3912 DO j = j_start, j_end
3914 DO i = i_start, i_end
3916 rdzu = 2./(1./rdzw(i,k,j) + 1./rdzw(i-1,k,j))
3917 tendency(i,k,j)=tendency(i,k,j)-rdzu*(titau3(i,k+1,j))
3922 END SUBROUTINE vertical_diffusion_u_2
3924 !=======================================================================
3925 !=======================================================================
3927 SUBROUTINE vertical_diffusion_v_2( tendency, config_flags, mu, &
3929 nba_mij, n_nba_mij, & !JDM
3930 dnw, rdzw, fnm, fnp, &
3931 ids, ide, jds, jde, kds, kde, &
3932 ims, ime, jms, jme, kms, kme, &
3933 its, ite, jts, jte, kts, kte )
3934 !-----------------------------------------------------------------------
3935 ! Begin declarations.
3939 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
3941 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
3942 ims, ime, jms, jme, kms, kme, &
3943 its, ite, jts, jte, kts, kte
3944 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
3945 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
3946 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
3947 ! REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: zeta_z
3949 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
3951 REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
3952 INTENT(IN ) ::defor23, &
3956 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
3958 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
3961 REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: mu
3965 INTEGER :: i, j, k, ktf
3967 INTEGER :: i_start, i_end, j_start, j_end
3968 INTEGER :: is_ext,ie_ext,js_ext,je_ext
3970 REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau3
3972 REAL , DIMENSION( its:ite, jts:jte) :: zzavg
3977 !-----------------------------------------------------------------------
3982 i_end = MIN(ite,ide-1)
3986 IF ( config_flags%open_xs .or. config_flags%specified .or. &
3987 config_flags%nested) i_start = MAX(ids+1,its)
3988 IF ( config_flags%open_xe .or. config_flags%specified .or. &
3989 config_flags%nested) i_end = MIN(ide-2,ite)
3990 IF ( config_flags%open_ys .or. config_flags%specified .or. &
3991 config_flags%nested) j_start = MAX(jds+1,jts)
3992 IF ( config_flags%open_ye .or. config_flags%specified .or. &
3993 config_flags%nested) j_end = MIN(jde-1,jte)
3994 IF ( config_flags%periodic_x ) i_start = its
3995 IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
4002 CALL cal_titau_23_32( config_flags, titau3, defor23, &
4003 nba_mij(ims,kms,jms,P_m23), & !JDM
4004 mu, xkmv, fnm, fnp, &
4005 is_ext, ie_ext, js_ext, je_ext, &
4006 ids, ide, jds, jde, kds, kde, &
4007 ims, ime, jms, jme, kms, kme, &
4008 its, ite, jts, jte, kts, kte )
4010 DO j = j_start, j_end
4012 DO i = i_start, i_end
4014 rdzv = 2./(1./rdzw(i,k,j) + 1./rdzw(i,k,j-1))
4015 tendency(i,k,j)=tendency(i,k,j)-rdzv*(titau3(i,k+1,j)-titau3(i,k,j))
4022 ! we will pick up the surface drag (titau3(i,kts,j)) later
4024 DO j = j_start, j_end
4026 DO i = i_start, i_end
4028 rdzv = 2./(1./rdzw(i,k,j) + 1./rdzw(i,k,j-1))
4029 tendency(i,k,j)=tendency(i,k,j)-rdzv*(titau3(i,k+1,j))
4035 END SUBROUTINE vertical_diffusion_v_2
4037 !=======================================================================
4038 !=======================================================================
4040 SUBROUTINE vertical_diffusion_w_2(tendency, config_flags, mu, &
4042 nba_mij, n_nba_mij, & !JDM
4045 ids, ide, jds, jde, kds, kde, &
4046 ims, ime, jms, jme, kms, kme, &
4047 its, ite, jts, jte, kts, kte )
4049 !-----------------------------------------------------------------------
4050 ! Begin declarations.
4054 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
4056 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
4057 ims, ime, jms, jme, kms, kme, &
4058 its, ite, jts, jte, kts, kte
4060 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
4062 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
4064 REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
4065 INTENT(IN ) ::defor33, &
4071 INTEGER, INTENT( IN ) :: n_nba_mij !JDM
4073 REAL , DIMENSION(ims:ime, kms:kme, jms:jme, n_nba_mij), INTENT(INOUT) & !JDM
4076 REAL , DIMENSION( ims:ime, jms:jme), INTENT(IN ) :: mu
4080 INTEGER :: i, j, k, ktf
4082 INTEGER :: i_start, i_end, j_start, j_end
4083 INTEGER :: is_ext,ie_ext,js_ext,je_ext
4085 REAL , DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1) :: titau3
4088 !-----------------------------------------------------------------------
4093 i_end = MIN(ite,ide-1)
4095 j_end = MIN(jte,jde-1)
4097 IF ( config_flags%open_xs .or. config_flags%specified .or. &
4098 config_flags%nested) i_start = MAX(ids+1,its)
4099 IF ( config_flags%open_xe .or. config_flags%specified .or. &
4100 config_flags%nested) i_end = MIN(ide-2,ite)
4101 IF ( config_flags%open_ys .or. config_flags%specified .or. &
4102 config_flags%nested) j_start = MAX(jds+1,jts)
4103 IF ( config_flags%open_ye .or. config_flags%specified .or. &
4104 config_flags%nested) j_end = MIN(jde-2,jte)
4105 IF ( config_flags%periodic_x ) i_start = its
4106 IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
4113 CALL cal_titau_11_22_33( config_flags, titau3, &
4114 mu, tke, xkmv, defor33, &
4115 nba_mij(ims,kms,jms,P_m33), & !JDM
4116 is_ext, ie_ext, js_ext, je_ext, &
4117 ids, ide, jds, jde, kds, kde, &
4118 ims, ime, jms, jme, kms, kme, &
4119 its, ite, jts, jte, kts, kte )
4121 ! DO j = j_start, j_end
4123 ! DO i = i_start, i_end
4124 ! titau3(i,k,j)=titau3(i,k,j)*zeta_z(i,j)
4129 DO j = j_start, j_end
4131 DO i = i_start, i_end
4132 tendency(i,k,j)=tendency(i,k,j)-rdz(i,k,j)*(titau3(i,k,j)-titau3(i,k-1,j))
4137 END SUBROUTINE vertical_diffusion_w_2
4139 !=======================================================================
4140 !=======================================================================
4142 SUBROUTINE vertical_diffusion_s( tendency, config_flags, var, mu, xkhv, &
4143 dn, dnw, rdz, rdzw, fnm, fnp, &
4145 ids, ide, jds, jde, kds, kde, &
4146 ims, ime, jms, jme, kms, kme, &
4147 its, ite, jts, jte, kts, kte )
4149 !-----------------------------------------------------------------------
4150 ! Begin declarations.
4154 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
4156 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
4157 ims, ime, jms, jme, kms, kme, &
4158 its, ite, jts, jte, kts, kte
4160 LOGICAL, INTENT(IN ) :: doing_tke
4162 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnm
4163 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: fnp
4164 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dn
4165 REAL , DIMENSION( kms:kme ) , INTENT(IN ) :: dnw
4167 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::tendency
4169 REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , INTENT(IN) :: xkhv
4171 REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: mu
4173 REAL , DIMENSION( ims:ime , kms:kme, jms:jme ) , &
4174 INTENT(IN ) :: var, &
4179 INTEGER :: i, j, k, ktf
4181 INTEGER :: i_start, i_end, j_start, j_end
4183 REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: H3, &
4187 REAL , DIMENSION( its:ite, kts:kte, jts:jte) :: tmptendf
4190 !-----------------------------------------------------------------------
4195 i_end = MIN(ite,ide-1)
4197 j_end = MIN(jte,jde-1)
4199 IF ( config_flags%open_xs .or. config_flags%specified .or. &
4200 config_flags%nested) i_start = MAX(ids+1,its)
4201 IF ( config_flags%open_xe .or. config_flags%specified .or. &
4202 config_flags%nested) i_end = MIN(ide-2,ite)
4203 IF ( config_flags%open_ys .or. config_flags%specified .or. &
4204 config_flags%nested) j_start = MAX(jds+1,jts)
4205 IF ( config_flags%open_ye .or. config_flags%specified .or. &
4206 config_flags%nested) j_end = MIN(jde-2,jte)
4207 IF ( config_flags%periodic_x ) i_start = its
4208 IF ( config_flags%periodic_x ) i_end = MIN(ite,ide-1)
4211 DO j = j_start, j_end
4213 DO i = i_start, i_end
4214 tmptendf(i,k,j)=tendency(i,k,j)
4224 DO j = j_start, j_end
4226 DO i = i_start, i_end
4227 xkxavg(i,k,j)=fnm(k)*xkhv(i,k,j)+fnp(k)*xkhv(i,k-1,j)
4228 H3(i,k,j)=-xkxavg(i,k,j)*(var(i,k,j)-var(i,k-1,j))*rdz(i,k,j)
4229 ! H3(i,k,j)=-xkxavg(i,k,j)*zeta_z(i,j)* &
4230 ! (var(i,k,j)-var(i,k-1,j))/dn(k)
4235 DO j = j_start, j_end
4236 DO i = i_start, i_end
4239 ! H3(i,kts,j)=H3(i,kts+1,j)
4240 ! H3(i,ktf+1,j)=H3(i,ktf,j)
4244 DO j = j_start, j_end
4246 DO i = i_start, i_end
4247 tendency(i,k,j)=tendency(i,k,j) &
4248 -mu(i,j)*(H3(i,k+1,j)-H3(i,k,j))*rdzw(i,k,j)
4254 DO j = j_start, j_end
4256 DO i = i_start, i_end
4257 tendency(i,k,j)=tmptendf(i,k,j)+2.* &
4258 (tendency(i,k,j)-tmptendf(i,k,j))
4264 END SUBROUTINE vertical_diffusion_s
4266 !=======================================================================
4267 !=======================================================================
4269 SUBROUTINE cal_titau_11_22_33( config_flags, titau, &
4270 mu, tke, xkx, defor, &
4272 is_ext, ie_ext, js_ext, je_ext, &
4273 ids, ide, jds, jde, kds, kde, &
4274 ims, ime, jms, jme, kms, kme, &
4275 its, ite, jts, jte, kts, kte )
4277 ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
4278 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
4279 ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
4281 ! Purpose: This routine calculates stress terms (taus) for use in
4282 ! the calculation of production of TKE by sheared wind
4284 ! References: Klemp and Wilhelmson (JAS 1978)
4285 ! Deardorff (B-L Meteor 1980)
4286 ! Chen and Dudhia (NCAR WRF physics report 2000)
4290 !-----------------------------------------------------------------------
4291 ! Begin declarations.
4295 TYPE( grid_config_rec_type ), INTENT( IN ) &
4298 INTEGER, INTENT( IN ) &
4299 :: ids, ide, jds, jde, kds, kde, &
4300 ims, ime, jms, jme, kms, kme, &
4301 its, ite, jts, jte, kts, kte
4303 INTEGER, INTENT( IN ) &
4304 :: is_ext, ie_ext, js_ext, je_ext
4306 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
4309 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
4312 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
4315 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
4321 :: i, j, k, ktf, i_start, i_end, j_start, j_end
4324 !-----------------------------------------------------------------------
4326 ktf = MIN( kte, kde-1 )
4333 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
4334 config_flags%nested) i_start = MAX( ids+1, its )
4335 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
4336 config_flags%nested) i_end = MIN( ide-1, ite )
4337 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
4338 config_flags%nested) j_start = MAX( jds+1, jts )
4339 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
4340 config_flags%nested) j_end = MIN( jde-1, jte )
4341 IF ( config_flags%periodic_x ) i_start = its
4342 IF ( config_flags%periodic_x ) i_end = ite
4344 i_start = i_start - is_ext
4345 i_end = i_end + ie_ext
4346 j_start = j_start - js_ext
4347 j_end = j_end + je_ext
4349 IF ( config_flags%sfs_opt .GT. 0 ) THEN ! USE NBA MODEL SFS STRESSES
4351 DO j = j_start, j_end
4353 DO i = i_start, i_end
4355 titau(i,k,j) = mu(i,j) * mtau(i,k,j)
4363 IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
4365 DO j = j_start, j_end
4367 DO i = i_start, i_end
4369 titau(i,k,j) = - mu(i,j) * xkx(i,k,j) * defor(i,k,j)
4370 mtau(i,k,j) = - xkx(i,k,j) * defor(i,k,j)
4376 ELSE !NO STRESS OUTPUT
4378 DO j = j_start, j_end
4380 DO i = i_start, i_end
4382 titau(i,k,j) = - mu(i,j) * xkx(i,k,j) * defor(i,k,j)
4392 END SUBROUTINE cal_titau_11_22_33
4394 !=======================================================================
4395 !=======================================================================
4397 SUBROUTINE cal_titau_12_21( config_flags, titau, &
4400 is_ext, ie_ext, js_ext, je_ext, &
4401 ids, ide, jds, jde, kds, kde, &
4402 ims, ime, jms, jme, kms, kme, &
4403 its, ite, jts, jte, kts, kte )
4405 ! History: Sep 2003 Modifications by George Bryan and Jason Knievel, NCAR
4406 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
4407 ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
4409 ! Pusrpose This routine calculates the stress terms (taus) for use in
4410 ! the calculation of production of TKE by sheared wind
4412 ! References: Klemp and Wilhelmson (JAS 1978)
4413 ! Deardorff (B-L Meteor 1980)
4414 ! Chen and Dudhia (NCAR WRF physics report 2000)
4418 !-----------------------------------------------------------------------
4419 ! Begin declarations.
4423 TYPE( grid_config_rec_type), INTENT( IN ) &
4426 INTEGER, INTENT( IN ) &
4427 :: ids, ide, jds, jde, kds, kde, &
4428 ims, ime, jms, jme, kms, kme, &
4429 its, ite, jts, jte, kts, kte
4431 INTEGER, INTENT( IN ) &
4432 :: is_ext, ie_ext, js_ext, je_ext
4434 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
4437 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
4440 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
4443 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
4449 :: i, j, k, ktf, i_start, i_end, j_start, j_end
4451 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
4454 REAL, DIMENSION( its-1:ite+1, jts-1:jte+1 ) &
4458 !-----------------------------------------------------------------------
4460 ktf = MIN( kte, kde-1 )
4462 ! Needs one more point in the x and y directions.
4469 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
4470 config_flags%nested ) i_start = MAX( ids+1, its )
4471 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
4472 config_flags%nested ) i_end = MIN( ide-1, ite )
4473 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
4474 config_flags%nested ) j_start = MAX( jds+1, jts )
4475 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
4476 config_flags%nested ) j_end = MIN( jde-1, jte )
4477 IF ( config_flags%periodic_x ) i_start = its
4478 IF ( config_flags%periodic_x ) i_end = ite
4480 i_start = i_start - is_ext
4481 i_end = i_end + ie_ext
4482 j_start = j_start - js_ext
4483 j_end = j_end + je_ext
4485 DO j = j_start, j_end
4487 DO i = i_start, i_end
4488 xkxavg(i,k,j) = 0.25 * ( xkx(i-1,k,j ) + xkx(i,k,j ) + &
4489 xkx(i-1,k,j-1) + xkx(i,k,j-1) )
4494 DO j = j_start, j_end
4495 DO i = i_start, i_end
4496 muavg(i,j) = 0.25 * ( mu(i-1,j ) + mu(i,j ) + &
4497 mu(i-1,j-1) + mu(i,j-1) )
4501 ! titau12 or titau21
4503 IF ( config_flags%sfs_opt .GT. 0 ) THEN ! USE NBA MODEL SFS STRESSES
4505 DO j = j_start, j_end
4507 DO i = i_start, i_end
4509 titau(i,k,j) = muavg(i,j) * mtau(i,k,j)
4517 IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
4519 DO j = j_start, j_end
4521 DO i = i_start, i_end
4523 titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
4524 mtau(i,k,j) = - xkxavg(i,k,j) * defor(i,k,j)
4530 ELSE ! NO STRESS OUTPUT
4532 DO j = j_start, j_end
4534 DO i = i_start, i_end
4536 titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
4546 END SUBROUTINE cal_titau_12_21
4548 !=======================================================================
4550 SUBROUTINE cal_titau_13_31( config_flags, titau, &
4553 mu, xkx, fnm, fnp, &
4554 is_ext, ie_ext, js_ext, je_ext, &
4555 ids, ide, jds, jde, kds, kde, &
4556 ims, ime, jms, jme, kms, kme, &
4557 its, ite, jts, jte, kts, kte )
4559 ! History: Sep 2003 Modifications by George Bryan and Jason Knievel, NCAR
4560 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
4561 ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
4563 ! Purpose: This routine calculates the stress terms (taus) for use in
4564 ! the calculation of production of TKE by sheared wind
4566 ! References: Klemp and Wilhelmson (JAS 1978)
4567 ! Deardorff (B-L Meteor 1980)
4568 ! Chen and Dudhia (NCAR WRF physics report 2000)
4572 !-----------------------------------------------------------------------
4573 ! Begin declarations.
4577 TYPE( grid_config_rec_type), INTENT( IN ) &
4580 INTEGER, INTENT( IN ) &
4581 :: ids, ide, jds, jde, kds, kde, &
4582 ims, ime, jms, jme, kms, kme, &
4583 its, ite, jts, jte, kts, kte
4585 INTEGER, INTENT( IN ) &
4586 :: is_ext, ie_ext, js_ext, je_ext
4588 REAL, DIMENSION( kms:kme ), INTENT( IN ) &
4591 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
4594 REAL, DIMENSION( ims:ime, kms:kme, jms:jme), INTENT( IN ) &
4597 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
4600 REAL, DIMENSION( ims:ime, jms:jme), INTENT( IN ) &
4606 :: i, j, k, ktf, i_start, i_end, j_start, j_end
4608 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
4611 REAL, DIMENSION( its-1:ite+1, jts-1:jte+1 ) &
4615 !-----------------------------------------------------------------------
4617 ktf = MIN( kte, kde-1 )
4619 ! Find ide-1 and jde-1 for averaging to p point.
4624 j_end = MIN( jte, jde-1 )
4626 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
4627 config_flags%nested) i_start = MAX( ids+1, its )
4628 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
4629 config_flags%nested) i_end = MIN( ide-1, ite )
4630 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
4631 config_flags%nested) j_start = MAX( jds+1, jts )
4632 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
4633 config_flags%nested) j_end = MIN( jde-2, jte )
4634 IF ( config_flags%periodic_x ) i_start = its
4635 IF ( config_flags%periodic_x ) i_end = ite
4637 i_start = i_start - is_ext
4638 i_end = i_end + ie_ext
4639 j_start = j_start - js_ext
4640 j_end = j_end + je_ext
4642 DO j = j_start, j_end
4644 DO i = i_start, i_end
4645 xkxavg(i,k,j) = 0.5 * ( fnm(k) * ( xkx(i,k ,j) + xkx(i-1,k ,j) ) + &
4646 fnp(k) * ( xkx(i,k-1,j) + xkx(i-1,k-1,j) ) )
4651 DO j = j_start, j_end
4652 DO i = i_start, i_end
4653 muavg(i,j) = 0.5 * ( mu(i,j) + mu(i-1,j) )
4657 IF ( config_flags%sfs_opt .GT. 0 ) THEN ! USE NBA MODEL SFS STRESSES
4659 DO j = j_start, j_end
4661 DO i = i_start, i_end
4662 titau(i,k,j) = muavg(i,j) * mtau(i,k,j)
4669 IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
4671 DO j = j_start, j_end
4673 DO i = i_start, i_end
4675 titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
4676 mtau(i,k,j) = - xkxavg(i,k,j) * defor(i,k,j)
4682 ELSE ! NO STRESS OUTPUT
4684 DO j = j_start, j_end
4686 DO i = i_start, i_end
4688 titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
4698 DO j = j_start, j_end
4699 DO i = i_start, i_end
4700 titau(i,kts ,j) = 0.0
4701 titau(i,ktf+1,j) = 0.0
4705 END SUBROUTINE cal_titau_13_31
4707 !=======================================================================
4708 !=======================================================================
4710 SUBROUTINE cal_titau_23_32( config_flags, titau, defor, &
4712 mu, xkx, fnm, fnp, &
4713 is_ext, ie_ext, js_ext, je_ext, &
4714 ids, ide, jds, jde, kds, kde, &
4715 ims, ime, jms, jme, kms, kme, &
4716 its, ite, jts, jte, kts, kte )
4718 ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
4719 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
4720 ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
4722 ! Purpose: This routine calculates stress terms (taus) for use in
4723 ! the calculation of production of TKE by sheared wind
4725 ! References: Klemp and Wilhelmson (JAS 1978)
4726 ! Deardorff (B-L Meteor 1980)
4727 ! Chen and Dudhia (NCAR WRF physics report 2000)
4731 !-----------------------------------------------------------------------
4732 ! Begin declarations.
4736 TYPE( grid_config_rec_type ), INTENT( IN ) &
4739 INTEGER, INTENT( IN ) &
4740 :: ids, ide, jds, jde, kds, kde, &
4741 ims, ime, jms, jme, kms, kme, &
4742 its, ite, jts, jte, kts, kte
4744 INTEGER, INTENT( IN ) &
4745 :: is_ext,ie_ext,js_ext,je_ext
4747 REAL, DIMENSION( kms:kme ), INTENT( IN ) &
4750 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ), INTENT( INOUT ) &
4753 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
4756 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) & !JDM
4759 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
4765 :: i, j, k, ktf, i_start, i_end, j_start, j_end
4767 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
4770 REAL, DIMENSION( its-1:ite+1, jts-1:jte+1 ) &
4774 !-----------------------------------------------------------------------
4776 ktf = MIN( kte, kde-1 )
4778 ! Find ide-1 and jde-1 for averaging to p point.
4781 i_end = MIN( ite, ide-1 )
4785 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
4786 config_flags%nested) i_start = MAX( ids+1, its )
4787 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
4788 config_flags%nested) i_end = MIN( ide-2, ite )
4789 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
4790 config_flags%nested) j_start = MAX( jds+1, jts )
4791 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
4792 config_flags%nested) j_end = MIN( jde-1, jte )
4793 IF ( config_flags%periodic_x ) i_start = its
4794 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
4796 i_start = i_start - is_ext
4797 i_end = i_end + ie_ext
4798 j_start = j_start - js_ext
4799 j_end = j_end + je_ext
4801 DO j = j_start, j_end
4803 DO i = i_start, i_end
4804 xkxavg(i,k,j) = 0.5 * ( fnm(k) * ( xkx(i,k ,j) + xkx(i,k ,j-1) ) + &
4805 fnp(k) * ( xkx(i,k-1,j) + xkx(i,k-1,j-1) ) )
4810 DO j = j_start, j_end
4811 DO i = i_start, i_end
4812 muavg(i,j) = 0.5 * ( mu(i,j) + mu(i,j-1) )
4816 IF ( config_flags%sfs_opt .EQ. 1 ) THEN ! USE NBA MODEL SFS STRESSES
4818 DO j = j_start, j_end
4820 DO i = i_start, i_end
4822 titau(i,k,j) = muavg(i,j) * mtau(i,k,j)
4830 IF ( config_flags%m_opt .EQ. 1 ) THEN ! ASSIGN STRESS TO MTAU FOR OUTPUT
4832 DO j = j_start, j_end
4834 DO i = i_start, i_end
4836 titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
4837 mtau(i,k,j) = - xkxavg(i,k,j) * defor(i,k,j)
4843 ELSE ! NO STRESS OUTPUT
4845 DO j = j_start, j_end
4847 DO i = i_start, i_end
4849 titau(i,k,j) = - muavg(i,j) * xkxavg(i,k,j) * defor(i,k,j)
4859 DO j = j_start, j_end
4860 DO i = i_start, i_end
4861 titau(i,kts ,j) = 0.0
4862 titau(i,ktf+1,j) = 0.0
4866 END SUBROUTINE cal_titau_23_32
4868 !=======================================================================
4869 !=======================================================================
4871 SUBROUTINE phy_bc ( config_flags,div,defor11,defor22,defor33, &
4872 defor12,defor13,defor23,xkmh,xkmv,xkhh,xkhv,tke, &
4874 ids, ide, jds, jde, kds, kde, &
4875 ims, ime, jms, jme, kms, kme, &
4876 ips, ipe, jps, jpe, kps, kpe, &
4877 its, ite, jts, jte, kts, kte )
4879 !------------------------------------------------------------------------------
4880 ! Begin declarations.
4884 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
4886 INTEGER , INTENT(IN ) :: ids, ide, jds, jde, kds, kde, &
4887 ims, ime, jms, jme, kms, kme, &
4888 ips, ipe, jps, jpe, kps, kpe, &
4889 its, ite, jts, jte, kts, kte
4891 REAL , DIMENSION( ims:ime, kms:kme, jms:jme), INTENT(INOUT) ::RUBLTEN, &
4907 !-----------------------------------------------------------------------
4909 IF(config_flags%bl_pbl_physics .GT. 0) THEN
4911 CALL set_physical_bc3d( RUBLTEN , 't', config_flags, &
4912 ids, ide, jds, jde, kds, kde, &
4913 ims, ime, jms, jme, kms, kme, &
4914 ips, ipe, jps, jpe, kps, kpe, &
4915 its, ite, jts, jte, kts, kte )
4917 CALL set_physical_bc3d( RVBLTEN , 't', config_flags, &
4918 ids, ide, jds, jde, kds, kde, &
4919 ims, ime, jms, jme, kms, kme, &
4920 ips, ipe, jps, jpe, kps, kpe, &
4921 its, ite, jts, jte, kts, kte )
4925 ! move out of the conditional, below; horiz coeffs needed for
4926 ! all diff_opt cases. JM
4928 CALL set_physical_bc3d( xkmh , 't', config_flags, &
4929 ids, ide, jds, jde, kds, kde, &
4930 ims, ime, jms, jme, kms, kme, &
4931 ips, ipe, jps, jpe, kps, kpe, &
4932 its, ite, jts, jte, kts, kte )
4934 CALL set_physical_bc3d( xkhh , 't', config_flags, &
4935 ids, ide, jds, jde, kds, kde, &
4936 ims, ime, jms, jme, kms, kme, &
4937 ips, ipe, jps, jpe, kps, kpe, &
4938 its, ite, jts, jte, kts, kte )
4940 IF(config_flags%diff_opt .eq. 2) THEN
4942 CALL set_physical_bc3d( xkmv , 't', config_flags, &
4943 ids, ide, jds, jde, kds, kde, &
4944 ims, ime, jms, jme, kms, kme, &
4945 ips, ipe, jps, jpe, kps, kpe, &
4946 its, ite, jts, jte, kts, kte )
4948 CALL set_physical_bc3d( xkhv , 't', config_flags, &
4949 ids, ide, jds, jde, kds, kde, &
4950 ims, ime, jms, jme, kms, kme, &
4951 ips, ipe, jps, jpe, kps, kpe, &
4952 its, ite, jts, jte, kts, kte )
4954 CALL set_physical_bc3d( div , 't', config_flags, &
4955 ids, ide, jds, jde, kds, kde, &
4956 ims, ime, jms, jme, kms, kme, &
4957 ips, ipe, jps, jpe, kps, kpe, &
4958 its, ite, jts, jte, kts, kte )
4960 CALL set_physical_bc3d( defor11 , 't', config_flags, &
4961 ids, ide, jds, jde, kds, kde, &
4962 ims, ime, jms, jme, kms, kme, &
4963 ips, ipe, jps, jpe, kps, kpe, &
4964 its, ite, jts, jte, kts, kte )
4966 CALL set_physical_bc3d( defor22 , 't', config_flags, &
4967 ids, ide, jds, jde, kds, kde, &
4968 ims, ime, jms, jme, kms, kme, &
4969 ips, ipe, jps, jpe, kps, kpe, &
4970 its, ite, jts, jte, kts, kte )
4972 CALL set_physical_bc3d( defor33 , 't', config_flags, &
4973 ids, ide, jds, jde, kds, kde, &
4974 ims, ime, jms, jme, kms, kme, &
4975 ips, ipe, jps, jpe, kps, kpe, &
4976 its, ite, jts, jte, kts, kte )
4978 CALL set_physical_bc3d( defor12 , 'd', config_flags, &
4979 ids, ide, jds, jde, kds, kde, &
4980 ims, ime, jms, jme, kms, kme, &
4981 ips, ipe, jps, jpe, kps, kpe, &
4982 its, ite, jts, jte, kts, kte )
4984 CALL set_physical_bc3d( defor13 , 'e', config_flags, &
4985 ids, ide, jds, jde, kds, kde, &
4986 ims, ime, jms, jme, kms, kme, &
4987 ips, ipe, jps, jpe, kps, kpe, &
4988 its, ite, jts, jte, kts, kte )
4990 CALL set_physical_bc3d( defor23 , 'f', config_flags, &
4991 ids, ide, jds, jde, kds, kde, &
4992 ims, ime, jms, jme, kms, kme, &
4993 ips, ipe, jps, jpe, kps, kpe, &
4994 its, ite, jts, jte, kts, kte )
4998 END SUBROUTINE phy_bc
5000 !=======================================================================
5001 !=======================================================================
5003 SUBROUTINE tke_rhs( tendency, BN2, config_flags, &
5004 defor11, defor22, defor33, &
5005 defor12, defor13, defor23, &
5006 u, v, w, div, tke, mu, &
5007 theta, p, p8w, t8w, z, fnm, fnp, &
5008 cf1, cf2, cf3, msftx, msfty, &
5010 rdx, rdy, dx, dy, dt, zx, zy, &
5011 rdz, rdzw, dn, dnw, isotropic, &
5012 hfx, qfx, qv, ust, rho, &
5013 ids, ide, jds, jde, kds, kde, &
5014 ims, ime, jms, jme, kms, kme, &
5015 its, ite, jts, jte, kts, kte )
5017 !-----------------------------------------------------------------------
5018 ! Begin declarations.
5022 TYPE( grid_config_rec_type ), INTENT( IN ) &
5025 INTEGER, INTENT( IN ) &
5026 :: ids, ide, jds, jde, kds, kde, &
5027 ims, ime, jms, jme, kms, kme, &
5028 its, ite, jts, jte, kts, kte
5030 INTEGER, INTENT( IN ) :: isotropic
5031 REAL, INTENT( IN ) &
5032 :: cf1, cf2, cf3, dt, rdx, rdy, dx, dy
5034 REAL, DIMENSION( kms:kme ), INTENT( IN ) &
5035 :: fnm, fnp, dnw, dn
5037 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5040 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
5043 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
5044 :: defor11, defor22, defor33, defor12, defor13, defor23, &
5045 div, BN2, tke, xkmh, xkmv, xkhv, zx, zy, u, v, w, theta, &
5046 p, p8w, t8w, z, rdz, rdzw
5048 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5051 REAL, DIMENSION ( ims:ime, jms:jme ), INTENT( IN ) &
5053 REAL, DIMENSION ( ims:ime, kms:kme, jms:jme ), INTENT ( IN ) &
5059 :: i, j, k, ktf, i_start, i_end, j_start, j_end
5062 !-----------------------------------------------------------------------
5064 CALL tke_shear( tendency, config_flags, &
5065 defor11, defor22, defor33, &
5066 defor12, defor13, defor23, &
5067 u, v, w, tke, ust, mu, fnm, fnp, &
5068 cf1, cf2, cf3, msftx, msfty, &
5070 rdx, rdy, zx, zy, rdz, rdzw, dnw, dn, &
5071 ids, ide, jds, jde, kds, kde, &
5072 ims, ime, jms, jme, kms, kme, &
5073 its, ite, jts, jte, kts, kte )
5075 CALL tke_buoyancy( tendency, config_flags, mu, &
5076 tke, xkhv, BN2, theta, dt, &
5077 hfx, qfx, qv, rho, &
5078 ids, ide, jds, jde, kds, kde, &
5079 ims, ime, jms, jme, kms, kme, &
5080 its, ite, jts, jte, kts, kte )
5082 CALL tke_dissip( tendency, config_flags, &
5083 mu, tke, bn2, theta, p8w, t8w, z, &
5084 dx, dy,rdz, rdzw, isotropic, &
5086 ids, ide, jds, jde, kds, kde, &
5087 ims, ime, jms, jme, kms, kme, &
5088 its, ite, jts, jte, kts, kte )
5090 ! Set a lower limit on TKE.
5092 ktf = MIN( kte, kde-1 )
5094 i_end = MIN( ite, ide-1 )
5096 j_end = MIN( jte, jde-1 )
5098 IF ( config_flags%open_xs .or. config_flags%specified .or. &
5099 config_flags%nested) i_start = MAX(ids+1,its)
5100 IF ( config_flags%open_xe .or. config_flags%specified .or. &
5101 config_flags%nested) i_end = MIN(ide-2,ite)
5102 IF ( config_flags%open_ys .or. config_flags%specified .or. &
5103 config_flags%nested) j_start = MAX(jds+1,jts)
5104 IF ( config_flags%open_ye .or. config_flags%specified .or. &
5105 config_flags%nested) j_end = MIN(jde-2,jte)
5106 IF ( config_flags%periodic_x ) i_start = its
5107 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
5109 DO j = j_start, j_end
5111 DO i = i_start, i_end
5112 tendency(i,k,j) = max( tendency(i,k,j), -mu(i,j) * max( 0.0 , tke(i,k,j) ) / dt )
5117 END SUBROUTINE tke_rhs
5119 !=======================================================================
5120 !=======================================================================
5122 SUBROUTINE tke_buoyancy( tendency, config_flags, mu, &
5123 tke, xkhv, BN2, theta, dt, &
5124 hfx, qfx, qv, rho, &
5125 ids, ide, jds, jde, kds, kde, &
5126 ims, ime, jms, jme, kms, kme, &
5127 its, ite, jts, jte, kts, kte )
5129 !-----------------------------------------------------------------------
5130 ! Begin declarations.
5134 TYPE( grid_config_rec_type ), INTENT( IN ) &
5137 INTEGER, INTENT( IN ) &
5138 :: ids, ide, jds, jde, kds, kde, &
5139 ims, ime, jms, jme, kms, kme, &
5140 its, ite, jts, jte, kts, kte
5142 REAL, INTENT( IN ) &
5145 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
5148 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
5149 :: xkhv, tke, BN2, theta
5151 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5154 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT ( IN ) &
5157 REAL, DIMENSION(ims:ime, jms:jme ), INTENT ( IN ) :: hfx, qfx
5165 :: i_start, i_end, j_start, j_end
5167 REAL :: heat_flux, heat_flux0
5172 !-----------------------------------------------------------------------
5174 !-----------------------------------------------------------------------
5175 ! Add to the TKE tendency the term that accounts for production of TKE
5176 ! due to buoyant motions.
5178 ktf = MIN( kte, kde-1 )
5180 i_end = MIN( ite, ide-1 )
5182 j_end = MIN( jte, jde-1 )
5184 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
5185 config_flags%nested ) i_start = MAX( ids+1, its )
5186 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
5187 config_flags%nested ) i_end = MIN( ide-2, ite )
5188 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
5189 config_flags%nested ) j_start = MAX( jds+1, jts )
5190 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
5191 config_flags%nested ) j_end = MIN( jde-2, jte )
5192 IF ( config_flags%periodic_x ) i_start = its
5193 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
5195 DO j = j_start, j_end
5197 DO i = i_start, i_end
5198 tendency(i,k,j) = tendency(i,k,j) - mu(i,j) * xkhv(i,k,j) * BN2(i,k,j)
5203 ! MARTA: change in the computation of the tke's tendency at the surface.
5204 ! the buoyancy flux is the average of the surface heat flux (0.06) and the
5205 ! flux at the first w level
5209 hflux: SELECT CASE( config_flags%isfflx )
5210 CASE (0,2) ! with fixed surface heat flux given in the namelist
5211 heat_flux0 = config_flags%tke_heat_flux ! constant heat flux value
5212 ! set in namelist.input
5215 DO j = j_start, j_end
5216 DO i = i_start, i_end
5217 heat_flux = heat_flux0
5218 tendency(i,k,j)= tendency(i,k,j) - &
5219 mu(i,j)*((xkhv(i,k,j)*BN2(i,k,j))- (g/theta(i,k,j))*heat_flux)/2.
5224 CASE (1) ! use surface heat flux computed from surface routine
5226 DO j = j_start, j_end
5227 DO i = i_start, i_end
5228 cpm = cp * (1. + 0.8*qv(i,k,j))
5229 heat_flux = (hfx(i,j)/cpm)/rho(i,k,j)
5231 tendency(i,k,j)= tendency(i,k,j) - &
5232 mu(i,j)*((xkhv(i,k,j)*BN2(i,k,j))- (g/theta(i,k,j))*heat_flux)/2.
5238 CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
5241 ! end of MARTA/WCS change
5243 ! The tendency array now includes production of TKE from buoyant
5245 !-----------------------------------------------------------------------
5247 END SUBROUTINE tke_buoyancy
5249 !=======================================================================
5250 !=======================================================================
5252 SUBROUTINE tke_dissip( tendency, config_flags, &
5253 mu, tke, bn2, theta, p8w, t8w, z, &
5254 dx, dy, rdz, rdzw, isotropic, &
5256 ids, ide, jds, jde, kds, kde, &
5257 ims, ime, jms, jme, kms, kme, &
5258 its, ite, jts, jte, kts, kte )
5260 ! History: Sep 2003 Changes by George Bryan and Jason Knievel, NCAR
5261 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
5262 ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
5264 ! Purpose: This routine calculates dissipation of turbulent kinetic
5267 ! References: Klemp and Wilhelmson (JAS 1978)
5268 ! Deardorff (B-L Meteor 1980)
5269 ! Chen and Dudhia (NCAR WRF physics report 2000)
5271 !-----------------------------------------------------------------------
5272 ! Begin declarations.
5276 TYPE( grid_config_rec_type ), INTENT( IN ) &
5279 INTEGER, INTENT( IN ) &
5280 :: ids, ide, jds, jde, kds, kde, &
5281 ims, ime, jms, jme, kms, kme, &
5282 its, ite, jts, jte, kts, kte
5284 INTEGER, INTENT( IN ) :: isotropic
5285 REAL, INTENT( IN ) &
5288 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
5291 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
5292 :: tke, bn2, theta, p8w, t8w, z, rdz, rdzw
5294 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5297 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5301 REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
5304 REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
5307 REAL, DIMENSION( its:ite ) &
5311 :: i, j, k, ktf, i_start, i_end, j_start, j_end
5314 :: disp_len, deltas, coefc, tmpdz, len_s, thetasfc, &
5315 thetatop, len_0, tketmp, tmp, ce1, ce2, c_k
5318 !-----------------------------------------------------------------------
5319 c_k = config_flags%c_k
5321 ce1 = ( c_k / 0.10 ) * 0.19
5322 ce2 = max( 0.0 , 0.93 - ce1 )
5324 ktf = MIN( kte, kde-1 )
5326 i_end = MIN(ite,ide-1)
5328 j_end = MIN(jte,jde-1)
5330 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
5331 config_flags%nested) i_start = MAX( ids+1, its )
5332 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
5333 config_flags%nested) i_end = MIN( ide-2, ite )
5334 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
5335 config_flags%nested) j_start = MAX( jds+1, jts )
5336 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
5337 config_flags%nested) j_end = MIN( jde-2, jte )
5338 IF ( config_flags%periodic_x ) i_start = its
5339 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
5341 CALL calc_l_scale( config_flags, tke, BN2, l_scale, &
5342 i_start, i_end, ktf, j_start, j_end, &
5343 dx, dy, rdzw, msftx, msfty, &
5344 ids, ide, jds, jde, kds, kde, &
5345 ims, ime, jms, jme, kms, kme, &
5346 its, ite, jts, jte, kts, kte )
5347 DO j = j_start, j_end
5349 DO i = i_start, i_end
5350 deltas = ( dx/msftx(i,j) * dy/msfty(i,j) / rdzw(i,k,j) )**0.33333333
5351 tketmp = MAX( tke(i,k,j), 1.0e-6 )
5353 ! Apply Deardorff's (1980) "wall effect" at the bottom of the domain.
5354 ! For LES with fine grid, no need for this wall effect!
5356 IF ( k .eq. kts .or. k .eq. ktf ) then
5359 coefc = ce1 + ce2 * l_scale(i,k,j) / deltas
5362 tendency(i,k,j) = tendency(i,k,j) - &
5363 mu(i,j) * coefc * tketmp**1.5 / l_scale(i,k,j)
5368 END SUBROUTINE tke_dissip
5370 !=======================================================================
5371 !=======================================================================
5373 SUBROUTINE tke_shear( tendency, config_flags, &
5374 defor11, defor22, defor33, &
5375 defor12, defor13, defor23, &
5376 u, v, w, tke, ust, mu, fnm, fnp, &
5377 cf1, cf2, cf3, msftx, msfty, &
5379 rdx, rdy, zx, zy, rdz, rdzw, dn, dnw, &
5380 ids, ide, jds, jde, kds, kde, &
5381 ims, ime, jms, jme, kms, kme, &
5382 its, ite, jts, jte, kts, kte )
5384 ! History: Sep 2003 Rewritten by George Bryan and Jason Knievel,
5386 ! Oct 2001 Converted to mass core by Bill Skamarock, NCAR
5387 ! Aug 2000 Original code by Shu-Hua Chen, UC-Davis
5389 ! Purpose: This routine calculates the production of turbulent
5390 ! kinetic energy by stresses due to sheared wind.
5392 ! References: Klemp and Wilhelmson (JAS 1978)
5393 ! Deardorff (B-L Meteor 1980)
5394 ! Chen and Dudhia (NCAR WRF physics report 2000)
5398 ! avg temporary working array
5402 ! defor11 deformation term ( du/dx + du/dx )
5403 ! defor12 deformation term ( dv/dx + du/dy ); same as defor21
5404 ! defor13 deformation term ( dw/dx + du/dz ); same as defor31
5405 ! defor22 deformation term ( dv/dy + dv/dy )
5406 ! defor23 deformation term ( dw/dy + dv/dz ); same as defor32
5407 ! defor33 deformation term ( dw/dz + dw/dz )
5408 ! div 3-d divergence
5418 ! titau tau (stress tensor) with a tilde, indicating division by
5419 ! a map-scale factor and the fraction of the total modeled
5420 ! atmosphere beneath a given altitude (titau = tau/m/zeta)
5421 ! tke turbulent kinetic energy
5423 !-----------------------------------------------------------------------
5424 ! Begin declarations.
5428 TYPE( grid_config_rec_type ), INTENT( IN ) &
5431 INTEGER, INTENT( IN ) &
5432 :: ids, ide, jds, jde, kds, kde, &
5433 ims, ime, jms, jme, kms, kme, &
5434 its, ite, jts, jte, kts, kte
5436 REAL, INTENT( IN ) &
5437 :: cf1, cf2, cf3, rdx, rdy
5439 REAL, DIMENSION( kms:kme ), INTENT( IN ) &
5440 :: fnm, fnp, dn, dnw
5442 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5445 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( INOUT ) &
5448 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
5449 :: defor11, defor22, defor33, defor12, defor13, defor23, &
5450 tke, xkmh, xkmv, zx, zy, u, v, w, rdz, rdzw
5452 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5455 REAL, DIMENSION( ims:ime, jms:jme ), INTENT( IN ) &
5461 :: i, j, k, ktf, ktes1, ktes2, &
5462 i_start, i_end, j_start, j_end, &
5463 is_ext, ie_ext, js_ext, je_ext
5468 REAL, DIMENSION( its-1:ite+1, kts:kte, jts-1:jte+1 ) &
5471 REAL, DIMENSION( its:ite, kts:kte, jts:jte ) &
5472 :: titau12, tmp1, zxavg, zyavg
5474 REAL :: absU, cd0, Cd
5477 !-----------------------------------------------------------------------
5479 ktf = MIN( kte, kde-1 )
5484 i_end = MIN( ite, ide-1 )
5486 j_end = MIN( jte, jde-1 )
5488 IF ( config_flags%open_xs .OR. config_flags%specified .OR. &
5489 config_flags%nested ) i_start = MAX( ids+1, its )
5490 IF ( config_flags%open_xe .OR. config_flags%specified .OR. &
5491 config_flags%nested ) i_end = MIN( ide-2, ite )
5492 IF ( config_flags%open_ys .OR. config_flags%specified .OR. &
5493 config_flags%nested ) j_start = MAX( jds+1, jts )
5494 IF ( config_flags%open_ye .OR. config_flags%specified .OR. &
5495 config_flags%nested ) j_end = MIN( jde-2, jte )
5496 IF ( config_flags%periodic_x ) i_start = its
5497 IF ( config_flags%periodic_x ) i_end = MIN( ite, ide-1 )
5499 DO j = j_start, j_end
5501 DO i = i_start, i_end
5502 zxavg(i,k,j) = 0.25 * ( zx(i,k ,j) + zx(i+1,k ,j) + &
5503 zx(i,k+1,j) + zx(i+1,k+1,j) )
5504 zyavg(i,k,j) = 0.25 * ( zy(i,k ,j) + zy(i,k ,j+1) + &
5505 zy(i,k+1,j) + zy(i,k+1,j+1) )
5510 ! Begin calculating production of turbulence due to shear. The approach
5511 ! is to add together contributions from six terms, each of which is the
5512 ! square of a deformation that is then multiplied by an exchange
5513 ! coefficiant. The same exchange coefficient is assumed for horizontal
5514 ! and vertical coefficients for some of the terms (the vertical value is
5519 DO j = j_start, j_end
5521 DO i = i_start, i_end
5522 tendency(i,k,j) = tendency(i,k,j) + 0.5 * &
5523 mu(i,j) * xkmh(i,k,j) * ( ( defor11(i,k,j) )**2 )
5530 DO j = j_start, j_end
5532 DO i = i_start, i_end
5533 tendency(i,k,j) = tendency(i,k,j) + 0.5 * &
5534 mu(i,j) * xkmh(i,k,j) * ( ( defor22(i,k,j) )**2 )
5541 DO j = j_start, j_end
5543 DO i = i_start, i_end
5544 tendency(i,k,j) = tendency(i,k,j) + 0.5 * &
5545 mu(i,j) * xkmv(i,k,j) * ( ( defor33(i,k,j) )**2 )
5552 DO j = j_start, j_end
5554 DO i = i_start, i_end
5555 avg(i,k,j) = 0.25 * &
5556 ( ( defor12(i ,k,j)**2 ) + ( defor12(i ,k,j+1)**2 ) + &
5557 ( defor12(i+1,k,j)**2 ) + ( defor12(i+1,k,j+1)**2 ) )
5562 DO j = j_start, j_end
5564 DO i = i_start, i_end
5565 tendency(i,k,j) = tendency(i,k,j) + mu(i,j) * xkmh(i,k,j) * avg(i,k,j)
5572 DO j = j_start, j_end
5574 DO i = i_start, i_end+1
5575 tmp2(i,k,j) = defor13(i,k,j)
5580 DO j = j_start, j_end
5581 DO i = i_start, i_end+1
5582 tmp2(i,kts ,j) = 0.0
5583 tmp2(i,ktf+1,j) = 0.0
5587 DO j = j_start, j_end
5589 DO i = i_start, i_end
5590 avg(i,k,j) = 0.25 * &
5591 ( ( tmp2(i ,k+1,j)**2 ) + ( tmp2(i ,k,j)**2 ) + &
5592 ( tmp2(i+1,k+1,j)**2 ) + ( tmp2(i+1,k,j)**2 ) )
5597 DO j = j_start, j_end
5599 DO i = i_start, i_end
5600 tendency(i,k,j) = tendency(i,k,j) + mu(i,j) * xkmv(i,k,j) * avg(i,k,j)
5605 !MARTA: add the drag at the surface; WCS 040331
5608 uflux: SELECT CASE( config_flags%isfflx )
5609 CASE (0) ! Assume cd a constant, specified in namelist
5611 cd0 = config_flags%tke_drag_coefficient ! drag coefficient set
5613 DO j = j_start, j_end
5614 DO i = i_start, i_end
5616 absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)
5618 tendency(i,k,j) = tendency(i,k,j) + &
5619 mu(i,j)*( (u(i,k,j)+u(i+1,k,j))*0.5* &
5620 Cd*absU*(defor13(i,kts+1,j)+defor13(i+1,kts+1,j))*0.5 )
5625 CASE (1,2) ! ustar computed from surface routine
5627 DO j = j_start, j_end
5628 DO i = i_start, i_end
5630 absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)+epsilon
5631 Cd = (ust(i,j)**2)/(absU**2)
5632 tendency(i,k,j) = tendency(i,k,j) + &
5633 mu(i,j)*( (u(i,k,j)+u(i+1,k,j))*0.5* &
5634 Cd*absU*(defor13(i,kts+1,j)+defor13(i+1,kts+1,j))*0.5 )
5640 CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
5642 ! end of MARTA/WCS change
5646 DO j = j_start, j_end+1
5648 DO i = i_start, i_end
5649 tmp2(i,k,j) = defor23(i,k,j)
5654 DO j = j_start, j_end+1
5655 DO i = i_start, i_end
5656 tmp2(i,kts, j) = 0.0
5657 tmp2(i,ktf+1,j) = 0.0
5661 DO j = j_start, j_end
5663 DO i = i_start, i_end
5664 avg(i,k,j) = 0.25 * &
5665 ( ( tmp2(i,k+1,j )**2 ) + ( tmp2(i,k,j )**2) + &
5666 ( tmp2(i,k+1,j+1)**2 ) + ( tmp2(i,k,j+1)**2) )
5671 DO j = j_start, j_end
5673 DO i = i_start, i_end
5674 tendency(i,k,j) = tendency(i,k,j) + mu(i,j) * xkmv(i,k,j) * avg(i,k,j)
5679 !MARTA: add the drag at the surface; WCS 040331
5682 vflux: SELECT CASE( config_flags%isfflx )
5683 CASE (0) ! Assume cd a constant, specified in namelist
5685 cd0 = config_flags%tke_drag_coefficient ! constant drag coefficient
5686 ! set in namelist.input
5687 DO j = j_start, j_end
5688 DO i = i_start, i_end
5690 absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)
5692 tendency(i,k,j) = tendency(i,k,j) + &
5693 mu(i,j)*( (v(i,k,j)+v(i,k,j+1))*0.5* &
5694 Cd*absU*(defor23(i,kts+1,j)+defor23(i,kts+1,j+1))*0.5 )
5699 CASE (1,2) ! ustar computed from surface routine
5701 DO j = j_start, j_end
5702 DO i = i_start, i_end
5704 absU=0.5*sqrt((u(i,k,j)+u(i+1,k,j))**2+(v(i,k,j)+v(i,k,j+1))**2)+epsilon
5705 Cd = (ust(i,j)**2)/(absU**2)
5706 tendency(i,k,j) = tendency(i,k,j) + &
5707 mu(i,j)*( (v(i,k,j)+v(i,k,j+1))*0.5* &
5708 Cd*absU*(defor23(i,kts+1,j)+defor23(i,kts+1,j+1))*0.5 )
5714 CALL wrf_error_fatal( 'isfflx value invalid for diff_opt=2' )
5716 ! end of MARTA/WCS change
5718 END SUBROUTINE tke_shear
5720 !=======================================================================
5721 !=======================================================================
5723 SUBROUTINE compute_diff_metrics( config_flags, ph, phb, z, rdz, rdzw, &
5725 ids, ide, jds, jde, kds, kde, &
5726 ims, ime, jms, jme, kms, kme, &
5727 its, ite, jts, jte, kts, kte )
5729 !-----------------------------------------------------------------------
5730 ! Begin declarations.
5734 TYPE( grid_config_rec_type ), INTENT( IN ) &
5737 INTEGER, INTENT( IN ) &
5738 :: ids, ide, jds, jde, kds, kde, &
5739 ims, ime, jms, jme, kms, kme, &
5740 its, ite, jts, jte, kts, kte
5742 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( IN ) &
5745 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT( OUT ) &
5746 :: rdz, rdzw, zx, zy, z
5748 REAL, INTENT( IN ) &
5754 :: i, j, k, i_start, i_end, j_start, j_end, ktf
5757 !-----------------------------------------------------------------------
5759 ktf = MIN( kte, kde-1 )
5761 ! Bug fix, WCS, 22 april 2002.
5763 ! We need rdzw in halo for average to u and v points.
5768 ! Begin with dz computations.
5770 DO j = j_start, j_end
5772 IF ( ( j_start >= jts ) .AND. ( j_end <= MIN( jte, jde-1 ) ) ) THEN
5777 i_end = MIN( ite, ide-1 )
5780 ! Compute z at w points for rdz and rdzw computations. We'll switch z
5781 ! to z at p points before returning
5785 ! Bug fix, WCS, 22 april 2002
5787 DO i = i_start, i_end
5788 z(i,k,j) = ( ph(i,k,j) + phb(i,k,j) ) / g
5793 DO i = i_start, i_end
5794 rdzw(i,k,j) = 1.0 / ( z(i,k+1,j) - z(i,k,j) )
5799 DO i = i_start, i_end
5800 rdz(i,k,j) = 2.0 / ( z(i,k+1,j) - z(i,k-1,j) )
5804 ! Bug fix, WCS, 22 april 2002; added the following code
5806 DO i = i_start, i_end
5807 rdz(i,1,j) = 2./(z(i,2,j)-z(i,1,j))
5814 ! Now compute zx and zy; we'll assume that the halo for ph and phb is
5818 i_end = MIN( ite, ide-1 )
5820 j_end = MIN( jte, jde-1 )
5822 DO j = j_start, j_end
5824 DO i = MAX( ids+1, its ), i_end
5825 zx(i,k,j) = rdx * ( phb(i,k,j) - phb(i-1,k,j) ) / g
5830 DO j = j_start, j_end
5832 DO i = MAX( ids+1, its ), i_end
5833 zx(i,k,j) = zx(i,k,j) + rdx * ( ph(i,k,j) - ph(i-1,k,j) ) / g
5838 DO j = MAX( jds+1, jts ), j_end
5840 DO i = i_start, i_end
5841 zy(i,k,j) = rdy * ( phb(i,k,j) - phb(i,k,j-1) ) / g
5846 DO j = MAX( jds+1, jts ), j_end
5848 DO i = i_start, i_end
5849 zy(i,k,j) = zy(i,k,j) + rdy * ( ph(i,k,j) - ph(i,k,j-1) ) / g
5854 ! Some b.c. on zx and zy.
5856 IF ( .NOT. config_flags%periodic_x ) THEN
5858 IF ( ite == ide ) THEN
5859 DO j = j_start, j_end
5866 IF ( its == ids ) THEN
5867 DO j = j_start, j_end
5876 IF ( ite == ide ) THEN
5879 zx(ide,k,j) = rdx * ( phb(ide,k,j) - phb(ide-1,k,j) ) / g
5883 DO j = j_start, j_end
5885 zx(ide,k,j) = zx(ide,k,j) + rdx * ( ph(ide,k,j) - ph(ide-1,k,j) ) / g
5890 IF ( its == ids ) THEN
5891 DO j = j_start, j_end
5893 zx(ids,k,j) = rdx * ( phb(ids,k,j) - phb(ids-1,k,j) ) / g
5899 zx(ids,k,j) = zx(ids,k,j) + rdx * ( ph(ids,k,j) - ph(ids-1,k,j) ) / g
5906 IF ( .NOT. config_flags%periodic_y ) THEN
5908 IF ( jte == jde ) THEN
5910 DO i =i_start, i_end
5916 IF ( jts == jds ) THEN
5918 DO i =i_start, i_end
5926 IF ( jte == jde ) THEN
5929 zy(i,k,jde) = rdy * ( phb(i,k,jde) - phb(i,k,jde-1) ) / g
5933 DO j = j_start, j_end
5935 zy(i,k,jde) = zy(i,k,jde) + rdy * ( ph(i,k,jde) - ph(i,k,jde-1) ) / g
5940 IF ( jts == jds ) THEN
5941 DO j = j_start, j_end
5943 zy(i,k,jds) = rdy * ( phb(i,k,jds) - phb(i,k,jds-1) ) / g
5947 DO j = j_start, j_end
5949 zy(i,k,jds) = zy(i,k,jds) + rdy * ( ph(i,k,jds) - ph(i,k,jds-1) ) / g
5956 ! Calculate z at p points.
5958 DO j = j_start, j_end
5960 DO i = i_start, i_end
5962 ( ph(i,k,j) + phb(i,k,j) + ph(i,k+1,j) + phb(i,k+1,j) ) / g
5967 END SUBROUTINE compute_diff_metrics
5969 !=======================================================================
5970 !=======================================================================
5972 END MODULE module_diffusion_em
5974 !=======================================================================
5975 !=======================================================================