SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/coupling_isba_svatn.F90
Go to the documentation of this file.
00001 !     ###############################################################################
00002 SUBROUTINE COUPLING_ISBA_SVAT_n(HPROGRAM, HCOUPLING,                                       &
00003                  PTSTEP, KYEAR, KMONTH, KDAY, PTIME, KI, KSV, KSW, PTSUN, PZENITH, PZENITH2, &
00004                  PAZIM, PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV,          &
00005                  PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA,                   &
00006                  PSFTQ, PSFTH, PSFTS, PSFCO2, PSFU, PSFV,                                    &
00007                  PTRAD, PDIR_ALB, PSCA_ALB, PEMIS,                                           &
00008                  PPEW_A_COEF, PPEW_B_COEF,                                                   &
00009                  PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF,                         &
00010                  HTEST                                                                       )  
00011 !     ###############################################################################
00012 !
00013 !!****  *COUPLING_ISBA_SVAT_n * - Chooses the time method (explicit, 
00014 !!        implicit, time-spliting) for ISBA scheme   
00015 !!
00016 !!    PURPOSE
00017 !!    -------
00018 !
00019 !!**  METHOD
00020 !!    ------
00021 !!
00022 !!    REFERENCE
00023 !!    ---------
00024 !!      
00025 !!
00026 !!    AUTHOR
00027 !!    ------
00028 !!     V. Masson 
00029 !!
00030 !!    MODIFICATIONS
00031 !!    -------------
00032 !!      Original    01/2004
00033 !!     A. Bogatchev 09/2005 EBA snow option
00034 !!     A. Boone     11/2009 Exner correction for Offline T-B coef
00035 !!     B. Decharme  11/2009 Implicit coupling ok with all snow scheme
00036 !!-------------------------------------------------------------------
00037 !
00038 USE MODD_ISBA_n,     ONLY : XTSTEP
00039 USE MODD_SURF_PAR,   ONLY : XUNDEF
00040 !
00041 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00042 USE PARKIND1  ,ONLY : JPRB
00043 !
00044 USE MODI_COUPLING_ISBA_OROGRAPHY_n
00045 !
00046 IMPLICIT NONE
00047 !
00048 !*      0.1    declarations of arguments
00049 !
00050  CHARACTER(LEN=6),    INTENT(IN)  :: HPROGRAM  ! program calling surf. schemes
00051  CHARACTER(LEN=1),    INTENT(IN)  :: HCOUPLING ! type of coupling
00052                                               ! 'E' : explicit
00053                                               ! 'I' : implicit
00054 INTEGER,             INTENT(IN)  :: KYEAR     ! current year (UTC)
00055 INTEGER,             INTENT(IN)  :: KMONTH    ! current month (UTC)
00056 INTEGER,             INTENT(IN)  :: KDAY      ! current day (UTC)
00057 REAL,                INTENT(IN)  :: PTIME     ! current time since midnight (UTC, s)
00058 INTEGER,             INTENT(IN)  :: KI        ! number of points
00059 INTEGER,             INTENT(IN)  :: KSV       ! number of scalars
00060 INTEGER,             INTENT(IN)  :: KSW       ! number of short-wave spectral bands
00061 REAL, DIMENSION(KI), INTENT(IN)  :: PTSUN     ! solar time                    (s from midnight)
00062 REAL,                INTENT(IN)  :: PTSTEP    ! atmospheric time-step                 (s)
00063 REAL, DIMENSION(KI), INTENT(IN)  :: PZREF     ! height of T,q forcing                 (m)
00064 REAL, DIMENSION(KI), INTENT(IN)  :: PUREF     ! height of wind forcing                (m)
00065 !
00066 REAL, DIMENSION(KI), INTENT(IN)  :: PTA       ! air temperature forcing               (K)
00067 REAL, DIMENSION(KI), INTENT(IN)  :: PQA       ! air humidity forcing                  (kg/m3)
00068 REAL, DIMENSION(KI), INTENT(IN)  :: PRHOA     ! air density                           (kg/m3)
00069 REAL, DIMENSION(KI,KSV),INTENT(IN) :: PSV     ! scalar variables
00070 !                                             ! chemistry:   first char. in HSV: '#'  (molecule/m3)
00071 !                                             !
00072  CHARACTER(LEN=6), DIMENSION(KSV),INTENT(IN):: HSV  ! name of all scalar variables
00073 REAL, DIMENSION(KI), INTENT(IN)  :: PU        ! zonal wind                            (m/s)
00074 REAL, DIMENSION(KI), INTENT(IN)  :: PV        ! meridian wind                         (m/s)
00075 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PDIR_SW ! direct  solar radiation (on horizontal surf.)
00076 !                                             !                                       (W/m2)
00077 REAL, DIMENSION(KI,KSW),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
00078 !                                             !                                       (W/m2)
00079 REAL, DIMENSION(KSW),INTENT(IN)  :: PSW_BANDS ! mean wavelength of each shortwave band (m)
00080 REAL, DIMENSION(KI), INTENT(IN)  :: PZENITH   ! zenithal angle at t      (radian from the vertical)
00081 REAL, DIMENSION(KI), INTENT(IN)  :: PZENITH2  ! zenithal angle at t+1    (radian from the vertical)
00082 REAL, DIMENSION(KI), INTENT(IN)  :: PAZIM     ! azimuthal angle      (radian from North, clockwise)
00083 REAL, DIMENSION(KI), INTENT(IN)  :: PLW       ! longwave radiation (on horizontal surf.)
00084 !                                             !                                       (W/m2)
00085 REAL, DIMENSION(KI), INTENT(IN)  :: PPS       ! pressure at atmospheric model surface (Pa)
00086 REAL, DIMENSION(KI), INTENT(IN)  :: PPA       ! pressure at forcing level             (Pa)
00087 REAL, DIMENSION(KI), INTENT(IN)  :: PZS       ! atmospheric model orography           (m)
00088 REAL, DIMENSION(KI), INTENT(IN)  :: PCO2      ! CO2 concentration in the air          (kg/m3)
00089 REAL, DIMENSION(KI), INTENT(IN)  :: PSNOW     ! snow precipitation                    (kg/m2/s)
00090 REAL, DIMENSION(KI), INTENT(IN)  :: PRAIN     ! liquid precipitation                  (kg/m2/s)
00091 !
00092 !
00093 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTH     ! flux of heat                          (W/m2)
00094 REAL, DIMENSION(KI), INTENT(OUT) :: PSFTQ     ! flux of water vapor                   (kg/m2/s)
00095 REAL, DIMENSION(KI), INTENT(OUT) :: PSFU      ! zonal momentum flux                   (Pa)
00096 REAL, DIMENSION(KI), INTENT(OUT) :: PSFV      ! meridian momentum flux                (Pa)
00097 REAL, DIMENSION(KI), INTENT(OUT) :: PSFCO2    ! flux of CO2                           (kg/m2/s)
00098 REAL, DIMENSION(KI,KSV),INTENT(OUT):: PSFTS   ! flux of scalar var.                   (kg/m2/s)
00099 !
00100 REAL, DIMENSION(KI), INTENT(OUT) :: PTRAD     ! radiative temperature                 (K)
00101 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PDIR_ALB! direct albedo for each spectral band  (-)
00102 REAL, DIMENSION(KI,KSW),INTENT(OUT):: PSCA_ALB! diffuse albedo for each spectral band (-)
00103 REAL, DIMENSION(KI), INTENT(OUT) :: PEMIS     ! emissivity                            (-)
00104 !
00105 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_A_COEF! implicit coefficients
00106 REAL, DIMENSION(KI), INTENT(IN) :: PPEW_B_COEF! needed if HCOUPLING='I'
00107 REAL, DIMENSION(KI), INTENT(IN) :: PPET_A_COEF
00108 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_A_COEF
00109 REAL, DIMENSION(KI), INTENT(IN) :: PPET_B_COEF
00110 REAL, DIMENSION(KI), INTENT(IN) :: PPEQ_B_COEF
00111  CHARACTER(LEN=2),    INTENT(IN) :: HTEST ! must be equal to 'OK'
00112 !
00113 !*      0.2    declarations of local variables
00114 !
00115 REAL, DIMENSION(KI)    :: ZSFTH   ! surface temperature flux 
00116 REAL, DIMENSION(KI)    :: ZSFTQ   ! surface water vapor flux 
00117 REAL, DIMENSION(KI)    :: ZSFCO2  ! surface CO2 flux 
00118 REAL, DIMENSION(KI,KSV):: ZSFTS   ! surface scalar flux   
00119 REAL, DIMENSION(KI)     :: ZSFU    ! zonal momentum flux
00120 REAL, DIMENSION(KI)     :: ZSFV    ! meridian momentum flux
00121 REAL, DIMENSION(KI)    :: ZTRAD   ! surface radiative temperature
00122 REAL, DIMENSION(KI)    :: ZEMIS   ! surface emissivity
00123 REAL, DIMENSION(KI,KSW) :: ZDIR_ALB! direct surface albedo
00124 REAL, DIMENSION(KI,KSW) :: ZSCA_ALB! diffuse surface albedo
00125 !
00126 REAL, DIMENSION(KI)    :: ZWORK_LW  ! work array for mean upward longwave surface flux
00127 !
00128 INTEGER :: JT      ! time loop counter
00129 INTEGER :: IT      ! total number of surface timesteps in one atmospheric timestep
00130 REAL    :: ZT      ! total number of surface timesteps in one atmospheric timestep
00131 REAL    :: ZTSTEP  ! surface time step
00132 !
00133 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00134 !
00135 !-------------------------------------------------------------------------------------
00136 !
00137 !*      1.     number of time-steps
00138 !              --------------------
00139 !
00140 !* only one timestep in Implicit coupling
00141 IF (LHOOK) CALL DR_HOOK('COUPLING_ISBA_SVAT_N',0,ZHOOK_HANDLE)
00142 IF (HCOUPLING=='I') THEN
00143   IT=1
00144   ZT=1.
00145   ZTSTEP=PTSTEP
00146 !
00147 !* same timestep as atmospheric timestep as default
00148 ELSE IF (XTSTEP==XUNDEF) THEN
00149   IT=1
00150   ZT=1.
00151   ZTSTEP=PTSTEP
00152 !
00153 !* case of specified SVAT time-step
00154 ELSE
00155   IT=MAX(NINT(PTSTEP/XTSTEP),1)
00156   ZT=FLOAT(IT)
00157   ZTSTEP=PTSTEP/ZT
00158 ENDIF
00159 !
00160 !*      3.     initialization of outputs
00161 !              -------------------------
00162 !
00163 PSFTQ   = 0.
00164 PSFTH   = 0.
00165 PSFTS   = 0.
00166 PSFCO2  = 0.
00167 PSFU    = 0.
00168 PSFV    = 0.
00169 PTRAD   = 0.
00170 PDIR_ALB= 0.
00171 PSCA_ALB= 0.
00172 PEMIS   = 0.
00173 !
00174 ZWORK_LW = 0.
00175 !
00176 !
00177 !*      4.     loop on surface time-step
00178 !              -------------------------
00179 !
00180 DO JT=1,IT
00181   CALL COUPLING_ISBA_OROGRAPHY_n(HPROGRAM, HCOUPLING,                                      &
00182                  ZTSTEP, KYEAR, KMONTH, KDAY, PTIME,                                         &
00183                  KI, KSV, KSW,                                                               &
00184                  PTSUN, PZENITH, PZENITH2, PAZIM,                                            &
00185                  PZREF, PUREF, PZS, PU, PV, PQA, PTA, PRHOA, PSV, PCO2, HSV,                 &
00186                  PRAIN, PSNOW, PLW, PDIR_SW, PSCA_SW, PSW_BANDS, PPS, PPA,                   &
00187                  ZSFTQ, ZSFTH, ZSFTS, ZSFCO2, ZSFU, ZSFV,                                    &
00188                  ZTRAD, ZDIR_ALB, ZSCA_ALB, ZEMIS,                                           &
00189                  PPEW_A_COEF, PPEW_B_COEF,                                                   &
00190                  PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF,                         &
00191                  'OK'                                                                        ) 
00192 !
00193   PSFTQ    = PSFTQ    + ZSFTQ    / ZT
00194   PSFTH    = PSFTH    + ZSFTH    / ZT
00195   PSFTS    = PSFTS    + ZSFTS    / ZT
00196   PSFCO2   = PSFCO2   + ZSFCO2   / ZT
00197   PSFU     = PSFU     + ZSFU     / ZT
00198   PSFV     = PSFV     + ZSFV     / ZT
00199   PEMIS    = PEMIS    + ZEMIS    / ZT
00200   PDIR_ALB = PDIR_ALB + ZDIR_ALB / ZT
00201   PSCA_ALB = PSCA_ALB + ZSCA_ALB / ZT
00202   ZWORK_LW = ZWORK_LW + ZEMIS*ZTRAD**4 / ZT
00203 END DO
00204 !
00205 !* radiative temperature retrieved from upward longwave flux
00206 !
00207 PTRAD = (ZWORK_LW/PEMIS)**(0.25)
00208 IF (LHOOK) CALL DR_HOOK('COUPLING_ISBA_SVAT_N',1,ZHOOK_HANDLE)
00209 !
00210 !-------------------------------------------------------------------------------------
00211 !
00212 END SUBROUTINE COUPLING_ISBA_SVAT_n