SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/init_seafluxn.F90
Go to the documentation of this file.
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