SURFEX v7.3
General documentation of Surfex
|
00001 ! ############################################################# 00002 SUBROUTINE INIT_SEAFLUX_n(HPROGRAM,HINIT, & 00003 KI,KSV,KSW, & 00004 HSV,PCO2,PRHOA, & 00005 PZENITH,PAZIM,PSW_BANDS,PDIR_ALB,PSCA_ALB, & 00006 PEMIS,PTSRAD, & 00007 KYEAR, KMONTH,KDAY, PTIME, & 00008 HATMFILE,HATMFILETYPE, & 00009 HTEST ) 00010 ! ############################################################# 00011 ! 00012 !!**** *INIT_SEAFLUX_n* - routine to initialize SEAFLUX 00013 !! 00014 !! PURPOSE 00015 !! ------- 00016 !! 00017 !!** METHOD 00018 !! ------ 00019 !! 00020 !! EXTERNAL 00021 !! -------- 00022 !! 00023 !! 00024 !! IMPLICIT ARGUMENTS 00025 !! ------------------ 00026 !! 00027 !! REFERENCE 00028 !! --------- 00029 !! 00030 !! 00031 !! AUTHOR 00032 !! ------ 00033 !! V. Masson *Meteo France* 00034 !! 00035 !! MODIFICATIONS 00036 !! ------------- 00037 !! Original 01/2003 00038 !! Modified 01/2006 : sea flux parameterization. 00039 !! 01/2008 : coupling with 1D ocean 00040 !! B. Decharme 08/2009 : specific treatment for sea/ice in the Earth System Model 00041 !! B. Decharme 07/2011 : read pgd+prep 00042 !------------------------------------------------------------------------------- 00043 ! 00044 !* 0. DECLARATIONS 00045 ! ------------ 00046 ! 00047 USE MODD_SURF_ATM, ONLY : LCPL_ESM 00048 ! 00049 USE MODD_READ_NAMELIST, ONLY : LNAM_READ 00050 USE MODD_CSTS, ONLY : XTTS 00051 USE MODD_SNOW_PAR, ONLY : XZ0HSN 00052 USE MODD_SEAFLUX_n, ONLY : XCOVER, XDIR_ALB, XSCA_ALB, & 00053 XEMIS, XSST, XTICE, CSEA_FLUX, & 00054 CSEA_ALB, LPWG,LPRECIP,LPWEBB, & 00055 XTSTEP, XOUT_TSTEP, TTIME, & 00056 NGRVWAVES, XSST_INI, LSBL, & 00057 XZ0, XZ0H, XUMER, XVMER, & 00058 XICHCE, CINTERPOL_SST, & 00059 LINTERPOL_SST, XICE_ALB 00060 USE MODD_OCEAN_n, ONLY : LPROGSST,NTIME_COUPLING,LMERCATOR,LCURRENT 00061 USE MODD_DIAG_SEAFLUX_n, ONLY : N2M, LSURF_BUDGET, LRAD_BUDGET, XDIAG_TSTEP, L2M_MIN_ZS, & 00062 LCOEF, LSURF_VARS, LSURF_BUDGETC, LRESET_BUDGETC 00063 USE MODD_DIAG_OCEAN_n, ONLY : LDIAG_OCEAN 00064 USE MODD_CH_SEAFLUX_n, ONLY : XDEP, CCH_DRY_DEP, CSV, CCH_NAMES, & 00065 NBEQ, NSV_CHSBEG, NSV_CHSEND, & 00066 NAEREQ, NSV_AERBEG, NSV_AEREND, CAER_NAMES,& 00067 NSV_DSTBEG, NSV_DSTEND, NDSTEQ, CDSTNAMES,& 00068 NSV_SLTBEG, NSV_SLTEND, NSLTEQ, CSLTNAMES 00069 USE MODD_SURF_PAR, ONLY : XUNDEF, NUNDEF 00070 USE MODD_CHS_AEROSOL, ONLY: LVARSIGI, LVARSIGJ 00071 USE MODD_DST_SURF, ONLY: LVARSIG_DST, NDSTMDE, NDST_MDEBEG, LRGFIX_DST 00072 USE MODD_SLT_SURF, ONLY: LVARSIG_SLT, NSLTMDE, NSLT_MDEBEG, LRGFIX_SLT 00073 ! 00074 USE MODI_INIT_IO_SURF_n 00075 USE MODI_DEFAULT_CH_DEP 00076 USE MODI_DEFAULT_SEAFLUX 00077 USE MODI_DEFAULT_DIAG_SEAFLUX 00078 USE MODI_READ_DEFAULT_SEAFLUX_n 00079 USE MODI_READ_SEAFLUX_CONF_n 00080 USE MODI_READ_SEAFLUX_n 00081 USE MODI_READ_OCEAN_n 00082 USE MODI_READ_PGD_SEAFLUX_n 00083 USE MODI_DIAG_SEAFLUX_INIT_n 00084 USE MODI_END_IO_SURF_n 00085 USE MODI_GET_LUOUT 00086 USE MODI_READ_SURF 00087 USE MODI_READ_SEAFLUX_DATE 00088 USE MODI_READ_NAM_PREP_SEAFLUX_n 00089 USE MODI_INIT_CHEMICAL_n 00090 USE MODI_PREP_CTRL_SEAFLUX 00091 USE MODI_UPDATE_RAD_SEAWAT 00092 USE MODI_READ_SEAFLUX_SBL_n 00093 USE MODI_ABOR1_SFX 00094 ! 00095 USE MODI_SET_SURFEX_FILEIN 00096 ! 00097 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00098 USE PARKIND1 ,ONLY : JPRB 00099 ! 00100 ! 00101 IMPLICIT NONE 00102 ! 00103 !* 0.1 Declarations of arguments 00104 ! ------------------------- 00105 ! 00106 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes 00107 CHARACTER(LEN=3), INTENT(IN) :: HINIT ! choice of fields to initialize 00108 INTEGER, INTENT(IN) :: KI ! number of points 00109 INTEGER, INTENT(IN) :: KSV ! number of scalars 00110 INTEGER, INTENT(IN) :: KSW ! number of short-wave spectral bands 00111 CHARACTER(LEN=6), DIMENSION(KSV), INTENT(IN) :: HSV ! name of all scalar variables 00112 REAL, DIMENSION(KI), INTENT(IN) :: PCO2 ! CO2 concentration (kg/m3) 00113 REAL, DIMENSION(KI), INTENT(IN) :: PRHOA ! air density 00114 REAL, DIMENSION(KI), INTENT(IN) :: PZENITH ! solar zenithal angle 00115 REAL, DIMENSION(KI), INTENT(IN) :: PAZIM ! solar azimuthal angle (rad from N, clock) 00116 REAL, DIMENSION(KSW), INTENT(IN) :: PSW_BANDS ! middle wavelength of each band 00117 REAL, DIMENSION(KI,KSW),INTENT(OUT) :: PDIR_ALB ! direct albedo for each band 00118 REAL, DIMENSION(KI,KSW),INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each band 00119 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS ! emissivity 00120 REAL, DIMENSION(KI), INTENT(OUT) :: PTSRAD ! radiative temperature 00121 INTEGER, INTENT(IN) :: KYEAR ! current year (UTC) 00122 INTEGER, INTENT(IN) :: KMONTH ! current month (UTC) 00123 INTEGER, INTENT(IN) :: KDAY ! current day (UTC) 00124 REAL, INTENT(IN) :: PTIME ! current time since 00125 ! midnight (UTC, s) 00126 ! 00127 CHARACTER(LEN=28), INTENT(IN) :: HATMFILE ! atmospheric file name 00128 CHARACTER(LEN=6), INTENT(IN) :: HATMFILETYPE! atmospheric file type 00129 CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK' 00130 ! 00131 ! 00132 !* 0.2 Declarations of local variables 00133 ! ------------------------------- 00134 ! 00135 INTEGER :: ILU ! sizes of SEAFLUX arrays 00136 INTEGER :: ILUOUT ! unit of output listing file 00137 INTEGER :: IRESP ! return code 00138 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00139 ! 00140 !------------------------------------------------------------------------------- 00141 ! 00142 ! Initialisation for IO 00143 ! 00144 IF (LHOOK) CALL DR_HOOK('INIT_SEAFLUX_N',0,ZHOOK_HANDLE) 00145 CALL GET_LUOUT(HPROGRAM,ILUOUT) 00146 ! 00147 IF (HTEST/='OK') THEN 00148 CALL ABOR1_SFX('INIT_SEAFLUXN: FATAL ERROR DURING ARGUMENT TRANSFER') 00149 END IF 00150 ! 00151 ! 00152 ! Others litlle things 00153 ! 00154 PDIR_ALB = XUNDEF 00155 PSCA_ALB = XUNDEF 00156 PEMIS = XUNDEF 00157 PTSRAD = XUNDEF 00158 ! 00159 LMERCATOR = .FALSE. 00160 LCURRENT = .FALSE. 00161 ! 00162 IF (LNAM_READ) THEN 00163 ! 00164 !* 0. Defaults 00165 ! -------- 00166 ! 00167 ! 0.1. Hard defaults 00168 ! 00169 00170 CALL DEFAULT_SEAFLUX(XTSTEP,XOUT_TSTEP,CSEA_ALB,CSEA_FLUX,LPWG, & 00171 LPRECIP,LPWEBB,NGRVWAVES,LPROGSST,NTIME_COUPLING,& 00172 XICHCE,CINTERPOL_SST ) 00173 ! 00174 CALL DEFAULT_CH_DEP(CCH_DRY_DEP) 00175 ! 00176 CALL DEFAULT_DIAG_SEAFLUX(N2M,LSURF_BUDGET,L2M_MIN_ZS,LRAD_BUDGET,LCOEF,LSURF_VARS,& 00177 LDIAG_OCEAN,LSURF_BUDGETC,LRESET_BUDGETC,XDIAG_TSTEP ) 00178 00179 ENDIF 00180 ! 00181 ! 0.2. Defaults from file header 00182 ! 00183 CALL READ_DEFAULT_SEAFLUX_n(HPROGRAM) 00184 ! 00185 !* 1.1 Reading of configuration: 00186 ! ------------------------- 00187 ! 00188 CALL READ_SEAFLUX_CONF_n(HPROGRAM) 00189 ! 00190 LINTERPOL_SST=.FALSE. 00191 IF(LCPL_ESM)THEN 00192 ! No STT interpolation in Earth System Model 00193 CINTERPOL_SST='NONE ' 00194 LINTERPOL_SST=.FALSE. 00195 ELSEIF(CINTERPOL_SST/='NONE ')THEN 00196 LINTERPOL_SST=.TRUE. 00197 ENDIF 00198 ! 00199 !* 1. Cover fields and grid: 00200 ! --------------------- 00201 !* date 00202 ! 00203 SELECT CASE (HINIT) 00204 CASE ('PGD') 00205 TTIME%TDATE%YEAR = NUNDEF 00206 TTIME%TDATE%MONTH= NUNDEF 00207 TTIME%TDATE%DAY = NUNDEF 00208 TTIME%TIME = XUNDEF 00209 00210 CASE ('PRE') 00211 CALL PREP_CTRL_SEAFLUX(N2M,LSURF_BUDGET,L2M_MIN_ZS,LRAD_BUDGET,LCOEF,LSURF_VARS,& 00212 LDIAG_OCEAN,ILUOUT,LSURF_BUDGETC ) 00213 IF (LNAM_READ) CALL READ_NAM_PREP_SEAFLUX_n(HPROGRAM) 00214 CALL READ_SEAFLUX_DATE(HPROGRAM,HINIT,ILUOUT,HATMFILE,HATMFILETYPE,KYEAR,KMONTH,KDAY,PTIME,TTIME) 00215 00216 CASE DEFAULT 00217 CALL INIT_IO_SURF_n(HPROGRAM,'SEA ','SEAFLX','READ ') 00218 CALL READ_SURF(HPROGRAM,'DTCUR',TTIME,IRESP) 00219 CALL END_IO_SURF_n(HPROGRAM) 00220 END SELECT 00221 ! 00222 !----------------------------------------------------------------------------------------------------- 00223 ! READ PGD FILE 00224 !----------------------------------------------------------------------------------------------------- 00225 ! 00226 ! Initialisation for IO 00227 ! 00228 CALL SET_SURFEX_FILEIN(HPROGRAM,'PGD ') ! change input file name to pgd name 00229 CALL INIT_IO_SURF_n(HPROGRAM,'SEA ','SEAFLX','READ ') 00230 ! 00231 ! Reading of the fields 00232 ! 00233 CALL READ_PGD_SEAFLUX_n(HPROGRAM) 00234 ! 00235 CALL END_IO_SURF_n(HPROGRAM) 00236 CALL SET_SURFEX_FILEIN(HPROGRAM,'PREP') ! restore input file name 00237 !------------------------------------------------------------------------------- 00238 ! 00239 !* if only physiographic fields are to be initialized, stop here. 00240 ! 00241 IF (HINIT/='ALL') THEN 00242 IF (LHOOK) CALL DR_HOOK('INIT_SEAFLUX_N',1,ZHOOK_HANDLE) 00243 RETURN 00244 END IF 00245 ! 00246 !------------------------------------------------------------------------------- 00247 ! 00248 ! Initialisation for IO 00249 ! 00250 CALL INIT_IO_SURF_n(HPROGRAM,'SEA ','SEAFLX','READ ') 00251 ! 00252 !* 2. Prognostic fields: 00253 ! ---------------- 00254 ! 00255 CALL READ_SEAFLUX_n(HPROGRAM) 00256 ! 00257 !------------------------------------------------------------------------------- 00258 ! 00259 !* 2.1 Ocean fields: 00260 ! ------------- 00261 ! 00262 CALL READ_OCEAN_n(HPROGRAM) 00263 ! 00264 !------------------------------------------------------------------------------- 00265 ! 00266 ILU = SIZE(XCOVER,1) 00267 ! 00268 ALLOCATE(XSST_INI (ILU)) 00269 XSST_INI(:) = XSST(:) 00270 ! 00271 ALLOCATE(XZ0H(ILU)) 00272 WHERE (XSST(:)>=XTTS) 00273 XZ0H(:) = XZ0(:) 00274 ELSEWHERE 00275 XZ0H(:) = XZ0HSN 00276 ENDWHERE 00277 ! 00278 ! 00279 !* 3. Specific fields when using earth system model (Sea current and Sea-ice temperature) 00280 ! ----------------------------------------------------------------------------------- 00281 ! 00282 IF(LCPL_ESM)THEN 00283 ! 00284 ALLOCATE(XTICE (ILU)) 00285 ALLOCATE(XICE_ALB(ILU)) 00286 ALLOCATE(XUMER (ILU)) 00287 ALLOCATE(XVMER (ILU)) 00288 ! 00289 XTICE (:)=XUNDEF 00290 XICE_ALB(:)=XUNDEF 00291 XUMER (:)=XUNDEF 00292 XVMER (:)=XUNDEF 00293 ! 00294 ELSE 00295 ! 00296 ALLOCATE(XTICE (0)) 00297 ALLOCATE(XICE_ALB(0)) 00298 ALLOCATE(XUMER (0)) 00299 ALLOCATE(XVMER (0)) 00300 ! 00301 ENDIF 00302 ! 00303 !* 4. Albedo, emissivity and output radiative fields on open sea and sea ice 00304 ! ---------------------------------------------------------------------- 00305 ! 00306 ALLOCATE(XDIR_ALB (ILU)) 00307 ALLOCATE(XSCA_ALB (ILU)) 00308 ALLOCATE(XEMIS (ILU)) 00309 XDIR_ALB = 0.0 00310 XSCA_ALB = 0.0 00311 XEMIS = 0.0 00312 ! 00313 CALL UPDATE_RAD_SEAWAT(CSEA_ALB,XSST,PZENITH,XTTS,XEMIS,XDIR_ALB,& 00314 XSCA_ALB,PDIR_ALB,PSCA_ALB,PEMIS,PTSRAD ) 00315 ! 00316 !------------------------------------------------------------------------------- 00317 ! 00318 !* 5. SBL air fields: 00319 ! -------------- 00320 ! 00321 CALL READ_SEAFLUX_SBL_n(HPROGRAM) 00322 ! 00323 !------------------------------------------------------------------------------- 00324 ! 00325 !* 6. Chemistry /dust 00326 ! --------- 00327 ! 00328 CALL INIT_CHEMICAL_n(ILUOUT, KSV, HSV, NBEQ, CSV, NAEREQ, & 00329 NSV_CHSBEG, NSV_CHSEND, NSV_AERBEG, NSV_AEREND, & 00330 CCH_NAMES, CAER_NAMES, NDSTEQ, NSV_DSTBEG, & 00331 NSV_DSTEND, NSLTEQ, NSV_SLTBEG, NSV_SLTEND, & 00332 HDSTNAMES=CDSTNAMES, HSLTNAMES=CSLTNAMES ) 00333 ! 00334 !* deposition scheme 00335 ! 00336 IF (NBEQ>0 .AND. CCH_DRY_DEP=='WES89') THEN 00337 ALLOCATE(XDEP(ILU,NBEQ)) 00338 ELSE 00339 ALLOCATE(XDEP(0,0)) 00340 END IF 00341 ! 00342 !------------------------------------------------------------------------------- 00343 ! 00344 !* 7. diagnostics initialization 00345 ! -------------------------- 00346 ! 00347 CALL DIAG_SEAFLUX_INIT_n(HPROGRAM,ILU,KSW) 00348 ! 00349 !------------------------------------------------------------------------------- 00350 ! 00351 ! End of IO 00352 ! 00353 CALL END_IO_SURF_n(HPROGRAM) 00354 IF (LHOOK) CALL DR_HOOK('INIT_SEAFLUX_N',1,ZHOOK_HANDLE) 00355 ! 00356 ! 00357 END SUBROUTINE INIT_SEAFLUX_n