--- trunk/libf/phylmd/Orography/gwprofil.f90 2009/12/14 15:25:16 23 +++ trunk/Sources/phylmd/Orography/gwprofil.f 2015/06/18 13:49:26 150 @@ -1,270 +1,161 @@ - SUBROUTINE gwprofil(nlon,nlev,kgwd,kdx,ktest,kkcrith,kcrit,paphm1,prho, & - pstab,pvph,pri,ptau,pdmod,psig,pvar) +module gwprofil_m -!**** *GWPROFIL* + IMPLICIT NONE -! PURPOSE. -! -------- +contains -!** INTERFACE. -! ---------- -! FROM *GWDRAG* + SUBROUTINE gwprofil(nlon, nlev, ktest, kkcrith, kcrit, paphm1, & + prho, pstab, pvph, pri, ptau, pdmod, psig, pvar) -! EXPLICIT ARGUMENTS : -! -------------------- -! ==== INPUTS === -! ==== OUTPUTS === + ! Method. The stress profile for gravity waves is computed as + ! follows: it is constant (no gwd) at the levels between the + ! ground and the top of the blocked layer (kkenvh). It decreases + ! linearly with height from the top of the blocked layer to + ! 3*varor (kknu), to simulate lee waves or nonlinear gravity wave + ! breaking. Above it is constant, except when the wave encounters + ! a critical level (kcrit) or when it breaks. -! IMPLICIT ARGUMENTS : NONE -! -------------------- + ! Reference. + ! See ECMWF research department documentation of the "I.F.S." -! METHOD: -! ------- -! THE STRESS PROFILE FOR GRAVITY WAVES IS COMPUTED AS FOLLOWS: -! IT IS CONSTANT (NO GWD) AT THE LEVELS BETWEEN THE GROUND -! AND THE TOP OF THE BLOCKED LAYER (KKENVH). -! IT DECREASES LINEARLY WITH HEIGHTS FROM THE TOP OF THE -! BLOCKED LAYER TO 3*VAROR (kKNU), TO SIMULATES LEE WAVES OR -! NONLINEAR GRAVITY WAVE BREAKING. -! ABOVE IT IS CONSTANT, EXCEPT WHEN THE WAVE ENCOUNTERS A CRITICAL -! LEVEL (KCRIT) OR WHEN IT BREAKS. + ! Modifications. + ! Passage of the new gwdrag TO I.F.S. (F. LOTT, 22/11/93) + USE dimphy, ONLY : klev, klon + USE yoegwd, ONLY : gkdrag, grahilo, grcrit, gssec, gtsec, nstra + ! 0.1 ARGUMENTS -! EXTERNALS. -! ---------- + INTEGER nlon, nlev + INTEGER kkcrith(nlon), kcrit(nlon), ktest(nlon) + REAL paphm1(nlon, nlev+1), pstab(nlon, nlev+1), prho(nlon, nlev+1), & + pvph(nlon, nlev+1), pri(nlon, nlev+1), ptau(nlon, nlev+1) -! REFERENCE. -! ---------- + REAL pdmod(nlon) + REAL, INTENT (IN) :: psig(nlon) + REAL, INTENT (IN) :: pvar(nlon) -! SEE ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE "I.F.S." + ! 0.2 LOCAL ARRAYS -! AUTHOR. -! ------- + INTEGER ilevh, jl, jk + REAL zsqr, zalfa, zriw, zdel, zb, zalpha, zdz2n + REAL zdelp, zdelpt + REAL zdz2(klon, klev), znorm(klon), zoro(klon) + REAL ztau(klon, klev+1) -! MODIFICATIONS. -! -------------- -! PASSAGE OF THE NEW GWDRAG TO I.F.S. (F. LOTT, 22/11/93) -!----------------------------------------------------------------------- - USE dimens_m - USE dimphy - USE yomcst - USE yoegwd - IMPLICIT NONE + !----------------------------------------------------------------------- + ! 1. INITIALIZATION + ! COMPUTATIONAL CONSTANTS. + ilevh = klev/3 + DO jl = 1, klon + IF (ktest(jl)==1) THEN + zoro(jl) = psig(jl)*pdmod(jl)/4./max(pvar(jl), 1.0) + ztau(jl, klev+1) = ptau(jl, klev+1) + END IF + end DO -!----------------------------------------------------------------------- - -!* 0.1 ARGUMENTS -! --------- - - INTEGER nlon, nlev - INTEGER kkcrith(nlon), kcrit(nlon), kdx(nlon), ktest(nlon) - - - REAL paphm1(nlon,nlev+1), pstab(nlon,nlev+1), prho(nlon,nlev+1), & - pvph(nlon,nlev+1), pri(nlon,nlev+1), ptau(nlon,nlev+1) - - REAL pdmod(nlon) - REAL, INTENT (IN) :: psig(nlon) - REAL, INTENT (IN) :: pvar(nlon) - -!----------------------------------------------------------------------- - -!* 0.2 LOCAL ARRAYS -! ------------ - - INTEGER ilevh, ji, kgwd, jl, jk - REAL zsqr, zalfa, zriw, zdel, zb, zalpha, zdz2n - REAL zdelp, zdelpt - REAL zdz2(klon,klev), znorm(klon), zoro(klon) - REAL ztau(klon,klev+1) - -!----------------------------------------------------------------------- - -!* 1. INITIALIZATION -! -------------- - -! print *,' entree gwprofil' -100 CONTINUE - - -!* COMPUTATIONAL CONSTANTS. -! ------------- ---------- - - ilevh = klev/3 - -! DO 400 ji=1,kgwd -! jl=kdx(ji) -! Modif vectorisation 02/04/2004 - DO 400 jl = 1, klon - IF (ktest(jl)==1) THEN - zoro(jl) = psig(jl)*pdmod(jl)/4./max(pvar(jl),1.0) - ztau(jl,klev+1) = ptau(jl,klev+1) - END IF -400 CONTINUE - - - DO 430 jk = klev, 2, -1 - - -!* 4.1 CONSTANT WAVE STRESS UNTIL TOP OF THE -! BLOCKING LAYER. -410 CONTINUE - -! DO 411 ji=1,kgwd -! jl=kdx(ji) -! Modif vectorisation 02/04/2004 - DO 411 jl = 1, klon + DO jk = klev, 2, -1 + ! 4.1 CONSTANT WAVE STRESS UNTIL TOP OF THE + ! BLOCKING LAYER. + DO jl = 1, klon IF (ktest(jl)==1) THEN - IF (jk>kkcrith(jl)) THEN - ptau(jl,jk) = ztau(jl,klev+1) -! ENDIF -! IF(JK.EQ.KKCRITH(JL)) THEN - ELSE - ptau(jl,jk) = grahilo*ztau(jl,klev+1) - END IF + IF (jk>kkcrith(jl)) THEN + ptau(jl, jk) = ztau(jl, klev+1) + ELSE + ptau(jl, jk) = grahilo*ztau(jl, klev+1) + END IF END IF -411 CONTINUE - -!* 4.15 CONSTANT SHEAR STRESS UNTIL THE TOP OF THE -! LOW LEVEL FLOW LAYER. -415 CONTINUE - - -!* 4.2 WAVE DISPLACEMENT AT NEXT LEVEL. + end DO -420 CONTINUE - -! DO 421 ji=1,kgwd -! jl=kdx(ji) -! Modif vectorisation 02/04/2004 - DO 421 jl = 1, klon + ! 4.2 WAVE DISPLACEMENT AT NEXT LEVEL. + DO jl = 1, klon IF (ktest(jl)==1) THEN - IF (jkkkcrith(jl)) THEN - - zdelp = paphm1(jl,jk) - paphm1(jl,klev+1) - zdelpt = paphm1(jl,kkcrith(jl)) - paphm1(jl,klev+1) - ptau(jl,jk) = ztau(jl,klev+1) + (ztau(jl,kkcrith(jl))-ztau(jl, & - klev+1))*zdelp/zdelpt - - END IF - + IF (jk>kkcrith(jl)) THEN + zdelp = paphm1(jl, jk) - paphm1(jl, klev+1) + zdelpt = paphm1(jl, kkcrith(jl)) - paphm1(jl, klev+1) + ptau(jl, jk) = ztau(jl, klev+1) & + + (ztau(jl, kkcrith(jl)) - ztau(jl, klev+1))*zdelp/zdelpt + END IF END IF -532 CONTINUE + end DO -! REORGANISATION IN THE STRATOSPHERE - -! DO 533 ji=1,kgwd -! jl=kdx(ji) -! Modif vectorisation 02/04/2004 - DO 533 jl = 1, klon + ! REORGANISATION IN THE STRATOSPHERE + DO jl = 1, klon IF (ktest(jl)==1) THEN - - - IF (jknstra) THEN - - zdelp = paphm1(jl,jk) - paphm1(jl,kkcrith(jl)) - zdelpt = paphm1(jl,nstra) - paphm1(jl,kkcrith(jl)) - ptau(jl,jk) = ztau(jl,kkcrith(jl)) + (ztau(jl,nstra)-ztau(jl, & - kkcrith(jl)))*zdelp/zdelpt - - END IF + IF (jk nstra) THEN + zdelp = paphm1(jl, jk) - paphm1(jl, kkcrith(jl)) + zdelpt = paphm1(jl, nstra) - paphm1(jl, kkcrith(jl)) + ptau(jl, jk) = ztau(jl, kkcrith(jl)) & + + (ztau(jl, nstra) - ztau(jl, kkcrith(jl)))*zdelp/zdelpt + END IF END IF -534 CONTINUE - - -531 CONTINUE + end DO + end DO + END SUBROUTINE gwprofil - RETURN - END +end module gwprofil_m