!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%% ***S/P MIXLEN2 * * #include "phy_macros_f.h"![]()
SUBROUTINE MIXLEN2( ZN, THV, EN, Z, H, N, NK) 2 * * #include "impnone.cdk"
* INTEGER N,NK * REAL ZN(N,NK), THV(N,NK) REAL EN(N,NK), Z(N,NK) REAL H(N) * * * *Author * S. Belair (November 1996) * *Revision * 001 J. Mailhot (July 1999) - version using the virtual potential * temperature; change name to MIXLEN1 * 002 J. Mailhot (Sept 1999) - clipping of RIF maximum for computation of ZE * 003 S. Belair (Oct 1999) - staggerred values for the virtual * potential temperature and the heights * 004 J. Mailhot (July 2000) - correct limits for solution of quadratic eqn. * 005 J. Mailhot (Aug 2000) - add relaxation option (RELAX = .T. or .F.) * 006 S. Belair, J. Mailhot (March 2001) * blend between local (i.e., * Bougeault-Lacarrere) and * background (i.e., input) mixing and * dissipation lengths * 007 A-M Leduc (Oct 2001) - Automatic arrays * 008 J. Mailhot (May 2002) - restrict local mixing to convective case * 009 S. Belair, J. Mailhot (June 2002) - use fixed heights for blend * and remove stability considerations * 010 S. Belair (Jan 2003) -reorganization and modification of bougeault * mixlen1--->mixlen2 * 011 B. Bilodeau (Aug 2003) - IBM conversion (scalar version) * *Object * Calculates the mixing length ZN and the dissipation * length ZE based on the Bougeault and Lacarrere method. * *Arguments * -Output- * * ZN mixing length * * -Input- * * ZN mixing length at t- (only if RELAX = .TRUE.) * THV virtual potential temperature * EN turbulent kinetic energy * Z height of the sigma levels * H height of the boundary layer * N horizontal dimension * NK vertical dimension * * INTEGER J, K, KI REAL GRAVINV * * SAVE ZMIX REAL ZMIX * * ************************************************************************ * AUTOMATIC ARRAYS ************************************************************************ * AUTOMATIC ( KIK , INTEGER , (N,NK ) ) * AUTOMATIC ( RECBETA , REAL , (N ) ) AUTOMATIC ( LUP , REAL , (N,NK ) ) AUTOMATIC ( LDOWN , REAL , (N,NK ) ) AUTOMATIC ( DELTHK , REAL , (N,NK ) ) AUTOMATIC ( SLOPE , REAL , (N,NK ) ) AUTOMATIC ( DELEN , REAL , (N,NK ) ) AUTOMATIC ( DELZUP , REAL , (N,NK ) ) AUTOMATIC ( DELZDOWN , REAL , (N,NK ) ) AUTOMATIC ( BUOYSUM , REAL , (N,NK,NK) ) AUTOMATIC ( THVSTAG , REAL , (N,NK ) ) AUTOMATIC ( ZSTAG , REAL , (N,NK ) ) AUTOMATIC ( ENLOCAL , REAL , (N,NK ) ) AUTOMATIC ( ZNBLAC , REAL , (N,NK ) ) * ************************************************************************ * #include "consphy.cdk"
#include "scfrst.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
* * DATA ZMIX / 500. / * * DO J=1,N*NK*NK BUOYSUM(J,1,1) = 0. END DO * * DO K=1,NK DO J=1,N ZNBLAC(J,K) = ZN(J,K) END DO END DO * * * * * virtual potential temperature and * level heights must be put on staggerred * DO K=1,NK-1 DO J=1,N THVSTAG(J,K) = 0.5 * ( THV(J,K) + THV(J,K+1) ) ZSTAG(J,K) = 0.5 * ( Z(J,K) + Z(J,K+1) ) ENLOCAL(J,K) = MIN( EN(J,K), 4. ) END DO END DO * DO J=1,N THVSTAG(J,NK) = THV(J,NK) ZSTAG(J,NK) = 0.5 * Z(J,NK) END DO * * surface buoyancy term BETA * GRAVINV = 1./GRAV DO J=1,N RECBETA(J) = THVSTAG(J,NK)*GRAVINV END DO * * * * --------- FIND THE UPWARD MIXING LENGTH * (LUP) * DO J=1,N*NK KIK(J,1) = 1 END DO * * DO J=1,N DO 10 KI=2,NK-1 DO K=KI,2,-1 IF (KI.EQ.K) BUOYSUM(J,K+1,KI) = 0.0 BUOYSUM(J,K,KI) = 1 BUOYSUM(J,K+1,KI) + 1 0.5*( ZSTAG(J,K-1)-ZSTAG(J,K) ) * 1 ( THVSTAG(J,K-1) + THVSTAG(J,K) - 2.*THVSTAG(J,KI) ) * IF (BUOYSUM(J,K,KI).GT.ENLOCAL(J,KI)*RECBETA(J)) THEN KIK(J,KI) = K GOTO 10 ENDIF END DO 10 CONTINUE END DO * * * DO K=2,NK-1 DO J=1,N LUP(J,K) = ZSTAG(J,KIK(J,K)) - ZSTAG(J,K) DELTHK(J,K) = THVSTAG(J,KIK(J,K)) - THVSTAG(J,K) SLOPE(J,K) = ( THVSTAG(J,KIK(J,K)-1)-THVSTAG(J,KIK(J,K)))/ 1 ( ZSTAG(J,KIK(J,K)-1) - ZSTAG(J,KIK(J,K) ) ) SLOPE(J,K) = MAX( SLOPE(J,K), 1.E-6 ) DELEN(J,K) = ENLOCAL(J,K)*RECBETA(J) - BUOYSUM(J,KIK(J,K)+1,K) DELZUP(J,K) = -DELTHK(J,K) + 1 SQRT( MAX( 0.0, DELTHK(J,K)*DELTHK(J,K) + 1 2.*SLOPE(J,K)*DELEN(J,K) ) ) DELZUP(J,K) = DELZUP(J,K) / SLOPE(J,K) LUP(J,K) = LUP(J,K) + DELZUP(J,K) LUP(J,K) = MAX( LUP(J,K), 1. ) END DO END DO * * DO J=1,N LUP(J,1) = LUP(J,2) LUP(J,NK)= LUP(J,NK-1) END DO * * * * Same work but for the downward * free path * DO KI=1,NK DO J=1,N KIK(J,KI) = 1 END DO END DO * DO J=1,N DO 11 KI=2,NK-1 DO K=KI,NK-1 IF (KI.EQ.K) BUOYSUM(J,K-1,KI) = 0.0 BUOYSUM(J,K,KI) = BUOYSUM(J,K-1,KI) + 1 0.5*( ZSTAG(J,K) - ZSTAG(J,K+1) ) * 1 ( 2.*THVSTAG(J,KI) - THVSTAG(J,K) - THVSTAG(J,K+1) ) * IF (BUOYSUM(J,K,KI).GT.ENLOCAL(J,KI)*RECBETA(J)) THEN KIK(J,KI) = K GO TO 11 ENDIF IF (K.EQ.NK-1.AND.KIK(J,KI).EQ.1) KIK(J,KI) = NK-1 END DO 11 CONTINUE END DO * * DO J=1,N KIK(J,1) = 1 END DO * * DO K=2,NK-1 DO J=1,N LDOWN(J,K) = ZSTAG(J,K) - ZSTAG(J,KIK(J,K)) DELTHK(J,K) = THVSTAG(J,K) - THVSTAG(J,KIK(J,K)) SLOPE(J,K) = ( THVSTAG(J,KIK(J,K))-THVSTAG(J,KIK(J,K)+1))/ 1 ( ZSTAG(J,KIK(J,K)) - ZSTAG(J,KIK(J,K)+1) ) SLOPE(J,K) = MAX( SLOPE(J,K), 1.E-6 ) DELEN(J,K) = ENLOCAL(J,K)*RECBETA(J) - BUOYSUM(J,KIK(J,K)-1,K) DELZDOWN(J,K) = -DELTHK(J,K) + SQRT ( MAX( 0.0 , 1 DELTHK(J,K)*DELTHK(J,K) + 1 2.*SLOPE(J,K)*DELEN(J,K) ) ) DELZDOWN(J,K) = DELZDOWN(J,K) / SLOPE(J,K) LDOWN(J,K) = LDOWN(J,K) + DELZDOWN(J,K) LDOWN(J,K) = MIN( LDOWN(J,K), ZSTAG(J,K) ) LDOWN(J,K) = MAX( LDOWN(J,K), 1. ) END DO END DO * * DO J=1,N LDOWN(J,NK) = LDOWN(J,NK-1) LDOWN(J,1) = LDOWN(J,2) END DO * * * * * Calculate the mixing length ZN * and the dissipation length from the * LUP and LDOWN results * * DO K=1,NK DO J=1,N ZN(J,K) = MIN( LUP(J,K), LDOWN(J,K) ) ZN(J,K) = MIN( ZN(J,K), ZSTAG(J,K) ) END DO END DO * * * * * Blending of the mixing and dissipation lengths * between the local values (i.e., Bougeaut- * Lacarrere calculations) and background values * (i.e., from input arguments) * Restrict local mixing to convective case * DO K=1,NK DO J=1,N * IF ( ZSTAG(J,K).LT.ZMIX ) THEN ZN(J,K) = ZNBLAC(J,K) + ZSTAG(J,K)/ZMIX * 1 ( ZN(J,K) - ZNBLAC(J,K) ) END IF * END DO END DO * * * * DO J=1,N ZN(J,NK) = MIN( ZN(J,NK) , KARMAN*ZSTAG(J,NK) ) END DO * * DO K=1,NK DO J=1,N ZN(J,K) = MAX( ZN(J,K), 1.E-6 ) END DO END DO * * * RETURN END