SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/coare30_seaflux.F90
Go to the documentation of this file.
00001 !     #########
00002     SUBROUTINE COARE30_SEAFLUX(PZ0SEA,PMASK,KSIZE_WATER,KSIZE_ICE,           &
00003                                 PTA,PEXNA,PRHOA,PSST,PEXNS,PQA,              & 
00004                                 PRAIN,PSNOW,PVMOD,PZREF,PUREF,PPS,           &
00005                                 PQSAT,PSFTH,PSFTQ,PUSTAR,PCD,PCDN,PCH,       &
00006                                 PCE,PRI,PRESA,PZ0HSEA) 
00007 !     #######################################################################
00008 !
00009 !
00010 !!****  *COARE30_SEAFLUX*  
00011 !!
00012 !!    PURPOSE
00013 !!    -------
00014 !     
00015 !      Calculate the sea surface fluxes with modified bulk algorithm COARE:  
00016 !
00017 !      Calculates the surface fluxes of heat, moisture, and momentum over
00018 !      sea surface with the simplified COARE 3.0 bulk algorithm from Fairall et al 
00019 !      2003
00020 !   
00021 !      based on water_flux computation for sea ice
00022 !     
00023 !!**  METHOD
00024 !!    ------
00025 !
00026 !!    EXTERNAL
00027 !!    --------
00028 !!
00029 !!    IMPLICIT ARGUMENTS
00030 !!    ------------------ 
00031 !!      
00032 !!    REFERENCE
00033 !!    ---------
00034 !!     
00035 !!    AUTHOR
00036 !!    ------
00037 !!     C. Lebeaupin  *Météo-France* 
00038 !!
00039 !!    MODIFICATIONS
00040 !!    -------------
00041 !!      Original     18/03/2005
00042 !-------------------------------------------------------------------------------
00043 !
00044 !*       0.     DECLARATIONS
00045 !               ------------
00046 !!
00047 USE MODI_ICE_SEA_FLUX
00048 USE MODI_COARE30_FLUX
00049 !
00050 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00051 USE PARKIND1  ,ONLY : JPRB
00052 !
00053 IMPLICIT NONE
00054 !
00055 !*      0.1    declarations of arguments
00056 !
00057 !
00058 REAL, DIMENSION(:), INTENT(IN)   :: PMASK
00059 INTEGER           , INTENT(IN)   :: KSIZE_WATER  ! number of points of sea water 
00060 INTEGER           , INTENT(IN)   :: KSIZE_ICE    ! and of sea ice
00061 !                                    
00062 REAL, DIMENSION(:), INTENT(IN)    :: PTA   ! air temperature at atm. level (K)
00063 REAL, DIMENSION(:), INTENT(IN)    :: PQA   ! air humidity at atm. level (kg/kg)
00064 REAL, DIMENSION(:), INTENT(IN)    :: PEXNA ! Exner function at atm. level
00065 REAL, DIMENSION(:), INTENT(IN)    :: PRHOA ! air density at atm. level
00066 REAL, DIMENSION(:), INTENT(IN)    :: PVMOD ! module of wind at atm. wind level (m/s)
00067 REAL, DIMENSION(:), INTENT(IN)    :: PZREF ! atm. level for temp. and humidity (m)
00068 REAL, DIMENSION(:), INTENT(IN)    :: PUREF ! atm. level for wind (m)
00069 REAL, DIMENSION(:), INTENT(IN)    :: PSST  ! Sea Surface Temperature (K)
00070 REAL, DIMENSION(:), INTENT(IN)    :: PEXNS ! Exner function at sea surface
00071 REAL, DIMENSION(:), INTENT(IN)    :: PPS   ! air pressure at sea surface (Pa)
00072 REAL, DIMENSION(:), INTENT(IN)    :: PRAIN ! precipitation rate (kg/s/m2)
00073 REAL, DIMENSION(:), INTENT(IN)    :: PSNOW ! snow rate (kg/s/m2)
00074 !
00075 REAL, DIMENSION(:), INTENT(INOUT)    :: PZ0SEA! roughness length over the ocean
00076 !                                                                                 
00077 !  surface fluxes : latent heat, sensible heat, friction fluxes
00078 REAL, DIMENSION(:), INTENT(OUT)      :: PSFTH ! heat flux (W/m2)
00079 REAL, DIMENSION(:), INTENT(OUT)      :: PSFTQ ! water flux (kg/m2/s)
00080 REAL, DIMENSION(:), INTENT(OUT)      :: PUSTAR! friction velocity (m/s)
00081 !
00082 ! diagnostics
00083 REAL, DIMENSION(:), INTENT(OUT)      :: PQSAT ! humidity at saturation
00084 REAL, DIMENSION(:), INTENT(OUT)      :: PCD   ! heat drag coefficient
00085 REAL, DIMENSION(:), INTENT(OUT)      :: PCDN  ! momentum drag coefficient
00086 REAL, DIMENSION(:), INTENT(OUT)      :: PCH   ! neutral momentum drag coefficient
00087 REAL, DIMENSION(:), INTENT(OUT)      :: PCE   !transfer coef. for latent heat flux
00088 REAL, DIMENSION(:), INTENT(OUT)      :: PRI   ! Richardson number
00089 REAL, DIMENSION(:), INTENT(OUT)      :: PRESA ! aerodynamical resistance
00090 REAL, DIMENSION(:), INTENT(OUT)      :: PZ0HSEA ! heat roughness length
00091 !
00092 !*      0.2    declarations of local variables
00093 !
00094 INTEGER, DIMENSION(KSIZE_WATER) :: IR_WATER
00095 INTEGER, DIMENSION(KSIZE_ICE)   :: IR_ICE
00096 INTEGER                         :: J1,J2,JJ
00097 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00098 !
00099 !-------------------------------------------------------------------------------
00100 !
00101 !       1.     Create Masks for ice and water sea
00102 !              ------------------------------------
00103 IF (LHOOK) CALL DR_HOOK('MODI_COARE30_SEAFLUX:COARE30_SEAFLUX',0,ZHOOK_HANDLE)
00104 !
00105 IR_WATER(:)=0
00106 IR_ICE(:)=0
00107 J1=0
00108 J2=0
00109 !
00110 DO JJ=1,SIZE(PSST(:))
00111   IF (PMASK(JJ) >=0.0 ) THEN
00112     J1 = J1 + 1
00113     IR_WATER(J1)= JJ
00114   ELSE
00115     J2 = J2 + 1
00116     IR_ICE(J2)= JJ
00117   ENDIF
00118 END DO
00119 !
00120 !-------------------------------------------------------------------------------
00121 !
00122 !       2.      water sea : call to COARE30_FLUX
00123 !              ------------------------------------------------
00124 !
00125 IF (KSIZE_WATER > 0 ) CALL TREAT_SURF(IR_WATER,'W')
00126 !
00127 !-------------------------------------------------------------------------------
00128 !
00129 !       3.      sea ice : call to ICE_SEA_FLUX
00130 !              ------------------------------------
00131 !
00132 IF (KSIZE_ICE > 0 ) CALL TREAT_SURF(IR_ICE,'I')
00133 !
00134 IF (LHOOK) CALL DR_HOOK('MODI_COARE30_SEAFLUX:COARE30_SEAFLUX',1,ZHOOK_HANDLE)
00135 !-------------------------------------------------------------------------------
00136 !
00137 CONTAINS
00138 !
00139 SUBROUTINE TREAT_SURF(KMASK,YTYPE)
00140 !
00141 INTEGER, INTENT(IN), DIMENSION(:) :: KMASK
00142  CHARACTER(LEN=1), INTENT(IN) :: YTYPE
00143 !
00144 REAL, DIMENSION(SIZE(KMASK))      :: ZW_TA   ! air temperature at atm. level (K)
00145 REAL, DIMENSION(SIZE(KMASK))      :: ZW_QA   ! air humidity at atm. level (kg/kg)
00146 REAL, DIMENSION(SIZE(KMASK))      :: ZW_EXNA ! Exner function at atm. level
00147 REAL, DIMENSION(SIZE(KMASK))      :: ZW_RHOA ! air density at atm. level
00148 REAL, DIMENSION(SIZE(KMASK))      :: ZW_VMOD ! module of wind at atm. wind level (m/s)
00149 REAL, DIMENSION(SIZE(KMASK))      :: ZW_ZREF ! atm. level for temp. and humidity (m)
00150 REAL, DIMENSION(SIZE(KMASK))      :: ZW_UREF ! atm. level for wind (m)
00151 REAL, DIMENSION(SIZE(KMASK))      :: ZW_SST  ! Sea Surface Temperature (K)
00152 REAL, DIMENSION(SIZE(KMASK))      :: ZW_EXNS ! Exner function at sea surface
00153 REAL, DIMENSION(SIZE(KMASK))      :: ZW_PS   ! air pressure at sea surface (Pa)
00154 REAL, DIMENSION(SIZE(KMASK))      :: ZW_RAIN !precipitation rate (kg/s/m2)
00155 REAL, DIMENSION(SIZE(KMASK))      :: ZW_SNOW !snow rate (kg/s/m2)
00156 !
00157 REAL, DIMENSION(SIZE(KMASK))      :: ZW_Z0SEA! roughness length over the ocean
00158 !                                                                                 
00159 !  surface fluxes : latent heat, sensible heat, friction fluxes
00160 REAL, DIMENSION(SIZE(KMASK))      :: ZW_SFTH ! heat flux (W/m2)
00161 REAL, DIMENSION(SIZE(KMASK))      :: ZW_SFTQ ! water flux (kg/m2/s)
00162 REAL, DIMENSION(SIZE(KMASK))      :: ZW_USTAR! friction velocity (m/s)
00163 !
00164 ! diagnostics
00165 REAL, DIMENSION(SIZE(KMASK))      :: ZW_QSAT ! humidity at saturation
00166 REAL, DIMENSION(SIZE(KMASK))      :: ZW_CD   ! heat drag coefficient
00167 REAL, DIMENSION(SIZE(KMASK))      :: ZW_CDN  ! momentum drag coefficient
00168 REAL, DIMENSION(SIZE(KMASK))      :: ZW_CH   ! neutral momentum drag coefficient
00169 REAL, DIMENSION(SIZE(KMASK))      :: ZW_CE   !transfer coef. for latent heat flux
00170 REAL, DIMENSION(SIZE(KMASK))      :: ZW_RI   ! Richardson number
00171 REAL, DIMENSION(SIZE(KMASK))      :: ZW_RESA ! aerodynamical resistance
00172 REAL, DIMENSION(SIZE(KMASK))      :: ZW_Z0HSEA ! heat roughness length
00173 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00174 !
00175 IF (LHOOK) CALL DR_HOOK('COARE30_SEAFLUX:TREAT_SURF',0,ZHOOK_HANDLE)
00176 DO JJ=1, SIZE(KMASK)
00177   ZW_TA(JJ)   = PTA(KMASK(JJ))
00178   ZW_QA(JJ)   = PQA(KMASK(JJ))
00179   ZW_EXNA(JJ) = PEXNA(KMASK(JJ))
00180   ZW_RHOA(JJ) = PRHOA(KMASK(JJ))
00181   ZW_VMOD(JJ) = PVMOD(KMASK(JJ))
00182   ZW_ZREF(JJ) = PZREF(KMASK(JJ)) 
00183   ZW_UREF(JJ) = PUREF(KMASK(JJ))
00184   ZW_SST(JJ)  = PSST(KMASK(JJ))
00185   ZW_EXNS(JJ) = PEXNS(KMASK(JJ)) 
00186   ZW_PS(JJ)   = PPS(KMASK(JJ))
00187   ZW_QSAT(JJ)   = PQSAT(KMASK(JJ))
00188   ZW_RAIN(JJ) = PRAIN(KMASK(JJ))
00189   ZW_SNOW(JJ) = PSNOW(KMASK(JJ))
00190   ZW_Z0SEA(JJ)= PZ0SEA(KMASK(JJ))
00191   ZW_SFTH(JJ) = PSFTH(KMASK(JJ))
00192   ZW_SFTQ(JJ) = PSFTQ(KMASK(JJ))
00193   ZW_USTAR(JJ) = PUSTAR(KMASK(JJ))
00194   ZW_CD(JJ) = PCD(KMASK(JJ))
00195   ZW_CDN(JJ) = PCDN(KMASK(JJ))
00196   ZW_CH(JJ) = PCH(KMASK(JJ)) 
00197   ZW_CE(JJ) = PCE(KMASK(JJ))
00198   ZW_RI(JJ) = PRI(KMASK(JJ))
00199   ZW_RESA(JJ) = PRESA(KMASK(JJ))
00200   ZW_Z0HSEA(JJ) = PZ0HSEA(KMASK(JJ))
00201 END DO
00202 !
00203 IF (YTYPE=='W') THEN
00204   !
00205   CALL COARE30_FLUX(ZW_Z0SEA,ZW_TA,ZW_EXNA,ZW_RHOA,ZW_SST,ZW_EXNS,&
00206         ZW_QA,ZW_VMOD,ZW_ZREF,ZW_UREF,ZW_PS,ZW_QSAT,ZW_SFTH,ZW_SFTQ,ZW_USTAR,&
00207         ZW_CD,ZW_CDN,ZW_CH,ZW_CE,ZW_RI,ZW_RESA,ZW_RAIN,ZW_Z0HSEA)   
00208   !
00209 ELSEIF (YTYPE=='I') THEN
00210   !
00211   CALL ICE_SEA_FLUX(ZW_Z0SEA,ZW_TA,ZW_EXNA,ZW_RHOA,ZW_SST,ZW_EXNS,ZW_QA,ZW_RAIN,ZW_SNOW,  &
00212          ZW_VMOD,ZW_ZREF,ZW_UREF,ZW_PS,ZW_QSAT,ZW_SFTH,ZW_SFTQ,ZW_USTAR,ZW_CD, &
00213          ZW_CDN,ZW_CH,ZW_RI,ZW_RESA,ZW_Z0HSEA)  
00214   !
00215 ENDIF
00216 !
00217 DO JJ=1, SIZE(KMASK)
00218   PQSAT(KMASK(JJ))   = ZW_QSAT(JJ)
00219   PZ0SEA(KMASK(JJ))= ZW_Z0SEA(JJ)
00220   PSFTH(KMASK(JJ)) = ZW_SFTH(JJ) 
00221   PSFTQ(KMASK(JJ)) = ZW_SFTQ(JJ) 
00222   PUSTAR(KMASK(JJ))= ZW_USTAR(JJ)
00223   PCD(KMASK(JJ))   = ZW_CD(JJ) 
00224   PCDN(KMASK(JJ))  = ZW_CDN(JJ) 
00225   PCH(KMASK(JJ))   = ZW_CH(JJ)
00226   PCE(KMASK(JJ))   = ZW_CE(JJ)
00227   PRI(KMASK(JJ))   = ZW_RI(JJ) 
00228   PRESA(KMASK(JJ)) = ZW_RESA(JJ) 
00229  PZ0HSEA(KMASK(JJ)) = ZW_Z0HSEA(JJ) 
00230 END DO
00231 IF (LHOOK) CALL DR_HOOK('COARE30_SEAFLUX:TREAT_SURF',1,ZHOOK_HANDLE)
00232 !
00233 END SUBROUTINE TREAT_SURF
00234 ! 
00235 END SUBROUTINE COARE30_SEAFLUX