|
SURFEX v7.3
General documentation of Surfex
|
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
1.8.0