SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/ice_sea_flux.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE ICE_SEA_FLUX(PZ0ICE,                                       &
00003                               PTA, PEXNA, PRHOA, PTICE, PEXNS, PQA, PRR, PRS, &
00004                               PVMOD, PZREF, PUREF,                            &
00005                               PPS, PQSAT,                                     &
00006                               PSFTH, PSFTQ, PUSTAR,                           &
00007                               PCD, PCDN, PCH, PRI, PRESA, PZ0HICE             )  
00008 !     #######################################################################
00009 !
00010 !
00011 !!****  *ICE_SEA_FLUX*  
00012 !!
00013 !!    PURPOSE
00014 !!    -------
00015 !      Calculate the surface fluxes of heat, moisture, and momentum over
00016 !       sea ice. adapted from WATER_FLUX  
00017 !     
00018 !!**  METHOD
00019 !!    ------
00020 !
00021 !!    EXTERNAL
00022 !!    --------
00023 !!
00024 !!    IMPLICIT ARGUMENTS
00025 !!    ------------------ 
00026 !!
00027 !!      
00028 !!    REFERENCE
00029 !!    ---------
00030 !!      
00031 !!    AUTHOR
00032 !!    ------
00033 !!      S. Belair           * Meteo-France *
00034 !!
00035 !!    MODIFICATIONS
00036 !!    -------------
00037 !!      Original      01/09/95 
00038 !!      (J.Stein)     16/11/95  use PUSLOPE and Theta to compute Ri
00039 !!      (P.Lacarrere) 19/03/96  bug in the ZTHVI and ZTHVIS computations
00040 !!      (J.Stein)     27/03/96  use only H and LE in the soil scheme
00041 !!      (P.Jabouille) 12/11/96  bug in the Z0 computation
00042 !!      (V.Masson)    01/02/00  detection of sea ice
00043 !!      (P. Tulet)    01/10/03  aerodynamical resistance output
00044 !!      (P. LeMoigne) 29/03/04  bug in the heat flux computation
00045 !!      (P. LeMoigne) 09/02/06  Z0H as output
00046 !!      B. Decharme    06/2009 limitation of Ri
00047 !!      Modified        09/2009  B. Decharme: limitation of Ri in surface_ri.F90
00048 !-------------------------------------------------------------------------------
00049 !
00050 !*       0.     DECLARATIONS
00051 !               ------------
00052 !
00053 USE MODD_CSTS,       ONLY : XG, XCPD
00054 USE MODD_SURF_PAR,   ONLY : XUNDEF
00055 USE MODD_SURF_ATM,   ONLY : LDRAG_COEF_ARP, LRRGUST_ARP, XRRSCALE, &
00056                               XRRGAMMA, XUTILGUST     
00057 USE MODD_SNOW_PAR,   ONLY : XZ0SN, XZ0HSN
00058 !
00059 USE MODI_SURFACE_RI
00060 USE MODI_SURFACE_AERO_COND
00061 USE MODI_SURFACE_CD
00062 USE MODI_SURFACE_CDCH_1DARP
00063 USE MODI_WIND_THRESHOLD
00064 !
00065 USE MODE_THERMOS
00066 !
00067 !
00068 !
00069 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00070 USE PARKIND1  ,ONLY : JPRB
00071 !
00072 IMPLICIT NONE
00073 !
00074 !*      0.1    declarations of arguments
00075 !
00076 !
00077 REAL, DIMENSION(:), INTENT(IN)       :: PTA   ! air temperature at atm. level
00078 REAL, DIMENSION(:), INTENT(IN)       :: PQA   ! air humidity at atm. level (kg/kg)
00079 REAL, DIMENSION(:), INTENT(IN)       :: PEXNA ! Exner function at atm. level
00080 REAL, DIMENSION(:), INTENT(IN)       :: PRHOA ! air density at atm. level
00081 REAL, DIMENSION(:), INTENT(IN)       :: PVMOD ! module of wind at atm. wind level
00082 REAL, DIMENSION(:), INTENT(IN)       :: PZREF ! atm. level for temp. and humidity
00083 REAL, DIMENSION(:), INTENT(IN)       :: PUREF ! atm. level for wind
00084 REAL, DIMENSION(:), INTENT(IN)       :: PTICE ! Sea ice Surface Temperature
00085 REAL, DIMENSION(:), INTENT(IN)       :: PEXNS ! Exner function at sea surface
00086 REAL, DIMENSION(:), INTENT(IN)       :: PPS   ! air pressure at sea surface
00087 REAL, DIMENSION(:), INTENT(IN)       :: PRR   ! rain rate
00088 REAL, DIMENSION(:), INTENT(IN)       :: PRS   ! snow rate
00089 !
00090 REAL, DIMENSION(:), INTENT(INOUT)    :: PZ0ICE! roughness length over the sea ice
00091 !                                         
00092 !                                         
00093 !  surface fluxes : latent heat, sensible heat, friction fluxes
00094 REAL, DIMENSION(:), INTENT(OUT)      :: PSFTH ! heat flux  (W/m2)
00095 REAL, DIMENSION(:), INTENT(OUT)      :: PSFTQ ! water flux (kg/m2/s)
00096 REAL, DIMENSION(:), INTENT(OUT)      :: PUSTAR! friction velocity (m/s)
00097 !
00098 ! diagnostics
00099 REAL, DIMENSION(:), INTENT(OUT)      :: PQSAT ! humidity at saturation
00100 REAL, DIMENSION(:), INTENT(OUT)      :: PCD   ! heat drag coefficient
00101 REAL, DIMENSION(:), INTENT(OUT)      :: PCDN  ! momentum drag coefficient
00102 REAL, DIMENSION(:), INTENT(OUT)      :: PCH   ! neutral momentum drag coefficient
00103 REAL, DIMENSION(:), INTENT(OUT)      :: PRI   ! Richardson number
00104 REAL, DIMENSION(:), INTENT(OUT)      :: PRESA     ! aerodynamical resistance
00105 REAL, DIMENSION(:), INTENT(OUT)      :: PZ0HICE    ! heat roughness length
00106 !
00107 !
00108 !*      0.2    declarations of local variables
00109 !
00110 !
00111 REAL, DIMENSION(SIZE(PTA)) :: ZVMOD     ! wind modulus
00112 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR2   ! square of friction velocity
00113 REAL, DIMENSION(SIZE(PTA)) :: ZAC       ! Aerodynamical conductance
00114 REAL, DIMENSION(SIZE(PTA)) :: ZRA       ! Aerodynamical resistance
00115 REAL, DIMENSION(SIZE(PTA)) :: ZDIRCOSZW ! orography slope cosine (=1 on water!)
00116 REAL, DIMENSION(SIZE(PTA)) :: ZFP       ! working variable
00117 REAL, DIMENSION(SIZE(PTA)) :: ZRRCOR    ! correction od CD, CH, CDN due to moist-gustiness
00118 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00119 
00120 !
00121 !-------------------------------------------------------------------------------
00122 !
00123 !       1.     Initializations
00124 !              ---------------
00125 !
00126 IF (LHOOK) CALL DR_HOOK('ICE_SEA_FLUX',0,ZHOOK_HANDLE)
00127 ZDIRCOSZW=1.
00128 !
00129 PRI(:) = XUNDEF
00130 PCH(:) = XUNDEF
00131 PCD(:) = XUNDEF
00132 PCDN(:) = XUNDEF
00133 !
00134 PSFTH (:)=XUNDEF
00135 PSFTQ (:)=XUNDEF
00136 PUSTAR(:)=XUNDEF
00137 PRESA(:)=XUNDEF
00138 !
00139 !
00140 !       1.1    Saturated specified humidity near the water surface
00141 !              ---------------------------------------------------
00142 !
00143 PQSAT(:) = QSAT(PTICE(:),PPS(:))
00144 !
00145 !-------------------------------------------------------------------------------
00146 !
00147 !       2.     Calculate the drag coefficient for momentum (PCD)
00148 !              -------------------------------------------------
00149 !
00150 !       2.1    Richardson number
00151 !              -----------------
00152 !
00153 
00154  CALL SURFACE_RI(PTICE,PQSAT,PEXNS,PEXNA,PTA,PQA, &
00155                   PZREF, PUREF, ZDIRCOSZW,PVMOD,PRI)
00156 !                  
00157 !
00158 !       2.2    Z0 for  sea ice
00159 !              --------------------
00160 !
00161 PZ0HICE(:) = XZ0HSN
00162 !
00163 PZ0ICE (:) = XZ0SN
00164 !
00165 !       2.3    Drag coefficient
00166 !              ----------------
00167 !
00168 ZVMOD(:)=WIND_THRESHOLD(PVMOD(:),PUREF(:))
00169 !
00170 IF (LDRAG_COEF_ARP) THEN
00171 !
00172    CALL SURFACE_CDCH_1DARP(PZREF, PZ0ICE, PZ0HICE , ZVMOD, PTA, PTICE, &
00173                              PQA, PQSAT, PCD, PCDN, PCH                 )  
00174 !
00175    ZRA(:) = 1. / ( PCH(:) * ZVMOD(:) )
00176 !
00177 ELSE
00178 
00179    CALL SURFACE_CD(PRI, PZREF, PUREF, PZ0ICE, PZ0HICE , PCD, PCDN)
00180 !
00181 !-------------------------------------------------------------------------------
00182 !
00183 !       3.     Drag coefficient for heat and aerodynamical resistance
00184 !              -------------------------------------------------------
00185 !
00186    CALL SURFACE_AERO_COND(PRI, PZREF, PUREF, ZVMOD, PZ0ICE, PZ0HICE , ZAC, ZRA, PCH)
00187 !
00188 ENDIF
00189 !
00190 ZUSTAR2(:) = PCD(:)*ZVMOD(:)*ZVMOD(:)
00191 !
00192 PRESA(:) = ZRA(:)
00193 !
00194 IF (LRRGUST_ARP) THEN
00195   ZFP(:)=MAX(0.0,PRR(:)+PRS(:))
00196   ZRRCOR(:)=SQRT(1.0+((((ZFP(:)/(ZFP(:)+XRRSCALE))**XRRGAMMA)*XUTILGUST)**2) &
00197       /(PCD(:)*ZVMOD(:)**2))  
00198 
00199   PCD  = PCD*ZRRCOR
00200   PCH  = PCH*ZRRCOR
00201   PCDN = PCDN*ZRRCOR
00202 ENDIF
00203 !
00204 !-------------------------------------------------------------------------------
00205 !
00206 !       4.     The fluxes
00207 !              ----------
00208 !
00209 PSFTH (:) =  XCPD * PRHOA(:) * PCH(:) * ZVMOD(:) * ( PTICE(:) -PTA(:) * PEXNS(:) / PEXNA(:) ) / PEXNS(:)
00210 PSFTQ (:) =  PRHOA(:) * PCH(:) * ZVMOD(:) * ( PQSAT(:)-PQA(:) )
00211 PUSTAR(:) = SQRT(ZUSTAR2(:))
00212 IF (LHOOK) CALL DR_HOOK('ICE_SEA_FLUX',1,ZHOOK_HANDLE)
00213 !
00214 !
00215 !-------------------------------------------------------------------------------
00216 !
00217 END SUBROUTINE ICE_SEA_FLUX