!copyright (C) 2001  MSC-RPN COMM  %%%RPNPHY%%%
#include "phy_macros_f.h"

      SUBROUTINE CLDWIN(BM,FM,T,HU,PS,TRAV,SIGMA,NI,NK,SATUCO) 1
#include "impnone.cdk"
*
      INTEGER NI,NK
      REAL FM(NI,NK),BM(NI,NK)
      REAL T(NI,NK),HU(NI,NK)
      REAL PS(NI)
      REAL TRAV(NI,NK)
      REAL SIGMA(NI,NK)
*
      LOGICAL SATUCO
*
*
*Author
*          Janusz Pudykiewicz (Nov. 1985)
*
*Revision
* 001      J. Mailhot (March 1993) 0 <= RH <= 1
* 002      R. Sarrazin (May 1994) Bugs correction
*          and function funb0 func0
* 003      B. Bilodeau (Aug 1994) New physics interface
* 004      R. Sarrazin (June 95) Corrections; add cloud fraction
* 005      B. Bilodeau (Jan 2001) Automatic arrays
* 006      M. Lepine  (March 2003) -  CVMG... Replacements
*
*Object
*          to initialize the cloud water field
*
*Arguments
*
*          - Output -
* BM       stratiform cloud fraction
* FM       cloud water field
*
*          - Input -
* T        temperature
* HU       specific humidity
* PS       surface pressure
* TRAV     work space
* SIGMA    vertical discretization
* NI       X-(horizontal grid dimension)
* NK       number of vertical levels
* SATUCO   .TRUE. if water/ice phase for saturation
*          .FALSE. if water phase only for saturation
*
**
*
*  STATEMENT FUNCTION:
*----------------------
*
*    >      FQSAT(XT,XP)=
*    >*
*    >     X0.622/((XP/100.)*EXP(5418./XT - 21.656) - 0.378)
*
*     USE COMDECKS FROM PHYSICS LIBRARY   ----------------
*                                                        *
      REAL TEMP1,PTCI,PUSBG1,PSGBT,WMR
*
************************************************************************
*     AUTOMATIC ARRAYS
************************************************************************
*
      AUTOMATIC (WPU0 , REAL , (NI))
*
************************************************************************
*
      REAL FUNB0,FUNC0
      REAL YPU0,XWFLO,XSIGMA,YPSGBT,YPUSG1,YPUS,YPTCI,XTTM,XW1
*
      REAL PU0,PUS,PMR,XT
      INTEGER NIK,K,I
*
      PARAMETER (PU0 = 0.85 )
      PARAMETER (PUS = 1.0 )
      PARAMETER (PMR = 0.2E-3)
      PARAMETER (PUSBG1 = 0.99)
      PARAMETER (PSGBT = 0.8)
      PARAMETER (PTCI = 238.)
*
#include "comphy.cdk"
#include "consphy.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
*
*
*____FUNCTION USED FOR CORRECTING OF THE U00 FOR SIGMA>0.9
*
      FUNB0(YPU0,XWFLO,XSIGMA,YPSGBT,YPUSG1)=
     *     YPU0+XWFLO*((XSIGMA-YPSGBT)/(1.-YPSGBT))*
     *     (YPUSG1-YPU0)
*
*____FUNCTION USED FOR CORRECTING OF THE U00 FOR CIRRUS LEVEL
*
      FUNC0(YPUS,YPTCI,XW1,XTTM)=
     *     YPUS-((YPUS-XW1)/(1.+0.15*(YPTCI-XTTM)))
*
*
*
*______COMMON VALUES
*
      NIK = NI * NK
*
*-----------------------------------------------------------
*
*      INITIALISATION OF THE CLOUD WATER CONTAIN
*      USING EMPIRICAL RELATION BETWEEN RELATIVE
*      HUMIDITY AND PARTIAL CLOUD COVER.
*
*___1) COMPUTE RELATIVE HUMIDITY
*
*
*     -----------------------------------------
      IF(SATUCO) THEN
      DO 100 K=1,NK
      DO 100 I=1,NI
*
      TRAV(I,K) = HU(I,K) /
     *   FOQST( T(I,K) , PS(I)*SIGMA(I,K))
*
      TRAV(I,K) = MAX( 0.0 , MIN(TRAV(I,K),1.0) )
*
 100  CONTINUE
      ELSE
      DO 101 K=1,NK
      DO 101 I=1,NI
*
      TRAV(I,K) = HU(I,K) /
     *   FOQSA( T(I,K) , PS(I)*SIGMA(I,K))
*
      TRAV(I,K) = MAX( 0.0 , MIN(TRAV(I,K),1.0) )
*
 101  CONTINUE
      ENDIF
*
      DO 10 K=1,NK
*
* correction to pu0 near ground
*
      TEMP1 = 0.75
      DO 77 I=1,NI
         WPU0(I)=PU0
* 0.5 on continent, 1.0 over ocean
         IF( SIGMA(I,K) .GE. PSGBT )
     $        WPU0(I)=FUNB0(PU0,TEMP1,SIGMA(I,K),PSGBT,PUSBG1)
 77   CONTINUE
*
* correction to pu0 for low temperatures
*
      DO 79 I=1,NI
        if (T(I,K).LE.PTCI) then
           TEMP1 = WPU0(I)
           WPU0(I) = FUNC0(PUS,PTCI,TEMP1,T(I,K))
        endif
 79   CONTINUE
*
*
*___2) COMPUTE PARTIAL CLOUD COVER
*
*
*
      DO 200 I=1,NI
*
         if ((TRAV(I,K).GE.WPU0(I)).AND.(TRAV(I,K).LE.PUS)) then
            BM(I,K)=((TRAV(I,K)-WPU0(I))/(PUS-WPU0(I)))
         else
            BM(I,K) = 0.
         endif
*
 200  CONTINUE
*
*
      DO 300 I=1,NI
*
      BM(I,K) = 1. - SQRT( 1. - BM(I,K) )
*
 300  CONTINUE
*
*
*___3) ESTIMATE CLOUD WATER CONTAIN FROM PARTIAL CLOUD
*      COVER.
*
      DO 400 I=1,NI
*
* reduce pmr for cold temperature
*
      IF( T(I,K) .LT. 268. ) THEN
      WMR=PMR/(1.0+0.5*(268.-T(I,K))**0.5)
      ELSE
      WMR=PMR
      ENDIF
*
      if(TRAV(I,K).LE.PUS) then
         FM(I,K)=.9*BM(I,K)*WMR
      else
         FM(I,K)=   BM(I,K)*WMR
      endif
*
 400  CONTINUE
*
 10   CONTINUE
*
*--------------------------------------------------------
*
      RETURN
      END