!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%%
***S/P NUAGES2
*
#include "phy_macros_f.h"
SUBROUTINE NUAGES2 ( CH , CM , CL , C3D , 2,3
X BASE, Q , T , PS, SHCL, ILMO, S,
Y TRNCH, N, M, NK, ITASK, SATUCO, STRCLD)
#include "impnone.cdk"
INTEGER N,M,NK,ITASK,IERROR,HEURSER
REAL CH(N),CM(N),CL(N),C3D(N,NK),Q(M,NK)
REAL T(M,NK),PS(N),SHCL(N),ILMO(N),S(n,NK)
REAL BASE (N)
INTEGER TRNCH
LOGICAL SATUCO,STRCLD
*
*Author
* R. Benoit RPN (April 1984)
*
*Revision
* 001 J. Cote RPN(Nov 1984)SEF version documentation
* 002 R. Benoit RPN(April 1985) Remove clouds in unstable
* boundary layer
* 003 R Benoit (May85) Inverse of calculations and base layer of
* condensation
* 004 M. Lepine - RFE model code revision project (Feb 87)
* 005 J.Mailhot(Mar 87)Base threshold of COND= KUO
* 006 G.Pellerin(Nov 87) Adaptation to revised code
* 007 G.Pellerin(Jan 90) Adaptation to version D4P6
* 008 G.Pellerin(Mar 90) Adaptation to version D5P7
* 009 N. Brunet (May 90) Standardization of thermodynamic
* functions
* 010 Y. Delage (Nov 1990) Replace WC by ILMO
* 011 C. Girard(Nov 90)
* Substantial modification to the CLOUD parameter
* 012 N. Brunet (May91)
* New version of thermodynamic functions
* and file of constants
* 013 B. Bilodeau (July 1991)- Adaptation to UNIX
* 014 C. Girard (Nov 1992) New modification to the
* definition
* 015 R. Benoit (Aug 93) Local Sigma
* 016 B. Bilodeau (May 1994) - New physics interface
* 017 R. Sarrazin (Summer 1995) - Correct bug for CL
* 018 B. Dugas (Sep 1996) - Add option to eliminate
* stratospheric clouds
* 019 J.P. Toviessi (June 2003) - Revove CVMG functions
*
*Object
* to calculate simplified cloud cover
*
*Arguments
*
* - Output -
* CH high altitude cloud fraction (0 to 1)
* CM medium altitude cloud fraction (0 to 1)
* CL low altitude cloud fraction (0 to 1)
* C3D 3-dimensional cloud field
* BASE sigma base of condensation layer (+/-)
*
* - Input -
* Q specific humidity
* T temperature
* PS surface pressure
* SHCL sigma height of the boundary layer
* ILMO inverse of the length of Monin-Obukhov
* S sigma levels
* TRNCH index of the vertical plane(NI*NK) for which
* calculations are to be done
* N horizontal dimension
* M 1st dimension of T and Q
* NK vertical dimension
* ITASK task number for multi-tasking
* SATUCO .TRUE. if water/ice phase for saturation
* .FALSE. if water phase only for saturation
* STRCLD .TRUE. if stratospheric clouds are acceptable
* .FALSE. otherwise
*
*
*IMPLICITES
*
#include "clefcon.cdk"
*
*
**
*
REAL SST,SCL,SH,SM
REAL F,SIG,NEBUL,U,SQRT3
INTEGER J,K,KH,KM,KL
INTEGER K1
LOGICAL REGULAR
logical flag
REAL EPS , VAL , HM
EXTERNAL MZONXST,SERGET,SERXST
SAVE SST,SCL,SH,SM
*
************************************************************************
* AUTOMATIC ARRAYS
************************************************************************
*
AUTOMATIC ( ftmp , REAL , (NK) )
AUTOMATIC ( ftmp1 , REAL , (N,NK) )
*
************************************************************************
*
REAL tmpNEBUL,tmp
INTEGER MODP
*
#include "consphy.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
DATA SST , SCL , SH , SM / 0.225 , 0.905 , 0.395 , 0.710 /
*
* TOPC and MINQ are the minimum values of pressure and
* specific humidity at which the routine stops producing
* clouds when STRCLD is set to .FALSE.
#include "nocld.cdk"
*
* ANCIENNE FORMULATION (REVISION 10)
* F(SIG)=MIN(.98,MAX(.8,(2.+SIG)/3.))
* NEBUL(U,SIG)=MAX(0.0,MIN(1.0,(U-F(SIG))/(1.0-F(SIG))))**2
*
* NOUVELLE FORMULATION (REVISION 12)
tmpNEBUL(U,F)=MAX(0.0,MIN(1.0,(U-F)/((1.0-F))))
NEBUL(U,F)=tmpNEBUL(U,F)*tmpNEBUL(U,F)
*
*
SQRT3=SQRT(3.)
CALL SERGET ('HEURE', HEURSER, 1, IERROR )
*
*
* FAIRE D'ABORD U (=HUM.REL.) DANS C3D
*
do K = 1, NK
ftmp(K) = S(1,K)
do J = 1,N
ftmp1(J,K) = S(J,K)*PS(J)
enddo
enddo
MODP = 3
IF(SATUCO)THEN
call mFOHR
(C3D(1,1),Q(1,1),T(1,1),ftmp,ftmp1,MODP,N,NK,N)
ELSE
call mFOHRA
(C3D(1,1),Q(1,1),T(1,1),ftmp,ftmp1,MODP,N,NK,N)
END IF
CALL SERXST
( C3D, 'HR', TRNCH, N, 0.0, 1.0, -1 )
CALL MZONXST( C3D, 'HR', TRNCH, N, HEURSER,1.0,-1,ITASK)
*
* BASE DE COUCHE DE CONDENSATION (SI EXISTE)
* HM = SEUIL DE DEBUT DE CONDENSATION
*
HM=0.9
*
* TROUVER 1ER NIVEAU EN MONTANT OU U>HM . METTRE DANS CL
*
DO 2 J = 1 ,N
2 CL (J) = 0.
*
DO K = NK-1 , 1 , -1
DO J = 1 , N
if (C3D(J,K).GT.HM .AND. CL(J).EQ.0.) CL (J) = FLOAT(K)
ENDDO
ENDDO
*
EPS = 1.E-12
DO 4 J = 1 , N
K1 = NINT (CL(J) )
BASE (J) = S (j,1)
if (K1.EQ.NK) BASE (J) = S(j,NK)
REGULAR = K1.GE.1 .AND. K1.LT.NK
K1 = MIN (NK-1 , MAX (K1,1) )
VAL = S(j,K1) + (S(j,K1+1)-S(j,K1)) * (C3D(J,K1)-HM)
X / MAX ( EPS , C3D(J,K1)-C3D(J,K1+1))
VAL = MIN ( VAL , S(j,K1+1) )
if (REGULAR) BASE (J) = VAL
*
* DONNER SIGNE A BASE . + SI W*=0 , - SI W*>0 .
*
BASE(J) = SIGN( BASE(J), ILMO(J) )
4 CONTINUE
*
DO 5 K=1,NK
DO 5 J=1,N
*
* LES NUAGES HORS DE (SST,SCL) NE SONT PAS OTES DE C3D.
* SI STRCLD EST FAUX, IL N'Y A PAS DE NUAGES AU-DESSUS
* DE TOPC OU BIEN SI Q EST PLUS PETIT QUE MINQ.
* ilmo .lt.0 instable
if (T(J,K).LT.238.) then
F= .95
else
F= .99
endif
if ( S(j,K).GE.SHCL(J).and. ilmo(j) .lt.0.) then
C3D(J,K) = 0.
else
C3D(J,K) = NEBUL(C3D(J,K),F)
endif
if (.NOT.STRCLD.AND.(S(J,K)*PS(J).LT.TOPC.OR.Q(J,K).LE.MINQ))
% C3D(J,K) = 0.
5 CONTINUE
*
DO 10 J=1,N
CH(J)=0.0
CM(J)=0.0
10 CL(J)=0.0
*
do 50 k=1,nk
do j=1,n
flag = (s(j,k).lt.shcl(j).or.ilmo(j).ge.0.)
if (s(j,k).ge.sst.and.s(j,k).lt.sh) then
if (flag) ch(j)= max(c3d(j,k) , ch(j))
elseif (s(j,k).ge.sst.and.s(j,k).lt.sm) then
if (flag) cm(j)= max (c3d(j,k) , cm(j))
elseif (s(j,k).ge.sst.and.s(j,k).lt.scl) then
if (flag) cl(j)= max (c3d(j,k) , cl(j))
endif
enddo
50 continue
*
return
end