source: branches/ORCHIDEE_2_2/ORCHIDEE/src_sechiba/hydrol.f90 @ 7476

Last change on this file since 7476 was 7476, checked in by josefine.ghattas, 2 years ago

Moved getin KFACT_ROOT_TYPE from hydrol_main to hydrol_var_init and changed it to KFACT_ROOT_CONST (logical instead of character string). See ticket #817

  • Property svn:keywords set to Revision Date HeadURL Date Author Revision
File size: 348.4 KB
RevLine 
[2589]1! ===================================================================================================\n
[947]2! MODULE        : hydrol
3!
[4470]4! CONTACT       : orchidee-help _at_ listes.ipsl.fr
[947]5!
6! LICENCE       : IPSL (2006)
7! This software is governed by the CeCILL licence see ORCHIDEE/ORCHIDEE_CeCILL.LIC
8!
9!>\BRIEF        This module computes the soil moisture processes on continental points.
[8]10!!
[2581]11!!\n DESCRIPTION : contains hydrol_main, hydrol_initialize, hydrol_finalise, hydrol_init,
12!!                 hydrol_var_init, hydrol_waterbal, hydrol_alma,
[5470]13!!                 hydrol_vegupd, hydrol_canop, hydrol_flood, hydrol_soil.
[947]14!!                 The assumption in this module is that very high vertical resolution is
15!!                 needed in order to properly resolve the vertical diffusion of water in
16!!                 the soils. Furthermore we have taken into account the sub-grid variability
17!!                 of soil properties and vegetation cover by allowing the co-existence of
18!!                 different soil moisture columns in the same grid box.
19!!                 This routine was originaly developed by Patricia deRosnay.
[2589]20!!
[6954]21!! RECENT CHANGE(S) : November 2020: It is possible to define soil hydraulic parameters from maps,
22!!                    as needed for the SP-MIP project (Tafasca Salma and Ducharne Agnes).
23!!                    Here, it leads to change dimensions and indices.
24!!                    We can also impose kfact_root=1 in all soil layers to cancel the effect of
[7476]25!!                    roots on ks profile (keyword KFACT_ROOT_CONST).
[6954]26!!                 
[2589]27!! REFERENCE(S) :
28!! - de Rosnay, P., J. Polcher, M. Bruen, and K. Laval, Impact of a physically based soil
29!! water flow and soil-plant interaction representation for modeling large-scale land surface
30!! processes, J. Geophys. Res, 107 (10.1029), 2002. \n
31!! - de Rosnay, P. and Polcher J. (1998) Modeling root water uptake in a complex land surface scheme coupled
32!! to a GCM. Hydrology and Earth System Sciences, 2(2-3):239-256. \n
33!! - de Rosnay, P., M. Bruen, and J. Polcher, Sensitivity of surface fluxes to the number of layers in the soil
34!! model used in GCMs, Geophysical research letters, 27 (20), 3329 - 3332, 2000. \n
35!! - d’Orgeval, T., J. Polcher, and P. De Rosnay, Sensitivity of the West African hydrological
36!! cycle in ORCHIDEE to infiltration processes, Hydrol. Earth Syst. Sci. Discuss, 5, 2251 - 2292, 2008. \n
37!! - Carsel, R., and R. Parrish, Developing joint probability distributions of soil water retention
38!! characteristics, Water Resources Research, 24 (5), 755 - 769, 1988. \n
39!! - Mualem, Y., A new model for predicting the hydraulic conductivity of unsaturated porous
40!! media, Water Resources Research, 12 (3), 513 - 522, 1976. \n
41!! - Van Genuchten, M., A closed-form equation for predicting the hydraulic conductivity of
42!! unsaturated soils, Soil Science Society of America Journal, 44 (5), 892 - 898, 1980. \n
43!! - Campoy, A., Ducharne, A., Cheruy, F., Hourdin, F., Polcher, J., and Dupont, J.-C., Response
44!! of land surface fluxes and precipitation to different soil bottom hydrological conditions in a
45!! general circulation model,  J. Geophys. Res, in press, 2013. \n
[3402]46!! - Gouttevin, I., Krinner, G., Ciais, P., Polcher, J., and Legout, C. , 2012. Multi-scale validation
47!! of a new soil freezing scheme for a land-surface model with physically-based hydrology.
48!! The Cryosphere, 6, 407-430, doi: 10.5194/tc-6-407-2012. \n
[6954]49!! - Tafasca S. (2020). Evaluation de l’impact des propriétés du sol sur l’hydrologie simulee dans le
50!! modÚle ORCHIDEE, PhD thesis, Sorbonne Universite. \n
[8]51!!
[947]52!! SVN          :
53!! $HeadURL$
54!! $Date$
55!! $Revision$
56!! \n
[2589]57!_ ===============================================================================================\n
[8]58MODULE hydrol
[947]59
[8]60  USE ioipsl
[1788]61  USE xios_orchidee
[8]62  USE constantes
[4646]63  USE time, ONLY : one_day, dt_sechiba, julian_diff
[947]64  USE constantes_soil
[511]65  USE pft_parameters
[4281]66  USE sechiba_io_p
[8]67  USE grid
[2222]68  USE explicitsnow
[8]69
70  IMPLICIT NONE
71
72  PRIVATE
[3402]73  PUBLIC :: hydrol_main, hydrol_initialize, hydrol_finalize, hydrol_clear
[8]74
75  !
76  ! variables used inside hydrol module : declaration and initialisation
77  !
[3975]78  LOGICAL, SAVE                                   :: doponds=.FALSE.           !! Reinfiltration flag (true/false)
[1078]79!$OMP THREADPRIVATE(doponds)
[4061]80  REAL(r_std), SAVE                               :: froz_frac_corr            !! Coefficient for water frozen fraction correction
81!$OMP THREADPRIVATE(froz_frac_corr)
[4202]82  REAL(r_std), SAVE                               :: max_froz_hydro            !! Coefficient for water frozen fraction correction
83!$OMP THREADPRIVATE(max_froz_hydro)
84  REAL(r_std), SAVE                               :: smtot_corr                !! Coefficient for water frozen fraction correction
85!$OMP THREADPRIVATE(smtot_corr)
[3975]86  LOGICAL, SAVE                                   :: do_rsoil=.FALSE.          !! Flag to calculate rsoil for bare soile evap
87                                                                               !! (true/false)
88!$OMP THREADPRIVATE(do_rsoil)
[4363]89  LOGICAL, SAVE                                   :: ok_dynroot                !! Flag to activate dynamic root profile to optimize soil 
90                                                                               !! moisture usage, similar to Beer et al.2007
91!$OMP THREADPRIVATE(ok_dynroot)
[7476]92  LOGICAL, SAVE                                   :: kfact_root_const          !! Control kfact_root calculation, set constant kfact_root=1 if kfact_root_const=true
93!$OMP THREADPRIVATE(kfact_root_const)
[4363]94  CHARACTER(LEN=80) , SAVE                        :: var_name                  !! To store variables names for I/O
[1078]95!$OMP THREADPRIVATE(var_name)
[947]96  !
97  REAL(r_std), PARAMETER                          :: allowed_err =  2.0E-8_r_std
98  REAL(r_std), PARAMETER                          :: EPS1 = EPSILON(un)      !! A small number
[7239]99 
[8]100  ! one dimension array allocated, computed, saved and got in hydrol module
[947]101  ! Values per soil type
102  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)   :: pcent               !! Fraction of saturated volumetric soil moisture above
[7239]103                                                                         !! which transpir is max (0-1, unitless)
104!$OMP THREADPRIVATE(pcent)                                                               
[2589]105  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)   :: mc_awet             !! Vol. wat. cont. above which albedo is cst
106                                                                         !!  @tex $(m^{3} m^{-3})$ @endtex
107!$OMP THREADPRIVATE(mc_awet)                                             
108  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)   :: mc_adry             !! Vol. wat. cont. below which albedo is cst
109                                                                         !!  @tex $(m^{3} m^{-3})$ @endtex
110!$OMP THREADPRIVATE(mc_adry)                                             
[947]111  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: tot_watveg_beg   !! Total amount of water on vegetation at start of time
[2589]112                                                                         !! step @tex $(kg m^{-2})$ @endtex
113!$OMP THREADPRIVATE(tot_watveg_beg)                                     
[8]114  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: tot_watveg_end   !! Total amount of water on vegetation at end of time step
[2589]115                                                                         !!  @tex $(kg m^{-2})$ @endtex
116!$OMP THREADPRIVATE(tot_watveg_end)                                     
[8]117  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: tot_watsoil_beg  !! Total amount of water in the soil at start of time step
[2589]118                                                                         !!  @tex $(kg m^{-2})$ @endtex
119!$OMP THREADPRIVATE(tot_watsoil_beg)                                     
[8]120  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: tot_watsoil_end  !! Total amount of water in the soil at end of time step
[2589]121                                                                         !!  @tex $(kg m^{-2})$ @endtex
122!$OMP THREADPRIVATE(tot_watsoil_end)                                     
[8]123  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: snow_beg         !! Total amount of snow at start of time step
[2589]124                                                                         !!  @tex $(kg m^{-2})$ @endtex
125!$OMP THREADPRIVATE(snow_beg)                                           
[8]126  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: snow_end         !! Total amount of snow at end of time step
[2589]127                                                                         !!  @tex $(kg m^{-2})$ @endtex
128!$OMP THREADPRIVATE(snow_end)                                           
129  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: delsoilmoist     !! Change in soil moisture @tex $(kg m^{-2})$ @endtex
130!$OMP THREADPRIVATE(delsoilmoist)                                         
[8]131  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: delintercept     !! Change in interception storage
[2589]132                                                                         !!  @tex $(kg m^{-2})$ @endtex
133!$OMP THREADPRIVATE(delintercept)                                       
134  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: delswe           !! Change in SWE @tex $(kg m^{-2})$ @endtex
[3402]135!$OMP THREADPRIVATE(delswe)
136  REAL(r_std),ALLOCATABLE, SAVE, DIMENSION (:)       :: undermcr         !! Nb of tiles under mcr for a given time step
137!$OMP THREADPRIVATE(undermcr)
[2589]138  INTEGER(i_std), ALLOCATABLE, SAVE, DIMENSION (:,:) :: mask_veget       !! zero/one when veget fraction is zero/higher (1)
[1078]139!$OMP THREADPRIVATE(mask_veget)
[2589]140  INTEGER(i_std), ALLOCATABLE, SAVE, DIMENSION (:,:) :: mask_soiltile    !! zero/one where soil tile is zero/higher (1)
[1078]141!$OMP THREADPRIVATE(mask_soiltile)
[2589]142  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: humrelv          !! Water stress index for transpiration
143                                                                         !! for each soiltile x PFT couple (0-1, unitless)
[1078]144!$OMP THREADPRIVATE(humrelv)
[2589]145  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: vegstressv       !! Water stress index for vegetation growth
146                                                                         !! for each soiltile x PFT couple (0-1, unitless)
[1078]147!$OMP THREADPRIVATE(vegstressv)
[2589]148  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:,:):: us               !! Water stress index for transpiration
149                                                                         !! (by soil layer and PFT) (0-1, unitless)
[1078]150!$OMP THREADPRIVATE(us)
[4753]151  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: precisol         !! Throughfall+Totmelt per PFT
[2589]152                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]153!$OMP THREADPRIVATE(precisol)
[4753]154  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: throughfall      !! Throughfall per PFT
155                                                                         !!  @tex $(kg m^{-2})$ @endtex
156!$OMP THREADPRIVATE(throughfall)
[2589]157  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: precisol_ns      !! Throughfall per soiltile
158                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]159!$OMP THREADPRIVATE(precisol_ns)
[2589]160  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: ae_ns            !! Bare soil evaporation per soiltile
161                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]162!$OMP THREADPRIVATE(ae_ns)
[947]163  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: free_drain_coef  !! Coefficient for free drainage at bottom
[2589]164                                                                         !!  (0-1, unitless)
[3402]165!$OMP THREADPRIVATE(free_drain_coef)
166  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: zwt_force        !! Prescribed water table depth (m)
167!$OMP THREADPRIVATE(zwt_force)
[2589]168  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: frac_bare_ns     !! Evaporating bare soil fraction per soiltile
169                                                                         !!  (0-1, unitless)
[1078]170!$OMP THREADPRIVATE(frac_bare_ns)
[2589]171  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: rootsink         !! Transpiration sink by soil layer and soiltile
172                                                                         !! @tex $(kg m^{-2})$ @endtex
[1078]173!$OMP THREADPRIVATE(rootsink)
[2589]174  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: subsnowveg       !! Sublimation of snow on vegetation
175                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]176!$OMP THREADPRIVATE(subsnowveg)
[2589]177  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: subsnownobio     !! Sublimation of snow on other surface types 
178                                                                         !! (ice, lakes,...) @tex $(kg m^{-2})$ @endtex
[1078]179!$OMP THREADPRIVATE(subsnownobio)
[2589]180  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: icemelt          !! Ice melt @tex $(kg m^{-2})$ @endtex
[1078]181!$OMP THREADPRIVATE(icemelt)
[8]182  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: subsinksoil      !! Excess of sublimation as a sink for the soil
[2589]183                                                                         !! @tex $(kg m^{-2})$ @endtex
[1078]184!$OMP THREADPRIVATE(subsinksoil)
[2589]185  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: vegtot           !! Total Total fraction of grid-cell covered by PFTs
186                                                                         !! (bare soil + vegetation) (1; 1)
[1078]187!$OMP THREADPRIVATE(vegtot)
[2589]188  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: resdist          !! Soiltile values from previous time-step (1; 1)
[1121]189!$OMP THREADPRIVATE(resdist)
[3969]190  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: vegtot_old       !! Total Total fraction of grid-cell covered by PFTs
191                                                                         !! from previous time-step (1; 1)
192!$OMP THREADPRIVATE(vegtot_old)
[2589]193  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: mx_eau_var       !! Maximum water content of the soil @tex $(kg m^{-2})$ @endtex
[1078]194!$OMP THREADPRIVATE(mx_eau_var)
[8]195
196  ! arrays used by cwrr scheme
[2589]197  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: nroot            !! Normalized root length fraction in each soil layer
198                                                                         !! (0-1, unitless)
[4363]199                                                                         !! DIM = kjpindex * nvm * nslm
[1078]200!$OMP THREADPRIVATE(nroot)
[2589]201  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: kfact_root       !! Factor to increase Ks towards the surface
202                                                                         !! (unitless)
203                                                                         !! DIM = kjpindex * nslm * nstm
[1078]204!$OMP THREADPRIVATE(kfact_root)
[2589]205  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: kfact            !! Factor to reduce Ks with depth (unitless)
[6954]206                                                                         !! DIM = nslm * kjpindex
[1078]207!$OMP THREADPRIVATE(kfact)
[4210]208  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: zz               !! Depth of nodes [znh in vertical_soil] transformed into (mm)
[1078]209!$OMP THREADPRIVATE(zz)
[4210]210  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: dz               !! Internode thickness [dnh in vertical_soil] transformed into (mm)
[1078]211!$OMP THREADPRIVATE(dz)
[4210]212  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: dh               !! Layer thickness [dlh in vertical_soil] transformed into (mm)
[2917]213!$OMP THREADPRIVATE(dh)
[4208]214  INTEGER(i_std), SAVE                               :: itopmax          !! Number of layers where the node is above 0.1m depth
215!$OMP THREADPRIVATE(itopmax)
[2589]216  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: mc_lin   !! 50 Vol. Wat. Contents to linearize K and D, for each texture
217                                                                 !!  @tex $(m^{3} m^{-3})$ @endtex
[6954]218                                                                 !! DIM = imin:imax * kjpindex
[1078]219!$OMP THREADPRIVATE(mc_lin)
[2589]220  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: k_lin    !! 50 values of unsaturated K, for each soil layer and texture
221                                                                 !!  @tex $(mm d^{-1})$ @endtex
[6954]222                                                                 !! DIM = imin:imax * nslm * kjpindex
[1078]223!$OMP THREADPRIVATE(k_lin)
[2589]224  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: d_lin    !! 50 values of diffusivity D, for each soil layer and texture
225                                                                 !!  @tex $(mm^2 d^{-1})$ @endtex
[6954]226                                                                 !! DIM = imin:imax * nslm * kjpindex
[1078]227!$OMP THREADPRIVATE(d_lin)
[2589]228  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: a_lin    !! 50 values of the slope in K=a*mc+b, for each soil layer and texture
229                                                                 !!  @tex $(mm d^{-1})$ @endtex
[6954]230                                                                 !! DIM = imin:imax * nslm * kjpindex
[1078]231!$OMP THREADPRIVATE(a_lin)
[2589]232  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: b_lin    !! 50 values of y-intercept in K=a*mc+b, for each soil layer and texture
233                                                                 !!  @tex $(m^{3} m^{-3})$ @endtex
[6954]234                                                                 !! DIM = imin:imax * nslm * kjpindex
[1078]235!$OMP THREADPRIVATE(b_lin)
[8]236
[2589]237  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: humtot   !! Total Soil Moisture @tex $(kg m^{-2})$ @endtex
[1078]238!$OMP THREADPRIVATE(humtot)
[2589]239  LOGICAL, ALLOCATABLE, SAVE, DIMENSION (:)          :: resolv   !! Mask of land points where to solve the diffusion equation
240                                                                 !! (true/false)
[1078]241!$OMP THREADPRIVATE(resolv)
[8]242
[4812]243!! for output
244  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: kk_moy   !! Mean hydraulic conductivity over soiltiles (mm/d)
245!$OMP THREADPRIVATE(kk_moy)
246  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: kk       !! Hydraulic conductivity for each soiltiles (mm/d)
247!$OMP THREADPRIVATE(kk)
248  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: avan_mod_tab  !! VG parameter a modified from  exponantial profile
[6954]249                                                                      !! @tex $(mm^{-1})$ @endtex !! DIMENSION (nslm,kjpindex)
[4812]250!$OMP THREADPRIVATE(avan_mod_tab) 
251  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: nvan_mod_tab  !! VG parameter n  modified from  exponantial profile
[6954]252                                                                      !! (unitless) !! DIMENSION (nslm,kjpindex) 
[4812]253!$OMP THREADPRIVATE(nvan_mod_tab)
254 
[2589]255!! linarization coefficients of hydraulic conductivity K (hydrol_soil_coef)
256  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: k        !! Hydraulic conductivity K for each soil layer
257                                                                 !!  @tex $(mm d^{-1})$ @endtex
258                                                                 !! DIM = (:,nslm)
[1078]259!$OMP THREADPRIVATE(k)
[2589]260  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: a        !! Slope in K=a*mc+b(:,nslm)
261                                                                 !!  @tex $(mm d^{-1})$ @endtex
262                                                                 !! DIM = (:,nslm)
[1078]263!$OMP THREADPRIVATE(a)
[2589]264  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: b        !! y-intercept in K=a*mc+b
265                                                                 !!  @tex $(m^{3} m^{-3})$ @endtex
266                                                                 !! DIM = (:,nslm)
[1078]267!$OMP THREADPRIVATE(b)
[2589]268!! linarization coefficients of hydraulic diffusivity D (hydrol_soil_coef)
269  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: d        !! Diffusivity D for each soil layer
270                                                                 !!  @tex $(mm^2 d^{-1})$ @endtex
271                                                                 !! DIM = (:,nslm)
[1078]272!$OMP THREADPRIVATE(d)
[2589]273!! matrix coefficients (hydrol_soil_tridiag and hydrol_soil_setup), see De Rosnay (1999), p155-157
274  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: e        !! Left-hand tridiagonal matrix coefficients
[1078]275!$OMP THREADPRIVATE(e)
[2589]276  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: f        !! Left-hand tridiagonal matrix coefficients
[1078]277!$OMP THREADPRIVATE(f)
[2589]278  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: g1       !! Left-hand tridiagonal matrix coefficients
[1078]279!$OMP THREADPRIVATE(g1)
[8]280
[2589]281  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: ep       !! Right-hand matrix coefficients
[1078]282!$OMP THREADPRIVATE(ep)
[2589]283  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: fp       !! Right-hand atrix coefficients
[1078]284!$OMP THREADPRIVATE(fp)
[2589]285  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: gp       !! Right-hand atrix coefficients
[1078]286!$OMP THREADPRIVATE(gp)
[2589]287  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: rhs      !! Right-hand system
[1078]288!$OMP THREADPRIVATE(rhs)
[2589]289  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: srhs     !! Temporarily stored rhs
[1078]290!$OMP THREADPRIVATE(srhs)
[2589]291  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: tmat             !! Left-hand tridiagonal matrix
292!$OMP THREADPRIVATE(tmat)
293  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: stmat            !! Temporarily stored tmat
294  !$OMP THREADPRIVATE(stmat)
[947]295  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: water2infilt     !! Water to be infiltrated
[2589]296                                                                         !! @tex $(kg m^{-2})$ @endtex
[1078]297!$OMP THREADPRIVATE(water2infilt)
[2589]298  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc              !! Total moisture content per soiltile
299                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]300!$OMP THREADPRIVATE(tmc)
[4724]301  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmcr             !! Total moisture content at residual per soiltile
[2589]302                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]303!$OMP THREADPRIVATE(tmcr)
[4724]304  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmcs             !! Total moisture content at saturation per soiltile
[2589]305                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]306!$OMP THREADPRIVATE(tmcs)
[4724]307  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmcfc            !! Total moisture content at field capacity per soiltile
308                                                                         !!  @tex $(kg m^{-2})$ @endtex
309!$OMP THREADPRIVATE(tmcfc)
310  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmcw             !! Total moisture content at wilting point per soiltile
311                                                                         !!  @tex $(kg m^{-2})$ @endtex
312!$OMP THREADPRIVATE(tmcw)
[2589]313  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc_litter       !! Total moisture in the litter per soiltile
314                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]315!$OMP THREADPRIVATE(tmc_litter)
[947]316  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: tmc_litt_mea     !! Total moisture in the litter over the grid
[2589]317                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]318!$OMP THREADPRIVATE(tmc_litt_mea)
[2589]319  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc_litter_wilt  !! Total moisture of litter at wilt point per soiltile
320                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]321!$OMP THREADPRIVATE(tmc_litter_wilt)
[2589]322  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc_litter_field !! Total moisture of litter at field cap. per soiltile
323                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]324!$OMP THREADPRIVATE(tmc_litter_field)
[947]325!!! A CHANGER DANS TOUT HYDROL: tmc_litter_res et sat ne devraient pas dependre de ji - tdo
[2589]326  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc_litter_res   !! Total moisture of litter at residual moisture per soiltile
327                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]328!$OMP THREADPRIVATE(tmc_litter_res)
[2589]329  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc_litter_sat   !! Total moisture of litter at saturation per soiltile
330                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]331!$OMP THREADPRIVATE(tmc_litter_sat)
[2589]332  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc_litter_awet  !! Total moisture of litter at mc_awet per soiltile
333                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]334!$OMP THREADPRIVATE(tmc_litter_awet)
[2589]335  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tmc_litter_adry  !! Total moisture of litter at mc_adry per soiltile
336                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]337!$OMP THREADPRIVATE(tmc_litter_adry)
[947]338  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: tmc_litt_wet_mea !! Total moisture in the litter over the grid below which
[2589]339                                                                         !! albedo is fixed constant
340                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]341!$OMP THREADPRIVATE(tmc_litt_wet_mea)
[947]342  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:)      :: tmc_litt_dry_mea !! Total moisture in the litter over the grid above which
[2589]343                                                                         !! albedo is constant
344                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]345!$OMP THREADPRIVATE(tmc_litt_dry_mea)
[947]346  LOGICAL, SAVE                                      :: tmc_init_updated = .FALSE. !! Flag allowing to determine if tmc is initialized.
[1078]347!$OMP THREADPRIVATE(tmc_init_updated)
[8]348
[2589]349  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: v1               !! Temporary variable (:)
[1078]350!$OMP THREADPRIVATE(v1)
[8]351
352  !! par type de sol :
[2589]353  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: ru_ns            !! Surface runoff per soiltile
354                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]355!$OMP THREADPRIVATE(ru_ns)
[2589]356  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: dr_ns            !! Drainage per soiltile
357                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]358!$OMP THREADPRIVATE(dr_ns)
[2589]359  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: tr_ns            !! Transpiration per soiltile
[1078]360!$OMP THREADPRIVATE(tr_ns)
[3687]361  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: vegetmax_soil    !! (:,nvm,nstm) percentage of each veg. type on each soil
[947]362                                                                         !! of each grid point
[3687]363!$OMP THREADPRIVATE(vegetmax_soil)
[4687]364  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: mc               !! Total volumetric water content at the calculation nodes
[2589]365                                                                         !! (eg : liquid + frozen)
366                                                                         !!  @tex $(m^{3} m^{-3})$ @endtex
[1078]367!$OMP THREADPRIVATE(mc)
[4565]368
369   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: mc_read_prev       !! Soil moisture from file at previous timestep in the file
370!$OMP THREADPRIVATE(mc_read_prev)
371   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: mc_read_next       !! Soil moisture from file at next time step in the file
372!$OMP THREADPRIVATE(mc_read_next)
[5450]373   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: mc_read_current    !! For nudging, linear time interpolation bewteen mc_read_prev and mc_read_next
374!$OMP THREADPRIVATE(mc_read_current)
[4565]375   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: mask_mc_interp     !! Mask of valid data in soil moisture nudging file
376!$OMP THREADPRIVATE(mask_mc_interp)
[5450]377   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: tmc_aux            !! Temporary variable needed for the calculation of diag nudgincsm for nudging
378!$OMP THREADPRIVATE(tmc_aux)
[4565]379   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: snowdz_read_prev   !! snowdz read from file at previous timestep in the file
380!$OMP THREADPRIVATE(snowdz_read_prev)
381   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: snowdz_read_next   !! snowdz read from file at next time step in the file
382!$OMP THREADPRIVATE(snowdz_read_next)
383   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: snowrho_read_prev  !! snowrho read from file at previous timestep in the file
384!$OMP THREADPRIVATE(snowrho_read_prev)
385   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: snowrho_read_next  !! snowrho read from file at next time step in the file
386!$OMP THREADPRIVATE(snowrho_read_next)
387   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: snowtemp_read_prev !! snowtemp read from file at previous timestep in the file
388!$OMP THREADPRIVATE(snowtemp_read_prev)
389   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: snowtemp_read_next !! snowtemp read from file at next time step in the file
390!$OMP THREADPRIVATE(snowtemp_read_next)
391   REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)   :: mask_snow_interp   !! Mask of valid data in snow nudging file
392!$OMP THREADPRIVATE(mask_snow_interp)
393
[3402]394   REAL(r_std),ALLOCATABLE, SAVE, DIMENSION(:,:,:)   :: mcl              !! Liquid water content
395                                                                         !!  @tex $(m^{3} m^{-3})$ @endtex
[2222]396!$OMP THREADPRIVATE(mcl)
[3402]397  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: soilmoist        !! (:,nslm) Mean of each soil layer's moisture
398                                                                         !! across soiltiles
399                                                                         !!  @tex $(kg m^{-2})$ @endtex
[1078]400!$OMP THREADPRIVATE(soilmoist)
[4650]401  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: soilmoist_liquid !! (:,nslm) Mean of each soil layer's liquid moisture
402                                                                         !! across soiltiles
403                                                                         !!  @tex $(kg m^{-2})$ @endtex
404!$OMP THREADPRIVATE(soilmoist_liquid)
[4534]405  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: soil_wet_ns      !! Soil wetness above mcw (0-1, unitless)
406!$OMP THREADPRIVATE(soil_wet_ns)
[2589]407  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: soil_wet_litter  !! Soil wetness aove mvw in the litter (0-1, unitless)
[1078]408!$OMP THREADPRIVATE(soil_wet_litter)
[5506]409  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: qflux_ns         !! Diffusive water fluxes between soil layers
410                                                                         !! (at lower interface)
411!$OMP THREADPRIVATE(qflux_ns)
412  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: check_top_ns     !! Diagnostic calculated in hydrol_diag_soil_flux
413                                                                         !! (water balance residu of top soil layer)
414!$OMP THREADPRIVATE(check_top_ns)
[2222]415  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:)    :: profil_froz_hydro     !! Frozen fraction for each hydrological soil layer
416!$OMP THREADPRIVATE(profil_froz_hydro)
417  REAL(r_std), ALLOCATABLE, SAVE, DIMENSION (:,:,:)  :: profil_froz_hydro_ns  !! As  profil_froz_hydro per soiltile
418!$OMP THREADPRIVATE(profil_froz_hydro_ns)
[8]419
[2222]420
[947]421CONTAINS
[8]422
[947]423!! ================================================================================================================================
[2581]424!! SUBROUTINE   : hydrol_initialize
425!!
426!>\BRIEF         Allocate module variables, read from restart file or initialize with default values
427!!
428!! DESCRIPTION :
429!!
430!! MAIN OUTPUT VARIABLE(S) :
431!!
432!! REFERENCE(S) :
433!!
434!! FLOWCHART    : None
435!! \n
436!_ ================================================================================================================================
437
[6954]438  SUBROUTINE hydrol_initialize ( ks,             nvan,      avan,          mcr,              &
439                                 mcs,            mcfc,      mcw,           kjit,             &
440                                 kjpindex,       index,     rest_id,                         &
[2591]441                                 njsc,           soiltile,  veget,         veget_max,        &
[7239]442                                 humrel,    vegstress,  drysoil_frac,        &
[3969]443                                 shumdiag_perma,    qsintveg,                        &
[5805]444                                 evap_bare_lim,  evap_bare_lim_ns,  snow,      snow_age,      snow_nobio,       &
[2650]445                                 snow_nobio_age, snowrho,   snowtemp,      snowgrain,        &
[3059]446                                 snowdz,         snowheat,  &
[4637]447                                 mc_layh,        mcl_layh,  soilmoist_out)
[2581]448
449    !! 0. Variable and parameter declaration
450    !! 0.1 Input variables
[6954]451
[7239]452    INTEGER(i_std), INTENT(in)                         :: kjit             !! Time step number
453    INTEGER(i_std), INTENT(in)                         :: kjpindex         !! Domain size
454    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)   :: index            !! Indeces of the points on the map
455    INTEGER(i_std),INTENT (in)                         :: rest_id          !! Restart file identifier
456    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)   :: njsc             !! Index of the dominant soil textural class in the
457                                                                           !! grid cell (1-nscm, unitless) 
458    ! 2D soil parameters
[6954]459    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: ks               !! Hydraulic conductivity at saturation (mm {-1})
460    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: nvan             !! Van Genuchten coeficients n (unitless)
461    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: avan             !! Van Genuchten coeficients a (mm-1})
462    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
463    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
464    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcfc             !! Volumetric water content at field capacity (m^{3} m^{-3})
465    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcw              !! Volumetric water content at wilting point (m^{3} m^{-3})
[7239]466   
[3969]467    REAL(r_std),DIMENSION (kjpindex,nstm), INTENT (in) :: soiltile         !! Fraction of each soil tile within vegtot (0-1, unitless)
[2581]468    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: veget            !! Fraction of vegetation type           
469    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: veget_max        !! Max. fraction of vegetation type (LAI -> infty)
470
[7239]471   
[2581]472    !! 0.2 Output variables
473    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out)   :: humrel         !! Relative humidity
474    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out)   :: vegstress      !! Veg. moisture stress (only for vegetation growth)
475    REAL(r_std),DIMENSION (kjpindex), INTENT (out)       :: drysoil_frac   !! function of litter wetness
[4631]476    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out)  :: shumdiag_perma !! Percent of porosity filled with water (mc/mcs) used for the thermal computations
[2581]477    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out)   :: qsintveg       !! Water on vegetation due to interception
478    REAL(r_std),DIMENSION (kjpindex), INTENT(out)        :: evap_bare_lim  !! Limitation factor for bare soil evaporation
[5805]479    REAL(r_std),DIMENSION (kjpindex,nstm), INTENT(out)   :: evap_bare_lim_ns !! Limitation factor for bare soil evaporation
[2581]480    REAL(r_std),DIMENSION (kjpindex), INTENT (out)       :: snow           !! Snow mass [Kg/m^2]
481    REAL(r_std),DIMENSION (kjpindex), INTENT (out)       :: snow_age       !! Snow age
482    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (out):: snow_nobio     !! Water balance on ice, lakes, .. [Kg/m^2]
483    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (out):: snow_nobio_age !! Snow age on ice, lakes, ...
484    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(out) :: snowrho        !! Snow density
485    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(out) :: snowtemp       !! Snow temperature
486    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(out) :: snowgrain      !! Snow grainsize
487    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(out) :: snowdz         !! Snow layer thickness
488    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(out) :: snowheat       !! Snow heat content
[2922]489    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out)  :: mc_layh        !! Volumetric moisture content for each layer in hydrol (liquid+ice) m3/m3
490    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out)  :: mcl_layh       !! Volumetric moisture content for each layer in hydrol (liquid) m3/m3
[4637]491    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out)  :: soilmoist_out  !! Total soil moisture content for each layer in hydrol (liquid+ice), mm
[2902]492    REAL(r_std),DIMENSION (kjpindex)                     :: soilwetdummy   !! Temporary variable never used
[2581]493
494    !! 0.4 Local variables
[4208]495    INTEGER(i_std)                                       :: jsl
[6954]496   
[2581]497!_ ================================================================================================================================
498
[6954]499    CALL hydrol_init (ks, nvan, avan, mcr, mcs, mcfc, mcw, njsc, kjit, kjpindex, index, rest_id, veget_max, soiltile, &
[2868]500         humrel, vegstress, snow,       snow_age,   snow_nobio, snow_nobio_age, qsintveg, &
501         snowdz, snowgrain, snowrho,    snowtemp,   snowheat, &
[5805]502         drysoil_frac, evap_bare_lim, evap_bare_lim_ns)
[2581]503   
[6954]504    CALL hydrol_var_init (ks, nvan, avan, mcr, mcs, mcfc, mcw, kjpindex, veget, veget_max, &
[3969]505         soiltile, njsc, mx_eau_var, shumdiag_perma, &
[4637]506         drysoil_frac, qsintveg, mc_layh, mcl_layh) 
[2581]507
[3006]508    !! Initialize hydrol_alma routine if the variables were not found in the restart file. This is done in the end of
[2902]509    !! hydrol_initialize so that all variables(humtot,..) that will be used are initialized.
[3006]510    IF (ALL(tot_watveg_beg(:)==val_exp) .OR.  ALL(tot_watsoil_beg(:)==val_exp) .OR. ALL(snow_beg(:)==val_exp)) THEN
511       ! The output variable soilwetdummy is not calculated at first call to hydrol_alma.
512       CALL hydrol_alma(kjpindex, index, .TRUE., qsintveg, snow, snow_nobio, soilwetdummy)
[2902]513    END IF
[3006]514   
[4208]515    !! Calculate itopmax indicating the number of layers where the node is above 0.1m depth
516    itopmax=1
517    DO jsl = 1, nslm
518       ! znh : depth of nodes
519       IF (znh(jsl) <= 0.1) THEN
520          itopmax=jsl
521       END IF
522    END DO
523    IF (printlev>=3) WRITE(numout,*) "Number of layers where the node is above 0.1m depth: itopmax=",itopmax
524
[4637]525    ! Copy soilmoist into a local variable to be sent to thermosoil
526    soilmoist_out(:,:) = soilmoist(:,:)
527
[2581]528  END SUBROUTINE hydrol_initialize
529
530
531!! ================================================================================================================================
[947]532!! SUBROUTINE   : hydrol_main
533!!
534!>\BRIEF         
535!!
536!! DESCRIPTION :
537!! - called every time step
[2581]538!! - initialization and finalization part are not done in here
[947]539!!
[5470]540!! - 1 computes snow  ==> explicitsnow
[2581]541!! - 2 computes vegetations reservoirs  ==> hydrol_vegupd
542!! - 3 computes canopy  ==> hydrol_canop
543!! - 4 computes surface reservoir  ==> hydrol_flood
[3402]544!! - 5 computes soil hydrology ==> hydrol_soil
[947]545!!
[2589]546!! IMPORTANT NOTICE : The water fluxes are used in their integrated form, over the time step
[2591]547!! dt_sechiba, with a unit of kg m^{-2}.
[2589]548!!
[947]549!! RECENT CHANGE(S) : None
550!!
551!! MAIN OUTPUT VARIABLE(S) :
552!!
553!! REFERENCE(S) :
554!!
555!! FLOWCHART    : None
556!! \n
557!_ ================================================================================================================================
[8]558
[6954]559  SUBROUTINE hydrol_main (ks, nvan, avan, mcr, mcs, mcfc, mcw,  &
560       & kjit, kjpindex, &
[4631]561       & index, indexveg, indexsoil, indexlayer, indexnslm, &
[947]562       & temp_sol_new, floodout, runoff, drainage, frac_nobio, totfrac_nobio, vevapwet, veget, veget_max, njsc, &
563       & qsintmax, qsintveg, vevapnu, vevapsno, vevapflo, snow, snow_age, snow_nobio, snow_nobio_age,  &
564       & tot_melt, transpir, precip_rain, precip_snow, returnflow, reinfiltration, irrigation, &
[5805]565       & humrel, vegstress, drysoil_frac, evapot, evapot_penm, evap_bare_lim, evap_bare_lim_ns, &
566       & flood_frac, flood_res, &
[4723]567       & shumdiag,shumdiag_perma, k_litt, litterhumdiag, soilcap, soiltile, fraclut, reinf_slope, rest_id, hist_id, hist2_id,&
[5091]568       & contfrac, stempdiag, &
[3975]569       & temp_air, pb, u, v, tq_cdrag, swnet, pgflux, &
[2650]570       & snowrho,snowtemp,snowgrain,snowdz,snowheat,snowliq, &
[3059]571       & grndflux,gtemp,tot_bare_soil, &
[4725]572       & lambda_snow,cgrnd_snow,dgrnd_snow,frac_snow_veg,temp_sol_add, &
[4637]573       & mc_layh, mcl_layh, soilmoist_out )
[8]574
[947]575    !! 0. Variable and parameter declaration
[8]576
[947]577    !! 0.1 Input variables
578 
[8]579    INTEGER(i_std), INTENT(in)                         :: kjit             !! Time step number
580    INTEGER(i_std), INTENT(in)                         :: kjpindex         !! Domain size
581    INTEGER(i_std),INTENT (in)                         :: rest_id,hist_id  !! _Restart_ file and _history_ file identifier
582    INTEGER(i_std),INTENT (in)                         :: hist2_id         !! _history_ file 2 identifier
583    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)   :: index            !! Indeces of the points on the map
584    INTEGER(i_std),DIMENSION (kjpindex*nvm), INTENT (in):: indexveg        !! Indeces of the points on the 3D map for veg
585    INTEGER(i_std),DIMENSION (kjpindex*nstm), INTENT (in):: indexsoil      !! Indeces of the points on the 3D map for soil
586    INTEGER(i_std),DIMENSION (kjpindex*nslm), INTENT (in):: indexlayer     !! Indeces of the points on the 3D map for soil layers
[4631]587    INTEGER(i_std),DIMENSION (kjpindex*nslm), INTENT (in):: indexnslm      !! Indeces of the points on the 3D map for of diagnostic soil layers
[2299]588
[8]589    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: precip_rain      !! Rain precipitation
590    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: precip_snow      !! Snow precipitation
[947]591    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: returnflow       !! Routed water which comes back into the soil (from the
592                                                                           !! bottom)
593    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: reinfiltration   !! Routed water which comes back into the soil (at the
594                                                                           !! top)
595    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: irrigation       !! Water from irrigation returning to soil moisture 
[8]596    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: temp_sol_new     !! New soil temperature
597
[1080]598    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)   :: njsc             !! Index of the dominant soil textural class in the grid cell (1-nscm, unitless)
[8]599    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (in) :: frac_nobio     !! Fraction of ice, lakes, ...
600    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: totfrac_nobio    !! Total fraction of ice+lakes+...
601    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: soilcap          !! Soil capacity
[3969]602    REAL(r_std),DIMENSION (kjpindex,nstm), INTENT (in) :: soiltile         !! Fraction of each soil tile within vegtot (0-1, unitless)
[4723]603    REAL(r_std),DIMENSION (kjpindex,nlut), INTENT (in) :: fraclut          !! Fraction of each landuse tile (0-1, unitless)
[8]604    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: vevapwet         !! Interception loss
605    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: veget            !! Fraction of vegetation type           
606    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: veget_max        !! Max. fraction of vegetation type (LAI -> infty)
607    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: qsintmax         !! Maximum water on vegetation for interception
608    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: transpir         !! Transpiration
[2653]609    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: reinf_slope      !! Slope coef
[6954]610
611    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: ks               !! Hydraulic conductivity at saturation (mm {-1})
612    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: nvan             !! Van Genuchten coeficients n (unitless)
613    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: avan             !! Van Genuchten coeficients a (mm-1})
614    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
615    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
616    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcfc             !! Volumetric water content at field capacity (m^{3} m^{-3})
617    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcw              !! Volumetric water content at wilting point (m^{3} m^{-3})
618 
[8]619    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: evapot           !! Soil Potential Evaporation
620    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: evapot_penm      !! Soil Potential Evaporation Correction
[947]621    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: flood_frac       !! flood fraction
[5091]622    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: contfrac         !! Fraction of continent in the grid
[4631]623    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (in) :: stempdiag        !! Diagnostic temp profile from thermosoil
[2222]624    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: temp_air         !! Air temperature
625    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: u,v              !! Horizontal wind speed
[4146]626    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: tq_cdrag         !! Surface drag coefficient (-)
[2222]627    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: pb               !! Surface pressure
628    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: swnet            !! Net shortwave radiation
629    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: pgflux           !! Net energy into snowpack
[3269]630    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: gtemp            !! First soil layer temperature
631    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: tot_bare_soil    !! Total evaporating bare soil fraction
632    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: lambda_snow      !! Coefficient of the linear extrapolation of surface temperature
633    REAL(r_std),DIMENSION (kjpindex,nsnow), INTENT (in):: cgrnd_snow       !! Integration coefficient for snow numerical scheme
634    REAL(r_std),DIMENSION (kjpindex,nsnow), INTENT (in):: dgrnd_snow       !! Integration coefficient for snow numerical scheme
[4725]635    REAL(r_std),DIMENSION (kjpindex), INTENT(in)       :: frac_snow_veg    !! Snow cover fraction on vegetation   
[947]636
637    !! 0.2 Output variables
638
639    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out) :: vegstress        !! Veg. moisture stress (only for vegetation growth)
640    REAL(r_std),DIMENSION (kjpindex), INTENT (out)     :: drysoil_frac     !! function of litter wetness
[4631]641    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out):: shumdiag         !! Relative soil moisture in each soil layer
[4724]642                                                                           !! with respect to (mcfc-mcw)
[2589]643                                                                           !! (unitless; can be out of 0-1)
[4631]644    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out):: shumdiag_perma   !! Percent of porosity filled with water (mc/mcs) used for the thermal computations
[947]645    REAL(r_std),DIMENSION (kjpindex), INTENT (out)     :: k_litt           !! litter approximate conductivity
646    REAL(r_std),DIMENSION (kjpindex), INTENT (out)     :: litterhumdiag    !! litter humidity
647    REAL(r_std),DIMENSION (kjpindex), INTENT (out)     :: tot_melt         !! Total melt   
[2692]648    REAL(r_std),DIMENSION (kjpindex), INTENT (out)     :: floodout         !! Flux out of floodplains
[2222]649   
[947]650    !! 0.3 Modified variables
[2692]651
652    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT(inout):: qsintveg         !! Water on vegetation due to interception
[5805]653    REAL(r_std),DIMENSION (kjpindex), INTENT(inout)    :: evap_bare_lim    !! Limitation factor (beta) for bare soil evaporation
654    REAL(r_std),DIMENSION (kjpindex,nstm),INTENT(inout):: evap_bare_lim_ns !! Limitation factor (beta) for bare soil evaporation   
[2674]655    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT(inout):: humrel           !! Relative humidity
[8]656    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)   :: vevapnu          !! Bare soil evaporation
657    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)   :: vevapsno         !! Snow evaporation
[947]658    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)   :: vevapflo         !! Floodplain evaporation
659    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)   :: flood_res        !! flood reservoir estimate
[2589]660    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)   :: snow             !! Snow mass [kg/m^2]
[8]661    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)   :: snow_age         !! Snow age
[947]662    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (inout) :: snow_nobio  !! Water balance on ice, lakes, .. [Kg/m^2]
[8]663    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (inout) :: snow_nobio_age !! Snow age on ice, lakes, ...
664    !! We consider that any water on the ice is snow and we only peforme a water balance to have consistency.
665    !! The water balance is limite to + or - 10^6 so that accumulation is not endless
[2589]666
[2868]667    REAL(r_std),DIMENSION (kjpindex), INTENT (out)         :: runoff       !! Complete surface runoff
668    REAL(r_std),DIMENSION (kjpindex), INTENT (out)         :: drainage     !! Drainage
[2222]669    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(inout) :: snowrho      !! Snow density
670    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(inout) :: snowtemp     !! Snow temperature
671    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(inout) :: snowgrain    !! Snow grainsize
672    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(inout) :: snowdz       !! Snow layer thickness
673    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(inout) :: snowheat     !! Snow heat content
[2650]674    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(out)   :: snowliq      !! Snow liquid content (m)
675    REAL(r_std), DIMENSION (kjpindex), INTENT(out)         :: grndflux     !! Net flux into soil W/m2
[2922]676    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT(out)     :: mc_layh      !! Volumetric moisture content for each layer in hydrol(liquid + ice) [m3/m3)]
677    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT(out)     :: mcl_layh     !! Volumetric moisture content for each layer in hydrol(liquid) [m3/m3]
[4637]678    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT(out)     :: soilmoist_out!! Total soil moisture content for each layer in hydrol(liquid + ice) [mm]
[3269]679    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)       :: temp_sol_add !! additional surface temperature due to the melt of first layer
680                                                                           !! at the present time-step @tex ($K$) @endtex
[8]681
[947]682    !! 0.4 Local variables
[2589]683    INTEGER(i_std)                                     :: jst              !! Index of soil tiles (unitless, 1-3)
684    INTEGER(i_std)                                     :: jsl              !! Index of soil layers (unitless)
[2868]685    INTEGER(i_std)                                     :: ji, jv
[8]686    REAL(r_std),DIMENSION (kjpindex)                   :: soilwet          !! A temporary diagnostic of soil wetness
[4881]687    REAL(r_std),DIMENSION (kjpindex)                   :: snowdepth_diag   !! Depth of snow layer containing default values, only for diagnostics
[7239]688    REAL(r_std),DIMENSION (kjpindex, nsnow)            :: snowdz_diag      !! Depth of snow layer on all layers containing default values,
689                                                                           !! only for diagnostics
[947]690    REAL(r_std),DIMENSION (kjpindex)                   :: njsc_tmp         !! Temporary REAL value for njsc to write it
[3687]691    REAL(r_std), DIMENSION (kjpindex)                  :: snowmelt         !! Snow melt [mm/dt_sechiba]
[2374]692    REAL(r_std), DIMENSION (kjpindex,nstm)             :: tmc_top          !! Moisture content in the itopmax upper layers, per tile
693    REAL(r_std), DIMENSION (kjpindex)                  :: humtot_top       !! Moisture content in the itopmax upper layers, for diagnistics
694    REAL(r_std), DIMENSION(kjpindex)                   :: histvar          !! Temporary variable when computations are needed
[2718]695    REAL(r_std), DIMENSION (kjpindex,nvm)              :: frac_bare        !! Fraction(of veget_max) of bare soil in each vegetation type
[2222]696    INTEGER(i_std), DIMENSION(kjpindex*imax)           :: mc_lin_axis_index
[2868]697    REAL(r_std), DIMENSION(kjpindex)                   :: twbr             !! Grid-cell mean of TWBR Total Water Budget Residu[kg/m2/dt]
[2927]698    REAL(r_std),DIMENSION (kjpindex,nslm)              :: land_nroot       !! To ouput the grid-cell mean of nroot
[4210]699    REAL(r_std),DIMENSION (kjpindex,nslm)              :: land_dlh         !! To ouput the soil layer thickness on all grid points [m]
[4724]700    REAL(r_std),DIMENSION (kjpindex,nslm)              :: land_mcs         !! To ouput the mean of mcs
701    REAL(r_std),DIMENSION (kjpindex,nslm)              :: land_mcfc        !! To ouput the mean of mcfc
702    REAL(r_std),DIMENSION (kjpindex,nslm)              :: land_mcw         !! To ouput the mean of mcw
[4812]703    REAL(r_std),DIMENSION (kjpindex,nslm)              :: land_mcr         !! To ouput the mean of mcr
[4724]704    REAL(r_std),DIMENSION (kjpindex)                   :: land_tmcs        !! To ouput the grid-cell mean of tmcs
705    REAL(r_std),DIMENSION (kjpindex)                   :: land_tmcfc       !! To ouput the grid-cell mean of tmcfc
[3969]706    REAL(r_std),DIMENSION (kjpindex)                   :: drain_upd        !! Change in drainage due to decrease in vegtot
707                                                                           !! on mc [kg/m2/dt]
708    REAL(r_std),DIMENSION (kjpindex)                   :: runoff_upd       !! Change in runoff due to decrease in vegtot
709                                                                           !! on water2infilt[kg/m2/dt]
[4545]710    REAL(r_std),DIMENSION (kjpindex)                   :: mrsow            !! Soil wetness above wilting point for CMIP6 (humtot-WP)/(SAT-WP)
[4723]711    REAL(r_std), DIMENSION (kjpindex,nlut)             :: humtot_lut       !! Moisture content on landuse tiles, for diagnostics
712    REAL(r_std), DIMENSION (kjpindex,nlut)             :: humtot_top_lut   !! Moisture content in upper layers on landuse tiles, for diagnostics
713    REAL(r_std), DIMENSION (kjpindex,nlut)             :: mrro_lut         !! Total runoff from landuse tiles, for diagnostics
[2868]714
[1082]715!_ ================================================================================================================================
[4215]716    !! 1. Update vegtot_old and recalculate vegtot
717    vegtot_old(:) = vegtot(:)
[1082]718
[4215]719    DO ji = 1, kjpindex
720       vegtot(ji) = SUM(veget_max(ji,:))
721    ENDDO
722
[4565]723
724    !! 2. Applay nudging for soil moisture and/or snow variables
[5450]725
726    ! For soil moisture, here only read and interpolate the soil moisture from file to current time step.
727    ! The values will be applayed in hydrol_soil after the soil moisture has been updated.
728    IF (ok_nudge_mc) THEN
729       CALL hydrol_nudge_mc_read(kjit)
[4565]730    END IF
731
[5450]732    ! Read, interpolate and applay nudging of snow variables
733    IF ( ok_nudge_snow) THEN
734     CALL hydrol_nudge_snow(kjit, kjpindex, snowdz, snowrho, snowtemp )
735    END IF
[4565]736
[5450]737
[2222]738    !! 3. Shared time step
[2591]739    IF (printlev>=3) WRITE (numout,*) 'hydrol pas de temps = ',dt_sechiba
[8]740
741    !
[5470]742    !! 3.1 Calculate snow processes with explicit snow model
743    CALL explicitsnow_main(kjpindex,    precip_rain,  precip_snow,   temp_air,    pb,       &
744         u,           v,            temp_sol_new,  soilcap,     pgflux,   &
745         frac_nobio,  totfrac_nobio,gtemp,                                &
746         lambda_snow, cgrnd_snow,   dgrnd_snow,    contfrac,              & 
747         vevapsno,    snow_age,     snow_nobio_age,snow_nobio,  snowrho,  &
748         snowgrain,   snowdz,       snowtemp,      snowheat,    snow,     &
749         temp_sol_add,                                                         &
750         snowliq,     subsnownobio, grndflux,      snowmelt,    tot_melt, &
751         subsinksoil)           
[2222]752       
[8]753    !
[947]754    !! 3.2 computes vegetations reservoirs  ==>hydrol_vegupd
[3969]755    CALL hydrol_vegupd(kjpindex, veget, veget_max, soiltile, qsintveg, frac_bare, drain_upd, runoff_upd)
[947]756
[7476]757
758   
[4438]759    !! Calculate kfact_root
[7476]760    IF (kfact_root_const) THEN
761       ! Set kfact_root constant to 1
762       kfact_root(:,:,:) = un
763    ELSE
764       ! An exponential factor is used to increase ks near the surface depending on the amount of roots in the soil
765       ! through a geometric average over the vegets
766       ! This comes from the PhD thesis of d'Orgeval, 2006, p82; d'Orgeval et al. 2008, Eqs. 3-4
767       ! (Calibrated against Hapex-Sahel measurements)
768       ! Since rev 2916: veget_max/2 is used instead of veget
769       kfact_root(:,:,:) = un
770       DO jsl = 1, nslm
771          DO jv = 2, nvm
772             jst = pref_soil_veg(jv)
773             DO ji = 1, kjpindex
774                IF (soiltile(ji,jst) .GT. min_sechiba) THEN
775                   kfact_root(ji,jsl,jst) = kfact_root(ji,jsl,jst) * &
776                        MAX((MAXVAL(ks_usda)/ks(ji))**(- vegetmax_soil(ji,jv,jst)/2 * (humcste(jv)*zz(jsl)/mille - un)/deux), &
777                        un) 
778                ENDIF
779             ENDDO
[4438]780          ENDDO
781       ENDDO
[7476]782    END IF
[4438]783
[6954]784
[8]785    !
[947]786    !! 3.3 computes canopy  ==>hydrol_canop
787    CALL hydrol_canop(kjpindex, precip_rain, vevapwet, veget_max, veget, qsintmax, qsintveg,precisol,tot_melt)
788
[8]789    !
[2222]790    !! 3.4 computes surface reservoir  ==>hydrol_flood
[2591]791    CALL hydrol_flood(kjpindex,  vevapflo, flood_frac, flood_res, floodout)
[8]792
793    !
[3402]794    !! 3.5 computes soil hydrology ==>hydrol_soil
[2222]795
[6954]796    CALL hydrol_soil(ks, nvan, avan, mcr, mcs, mcfc, mcw, kjpindex, veget_max, soiltile, njsc, reinf_slope,  &
[3402]797         transpir, vevapnu, evapot, evapot_penm, runoff, drainage, & 
798         returnflow, reinfiltration, irrigation, &
[5805]799         tot_melt,evap_bare_lim,evap_bare_lim_ns, shumdiag, shumdiag_perma, &
[2222]800         k_litt, litterhumdiag, humrel, vegstress, drysoil_frac,&
[3975]801         stempdiag,snow,snowdz, tot_bare_soil,  u, v, tq_cdrag, &
[4637]802         mc_layh, mcl_layh)
[8]803
[3969]804    ! The update fluxes come from hydrol_vegupd
805    drainage(:) =  drainage(:) +  drain_upd(:)
806    runoff(:) =  runoff(:) +  runoff_upd(:)
807
[947]808
809    !! 4 write out file  ==> hydrol_alma/histwrite(*)
[8]810    !
811    ! If we use the ALMA standards
[3006]812    CALL hydrol_alma(kjpindex, index, .FALSE., qsintveg, snow, snow_nobio, soilwet)
813   
[8]814
[4208]815    ! Calculate the moisture in the upper itopmax layers corresponding to 0.1m (humtot_top):
816    ! For ORCHIDEE with nslm=11 and zmaxh=2, itopmax=6.
[2374]817    ! We compute tmc_top as tmc but only for the first itopmax layers. Then we compute a humtot with this variable.
818    DO jst=1,nstm
819       DO ji=1,kjpindex
[2651]820          tmc_top(ji,jst) = dz(2) * ( trois*mc(ji,1,jst) + mc(ji,2,jst) )/huit
[2374]821          DO jsl = 2, itopmax
[2651]822             tmc_top(ji,jst) = tmc_top(ji,jst) + dz(jsl) * (trois*mc(ji,jsl,jst)+mc(ji,jsl-1,jst))/huit &
823                  + dz(jsl+1) * (trois*mc(ji,jsl,jst)+mc(ji,jsl+1,jst))/huit
[2374]824          ENDDO
825       ENDDO
826    ENDDO
[4208]827 
[3969]828    ! We average the values of each soiltile and multiply by vegtot to transform to a grid-cell mean
[2374]829    humtot_top(:) = zero
830    DO jst=1,nstm
831       DO ji=1,kjpindex
[3969]832          humtot_top(ji) = humtot_top(ji) + soiltile(ji,jst) * tmc_top(ji,jst) * vegtot(ji)
[2374]833       ENDDO
834    ENDDO
[1788]835
[3402]836    ! Calculate the Total Water Budget Residu (in kg/m2 over dt_sechiba)
[3969]837    ! All the delstocks and fluxes below are averaged over the mesh
[2720]838    ! snow_nobio included in delswe
839    ! Does not include the routing reservoirs, although the flux to/from routing are integrated
[3006]840    DO ji=1,kjpindex
[3969]841       twbr(ji) = (delsoilmoist(ji) + delintercept(ji) + delswe(ji)) &
[3006]842            - ( precip_rain(ji) + precip_snow(ji) + irrigation(ji) + floodout(ji) &
843            + returnflow(ji) + reinfiltration(ji) ) &
844            + ( runoff(ji) + drainage(ji) + SUM(vevapwet(ji,:)) &
845            + SUM(transpir(ji,:)) + vevapnu(ji) + vevapsno(ji) + vevapflo(ji) ) 
846    ENDDO
847    ! Transform unit from kg/m2/dt to kg/m2/s (or mm/s)
848    CALL xios_orchidee_send_field("twbr",twbr/dt_sechiba)
[3687]849    CALL xios_orchidee_send_field("undermcr",undermcr) ! nb of tiles undermcr at end of timestep
850
[2927]851    ! Calculate land_nroot : grid-cell mean of nroot
852    ! Do not treat PFT1 because it has no roots
853    land_nroot(:,:) = zero
854    DO jsl=1,nslm
855       DO jv=2,nvm
856          DO ji=1,kjpindex
857               IF ( vegtot(ji) > min_sechiba ) THEN
[4363]858               land_nroot(ji,jsl) = land_nroot(ji,jsl) + veget_max(ji,jv) * nroot(ji,jv,jsl) / vegtot(ji) 
[2927]859            END IF
860          END DO
861       ENDDO
862    ENDDO
[3687]863    CALL xios_orchidee_send_field("nroot",land_nroot)   
[2927]864
865    DO jsl=1,nslm
[4210]866       land_dlh(:,jsl)=dlh(jsl)
[2927]867    ENDDO
[4210]868    CALL xios_orchidee_send_field("dlh",land_dlh)
[2927]869
[4724]870    ! Particular soil moisture values, spatially averaged over the grid-cell
871    ! (a) total SM in kg/m2
872    !     we average the total values of each soiltile and multiply by vegtot to transform to a grid-cell mean (over total land)
873    land_tmcs(:) = zero
874    land_tmcfc(:) = zero
875    DO jst=1,nstm
876       DO ji=1,kjpindex
877          land_tmcs(ji) = land_tmcs(ji) + soiltile(ji,jst) * tmcs(ji,jst) * vegtot(ji)
878          land_tmcfc(ji) = land_tmcfc(ji) + soiltile(ji,jst) * tmcfc(ji,jst) * vegtot(ji)
[2927]879       ENDDO
880    ENDDO
[4724]881    CALL xios_orchidee_send_field("tmcs",land_tmcs) ! in kg/m2
882    CALL xios_orchidee_send_field("tmcfc",land_tmcfc) ! in kg/m2
883
884    ! (b) volumetric moisture content by layers in m3/m3
885    !     mcs etc are identical in all layers (no normalization by vegtot to be comparable to mc)
886    DO jsl=1,nslm
[6954]887       land_mcs(:,jsl) = mcs(:)
888       land_mcfc(:,jsl) = mcfc(:)
889       land_mcw(:,jsl) = mcw(:)
890       land_mcr(:,jsl) = mcr(:)
[4724]891    ENDDO
892    CALL xios_orchidee_send_field("mcs",land_mcs) ! in m3/m3
893    CALL xios_orchidee_send_field("mcfc",land_mcfc) ! in m3/m3
894    CALL xios_orchidee_send_field("mcw",land_mcw) ! in m3/m3
[4812]895    CALL xios_orchidee_send_field("mcr",land_mcr) ! in m3/m3
[6954]896
897     
[2927]898    CALL xios_orchidee_send_field("water2infilt",water2infilt)   
[3839]899    CALL xios_orchidee_send_field("mc",mc)
900    CALL xios_orchidee_send_field("kfact_root",kfact_root)
901    CALL xios_orchidee_send_field("vegetmax_soil",vegetmax_soil)
[3687]902    CALL xios_orchidee_send_field("evapnu_soil",ae_ns/dt_sechiba)
903    CALL xios_orchidee_send_field("drainage_soil",dr_ns/dt_sechiba)
904    CALL xios_orchidee_send_field("transpir_soil",tr_ns/dt_sechiba)
905    CALL xios_orchidee_send_field("runoff_soil",ru_ns/dt_sechiba)
[1788]906    CALL xios_orchidee_send_field("humrel",humrel)     
[3687]907    CALL xios_orchidee_send_field("drainage",drainage/dt_sechiba) ! [kg m-2 s-1]
908    CALL xios_orchidee_send_field("runoff",runoff/dt_sechiba) ! [kg m-2 s-1]
909    CALL xios_orchidee_send_field("precisol",precisol/dt_sechiba)
[4753]910    CALL xios_orchidee_send_field("throughfall",throughfall/dt_sechiba)
[3687]911    CALL xios_orchidee_send_field("precip_rain",precip_rain/dt_sechiba)
912    CALL xios_orchidee_send_field("precip_snow",precip_snow/dt_sechiba)
[1788]913    CALL xios_orchidee_send_field("qsintmax",qsintmax)
914    CALL xios_orchidee_send_field("qsintveg",qsintveg)
[3687]915    CALL xios_orchidee_send_field("qsintveg_tot",SUM(qsintveg(:,:),dim=2))
[4753]916    histvar(:)=(precip_rain(:)-SUM(throughfall(:,:),dim=2))
[2374]917    CALL xios_orchidee_send_field("prveg",histvar/dt_sechiba)
918
[2548]919    IF ( do_floodplains ) THEN
[3687]920       CALL xios_orchidee_send_field("floodout",floodout/dt_sechiba)
[1814]921    END IF
922
[3687]923    CALL xios_orchidee_send_field("snowmelt",snowmelt/dt_sechiba)
924    CALL xios_orchidee_send_field("tot_melt",tot_melt/dt_sechiba)
[2927]925
[3687]926    CALL xios_orchidee_send_field("soilmoist",soilmoist)
[4650]927    CALL xios_orchidee_send_field("soilmoist_liquid",soilmoist_liquid)
928    CALL xios_orchidee_send_field("humtot_frozen",SUM(soilmoist(:,:),2)-SUM(soilmoist_liquid(:,:),2))
[3687]929    CALL xios_orchidee_send_field("tmc",tmc)
930    CALL xios_orchidee_send_field("humtot",humtot)
931    CALL xios_orchidee_send_field("humtot_top",humtot_top)
932
[4545]933    ! For the soil wetness above wilting point for CMIP6 (mrsow)
[6954]934    mrsow(:) = MAX( zero,humtot(:) - zmaxh*mille*mcw(:) ) &
935         / ( zmaxh*mille*( mcs(:) - mcw(:) ) )
[4545]936    CALL xios_orchidee_send_field("mrsow",mrsow)
937
[4881]938
939   
[5470]940    ! Prepare diagnostic snow variables
941    !  Add XIOS default value where no snow
942    DO ji=1,kjpindex
943       IF (snow(ji) > 0) THEN
944          snowdz_diag(ji,:) = snowdz(ji,:)
945          snowdepth_diag(ji) = SUM(snowdz(ji,:))*(1-totfrac_nobio(ji))*frac_snow_veg(ji)
946       ELSE
947          snowdz_diag(ji,:) = xios_default_val
948          snowdepth_diag(ji) = xios_default_val             
949       END IF
950    END DO
951    CALL xios_orchidee_send_field("snowdz",snowdz_diag)
952    CALL xios_orchidee_send_field("snowdepth",snowdepth_diag)
[3687]953
[2718]954    CALL xios_orchidee_send_field("frac_bare",frac_bare)
[3687]955    CALL xios_orchidee_send_field("soilwet",soilwet)
956    CALL xios_orchidee_send_field("delsoilmoist",delsoilmoist)
957    CALL xios_orchidee_send_field("delswe",delswe)
958    CALL xios_orchidee_send_field("delintercept",delintercept) 
[3403]959
960    IF (ok_freeze_cwrr) THEN
961       CALL xios_orchidee_send_field("profil_froz_hydro",profil_froz_hydro)
962    END IF
[3839]963    CALL xios_orchidee_send_field("profil_froz_hydro_ns", profil_froz_hydro_ns)
[4812]964    CALL xios_orchidee_send_field("kk_moy",kk_moy) ! in mm/d
[1788]965
[4723]966    !! Calculate diagnostic variables on Landuse tiles for LUMIP/CMIP6
967    humtot_lut(:,:)=0
968    humtot_top_lut(:,:)=0
969    mrro_lut(:,:)=0
970    DO jv=1,nvm
971       jst=pref_soil_veg(jv) ! soil tile index
972       IF (natural(jv)) THEN
973          humtot_lut(:,id_psl) = humtot_lut(:,id_psl) + tmc(:,jst)*veget_max(:,jv)
974          humtot_top_lut(:,id_psl) = humtot_top_lut(:,id_psl) + tmc_top(:,jst)*veget_max(:,jv)
975          mrro_lut(:,id_psl) = mrro_lut(:,id_psl) + (dr_ns(:,jst)+ru_ns(:,jst))*veget_max(:,jv)
976       ELSE
977          humtot_lut(:,id_crp) = humtot_lut(:,id_crp) + tmc(:,jst)*veget_max(:,jv)
978          humtot_top_lut(:,id_crp) = humtot_top_lut(:,id_crp) + tmc_top(:,jst)*veget_max(:,jv)
979          mrro_lut(:,id_crp) = mrro_lut(:,id_crp) + (dr_ns(:,jst)+ru_ns(:,jst))*veget_max(:,jv)
980       ENDIF
981    END DO
982
983    WHERE (fraclut(:,id_psl)>min_sechiba)
984       humtot_lut(:,id_psl) = humtot_lut(:,id_psl)/fraclut(:,id_psl)
985       humtot_top_lut(:,id_psl) = humtot_top_lut(:,id_psl)/fraclut(:,id_psl)
986       mrro_lut(:,id_psl) = mrro_lut(:,id_psl)/fraclut(:,id_psl)/dt_sechiba
987    ELSEWHERE
988       humtot_lut(:,id_psl) = val_exp
989       humtot_top_lut(:,id_psl) = val_exp
990       mrro_lut(:,id_psl) = val_exp
991    END WHERE
992    WHERE (fraclut(:,id_crp)>min_sechiba)
993       humtot_lut(:,id_crp) = humtot_lut(:,id_crp)/fraclut(:,id_crp)
994       humtot_top_lut(:,id_crp) = humtot_top_lut(:,id_crp)/fraclut(:,id_crp)
995       mrro_lut(:,id_crp) = mrro_lut(:,id_crp)/fraclut(:,id_crp)/dt_sechiba
996    ELSEWHERE
997       humtot_lut(:,id_crp) = val_exp
998       humtot_top_lut(:,id_crp) = val_exp
999       mrro_lut(:,id_crp) = val_exp
1000    END WHERE
1001
1002    humtot_lut(:,id_pst) = val_exp
1003    humtot_lut(:,id_urb) = val_exp
1004    humtot_top_lut(:,id_pst) = val_exp
1005    humtot_top_lut(:,id_urb) = val_exp
1006    mrro_lut(:,id_pst) = val_exp
1007    mrro_lut(:,id_urb) = val_exp
1008
1009    CALL xios_orchidee_send_field("humtot_lut",humtot_lut)
1010    CALL xios_orchidee_send_field("humtot_top_lut",humtot_top_lut)
1011    CALL xios_orchidee_send_field("mrro_lut",mrro_lut)
1012
[5450]1013    ! Write diagnistic for soil moisture nudging
1014    IF (ok_nudge_mc) CALL hydrol_nudge_mc_diag(kjpindex, soiltile)
[4723]1015
[5450]1016
[8]1017    IF ( .NOT. almaoutput ) THEN
[2718]1018       CALL histwrite_p(hist_id, 'frac_bare', kjit, frac_bare, kjpindex*nvm, indexveg)
1019
[8]1020       DO jst=1,nstm
1021          ! var_name= "mc_1" ... "mc_3"
1022          WRITE (var_name,"('moistc_',i1)") jst
[2222]1023          CALL histwrite_p(hist_id, TRIM(var_name), kjit,mc(:,:,jst), kjpindex*nslm, indexlayer)
[8]1024
[947]1025          ! var_name= "kfactroot_1" ... "kfactroot_3"
1026          WRITE (var_name,"('kfactroot_',i1)") jst
[2222]1027          CALL histwrite_p(hist_id, TRIM(var_name), kjit, kfact_root(:,:,jst), kjpindex*nslm, indexlayer)
[947]1028
[8]1029          ! var_name= "vegetsoil_1" ... "vegetsoil_3"
1030          WRITE (var_name,"('vegetsoil_',i1)") jst
[3687]1031          CALL histwrite_p(hist_id, TRIM(var_name), kjit,vegetmax_soil(:,:,jst), kjpindex*nvm, indexveg)
[8]1032       ENDDO
[1078]1033       CALL histwrite_p(hist_id, 'evapnu_soil', kjit, ae_ns, kjpindex*nstm, indexsoil)
1034       CALL histwrite_p(hist_id, 'drainage_soil', kjit, dr_ns, kjpindex*nstm, indexsoil)
1035       CALL histwrite_p(hist_id, 'transpir_soil', kjit, tr_ns, kjpindex*nstm, indexsoil)
1036       CALL histwrite_p(hist_id, 'runoff_soil', kjit, ru_ns, kjpindex*nstm, indexsoil)
1037       CALL histwrite_p(hist_id, 'humtot_soil', kjit, tmc, kjpindex*nstm, indexsoil)
[2499]1038       ! mrso is a perfect duplicate of humtot
[1078]1039       CALL histwrite_p(hist_id, 'humtot', kjit, humtot, kjpindex, index)
[2499]1040       CALL histwrite_p(hist_id, 'mrso', kjit, humtot, kjpindex, index)
[2374]1041       CALL histwrite_p(hist_id, 'mrsos', kjit, humtot_top, kjpindex, index)
[947]1042       njsc_tmp(:)=njsc(:)
[1078]1043       CALL histwrite_p(hist_id, 'soilindex', kjit, njsc_tmp, kjpindex, index)
1044       CALL histwrite_p(hist_id, 'humrel',   kjit, humrel,   kjpindex*nvm, indexveg)
1045       CALL histwrite_p(hist_id, 'drainage', kjit, drainage, kjpindex, index)
[2499]1046       ! NB! According to histdef in intersurf, the variables 'runoff' and 'mrros' have different units
[1078]1047       CALL histwrite_p(hist_id, 'runoff', kjit, runoff, kjpindex, index)
[2499]1048       CALL histwrite_p(hist_id, 'mrros', kjit, runoff, kjpindex, index)
1049       histvar(:)=(runoff(:)+drainage(:))
1050       CALL histwrite_p(hist_id, 'mrro', kjit, histvar, kjpindex, index)
[1078]1051       CALL histwrite_p(hist_id, 'precisol', kjit, precisol, kjpindex*nvm, indexveg)
1052       CALL histwrite_p(hist_id, 'rain', kjit, precip_rain, kjpindex, index)
[2374]1053
[4753]1054       histvar(:)=(precip_rain(:)-SUM(throughfall(:,:),dim=2))
[2374]1055       CALL histwrite_p(hist_id, 'prveg', kjit, histvar, kjpindex, index)
1056
[1078]1057       CALL histwrite_p(hist_id, 'snowf', kjit, precip_snow, kjpindex, index)
1058       CALL histwrite_p(hist_id, 'qsintmax', kjit, qsintmax, kjpindex*nvm, indexveg)
1059       CALL histwrite_p(hist_id, 'qsintveg', kjit, qsintveg, kjpindex*nvm, indexveg)
[2222]1060       CALL histwrite_p(hist_id, 'snowmelt',kjit,snowmelt,kjpindex,index)
[4631]1061       CALL histwrite_p(hist_id, 'shumdiag_perma',kjit,shumdiag_perma,kjpindex*nslm,indexnslm)
[2222]1062
[2548]1063       IF ( do_floodplains ) THEN
[1078]1064          CALL histwrite_p(hist_id, 'floodout', kjit, floodout, kjpindex, index)
[947]1065       ENDIF
1066       !
[8]1067       IF ( hist2_id > 0 ) THEN
1068          DO jst=1,nstm
1069             ! var_name= "mc_1" ... "mc_3"
1070             WRITE (var_name,"('moistc_',i1)") jst
[2222]1071             CALL histwrite_p(hist2_id, TRIM(var_name), kjit,mc(:,:,jst), kjpindex*nslm, indexlayer)
[8]1072
[947]1073             ! var_name= "kfactroot_1" ... "kfactroot_3"
1074             WRITE (var_name,"('kfactroot_',i1)") jst
[2222]1075             CALL histwrite_p(hist2_id, TRIM(var_name), kjit, kfact_root(:,:,jst), kjpindex*nslm, indexlayer)
[947]1076
[8]1077             ! var_name= "vegetsoil_1" ... "vegetsoil_3"
1078             WRITE (var_name,"('vegetsoil_',i1)") jst
[3687]1079             CALL histwrite_p(hist2_id, TRIM(var_name), kjit,vegetmax_soil(:,:,jst), kjpindex*nvm, indexveg)
[8]1080          ENDDO
[1078]1081          CALL histwrite_p(hist2_id, 'evapnu_soil', kjit, ae_ns, kjpindex*nstm, indexsoil)
1082          CALL histwrite_p(hist2_id, 'drainage_soil', kjit, dr_ns, kjpindex*nstm, indexsoil)
1083          CALL histwrite_p(hist2_id, 'transpir_soil', kjit, tr_ns, kjpindex*nstm, indexsoil)
1084          CALL histwrite_p(hist2_id, 'runoff_soil', kjit, ru_ns, kjpindex*nstm, indexsoil)
1085          CALL histwrite_p(hist2_id, 'humtot_soil', kjit, tmc, kjpindex*nstm, indexsoil)
[2499]1086          ! mrso is a perfect duplicate of humtot
[1078]1087          CALL histwrite_p(hist2_id, 'humtot', kjit, humtot, kjpindex, index)
[2499]1088          CALL histwrite_p(hist2_id, 'mrso', kjit, humtot, kjpindex, index)
[2374]1089          CALL histwrite_p(hist2_id, 'mrsos', kjit, humtot_top, kjpindex, index)
[947]1090          njsc_tmp(:)=njsc(:)
[1078]1091          CALL histwrite_p(hist2_id, 'soilindex', kjit, njsc_tmp, kjpindex, index)
1092          CALL histwrite_p(hist2_id, 'humrel',   kjit, humrel,   kjpindex*nvm, indexveg)
1093          CALL histwrite_p(hist2_id, 'drainage', kjit, drainage, kjpindex, index)
[2499]1094          ! NB! According to histdef in intersurf, the variables 'runoff' and 'mrros' have different units
[1078]1095          CALL histwrite_p(hist2_id, 'runoff', kjit, runoff, kjpindex, index)
[2499]1096          CALL histwrite_p(hist2_id, 'mrros', kjit, runoff, kjpindex, index)
1097          histvar(:)=(runoff(:)+drainage(:))
1098          CALL histwrite_p(hist2_id, 'mrro', kjit, histvar, kjpindex, index)
1099
[2548]1100          IF ( do_floodplains ) THEN
[1078]1101             CALL histwrite_p(hist2_id, 'floodout', kjit, floodout, kjpindex, index)
[947]1102          ENDIF
[1078]1103          CALL histwrite_p(hist2_id, 'precisol', kjit, precisol, kjpindex*nvm, indexveg)
1104          CALL histwrite_p(hist2_id, 'rain', kjit, precip_rain, kjpindex, index)
1105          CALL histwrite_p(hist2_id, 'snowf', kjit, precip_snow, kjpindex, index)
[2222]1106          CALL histwrite_p(hist2_id, 'snowmelt',kjit,snowmelt,kjpindex,index)
[1078]1107          CALL histwrite_p(hist2_id, 'qsintmax', kjit, qsintmax, kjpindex*nvm, indexveg)
1108          CALL histwrite_p(hist2_id, 'qsintveg', kjit, qsintveg, kjpindex*nvm, indexveg)
[8]1109       ENDIF
1110    ELSE
[1078]1111       CALL histwrite_p(hist_id, 'Snowf', kjit, precip_snow, kjpindex, index)
1112       CALL histwrite_p(hist_id, 'Rainf', kjit, precip_rain, kjpindex, index)
1113       CALL histwrite_p(hist_id, 'Qs', kjit, runoff, kjpindex, index)
1114       CALL histwrite_p(hist_id, 'Qsb', kjit, drainage, kjpindex, index)
[2222]1115       CALL histwrite_p(hist_id, 'Qsm', kjit, snowmelt, kjpindex, index)
[1078]1116       CALL histwrite_p(hist_id, 'DelSoilMoist', kjit, delsoilmoist, kjpindex, index)
1117       CALL histwrite_p(hist_id, 'DelSWE', kjit, delswe, kjpindex, index)
1118       CALL histwrite_p(hist_id, 'DelIntercept', kjit, delintercept, kjpindex, index)
[8]1119       !
[1078]1120       CALL histwrite_p(hist_id, 'SoilMoist', kjit, soilmoist, kjpindex*nslm, indexlayer)
1121       CALL histwrite_p(hist_id, 'SoilWet', kjit, soilwet, kjpindex, index)
[8]1122       !
[1078]1123       CALL histwrite_p(hist_id, 'RootMoist', kjit, tot_watsoil_end, kjpindex, index)
1124       CALL histwrite_p(hist_id, 'SubSnow', kjit, vevapsno, kjpindex, index)
[5470]1125
[8]1126       IF ( hist2_id > 0 ) THEN
[1078]1127          CALL histwrite_p(hist2_id, 'Snowf', kjit, precip_snow, kjpindex, index)
1128          CALL histwrite_p(hist2_id, 'Rainf', kjit, precip_rain, kjpindex, index)
1129          CALL histwrite_p(hist2_id, 'Qs', kjit, runoff, kjpindex, index)
1130          CALL histwrite_p(hist2_id, 'Qsb', kjit, drainage, kjpindex, index)
[2222]1131          CALL histwrite_p(hist2_id, 'Qsm', kjit, snowmelt, kjpindex, index)
[1078]1132          CALL histwrite_p(hist2_id, 'DelSoilMoist', kjit, delsoilmoist, kjpindex, index)
1133          CALL histwrite_p(hist2_id, 'DelSWE', kjit, delswe, kjpindex, index)
1134          CALL histwrite_p(hist2_id, 'DelIntercept', kjit, delintercept, kjpindex, index)
[8]1135          !
[1078]1136          CALL histwrite_p(hist2_id, 'SoilMoist', kjit, soilmoist, kjpindex*nslm, indexlayer)
1137          CALL histwrite_p(hist2_id, 'SoilWet', kjit, soilwet, kjpindex, index)
[8]1138          !
[1078]1139          CALL histwrite_p(hist2_id, 'RootMoist', kjit, tot_watsoil_end, kjpindex, index)
1140          CALL histwrite_p(hist2_id, 'SubSnow', kjit, vevapsno, kjpindex, index)
[8]1141       ENDIF
1142    ENDIF
1143
[2222]1144    IF (ok_freeze_cwrr) THEN
1145       CALL histwrite_p(hist_id, 'profil_froz_hydro', kjit,profil_froz_hydro , kjpindex*nslm, indexlayer)
1146    ENDIF
[4764]1147    CALL histwrite_p(hist_id, 'kk_moy', kjit, kk_moy,kjpindex*nslm, indexlayer) ! averaged over soiltiles
1148    DO jst=1,nstm
1149       WRITE (var_name,"('profil_froz_hydro_',i1)") jst
1150       CALL histwrite_p(hist_id, TRIM(var_name), kjit, profil_froz_hydro_ns(:,:,jst), kjpindex*nslm, indexlayer)
1151    ENDDO
[2222]1152
[4637]1153    ! Copy soilmoist into a local variable to be sent to thermosoil
1154    soilmoist_out(:,:) = soilmoist(:,:)
1155
[2348]1156    IF (printlev>=3) WRITE (numout,*) ' hydrol_main Done '
[8]1157
1158  END SUBROUTINE hydrol_main
1159
[947]1160
1161!! ================================================================================================================================
[2581]1162!! SUBROUTINE   : hydrol_finalize
1163!!
1164!>\BRIEF         
1165!!
1166!! DESCRIPTION : This subroutine writes the module variables and variables calculated in hydrol to restart file
1167!!
1168!! MAIN OUTPUT VARIABLE(S) :
1169!!
1170!! REFERENCE(S) :
1171!!
1172!! FLOWCHART    : None
1173!! \n
1174!_ ================================================================================================================================
1175
[2868]1176  SUBROUTINE hydrol_finalize( kjit,           kjpindex,   rest_id,  vegstress,  &
1177                              qsintveg,       humrel,     snow,     snow_age, snow_nobio, &
1178                              snow_nobio_age, snowrho,    snowtemp, snowdz,     &
[3059]1179                              snowheat,       snowgrain,  &
[5805]1180                              drysoil_frac, evap_bare_lim, evap_bare_lim_ns)
[2581]1181
1182    !! 0. Variable and parameter declaration
1183    !! 0.1 Input variables
1184    INTEGER(i_std), INTENT(in)                           :: kjit           !! Time step number
1185    INTEGER(i_std), INTENT(in)                           :: kjpindex       !! Domain size
1186    INTEGER(i_std),INTENT (in)                           :: rest_id        !! Restart file identifier
1187    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)    :: vegstress      !! Veg. moisture stress (only for vegetation growth)
1188    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)    :: qsintveg       !! Water on vegetation due to interception
[2868]1189    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)    :: humrel
[2581]1190    REAL(r_std),DIMENSION (kjpindex), INTENT (in)        :: snow           !! Snow mass [Kg/m^2]
1191    REAL(r_std),DIMENSION (kjpindex), INTENT (in)        :: snow_age       !! Snow age
1192    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (in) :: snow_nobio     !! Water balance on ice, lakes, .. [Kg/m^2]
1193    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (in) :: snow_nobio_age !! Snow age on ice, lakes, ...
1194    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(in)  :: snowrho        !! Snow density
1195    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(in)  :: snowtemp       !! Snow temperature
1196    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(in)  :: snowdz         !! Snow layer thickness
1197    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(in)  :: snowheat       !! Snow heat content
[2650]1198    REAL(r_std), DIMENSION (kjpindex,nsnow), INTENT(in)  :: snowgrain      !! Snow grainsize
[2868]1199    REAL(r_std),DIMENSION (kjpindex),INTENT(in)          :: drysoil_frac   !! function of litter wetness
1200    REAL(r_std),DIMENSION (kjpindex),INTENT(in)          :: evap_bare_lim
[5805]1201    REAL(r_std),DIMENSION (kjpindex,nstm),INTENT(in)     :: evap_bare_lim_ns
[2581]1202
1203    !! 0.4 Local variables
1204    INTEGER(i_std)                                       :: jst, jsl
1205   
1206!_ ================================================================================================================================
1207
1208
1209    IF (printlev>=3) WRITE (numout,*) 'Write restart file with HYDROLOGIC variables '
1210
1211    DO jst=1,nstm
1212       ! var_name= "mc_1" ... "mc_3"
1213       WRITE (var_name,"('moistc_',i1)") jst
1214       CALL restput_p(rest_id, var_name, nbp_glo,  nslm, 1, kjit, mc(:,:,jst), 'scatter',  nbp_glo, index_g)
1215    END DO
[3402]1216
[2581]1217    DO jst=1,nstm
[3402]1218       ! var_name= "mcl_1" ... "mcl_3"
1219       WRITE (var_name,"('moistcl_',i1)") jst
1220       CALL restput_p(rest_id, var_name, nbp_glo,  nslm, 1, kjit, mcl(:,:,jst), 'scatter',  nbp_glo, index_g)
1221    END DO
[4565]1222   
1223    IF (ok_nudge_mc) THEN
1224       DO jst=1,nstm
1225          WRITE (var_name,"('mc_read_next_',i1)") jst
1226          CALL restput_p(rest_id, var_name, nbp_glo,  nslm, 1, kjit, mc_read_next(:,:,jst), 'scatter',  nbp_glo, index_g)
1227       END DO
1228    END IF
1229
1230    IF (ok_nudge_snow) THEN
1231       CALL restput_p(rest_id, 'snowdz_read_next', nbp_glo,  nsnow, 1, kjit, snowdz_read_next(:,:), &
1232            'scatter',  nbp_glo, index_g)
1233       CALL restput_p(rest_id, 'snowrho_read_next', nbp_glo,  nsnow, 1, kjit, snowrho_read_next(:,:), &
1234            'scatter',  nbp_glo, index_g)
1235       CALL restput_p(rest_id, 'snowtemp_read_next', nbp_glo,  nsnow, 1, kjit, snowtemp_read_next(:,:), &
1236            'scatter',  nbp_glo, index_g)
1237    END IF
1238
1239
1240           
[3402]1241    DO jst=1,nstm
[2581]1242       DO jsl=1,nslm
1243          ! var_name= "us_1_01" ... "us_3_11"
1244          WRITE (var_name,"('us_',i1,'_',i2.2)") jst,jsl
1245          CALL restput_p(rest_id, var_name, nbp_glo,nvm, 1,kjit,us(:,:,jst,jsl),'scatter',nbp_glo,index_g)
1246       END DO
1247    END DO
1248   
1249    CALL restput_p(rest_id, 'free_drain_coef', nbp_glo,   nstm, 1, kjit,  free_drain_coef, 'scatter',  nbp_glo, index_g)
[3402]1250    CALL restput_p(rest_id, 'zwt_force', nbp_glo,   nstm, 1, kjit,  zwt_force, 'scatter',  nbp_glo, index_g)
[2581]1251    CALL restput_p(rest_id, 'water2infilt', nbp_glo,   nstm, 1, kjit,  water2infilt, 'scatter',  nbp_glo, index_g)
1252    CALL restput_p(rest_id, 'ae_ns', nbp_glo,   nstm, 1, kjit,  ae_ns, 'scatter',  nbp_glo, index_g)
1253    CALL restput_p(rest_id, 'vegstress', nbp_glo,   nvm, 1, kjit,  vegstress, 'scatter',  nbp_glo, index_g)
1254    CALL restput_p(rest_id, 'snow', nbp_glo,   1, 1, kjit,  snow, 'scatter',  nbp_glo, index_g)
1255    CALL restput_p(rest_id, 'snow_age', nbp_glo,   1, 1, kjit,  snow_age, 'scatter',  nbp_glo, index_g)
1256    CALL restput_p(rest_id, 'snow_nobio', nbp_glo,   nnobio, 1, kjit,  snow_nobio, 'scatter', nbp_glo, index_g)
1257    CALL restput_p(rest_id, 'snow_nobio_age', nbp_glo,   nnobio, 1, kjit,  snow_nobio_age, 'scatter', nbp_glo, index_g)
1258    CALL restput_p(rest_id, 'qsintveg', nbp_glo, nvm, 1, kjit,  qsintveg, 'scatter',  nbp_glo, index_g)
1259    CALL restput_p(rest_id, 'evap_bare_lim_ns', nbp_glo, nstm, 1, kjit,  evap_bare_lim_ns, 'scatter',  nbp_glo, index_g)
[2868]1260    CALL restput_p(rest_id, 'evap_bare_lim', nbp_glo, 1, 1, kjit,  evap_bare_lim, 'scatter',  nbp_glo, index_g)
[3969]1261    CALL restput_p(rest_id, 'resdist', nbp_glo, nstm, 1, kjit,  resdist, 'scatter',  nbp_glo, index_g) 
1262    CALL restput_p(rest_id, 'vegtot_old', nbp_glo, 1, 1, kjit,  vegtot_old, 'scatter',  nbp_glo, index_g)           
[2868]1263    CALL restput_p(rest_id, 'drysoil_frac', nbp_glo,   1, 1, kjit, drysoil_frac, 'scatter', nbp_glo, index_g)
1264    CALL restput_p(rest_id, 'humrel', nbp_glo,   nvm, 1, kjit,  humrel, 'scatter',  nbp_glo, index_g)
[2581]1265
[3006]1266    CALL restput_p(rest_id, 'tot_watveg_beg', nbp_glo,  1, 1, kjit,  tot_watveg_beg, 'scatter',  nbp_glo, index_g)
1267    CALL restput_p(rest_id, 'tot_watsoil_beg', nbp_glo, 1, 1, kjit,  tot_watsoil_beg, 'scatter',  nbp_glo, index_g)
1268    CALL restput_p(rest_id, 'snow_beg', nbp_glo,        1, 1, kjit,  snow_beg, 'scatter',  nbp_glo, index_g)
1269   
[2581]1270   
[2650]1271    ! Write variables for explictsnow module to restart file
[5470]1272    CALL explicitsnow_finalize ( kjit,     kjpindex, rest_id,    snowrho,   &
1273         snowtemp, snowdz,   snowheat,   snowgrain)
[2581]1274
1275  END SUBROUTINE hydrol_finalize
1276
1277
1278!! ================================================================================================================================
[947]1279!! SUBROUTINE   : hydrol_init
1280!!
1281!>\BRIEF        Initializations and memory allocation   
1282!!
1283!! DESCRIPTION  :
1284!! - 1 Some initializations
1285!! - 2 make dynamic allocation with good dimension
1286!! - 2.1 array allocation for soil textur
1287!! - 2.2 Soil texture choice
1288!! - 3 Other array allocation
1289!! - 4 Open restart input file and read data for HYDROLOGIC process
1290!! - 5 get restart values if none were found in the restart file
1291!! - 6 Vegetation array     
1292!! - 7 set humrelv from us
1293!!
1294!! RECENT CHANGE(S) : None
1295!!
1296!! MAIN OUTPUT VARIABLE(S) :
1297!!
1298!! REFERENCE(S) :
1299!!
1300!! FLOWCHART    : None
1301!! \n
1302!_ ================================================================================================================================
1303!!_ hydrol_init
1304
[6954]1305  SUBROUTINE hydrol_init(ks, nvan, avan, mcr, mcs, mcfc, mcw, njsc,&
1306       kjit, kjpindex, index, rest_id, veget_max, soiltile, &
[2868]1307       humrel,  vegstress, snow,       snow_age,   snow_nobio, snow_nobio_age, qsintveg, &
1308       snowdz,  snowgrain, snowrho,    snowtemp,   snowheat, &
[5805]1309       drysoil_frac, evap_bare_lim, evap_bare_lim_ns)
[2650]1310   
[8]1311
[947]1312    !! 0. Variable and parameter declaration
1313
1314    !! 0.1 Input variables
[6954]1315    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)    :: njsc               !! Index of the dominant soil textural class in the grid cell (1-nscm, unitless)
[8]1316    INTEGER(i_std), INTENT (in)                         :: kjit               !! Time step number
1317    INTEGER(i_std), INTENT (in)                         :: kjpindex           !! Domain size
1318    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)    :: index              !! Indeces of the points on the map
1319    INTEGER(i_std), INTENT (in)                         :: rest_id            !! _Restart_ file identifier
[947]1320    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)   :: veget_max          !! Carte de vegetation max
[3969]1321    REAL(r_std),DIMENSION (kjpindex,nstm), INTENT (in)  :: soiltile           !! Fraction of each soil tile within vegtot (0-1, unitless)
[6954]1322   
[947]1323    !! 0.2 Output variables
1324
[6954]1325    REAL(r_std),DIMENSION (kjpindex), INTENT (in)         :: ks               !! Hydraulic conductivity at saturation (mm {-1})
1326    REAL(r_std),DIMENSION (kjpindex), INTENT (in)         :: nvan             !! Van Genuchten coeficients n (unitless)
1327    REAL(r_std),DIMENSION (kjpindex), INTENT (in)         :: avan             !! Van Genuchten coeficients a (mm-1})
1328    REAL(r_std),DIMENSION (kjpindex), INTENT (in)         :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
1329    REAL(r_std),DIMENSION (kjpindex), INTENT (in)         :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
1330    REAL(r_std),DIMENSION (kjpindex), INTENT (in)         :: mcfc             !! Volumetric water content at field capacity (m^{3} m^{-3})
1331    REAL(r_std),DIMENSION (kjpindex), INTENT (in)         :: mcw              !! Volumetric water content at wilting point (m^{3} m^{-3})
1332
[8]1333    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out)  :: humrel             !! Stress hydrique, relative humidity
[947]1334    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out)  :: vegstress          !! Veg. moisture stress (only for vegetation growth)
[8]1335    REAL(r_std),DIMENSION (kjpindex), INTENT (out)      :: snow               !! Snow mass [Kg/m^2]
1336    REAL(r_std),DIMENSION (kjpindex), INTENT (out)      :: snow_age           !! Snow age
1337    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (out) :: snow_nobio       !! Snow on ice, lakes, ...
1338    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (out) :: snow_nobio_age   !! Snow age on ice, lakes, ...
[2581]1339    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out)    :: qsintveg         !! Water on vegetation due to interception
1340    REAL(r_std),DIMENSION (kjpindex,nsnow),INTENT(out)    :: snowdz           !! Snow depth
1341    REAL(r_std),DIMENSION (kjpindex,nsnow),INTENT(out)    :: snowgrain        !! Snow grain size
1342    REAL(r_std),DIMENSION (kjpindex,nsnow),INTENT(out)    :: snowheat         !! Snow heat content
1343    REAL(r_std),DIMENSION (kjpindex,nsnow),INTENT(out)    :: snowtemp         !! Snow temperature
1344    REAL(r_std),DIMENSION (kjpindex,nsnow),INTENT(out)    :: snowrho          !! Snow density
[2868]1345    REAL(r_std),DIMENSION (kjpindex),INTENT(out)          :: drysoil_frac     !! function of litter wetness
1346    REAL(r_std),DIMENSION (kjpindex),INTENT(out)          :: evap_bare_lim
[5805]1347    REAL(r_std),DIMENSION (kjpindex,nstm),INTENT(out)     :: evap_bare_lim_ns
[8]1348
[947]1349    !! 0.4 Local variables
1350
[1082]1351    INTEGER(i_std)                                     :: ier                   !! Error code
[2589]1352    INTEGER(i_std)                                     :: ji                    !! Index of land grid cells (1)
1353    INTEGER(i_std)                                     :: jv                    !! Index of PFTs (1)
1354    INTEGER(i_std)                                     :: jst                   !! Index of soil tiles (1)
1355    INTEGER(i_std)                                     :: jsl                   !! Index of soil layers (1)
1356    INTEGER(i_std)                                     :: jsc                   !! Index of soil texture (1)
[1082]1357    INTEGER(i_std), PARAMETER                          :: error_level = 3       !! Error level for consistency check
[7239]1358    !! Switch to 2 tu turn fatal errors into warnings
[3402]1359    REAL(r_std), ALLOCATABLE, DIMENSION (:)            :: free_drain_max        !! Temporary var for initialization of free_drain_coef
1360    REAL(r_std), ALLOCATABLE, DIMENSION (:)            :: zwt_default           !! Temporary variable for initialization of zwt_force
1361    LOGICAL                                            :: zforce                !! To test if we force the WT in any of the soiltiles
[7239]1362   
[947]1363
[1082]1364!_ ================================================================================================================================
1365
[947]1366    !! 1 Some initializations
1367    !
1368    !Config Key   = DO_PONDS
1369    !Config Desc  = Should we include ponds
[2135]1370    !Config Def   = n
[5454]1371    !Config If    =
[947]1372    !Config Help  = This parameters allows the user to ask the model
1373    !Config         to take into account the ponds and return
1374    !Config         the water into the soil moisture. If this is
1375    !Config         activated, then there is no reinfiltration
1376    !Config         computed inside the hydrol module.
1377    !Config Units = [FLAG]
1378    !
1379    doponds = .FALSE.
1380    CALL getin_p('DO_PONDS', doponds)
[511]1381
[4061]1382    !Config Key   = FROZ_FRAC_CORR
1383    !Config Desc  = Coefficient for the frozen fraction correction
[4202]1384    !Config Def   = 1.0
[5454]1385    !Config If    = OK_FREEZE
[4061]1386    !Config Help  =
1387    !Config Units = [-]
[4202]1388    froz_frac_corr = 1.0
[4061]1389    CALL getin_p("FROZ_FRAC_CORR", froz_frac_corr)
1390
[4202]1391    !Config Key   = MAX_FROZ_HYDRO
1392    !Config Desc  = Coefficient for the frozen fraction correction
1393    !Config Def   = 1.0
[5454]1394    !Config If    = OK_FREEZE
[4202]1395    !Config Help  =
1396    !Config Units = [-]
1397    max_froz_hydro = 1.0
1398    CALL getin_p("MAX_FROZ_HYDRO", max_froz_hydro)
1399
1400    !Config Key   = SMTOT_CORR
1401    !Config Desc  = Coefficient for the frozen fraction correction
1402    !Config Def   = 2.0
[5454]1403    !Config If    = OK_FREEZE
[4202]1404    !Config Help  =
1405    !Config Units = [-]
1406    smtot_corr = 2.0
1407    CALL getin_p("SMTOT_CORR", smtot_corr)
1408
[3975]1409    !Config Key   = DO_RSOIL
1410    !Config Desc  = Should we reduce soil evaporation with a soil resistance
1411    !Config Def   = n
[5454]1412    !Config If    =
[3975]1413    !Config Help  = This parameters allows the user to ask the model
1414    !Config         to calculate a soil resistance to reduce the soil evaporation
1415    !Config Units = [FLAG]
1416    !
1417    do_rsoil = .FALSE.
1418    CALL getin_p('DO_RSOIL', do_rsoil) 
[2222]1419
[4363]1420    !Config Key   = OK_DYNROOT
[4365]1421    !Config Desc  = Calculate dynamic root profile to optimize soil moisture usage 
[4363]1422    !Config Def   = n
[5454]1423    !Config If    =
[4363]1424    !Config Help  =
1425    !Config Units = [FLAG]
1426    ok_dynroot = .FALSE.
1427    CALL getin_p('OK_DYNROOT',ok_dynroot)
1428
[947]1429    !! 2 make dynamic allocation with good dimension
[8]1430
[947]1431    !! 2.1 array allocation for soil texture
[8]1432
[7239]1433    ALLOCATE (pcent(nscm),stat=ier)
[2483]1434    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable pcent','','')
[947]1435   
[7239]1436    ALLOCATE (mc_awet(nscm),stat=ier)
[2483]1437    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mc_awet','','')
[947]1438
[7239]1439    ALLOCATE (mc_adry(nscm),stat=ier)
[2483]1440    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mc_adry','','')
[947]1441       
[7337]1442    !! 2.2 Soil texture parameters
1443         
1444    pcent(:) = pcent_usda(:) 
1445    mc_awet(:) = mc_awet_usda(:)
1446    mc_adry(:) = mc_adry_usda(:) 
[1082]1447
1448    !! 2.3 Read in the run.def the parameters values defined by the user
1449
1450    !Config Key   = WETNESS_TRANSPIR_MAX
[7444]1451    !Config Desc  = Soil moisture above which transpir is max, for each soil texture class
[5454]1452    !Config If    =
[7444]1453    !Config Def   = 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8
[1082]1454    !Config Help  = This parameter is independent from soil texture for
1455    !Config         the time being.
1456    !Config Units = [-]   
1457    CALL getin_p("WETNESS_TRANSPIR_MAX",pcent)
1458
1459    !! Check parameter value (correct range)
1460    IF ( ANY(pcent(:) <= zero) .OR. ANY(pcent(:) > 1.) ) THEN
1461       CALL ipslerr_p(error_level, "hydrol_init.", &
1462            &     "Wrong parameter value for WETNESS_TRANSPIR_MAX.", &
1463            &     "This parameter should be positive and less or equals than 1. ", &
1464            &     "Please, check parameter value in run.def. ")
1465    END IF
[6954]1466   
[1082]1467
1468    !Config Key   = VWC_MIN_FOR_WET_ALB
1469    !Config Desc  = Vol. wat. cont. above which albedo is cst
[5454]1470    !Config If    =
[1082]1471    !Config Def   = 0.25, 0.25, 0.25
1472    !Config Help  = This parameter is independent from soil texture for
1473    !Config         the time being.
[2589]1474    !Config Units = [m3/m3] 
[1082]1475    CALL getin_p("VWC_MIN_FOR_WET_ALB",mc_awet)
1476
1477    !! Check parameter value (correct range)
1478    IF ( ANY(mc_awet(:) < 0) ) THEN
1479       CALL ipslerr_p(error_level, "hydrol_init.", &
1480            &     "Wrong parameter value for VWC_MIN_FOR_WET_ALB.", &
1481            &     "This parameter should be positive. ", &
1482            &     "Please, check parameter value in run.def. ")
1483    END IF
1484
1485
1486    !Config Key   = VWC_MAX_FOR_DRY_ALB
1487    !Config Desc  = Vol. wat. cont. below which albedo is cst
[5454]1488    !Config If    =
[1082]1489    !Config Def   = 0.1, 0.1, 0.1
1490    !Config Help  = This parameter is independent from soil texture for
1491    !Config         the time being.
[2589]1492    !Config Units = [m3/m3]   
[1082]1493    CALL getin_p("VWC_MAX_FOR_DRY_ALB",mc_adry)
1494
1495    !! Check parameter value (correct range)
1496    IF ( ANY(mc_adry(:) < 0) .OR. ANY(mc_adry(:) > mc_awet(:)) ) THEN
1497       CALL ipslerr_p(error_level, "hydrol_init.", &
1498            &     "Wrong parameter value for VWC_MAX_FOR_DRY_ALB.", &
1499            &     "This parameter should be positive and not greater than VWC_MIN_FOR_WET_ALB.", &
1500            &     "Please, check parameter value in run.def. ")
1501    END IF
1502
1503
[947]1504    !! 3 Other array allocation
1505
1506
[2483]1507    ALLOCATE (mask_veget(kjpindex,nvm),stat=ier)
1508    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mask_veget','','')
[947]1509
[2483]1510    ALLOCATE (mask_soiltile(kjpindex,nstm),stat=ier)
1511    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mask_soiltile','','')
[947]1512
[2483]1513    ALLOCATE (humrelv(kjpindex,nvm,nstm),stat=ier)
1514    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable humrelv','','')
[8]1515
1516    ALLOCATE (vegstressv(kjpindex,nvm,nstm),stat=ier) 
[2483]1517    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable vegstressv','','')
[8]1518
1519    ALLOCATE (us(kjpindex,nvm,nstm,nslm),stat=ier) 
[2483]1520    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable us','','')
[8]1521
1522    ALLOCATE (precisol(kjpindex,nvm),stat=ier) 
[2483]1523    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable precisol','','')
[8]1524
[4753]1525    ALLOCATE (throughfall(kjpindex,nvm),stat=ier) 
1526    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable throughfall','','')
1527
[8]1528    ALLOCATE (precisol_ns(kjpindex,nstm),stat=ier) 
[2483]1529    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable precisol_nc','','')
[8]1530
1531    ALLOCATE (free_drain_coef(kjpindex,nstm),stat=ier) 
[2483]1532    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable free_drain_coef','','')
[8]1533
[3402]1534    ALLOCATE (zwt_force(kjpindex,nstm),stat=ier) 
1535    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable zwt_force','','')
1536
[947]1537    ALLOCATE (frac_bare_ns(kjpindex,nstm),stat=ier) 
[2483]1538    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable frac_bare_ns','','')
[947]1539
1540    ALLOCATE (water2infilt(kjpindex,nstm),stat=ier)
[2483]1541    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable water2infilt','','')
[947]1542
[8]1543    ALLOCATE (ae_ns(kjpindex,nstm),stat=ier) 
[2483]1544    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable ae_ns','','')
[8]1545
1546    ALLOCATE (rootsink(kjpindex,nslm,nstm),stat=ier) 
[2483]1547    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable rootsink','','')
[8]1548
1549    ALLOCATE (subsnowveg(kjpindex),stat=ier) 
[2483]1550    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable subsnowveg','','')
[8]1551
1552    ALLOCATE (subsnownobio(kjpindex,nnobio),stat=ier) 
[2483]1553    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable subsnownobio','','')
[8]1554
1555    ALLOCATE (icemelt(kjpindex),stat=ier) 
[2483]1556    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable icemelt','','')
[8]1557
1558    ALLOCATE (subsinksoil(kjpindex),stat=ier) 
[2483]1559    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable subsinksoil','','')
[8]1560
1561    ALLOCATE (mx_eau_var(kjpindex),stat=ier)
[2483]1562    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mx_eau_var','','')
[8]1563
1564    ALLOCATE (vegtot(kjpindex),stat=ier) 
[2483]1565    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable vegtot','','')
[8]1566
[3969]1567    ALLOCATE (vegtot_old(kjpindex),stat=ier) 
1568    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable vegtot_old','','')
1569
[1118]1570    ALLOCATE (resdist(kjpindex,nstm),stat=ier)
[2483]1571    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable resdist','','')
[8]1572
1573    ALLOCATE (humtot(kjpindex),stat=ier)
[2483]1574    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable humtot','','')
[8]1575
1576    ALLOCATE (resolv(kjpindex),stat=ier) 
[2483]1577    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable resolv','','')
[8]1578
[947]1579    ALLOCATE (k(kjpindex,nslm),stat=ier) 
[2483]1580    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable k','','')
[947]1581
[4764]1582    ALLOCATE (kk_moy(kjpindex,nslm),stat=ier) 
1583    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable kk_moy','','')
1584    kk_moy(:,:) = 276.48
1585   
1586    ALLOCATE (kk(kjpindex,nslm,nstm),stat=ier) 
1587    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable kk','','')
1588    kk(:,:,:) = 276.48
1589   
[6954]1590    ALLOCATE (avan_mod_tab(nslm,kjpindex),stat=ier) 
[4812]1591    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable avan_mod_tab','','')
1592   
[6954]1593    ALLOCATE (nvan_mod_tab(nslm,kjpindex),stat=ier) 
[4812]1594    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable nvan_mod_tab','','')
1595
[8]1596    ALLOCATE (a(kjpindex,nslm),stat=ier) 
[2483]1597    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable a','','')
[8]1598
1599    ALLOCATE (b(kjpindex,nslm),stat=ier)
[2483]1600    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable b','','')
[8]1601
1602    ALLOCATE (d(kjpindex,nslm),stat=ier)
[2483]1603    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable d','','')
[8]1604
1605    ALLOCATE (e(kjpindex,nslm),stat=ier) 
[2483]1606    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable e','','')
[8]1607
1608    ALLOCATE (f(kjpindex,nslm),stat=ier) 
[2483]1609    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable f','','')
[8]1610
1611    ALLOCATE (g1(kjpindex,nslm),stat=ier) 
[2483]1612    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable g1','','')
[8]1613
1614    ALLOCATE (ep(kjpindex,nslm),stat=ier)
[2483]1615    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable ep','','')
[8]1616
1617    ALLOCATE (fp(kjpindex,nslm),stat=ier)
[2483]1618    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable fp','','')
[8]1619
1620    ALLOCATE (gp(kjpindex,nslm),stat=ier)
[2483]1621    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable gp','','')
[8]1622
1623    ALLOCATE (rhs(kjpindex,nslm),stat=ier)
[2483]1624    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable rhs','','')
[8]1625
1626    ALLOCATE (srhs(kjpindex,nslm),stat=ier)
[2483]1627    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable srhs','','')
[8]1628
1629    ALLOCATE (tmc(kjpindex,nstm),stat=ier)
[2483]1630    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc','','')
[8]1631
[947]1632    ALLOCATE (tmcs(kjpindex,nstm),stat=ier)
[2483]1633    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmcs','','')
[8]1634
[947]1635    ALLOCATE (tmcr(kjpindex,nstm),stat=ier)
[2483]1636    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmcr','','')
[947]1637
[4724]1638    ALLOCATE (tmcfc(kjpindex,nstm),stat=ier)
1639    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmcfc','','')
1640
1641    ALLOCATE (tmcw(kjpindex,nstm),stat=ier)
1642    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmcw','','')
1643
[8]1644    ALLOCATE (tmc_litter(kjpindex,nstm),stat=ier)
[2483]1645    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litter','','')
[8]1646
1647    ALLOCATE (tmc_litt_mea(kjpindex),stat=ier)
[2483]1648    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litt_mea','','')
[8]1649
1650    ALLOCATE (tmc_litter_res(kjpindex,nstm),stat=ier)
[2483]1651    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litter_res','','')
[8]1652
1653    ALLOCATE (tmc_litter_wilt(kjpindex,nstm),stat=ier)
[2483]1654    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litter_wilt','','')
[8]1655
1656    ALLOCATE (tmc_litter_field(kjpindex,nstm),stat=ier)
[2483]1657    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litter_field','','')
[8]1658
1659    ALLOCATE (tmc_litter_sat(kjpindex,nstm),stat=ier)
[2483]1660    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litter_sat','','')
[8]1661
1662    ALLOCATE (tmc_litter_awet(kjpindex,nstm),stat=ier)
[2483]1663    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litter_awet','','')
[8]1664
1665    ALLOCATE (tmc_litter_adry(kjpindex,nstm),stat=ier)
[2483]1666    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litter_adry','','')
[8]1667
1668    ALLOCATE (tmc_litt_wet_mea(kjpindex),stat=ier)
[2483]1669    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litt_wet_mea','','')
[8]1670
1671    ALLOCATE (tmc_litt_dry_mea(kjpindex),stat=ier)
[2483]1672    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_litt_dry_mea','','')
[8]1673
1674    ALLOCATE (v1(kjpindex,nstm),stat=ier)
[2483]1675    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable v1','','')
[8]1676
1677    ALLOCATE (ru_ns(kjpindex,nstm),stat=ier)
[2483]1678    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable ru_ns','','')
[8]1679    ru_ns(:,:) = zero
1680
1681    ALLOCATE (dr_ns(kjpindex,nstm),stat=ier)
[2483]1682    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable dr_ns','','')
[8]1683    dr_ns(:,:) = zero
1684
1685    ALLOCATE (tr_ns(kjpindex,nstm),stat=ier)
[2483]1686    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tr_ns','','')
[8]1687
[3687]1688    ALLOCATE (vegetmax_soil(kjpindex,nvm,nstm),stat=ier)
1689    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable vegetmax_soil','','')
[8]1690
1691    ALLOCATE (mc(kjpindex,nslm,nstm),stat=ier)
[2483]1692    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mc','','')
[8]1693
[4565]1694
1695    ! Variables for nudging of soil moisture
1696    IF (ok_nudge_mc) THEN
1697       ALLOCATE (mc_read_prev(kjpindex,nslm,nstm),stat=ier)
1698       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mc_read_prev','','')
1699       ALLOCATE (mc_read_next(kjpindex,nslm,nstm),stat=ier)
1700       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mc_read_next','','')
[5450]1701       ALLOCATE (mc_read_current(kjpindex,nslm,nstm),stat=ier)
1702       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mc_read_current','','')
[4565]1703       ALLOCATE (mask_mc_interp(kjpindex,nslm,nstm),stat=ier)
1704       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mask_mc_interp','','')
[5450]1705       ALLOCATE (tmc_aux(kjpindex,nstm),stat=ier)
1706       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmc_aux','','')
[4565]1707    END IF
1708
1709    ! Variables for nudging of snow variables
1710    IF (ok_nudge_snow) THEN
1711       ALLOCATE (snowdz_read_prev(kjpindex,nsnow),stat=ier)
1712       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snowdz_read_prev','','')
1713       ALLOCATE (snowdz_read_next(kjpindex,nsnow),stat=ier)
1714       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snowdz_read_next','','')
1715       
1716       ALLOCATE (snowrho_read_prev(kjpindex,nsnow),stat=ier)
1717       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snowrho_read_prev','','')
1718       ALLOCATE (snowrho_read_next(kjpindex,nsnow),stat=ier)
1719       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snowrho_read_next','','')
1720       
1721       ALLOCATE (snowtemp_read_prev(kjpindex,nsnow),stat=ier)
1722       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snowtemp_read_prev','','')
1723       ALLOCATE (snowtemp_read_next(kjpindex,nsnow),stat=ier)
1724       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snowtemp_read_next','','')
1725       
1726       ALLOCATE (mask_snow_interp(kjpindex,nsnow),stat=ier)
1727       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mask_snow_interp','','')
1728    END IF
1729
[3402]1730    ALLOCATE (mcl(kjpindex, nslm, nstm),stat=ier)
1731    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mcl','','')
1732
1733    IF (ok_freeze_cwrr) THEN
1734       ALLOCATE (profil_froz_hydro(kjpindex, nslm),stat=ier)
1735       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable profil_froz_hydrol','','')
1736       profil_froz_hydro(:,:) = zero
1737    ENDIF
1738   
1739    ALLOCATE (profil_froz_hydro_ns(kjpindex, nslm, nstm),stat=ier)
1740    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable profil_froz_hydro_ns','','')
1741    profil_froz_hydro_ns(:,:,:) = zero
1742   
[8]1743    ALLOCATE (soilmoist(kjpindex,nslm),stat=ier)
[2483]1744    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable soilmoist','','')
[8]1745
[4650]1746    ALLOCATE (soilmoist_liquid(kjpindex,nslm),stat=ier)
1747    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable soilmoist_liquid','','')
1748
[4534]1749    ALLOCATE (soil_wet_ns(kjpindex,nslm,nstm),stat=ier)
1750    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable soil_wet_ns','','')
[8]1751
1752    ALLOCATE (soil_wet_litter(kjpindex,nstm),stat=ier)
[2483]1753    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable soil_wet_litter','','')
[8]1754
[5506]1755    ALLOCATE (qflux_ns(kjpindex,nslm,nstm),stat=ier) 
1756    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable qflux_ns','','')
[8]1757
[5506]1758    ALLOCATE (check_top_ns(kjpindex,nstm),stat=ier) 
1759    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable check_top_ns','','')
1760
[8]1761    ALLOCATE (tmat(kjpindex,nslm,3),stat=ier)
[2483]1762    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tmat','','')
[8]1763
1764    ALLOCATE (stmat(kjpindex,nslm,3),stat=ier)
[2483]1765    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable stmat','','')
[8]1766
[4363]1767    ALLOCATE (nroot(kjpindex,nvm, nslm),stat=ier)
[2483]1768    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable nroot','','')
[947]1769
1770    ALLOCATE (kfact_root(kjpindex, nslm, nstm), stat=ier)
[2483]1771    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable kfact_root','','')
[947]1772
[6954]1773    ALLOCATE (kfact(nslm, kjpindex),stat=ier)
[2483]1774    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable kfact','','')
[947]1775
[4210]1776    ALLOCATE (zz(nslm),stat=ier)
[2483]1777    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable zz','','')
[947]1778
[2928]1779    ALLOCATE (dz(nslm),stat=ier)
[2483]1780    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable dz','','')
[3402]1781   
[2917]1782    ALLOCATE (dh(nslm),stat=ier)
1783    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable dh','','')
1784
[6954]1785    ALLOCATE (mc_lin(imin:imax, kjpindex),stat=ier)
[2483]1786    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable mc_lin','','')
[947]1787
[6954]1788    ALLOCATE (k_lin(imin:imax, nslm, kjpindex),stat=ier)
[2483]1789    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable k_lin','','')
[947]1790
[6954]1791    ALLOCATE (d_lin(imin:imax, nslm, kjpindex),stat=ier)
[2483]1792    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable d_lin','','')
[947]1793
[6954]1794    ALLOCATE (a_lin(imin:imax, nslm, kjpindex),stat=ier)
[2483]1795    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable a_lin','','')
[947]1796
[6954]1797    ALLOCATE (b_lin(imin:imax, nslm, kjpindex),stat=ier)
[2483]1798    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable b_lin','','')
[947]1799
[3402]1800    ALLOCATE (undermcr(kjpindex),stat=ier)
1801    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable undermcr','','')
1802
[3006]1803    ALLOCATE (tot_watveg_beg(kjpindex),stat=ier)
1804    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tot_watveg_beg','','')
1805   
1806    ALLOCATE (tot_watveg_end(kjpindex),stat=ier)
1807    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tot_watvag_end','','')
1808   
1809    ALLOCATE (tot_watsoil_beg(kjpindex),stat=ier)
1810    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tot_watsoil_beg','','')
1811   
1812    ALLOCATE (tot_watsoil_end(kjpindex),stat=ier)
1813    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable tot_watsoil_end','','')
1814   
1815    ALLOCATE (delsoilmoist(kjpindex),stat=ier)
1816    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable delsoilmoist','','')
1817   
1818    ALLOCATE (delintercept(kjpindex),stat=ier)
1819    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable delintercept','','')
1820   
1821    ALLOCATE (delswe(kjpindex),stat=ier)
1822    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable delswe','','')
1823   
1824    ALLOCATE (snow_beg(kjpindex),stat=ier)
1825    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snow_beg','','')
1826   
1827    ALLOCATE (snow_end(kjpindex),stat=ier)
1828    IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable snow_end','','')
1829   
[947]1830    !! 4 Open restart input file and read data for HYDROLOGIC process
[2348]1831       IF (printlev>=3) WRITE (numout,*) ' we have to read a restart file for HYDROLOGIC variables'
[8]1832
[1078]1833       IF (is_root_prc) CALL ioconf_setatt_p('UNITS', '-')
[8]1834       !
1835       DO jst=1,nstm
1836          ! var_name= "mc_1" ... "mc_3"
1837           WRITE (var_name,"('moistc_',I1)") jst
[1078]1838           IF (is_root_prc) CALL ioconf_setatt_p('LONG_NAME',var_name)
[8]1839           CALL restget_p (rest_id, var_name, nbp_glo, nslm , 1, kjit, .TRUE., mc(:,:,jst), "gather", nbp_glo, index_g)
1840       END DO
[4565]1841
1842       IF (ok_nudge_mc) THEN
1843          DO jst=1,nstm
1844             WRITE (var_name,"('mc_read_next_',I1)") jst
1845             IF (is_root_prc) CALL ioconf_setatt_p('LONG_NAME','Soil moisture read from nudging file')
1846             CALL restget_p (rest_id, var_name, nbp_glo, nslm , 1, kjit, .TRUE., mc_read_next(:,:,jst), &
1847                  "gather", nbp_glo, index_g)
1848          END DO
1849       END IF
1850
1851       IF (ok_nudge_snow) THEN
1852          IF (is_root_prc) THEN
1853             CALL ioconf_setatt_p('UNITS', 'm')
1854             CALL ioconf_setatt_p('LONG_NAME','Snow layer thickness read from nudging file')
1855          ENDIF
1856          CALL restget_p (rest_id, 'snowdz_read_next', nbp_glo, nsnow, 1, kjit, .TRUE., snowdz_read_next, &
1857               "gather", nbp_glo, index_g)
1858
1859          IF (is_root_prc) THEN
1860             CALL ioconf_setatt_p('UNITS', 'kg/m^3')
1861             CALL ioconf_setatt_p('LONG_NAME','Snow density profile read from nudging file')
1862          ENDIF
1863          CALL restget_p (rest_id, 'snowrho_read_next', nbp_glo, nsnow, 1, kjit, .TRUE., snowrho_read_next, &
1864               "gather", nbp_glo, index_g)
1865
1866          IF (is_root_prc) THEN
1867             CALL ioconf_setatt_p('UNITS', 'K')
1868             CALL ioconf_setatt_p('LONG_NAME','Snow temperature read from nudging file')
1869          ENDIF
1870          CALL restget_p (rest_id, 'snowtemp_read_next', nbp_glo, nsnow, 1, kjit, .TRUE., snowtemp_read_next, &
1871               "gather", nbp_glo, index_g)
1872       END IF
1873     
[3402]1874       DO jst=1,nstm
1875          ! var_name= "mcl_1" ... "mcl_3"
1876           WRITE (var_name,"('moistcl_',I1)") jst
1877           IF (is_root_prc) CALL ioconf_setatt_p('LONG_NAME',var_name)
1878           CALL restget_p (rest_id, var_name, nbp_glo, nslm , 1, kjit, .TRUE., mcl(:,:,jst), "gather", nbp_glo, index_g)
1879       END DO
1880
[1078]1881       IF (is_root_prc) CALL ioconf_setatt_p('UNITS', '-')
[8]1882       DO jst=1,nstm
1883          DO jsl=1,nslm
1884             ! var_name= "us_1_01" ... "us_3_11"
1885             WRITE (var_name,"('us_',i1,'_',i2.2)") jst,jsl
[1078]1886             IF (is_root_prc) CALL ioconf_setatt_p('LONG_NAME',var_name)
[8]1887             CALL restget_p (rest_id, var_name, nbp_glo, nvm, 1, kjit, .TRUE., us(:,:,jst,jsl), "gather", nbp_glo, index_g)
1888          END DO
1889       END DO
1890       !
1891       var_name= 'free_drain_coef'
[947]1892       IF (is_root_prc) THEN
[1078]1893          CALL ioconf_setatt_p('UNITS', '-')
1894          CALL ioconf_setatt_p('LONG_NAME','Coefficient for free drainage at bottom of soil')
[947]1895       ENDIF
[8]1896       CALL restget_p (rest_id, var_name, nbp_glo, nstm, 1, kjit, .TRUE., free_drain_coef, "gather", nbp_glo, index_g)
1897       !
[3402]1898       var_name= 'zwt_force'
1899       IF (is_root_prc) THEN
1900          CALL ioconf_setatt_p('UNITS', 'm')
1901          CALL ioconf_setatt_p('LONG_NAME','Prescribed water table depth')
1902       ENDIF
1903       CALL restget_p (rest_id, var_name, nbp_glo, nstm, 1, kjit, .TRUE., zwt_force, "gather", nbp_glo, index_g)
1904       !
[947]1905       var_name= 'water2infilt'
1906       IF (is_root_prc) THEN
[1078]1907          CALL ioconf_setatt_p('UNITS', '-')
1908          CALL ioconf_setatt_p('LONG_NAME','Remaining water to be infiltrated on top of the soil')
[947]1909       ENDIF
1910       CALL restget_p (rest_id, var_name, nbp_glo, nstm, 1, kjit, .TRUE., water2infilt, "gather", nbp_glo, index_g)
1911       !
[8]1912       var_name= 'ae_ns'
[947]1913       IF (is_root_prc) THEN
[1078]1914          CALL ioconf_setatt_p('UNITS', 'kg/m^2')
1915          CALL ioconf_setatt_p('LONG_NAME','Bare soil evap on each soil type')
[947]1916       ENDIF
[8]1917       CALL restget_p (rest_id, var_name, nbp_glo, nstm, 1, kjit, .TRUE., ae_ns, "gather", nbp_glo, index_g)
1918       !
1919       var_name= 'snow'       
[947]1920       IF (is_root_prc) THEN
[1078]1921          CALL ioconf_setatt_p('UNITS', 'kg/m^2')
1922          CALL ioconf_setatt_p('LONG_NAME','Snow mass')
[947]1923       ENDIF
[8]1924       CALL restget_p (rest_id, var_name, nbp_glo, 1  , 1, kjit, .TRUE., snow, "gather", nbp_glo, index_g)
1925       !
1926       var_name= 'snow_age'
[947]1927       IF (is_root_prc) THEN
[1078]1928          CALL ioconf_setatt_p('UNITS', 'd')
1929          CALL ioconf_setatt_p('LONG_NAME','Snow age')
[947]1930       ENDIF
[8]1931       CALL restget_p (rest_id, var_name, nbp_glo, 1  , 1, kjit, .TRUE., snow_age, "gather", nbp_glo, index_g)
1932       !
1933       var_name= 'snow_nobio'
[947]1934       IF (is_root_prc) THEN
[1078]1935          CALL ioconf_setatt_p('UNITS', 'kg/m^2')
1936          CALL ioconf_setatt_p('LONG_NAME','Snow on other surface types')
[947]1937       ENDIF
[8]1938       CALL restget_p (rest_id, var_name, nbp_glo, nnobio  , 1, kjit, .TRUE., snow_nobio, "gather", nbp_glo, index_g)
1939       !
1940       var_name= 'snow_nobio_age'
[947]1941       IF (is_root_prc) THEN
[1078]1942          CALL ioconf_setatt_p('UNITS', 'd')
1943          CALL ioconf_setatt_p('LONG_NAME','Snow age on other surface types')
[947]1944       ENDIF
[8]1945       CALL restget_p (rest_id, var_name, nbp_glo, nnobio  , 1, kjit, .TRUE., snow_nobio_age, "gather", nbp_glo, index_g)
1946       !
1947       var_name= 'qsintveg'
[947]1948       IF (is_root_prc) THEN
[1078]1949          CALL ioconf_setatt_p('UNITS', 'kg/m^2')
1950          CALL ioconf_setatt_p('LONG_NAME','Intercepted moisture')
[947]1951       ENDIF
[8]1952       CALL restget_p (rest_id, var_name, nbp_glo, nvm, 1, kjit, .TRUE., qsintveg, "gather", nbp_glo, index_g)
[2222]1953
[2435]1954       var_name= 'evap_bare_lim_ns'
1955       IF (is_root_prc) THEN
1956          CALL ioconf_setatt_p('UNITS', '?')
1957          CALL ioconf_setatt_p('LONG_NAME','?')
1958       ENDIF
1959       CALL restget_p (rest_id, var_name, nbp_glo, nstm, 1, kjit, .TRUE., evap_bare_lim_ns, "gather", nbp_glo, index_g)
1960       CALL setvar_p (evap_bare_lim_ns, val_exp, 'NO_KEYWORD', 0.0)
[2222]1961
[8]1962       var_name= 'resdist'
[947]1963       IF (is_root_prc) THEN
[1078]1964          CALL ioconf_setatt_p('UNITS', '-')
[2399]1965          CALL ioconf_setatt_p('LONG_NAME','soiltile values from previous time-step')
[947]1966       ENDIF
[1118]1967       CALL restget_p (rest_id, var_name, nbp_glo, nstm, 1, kjit, .TRUE., resdist, "gather", nbp_glo, index_g)
[3969]1968
1969       var_name= 'vegtot_old'
1970       IF (is_root_prc) THEN
1971          CALL ioconf_setatt_p('UNITS', '-')
1972          CALL ioconf_setatt_p('LONG_NAME','vegtot from previous time-step')
1973       ENDIF
1974       CALL restget_p (rest_id, var_name, nbp_glo, 1, 1, kjit, .TRUE., vegtot_old, "gather", nbp_glo, index_g)       
[2222]1975       
[2868]1976       ! Read drysoil_frac. It will be initalized later in hydrol_var_init if the varaible is not find in restart file.
1977       IF (is_root_prc) THEN
1978          CALL ioconf_setatt_p('UNITS', '')
1979          CALL ioconf_setatt_p('LONG_NAME','Function of litter wetness')
1980       ENDIF
1981       CALL restget_p (rest_id, 'drysoil_frac', nbp_glo, 1  , 1, kjit, .TRUE., drysoil_frac, "gather", nbp_glo, index_g)
[947]1982
[2868]1983
[947]1984    !! 5 get restart values if none were found in the restart file
[8]1985       !
[566]1986       !Config Key   = HYDROL_MOISTURE_CONTENT
1987       !Config Desc  = Soil moisture on each soil tile and levels
[5454]1988       !Config If    =
[566]1989       !Config Def   = 0.3
1990       !Config Help  = The initial value of mc if its value is not found
1991       !Config         in the restart file. This should only be used if the model is
1992       !Config         started without a restart file.
[2589]1993       !Config Units = [m3/m3]
[8]1994       !
1995       CALL setvar_p (mc, val_exp, 'HYDROL_MOISTURE_CONTENT', 0.3_r_std)
[3402]1996
1997       ! Initialize mcl as mc if it is not found in the restart file
1998       IF ( ALL(mcl(:,:,:)==val_exp) ) THEN
1999          mcl(:,:,:) = mc(:,:,:)
2000       END IF
2001
[4565]2002
[3402]2003       
[566]2004       !Config Key   = US_INIT
2005       !Config Desc  = US_NVM_NSTM_NSLM
[5454]2006       !Config If    =
[566]2007       !Config Def   = 0.0
[947]2008       !Config Help  = The initial value of us (relative moisture) if its value is not found
[566]2009       !Config         in the restart file. This should only be used if the model is
2010       !Config         started without a restart file.
[2589]2011       !Config Units = [-]
[8]2012       !
2013       DO jsl=1,nslm
[42]2014          CALL setvar_p (us(:,:,:,jsl), val_exp, 'US_INIT', zero)
[8]2015       ENDDO
2016       !
[3402]2017       !Config Key   = ZWT_FORCE
2018       !Config Desc  = Prescribed water depth, dimension nstm
[5454]2019       !Config If    =
[3402]2020       !Config Def   = undef undef undef
2021       !Config Help  = The initial value of zwt_force if its value is not found
2022       !Config         in the restart file. undef corresponds to a case whith no forced WT.
2023       !Config         This should only be used if the model is started without a restart file.
2024       !Config Units = [m]
2025       
2026       ALLOCATE (zwt_default(nstm),stat=ier)
2027       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable zwt_default','','')
2028       zwt_default(:) = undef_sechiba
2029       CALL setvar_p (zwt_force, val_exp, 'ZWT_FORCE', zwt_default )
2030
2031       zforce = .FALSE.
2032       DO jst=1,nstm
2033          IF (zwt_force(1,jst) <= zmaxh) zforce = .TRUE. ! AD16*** check if OK with vertical_soil
2034       ENDDO
2035       !
[566]2036       !Config Key   = FREE_DRAIN_COEF
[2344]2037       !Config Desc  = Coefficient for free drainage at bottom, dimension nstm
[5454]2038       !Config If    =
[2344]2039       !Config Def   = 1.0 1.0 1.0
2040       !Config Help  = The initial value of free drainage coefficient if its value is not found
[566]2041       !Config         in the restart file. This should only be used if the model is
2042       !Config         started without a restart file.
[2344]2043       !Config Units = [-]
2044             
2045       ALLOCATE (free_drain_max(nstm),stat=ier)
[2483]2046       IF (ier /= 0) CALL ipslerr_p(3,'hydrol_init','Problem in allocate of variable free_drain_max','','')
[2344]2047       free_drain_max(:)=1.0
[2589]2048
[8]2049       CALL setvar_p (free_drain_coef, val_exp, 'FREE_DRAIN_COEF', free_drain_max)
[3941]2050       IF (printlev>=2) WRITE (numout,*) ' hydrol_init => free_drain_coef = ',free_drain_coef(1,:)
[2344]2051       DEALLOCATE(free_drain_max)
2052
[8]2053       !
[947]2054       !Config Key   = WATER_TO_INFILT
2055       !Config Desc  = Water to be infiltrated on top of the soil
[5454]2056       !Config If    =
[947]2057       !Config Def   = 0.0
2058       !Config Help  = The initial value of free drainage if its value is not found
2059       !Config         in the restart file. This should only be used if the model is
2060       !Config         started without a restart file.
[2589]2061       !Config Units = [mm]
[947]2062       !
2063       CALL setvar_p (water2infilt, val_exp, 'WATER_TO_INFILT', zero)
2064       !
[566]2065       !Config Key   = EVAPNU_SOIL
2066       !Config Desc  = Bare soil evap on each soil if not found in restart
[5454]2067       !Config If    =
[566]2068       !Config Def   = 0.0
2069       !Config Help  = The initial value of bare soils evap if its value is not found
2070       !Config         in the restart file. This should only be used if the model is
2071       !Config         started without a restart file.
[2589]2072       !Config Units = [mm]
[8]2073       !
[42]2074       CALL setvar_p (ae_ns, val_exp, 'EVAPNU_SOIL', zero)
[8]2075       !
[947]2076       !Config Key  = HYDROL_SNOW
[566]2077       !Config Desc  = Initial snow mass if not found in restart
2078       !Config If    = OK_SECHIBA
2079       !Config Def   = 0.0
2080       !Config Help  = The initial value of snow mass if its value is not found
2081       !Config         in the restart file. This should only be used if the model is
2082       !Config         started without a restart file.
2083       !Config Units =
[8]2084       !
[42]2085       CALL setvar_p (snow, val_exp, 'HYDROL_SNOW', zero)
[8]2086       !
[566]2087       !Config Key   = HYDROL_SNOWAGE
2088       !Config Desc  = Initial snow age if not found in restart
2089       !Config If    = OK_SECHIBA
2090       !Config Def   = 0.0
2091       !Config Help  = The initial value of snow age if its value is not found
2092       !Config         in the restart file. This should only be used if the model is
2093       !Config         started without a restart file.
[2589]2094       !Config Units = ***
[8]2095       !
[42]2096       CALL setvar_p (snow_age, val_exp, 'HYDROL_SNOWAGE', zero)
[8]2097       !
[566]2098       !Config Key   = HYDROL_SNOW_NOBIO
2099       !Config Desc  = Initial snow amount on ice, lakes, etc. if not found in restart
2100       !Config If    = OK_SECHIBA
2101       !Config Def   = 0.0
2102       !Config Help  = The initial value of snow if its value is not found
2103       !Config         in the restart file. This should only be used if the model is
2104       !Config         started without a restart file.
[2589]2105       !Config Units = [mm]
[8]2106       !
[42]2107       CALL setvar_p (snow_nobio, val_exp, 'HYDROL_SNOW_NOBIO', zero)
[8]2108       !
[566]2109       !Config Key   = HYDROL_SNOW_NOBIO_AGE
2110       !Config Desc  = Initial snow age on ice, lakes, etc. if not found in restart
2111       !Config If    = OK_SECHIBA
2112       !Config Def   = 0.0
2113       !Config Help  = The initial value of snow age if its value is not found
2114       !Config         in the restart file. This should only be used if the model is
2115       !Config         started without a restart file.
[2589]2116       !Config Units = ***
[8]2117       !
[42]2118       CALL setvar_p (snow_nobio_age, val_exp, 'HYDROL_SNOW_NOBIO_AGE', zero)
[8]2119       !
[566]2120       !Config Key   = HYDROL_QSV
2121       !Config Desc  = Initial water on canopy if not found in restart
2122       !Config If    = OK_SECHIBA
2123       !Config Def   = 0.0
2124       !Config Help  = The initial value of moisture on canopy if its value
2125       !Config         is not found in the restart file. This should only be used if
2126       !Config         the model is started without a restart file.
[2589]2127       !Config Units = [mm]
[8]2128       !
[42]2129       CALL setvar_p (qsintveg, val_exp, 'HYDROL_QSV', zero)
[947]2130
2131    !! 6 Vegetation array     
[8]2132       !
[2435]2133       ! If resdist is not in restart file, initialize with soiltile
[8]2134       IF ( MINVAL(resdist) .EQ.  MAXVAL(resdist) .AND. MINVAL(resdist) .EQ. val_exp) THEN
[1118]2135          resdist(:,:) = soiltile(:,:)
[8]2136       ENDIF
[3969]2137       
[8]2138       !
[947]2139       !  Remember that it is only frac_nobio + SUM(veget_max(,:)) that is equal to 1. Thus we need vegtot
[8]2140       !
[4215]2141       IF ( ALL(vegtot_old(:) == val_exp) ) THEN
2142          ! vegtot_old was not found in restart file
2143          DO ji = 1, kjpindex
[4261]2144             vegtot_old(ji) = SUM(veget_max(ji,:))
[4215]2145          ENDDO
[3969]2146       ENDIF
2147       
[4215]2148       ! In the initialization phase, vegtot must take the value from previous time-step.
2149       ! This is because hydrol_main is done before veget_max is updated in the end of the time step.
2150       vegtot(:) = vegtot_old(:)
2151       
[8]2152       !
2153       !
2154       ! compute the masks for veget
2155
2156       mask_veget(:,:) = 0
[947]2157       mask_soiltile(:,:) = 0
[8]2158
[947]2159       DO jst=1,nstm
2160          DO ji = 1, kjpindex
2161             IF(soiltile(ji,jst) .GT. min_sechiba) THEN
2162                mask_soiltile(ji,jst) = 1
[8]2163             ENDIF
2164          END DO
[947]2165       ENDDO
[8]2166         
[947]2167       DO jv = 1, nvm
2168          DO ji = 1, kjpindex
2169             IF(veget_max(ji,jv) .GT. min_sechiba) THEN
[8]2170                mask_veget(ji,jv) = 1
2171             ENDIF
2172          END DO
[947]2173       END DO
[8]2174
2175       humrelv(:,:,:) = SUM(us,dim=4)
2176
[3473]2177         
2178       !! 7a. Set vegstress
[3969]2179     
[3473]2180       var_name= 'vegstress'
2181       IF (is_root_prc) THEN
2182          CALL ioconf_setatt_p('UNITS', '-')
2183          CALL ioconf_setatt_p('LONG_NAME','Vegetation growth moisture stress')
2184       ENDIF
2185       CALL restget_p (rest_id, var_name, nbp_glo, nvm, 1, kjit, .TRUE., vegstress, "gather", nbp_glo, index_g)
2186
2187       vegstressv(:,:,:) = humrelv(:,:,:)
2188       ! Calculate vegstress if it is not found in restart file
2189       IF (ALL(vegstress(:,:)==val_exp)) THEN
[8]2190          DO jv=1,nvm
2191             DO ji=1,kjpindex
[3473]2192                vegstress(ji,jv)=vegstress(ji,jv) + vegstressv(ji,jv,pref_soil_veg(jv))
[2868]2193             END DO
2194          END DO
[3473]2195       END IF
2196       !! 7b. Set humrel   
[2868]2197       ! Read humrel from restart file
2198       var_name= 'humrel'
2199       IF (is_root_prc) THEN
2200          CALL ioconf_setatt_p('UNITS', '')
2201          CALL ioconf_setatt_p('LONG_NAME','Relative humidity')
2202       ENDIF
2203       CALL restget_p (rest_id, var_name, nbp_glo, nvm, 1, kjit, .TRUE., humrel, "gather", nbp_glo, index_g)
[8]2204
[2868]2205       ! Calculate humrel if it is not found in restart file
2206       IF (ALL(humrel(:,:)==val_exp)) THEN
2207          ! set humrel from humrelv, assuming equi-repartition for the first time step
2208          humrel(:,:) = zero
[3473]2209          DO jv=1,nvm
2210             DO ji=1,kjpindex
2211                humrel(ji,jv)=humrel(ji,jv) + humrelv(ji,jv,pref_soil_veg(jv))     
[8]2212             END DO
2213          END DO
[2868]2214       END IF
2215
2216       ! Read evap_bare_lim from restart file
2217       var_name= 'evap_bare_lim'
2218       IF (is_root_prc) THEN
2219          CALL ioconf_setatt_p('UNITS', '')
2220          CALL ioconf_setatt_p('LONG_NAME','Limitation factor for bare soil evaporation')
2221       ENDIF
2222       CALL restget_p (rest_id, var_name, nbp_glo, 1, 1, kjit, .TRUE., evap_bare_lim, "gather", nbp_glo, index_g)
2223
2224       ! Calculate evap_bare_lim if it was not found in the restart file.
2225       IF ( ALL(evap_bare_lim(:) == val_exp) ) THEN
2226          DO ji = 1, kjpindex
2227             evap_bare_lim(ji) =  SUM(evap_bare_lim_ns(ji,:)*vegtot(ji)*soiltile(ji,:))
2228          ENDDO
2229       END IF
2230
2231
[3006]2232    ! Read from restart file       
2233    ! The variables tot_watsoil_beg, tot_watsoil_beg and snwo_beg will be initialized in the end of
2234    ! hydrol_initialize if they were not found in the restart file.
[2868]2235       
[3006]2236    var_name= 'tot_watveg_beg'
2237    IF (is_root_prc) THEN
2238       CALL ioconf_setatt_p('UNITS', '?')
2239       CALL ioconf_setatt_p('LONG_NAME','?')
2240    ENDIF
2241    CALL restget_p (rest_id, var_name, nbp_glo, 1, 1, kjit, .TRUE., tot_watveg_beg, "gather", nbp_glo, index_g)
2242   
2243    var_name= 'tot_watsoil_beg'
2244    IF (is_root_prc) THEN
2245       CALL ioconf_setatt_p('UNITS', '?')
2246       CALL ioconf_setatt_p('LONG_NAME','?')
2247    ENDIF
2248    CALL restget_p (rest_id, var_name, nbp_glo, 1, 1, kjit, .TRUE., tot_watsoil_beg, "gather", nbp_glo, index_g)
2249   
2250    var_name= 'snow_beg'
2251    IF (is_root_prc) THEN
2252       CALL ioconf_setatt_p('UNITS', '?')
2253       CALL ioconf_setatt_p('LONG_NAME','?')
2254    ENDIF
2255    CALL restget_p (rest_id, var_name, nbp_glo, 1, 1, kjit, .TRUE., snow_beg, "gather", nbp_glo, index_g)
[2868]2256       
2257 
[2650]2258    ! Initialize variables for explictsnow module by reading restart file
[5470]2259    CALL explicitsnow_initialize( kjit,     kjpindex, rest_id,    snowrho,   &
2260         snowtemp, snowdz,   snowheat,   snowgrain)
[2650]2261
[4565]2262
2263    ! Initialize soil moisture for nudging if not found in restart file
2264    IF (ok_nudge_mc) THEN
2265       IF ( ALL(mc_read_next(:,:,:)==val_exp) ) mc_read_next(:,:,:) = mc(:,:,:)
2266    END IF
[2650]2267   
[4565]2268    ! Initialize snow variables for nudging if not found in restart file
2269    IF (ok_nudge_snow) THEN
2270       IF ( ALL(snowdz_read_next(:,:)==val_exp) ) snowdz_read_next(:,:) = snowdz(:,:)
2271       IF ( ALL(snowrho_read_next(:,:)==val_exp) ) snowrho_read_next(:,:) = snowrho(:,:)
2272       IF ( ALL(snowtemp_read_next(:,:)==val_exp) ) snowtemp_read_next(:,:) = snowtemp(:,:)
2273    END IF
2274   
2275   
[2348]2276    IF (printlev>=3) WRITE (numout,*) ' hydrol_init done '
[2650]2277   
[8]2278  END SUBROUTINE hydrol_init
[947]2279
2280
2281!! ================================================================================================================================
2282!! SUBROUTINE   : hydrol_clear
2283!!
2284!>\BRIEF        Deallocate arrays
2285!!
2286!_ ================================================================================================================================
2287!_ hydrol_clear
2288
[8]2289  SUBROUTINE hydrol_clear()
2290
[947]2291    ! Allocation for soiltile related parameters
[6954]2292   
[947]2293    IF ( ALLOCATED (pcent)) DEALLOCATE (pcent)
2294    IF ( ALLOCATED (mc_awet)) DEALLOCATE (mc_awet)
2295    IF ( ALLOCATED (mc_adry)) DEALLOCATE (mc_adry)
2296    ! Other arrays
[8]2297    IF (ALLOCATED (mask_veget)) DEALLOCATE (mask_veget)
[947]2298    IF (ALLOCATED (mask_soiltile)) DEALLOCATE (mask_soiltile)
[8]2299    IF (ALLOCATED (humrelv)) DEALLOCATE (humrelv)
2300    IF (ALLOCATED (vegstressv)) DEALLOCATE (vegstressv)
2301    IF (ALLOCATED (us)) DEALLOCATE (us)
2302    IF (ALLOCATED  (precisol)) DEALLOCATE (precisol)
[4753]2303    IF (ALLOCATED  (throughfall)) DEALLOCATE (throughfall)
[8]2304    IF (ALLOCATED  (precisol_ns)) DEALLOCATE (precisol_ns)
2305    IF (ALLOCATED  (free_drain_coef)) DEALLOCATE (free_drain_coef)
[947]2306    IF (ALLOCATED  (frac_bare_ns)) DEALLOCATE (frac_bare_ns)
2307    IF (ALLOCATED  (water2infilt)) DEALLOCATE (water2infilt)
[8]2308    IF (ALLOCATED  (ae_ns)) DEALLOCATE (ae_ns)
2309    IF (ALLOCATED  (rootsink)) DEALLOCATE (rootsink)
2310    IF (ALLOCATED  (subsnowveg)) DEALLOCATE (subsnowveg)
2311    IF (ALLOCATED  (subsnownobio)) DEALLOCATE (subsnownobio)
2312    IF (ALLOCATED  (icemelt)) DEALLOCATE (icemelt)
2313    IF (ALLOCATED  (subsinksoil)) DEALLOCATE (subsinksoil)
2314    IF (ALLOCATED  (mx_eau_var)) DEALLOCATE (mx_eau_var)
2315    IF (ALLOCATED  (vegtot)) DEALLOCATE (vegtot)
[3969]2316    IF (ALLOCATED  (vegtot_old)) DEALLOCATE (vegtot_old)
[8]2317    IF (ALLOCATED  (resdist)) DEALLOCATE (resdist)
2318    IF (ALLOCATED  (tot_watveg_beg)) DEALLOCATE (tot_watveg_beg)
2319    IF (ALLOCATED  (tot_watveg_end)) DEALLOCATE (tot_watveg_end)
2320    IF (ALLOCATED  (tot_watsoil_beg)) DEALLOCATE (tot_watsoil_beg)
2321    IF (ALLOCATED  (tot_watsoil_end)) DEALLOCATE (tot_watsoil_end)
2322    IF (ALLOCATED  (delsoilmoist)) DEALLOCATE (delsoilmoist)
2323    IF (ALLOCATED  (delintercept)) DEALLOCATE (delintercept)
2324    IF (ALLOCATED  (snow_beg)) DEALLOCATE (snow_beg)
2325    IF (ALLOCATED  (snow_end)) DEALLOCATE (snow_end)
2326    IF (ALLOCATED  (delswe)) DEALLOCATE (delswe)
[3402]2327    IF (ALLOCATED  (undermcr)) DEALLOCATE (undermcr)
[8]2328    IF (ALLOCATED  (v1)) DEALLOCATE (v1)
2329    IF (ALLOCATED  (humtot)) DEALLOCATE (humtot)
2330    IF (ALLOCATED  (resolv)) DEALLOCATE (resolv)
[947]2331    IF (ALLOCATED  (k)) DEALLOCATE (k)
[2222]2332    IF (ALLOCATED  (kk)) DEALLOCATE (kk)
2333    IF (ALLOCATED  (kk_moy)) DEALLOCATE (kk_moy)
[4812]2334    IF (ALLOCATED  (avan_mod_tab)) DEALLOCATE (avan_mod_tab)
2335    IF (ALLOCATED  (nvan_mod_tab)) DEALLOCATE (nvan_mod_tab)
[8]2336    IF (ALLOCATED  (a)) DEALLOCATE (a)
2337    IF (ALLOCATED  (b)) DEALLOCATE (b)
2338    IF (ALLOCATED  (d)) DEALLOCATE (d)
2339    IF (ALLOCATED  (e)) DEALLOCATE (e)
2340    IF (ALLOCATED  (f)) DEALLOCATE (f)
2341    IF (ALLOCATED  (g1)) DEALLOCATE (g1)
2342    IF (ALLOCATED  (ep)) DEALLOCATE (ep)
2343    IF (ALLOCATED  (fp)) DEALLOCATE (fp)
2344    IF (ALLOCATED  (gp)) DEALLOCATE (gp)
2345    IF (ALLOCATED  (rhs)) DEALLOCATE (rhs)
2346    IF (ALLOCATED  (srhs)) DEALLOCATE (srhs)
2347    IF (ALLOCATED  (tmc)) DEALLOCATE (tmc)
2348    IF (ALLOCATED  (tmcs)) DEALLOCATE (tmcs)
[947]2349    IF (ALLOCATED  (tmcr)) DEALLOCATE (tmcr)
[4724]2350    IF (ALLOCATED  (tmcfc)) DEALLOCATE (tmcfc)
2351    IF (ALLOCATED  (tmcw)) DEALLOCATE (tmcw)
[8]2352    IF (ALLOCATED  (tmc_litter)) DEALLOCATE (tmc_litter)
2353    IF (ALLOCATED  (tmc_litt_mea)) DEALLOCATE (tmc_litt_mea)
2354    IF (ALLOCATED  (tmc_litter_res)) DEALLOCATE (tmc_litter_res)
2355    IF (ALLOCATED  (tmc_litter_wilt)) DEALLOCATE (tmc_litter_wilt)
2356    IF (ALLOCATED  (tmc_litter_field)) DEALLOCATE (tmc_litter_field)
2357    IF (ALLOCATED  (tmc_litter_sat)) DEALLOCATE (tmc_litter_sat)
2358    IF (ALLOCATED  (tmc_litter_awet)) DEALLOCATE (tmc_litter_awet)
2359    IF (ALLOCATED  (tmc_litter_adry)) DEALLOCATE (tmc_litter_adry)
2360    IF (ALLOCATED  (tmc_litt_wet_mea)) DEALLOCATE (tmc_litt_wet_mea)
2361    IF (ALLOCATED  (tmc_litt_dry_mea)) DEALLOCATE (tmc_litt_dry_mea)
2362    IF (ALLOCATED  (ru_ns)) DEALLOCATE (ru_ns)
2363    IF (ALLOCATED  (dr_ns)) DEALLOCATE (dr_ns)
2364    IF (ALLOCATED  (tr_ns)) DEALLOCATE (tr_ns)
[3687]2365    IF (ALLOCATED  (vegetmax_soil)) DEALLOCATE (vegetmax_soil)
[8]2366    IF (ALLOCATED  (mc)) DEALLOCATE (mc)
2367    IF (ALLOCATED  (soilmoist)) DEALLOCATE (soilmoist)
[4650]2368    IF (ALLOCATED  (soilmoist_liquid)) DEALLOCATE (soilmoist_liquid)
[4534]2369    IF (ALLOCATED  (soil_wet_ns)) DEALLOCATE (soil_wet_ns)
[8]2370    IF (ALLOCATED  (soil_wet_litter)) DEALLOCATE (soil_wet_litter)
[5506]2371    IF (ALLOCATED  (qflux_ns)) DEALLOCATE (qflux_ns)
[8]2372    IF (ALLOCATED  (tmat)) DEALLOCATE (tmat)
2373    IF (ALLOCATED  (stmat)) DEALLOCATE (stmat)
[947]2374    IF (ALLOCATED  (nroot)) DEALLOCATE (nroot)
2375    IF (ALLOCATED  (kfact_root)) DEALLOCATE (kfact_root)
2376    IF (ALLOCATED  (kfact)) DEALLOCATE (kfact)
2377    IF (ALLOCATED  (zz)) DEALLOCATE (zz)
2378    IF (ALLOCATED  (dz)) DEALLOCATE (dz)
[2917]2379    IF (ALLOCATED  (dh)) DEALLOCATE (dh)
[947]2380    IF (ALLOCATED  (mc_lin)) DEALLOCATE (mc_lin)
2381    IF (ALLOCATED  (k_lin)) DEALLOCATE (k_lin)
2382    IF (ALLOCATED  (d_lin)) DEALLOCATE (d_lin)
2383    IF (ALLOCATED  (a_lin)) DEALLOCATE (a_lin)
2384    IF (ALLOCATED  (b_lin)) DEALLOCATE (b_lin)
[8]2385
2386  END SUBROUTINE hydrol_clear
2387
[947]2388!! ================================================================================================================================
2389!! SUBROUTINE   : hydrol_tmc_update
2390!!
2391!>\BRIEF        This routine updates the soil moisture profiles when the vegetation fraction have changed.
2392!!
2393!! DESCRIPTION  :
2394!!
2395!!    This routine update tmc and mc with variation of veget_max (LAND_USE or DGVM activated)
2396!!
2397!!
2398!!
2399!!
[3969]2400!! RECENT CHANGE(S) : Adaptation to excluding nobio from soiltile(1)
[947]2401!!
2402!! MAIN OUTPUT VARIABLE(S) :
2403!!
2404!! REFERENCE(S) :
2405!!
2406!! FLOWCHART    : None
2407!! \n
2408!_ ================================================================================================================================
2409!_ hydrol_tmc_update
[3969]2410  SUBROUTINE hydrol_tmc_update ( kjpindex, veget_max, soiltile, qsintveg, drain_upd, runoff_upd)
[1082]2411
2412    !! 0.1 Input variables
[3969]2413    INTEGER(i_std), INTENT(in)                            :: kjpindex      !! domain size
2414    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)     :: veget_max     !! max fraction of vegetation type
2415    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT (in)   :: soiltile      !! Fraction of each soil tile (0-1, unitless)
[8]2416
[3969]2417    !! 0.2 Output variables
2418    REAL(r_std),DIMENSION (kjpindex), INTENT(out)         :: drain_upd        !! Change in drainage due to decrease in vegtot
2419                                                                              !! on mc [kg/m2/dt]
2420    REAL(r_std),DIMENSION (kjpindex), INTENT(out)         :: runoff_upd       !! Change in runoff due to decrease in vegtot
2421                                                                              !! on water2infilt[kg/m2/dt]
2422   
[1118]2423    !! 0.3 Modified variables
[3969]2424    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (inout)  :: qsintveg   !! Amount of water in the canopy interception
[1118]2425
[1082]2426    !! 0.4 Local variables
[1118]2427    INTEGER(i_std)                           :: ji, jv, jst,jsl
2428    LOGICAL                                  :: soil_upd        !! True if soiltile changed since last time step
[3969]2429    LOGICAL                                  :: vegtot_upd      !! True if vegtot changed since last time step
2430    REAL(r_std), DIMENSION(kjpindex,nstm)    :: vmr             !! Change in soiltile (within vegtot)
[1118]2431    REAL(r_std), DIMENSION(kjpindex)         :: vmr_sum
[3969]2432    REAL(r_std), DIMENSION(kjpindex)         :: delvegtot   
[1118]2433    REAL(r_std), DIMENSION(kjpindex,nslm)    :: mc_dilu         !! Total loss of moisture content
2434    REAL(r_std), DIMENSION(kjpindex)         :: infil_dilu      !! Total loss for water2infilt
2435    REAL(r_std), DIMENSION(kjpindex,nstm)    :: tmc_old         !! tmc before calculations
2436    REAL(r_std), DIMENSION(kjpindex,nstm)    :: water2infilt_old!! water2infilt before calculations
2437    REAL(r_std), DIMENSION (kjpindex,nvm)    :: qsintveg_old    !! qsintveg before calculations
2438    REAL(r_std), DIMENSION(kjpindex)         :: test
[3969]2439    REAL(r_std), DIMENSION(kjpindex,nslm,nstm) :: mcaux        !! serves to hold the chnage in mc when vegtot decreases
[1082]2440
[3969]2441   
[1118]2442    !! 1. If a PFT has disapperead as result from a veget_max change,
2443    !!    then add canopy water to surface water.
[3969]2444    !     Other adaptations of qsintveg are delt by the normal functioning of hydrol_canop
[1118]2445
[947]2446    DO ji=1,kjpindex
[3969]2447       IF (vegtot_old(ji) .GT.min_sechiba) THEN
2448          DO jv=1,nvm
2449             IF ((veget_max(ji,jv).LT.min_sechiba).AND.(qsintveg(ji,jv).GT.0.)) THEN
2450                jst=pref_soil_veg(jv) ! soil tile index
2451                water2infilt(ji,jst) = water2infilt(ji,jst) + qsintveg(ji,jv)/(resdist(ji,jst)*vegtot_old(ji))
2452                qsintveg(ji,jv) = zero
2453             ENDIF
2454          ENDDO
2455       ENDIF
2456    ENDDO
2457   
2458    !! 2. We now deal with the changes of soiltile and corresponding soil moistures
2459    !!    Because sum(soiltile)=1 whatever vegtot, we need to distinguish two cases:
2460    !!    - when vegtot changes (meaning that the nobio fraction changes too),
2461    !!    - and when vegtot does not changes (a priori the most frequent case)
2462
2463    vegtot_upd = SUM(ABS((vegtot(:)-vegtot_old(:)))) .GT. zero ! True if at least one land point with a vegtot change
2464    runoff_upd(:) = zero
2465    drain_upd(:) = zero
2466    IF (vegtot_upd) THEN
2467       ! We find here the processing specific to the chnages of nobio fraction and vegtot
2468
2469       delvegtot(:) = vegtot(:) - vegtot_old(:)
2470
2471       DO jst=1,nstm
2472          DO ji=1,kjpindex
2473
2474             IF (delvegtot(ji) .GT. min_sechiba) THEN
2475
2476                !! 2.1. If vegtot increases (nobio decreases), then the mc in each soiltile is decreased
2477                !!      assuming the same proportions for each soiltile, and each soil layer
2478               
2479                mc(ji,:,jst) = mc(ji,:,jst) * vegtot_old(ji)/vegtot(ji) ! vegtot cannot be zero as > vegtot_old
2480                water2infilt(ji,jst) = water2infilt(ji,jst) * vegtot_old(ji)/vegtot(ji)
2481
2482             ELSE
2483
2484                !! 2.2 If vegtot decreases (nobio increases), then the mc in each soiltile should increase,
2485                !!     but should not exceed mcs
2486                !!     For simplicity, we choose to send the corresponding water volume to drainage
2487                !!     We do the same for water2infilt but send the excess to surface runoff
2488
2489                IF (vegtot(ji) .GT.min_sechiba) THEN
2490                   mcaux(ji,:,jst) =  mc(ji,:,jst) * (vegtot_old(ji)-vegtot(ji))/vegtot(ji) ! mcaux is the delta mc
2491                ELSE ! we just have nobio in the grid-cell
2492                   mcaux(ji,:,jst) =  mc(ji,:,jst)
2493                ENDIF
2494               
2495                drain_upd(ji) = drain_upd(ji) + dz(2) * ( trois*mcaux(ji,1,jst) + mcaux(ji,2,jst) )/huit
2496                DO jsl = 2,nslm-1
2497                   drain_upd(ji) = drain_upd(ji) + dz(jsl) * (trois*mcaux(ji,jsl,jst)+mcaux(ji,jsl-1,jst))/huit &
2498                        + dz(jsl+1) * (trois*mcaux(ji,jsl,jst)+mcaux(ji,jsl+1,jst))/huit
2499                ENDDO
2500                drain_upd(ji) = drain_upd(ji) + dz(nslm) * (trois*mcaux(ji,nslm,jst) + mcaux(ji,nslm-1,jst))/huit
2501
2502                IF (vegtot(ji) .GT.min_sechiba) THEN
2503                   runoff_upd(ji) = runoff_upd(ji) + water2infilt(ji,jst) * (vegtot_old(ji)-vegtot(ji))/vegtot(ji)
2504                ELSE ! we just have nobio in the grid-cell
2505                   runoff_upd(ji) = runoff_upd(ji) + water2infilt(ji,jst)
2506                ENDIF
2507
2508             ENDIF
2509             
2510          ENDDO
[1118]2511       ENDDO
[3969]2512       
2513    ENDIF
[1118]2514   
[3969]2515    !! 3. At the end of step 2, we are back to a case where vegtot changes are treated, so we can use soiltile
2516    !!    as a fraction of vegtot to process the mc transfers between soil tiles due to the changes of vegetation map
2517   
2518    !! 3.1 Check if soiltiles changed since last time step
2519    soil_upd=SUM(ABS(soiltile(:,:)-resdist(:,:))) .GT. zero
2520    IF (printlev>=3) WRITE (numout,*) 'soil_upd ', soil_upd
2521       
[1118]2522    IF (soil_upd) THEN
[3969]2523     
2524       !! 3.2 Define the change in soiltile
2525       vmr(:,:) = soiltile(:,:) - resdist(:,:)  ! resdist is the previous values of soiltiles, previous timestep, so before new map
[947]2526
[1118]2527       ! Total area loss by the three soil tiles
2528       DO ji=1,kjpindex
2529          vmr_sum(ji)=SUM(vmr(ji,:),MASK=vmr(ji,:).LT.zero)
2530       ENDDO
2531
[3969]2532       !! 3.3 Shrinking soil tiles
2533       !! 3.3.1 Total loss of moisture content from the shrinking soil tiles, expressed by soil layer
[1118]2534       mc_dilu(:,:)=zero
2535       DO jst=1,nstm
2536          DO jsl = 1, nslm
2537             DO ji=1,kjpindex
[4480]2538                IF ( vmr(ji,jst) < -min_sechiba ) THEN
[1118]2539                   mc_dilu(ji,jsl) = mc_dilu(ji,jsl) + mc(ji,jsl,jst) * vmr(ji,jst) / vmr_sum(ji)
2540                ENDIF
2541             ENDDO
[947]2542          ENDDO
[1118]2543       ENDDO
[947]2544
[3969]2545       !! 3.3.2 Total loss of water2inft from the shrinking soil tiles
[1118]2546       infil_dilu(:)=zero
2547       DO jst=1,nstm
2548          DO ji=1,kjpindex
[4480]2549             IF ( vmr(ji,jst) < -min_sechiba ) THEN
[1118]2550                infil_dilu(ji) = infil_dilu(ji) + water2infilt(ji,jst) * vmr(ji,jst) / vmr_sum(ji)
[947]2551             ENDIF
2552          ENDDO
[1118]2553       ENDDO
[947]2554
[3969]2555       !! 3.4 Each gaining soil tile gets moisture proportionally to both the total loss and its areal increase
[1118]2556
2557       ! As the original mc from each soil tile are in [mcr,mcs] and we do weighted avrage, the new mc are in [mcr,mcs]
2558       ! The case where the soiltile is created (soiltile_old=0) works as the other cases
2559
[3969]2560       ! 3.4.1 Update mc(kjpindex,nslm,nstm) !m3/m3
[1118]2561       DO jst=1,nstm
2562          DO jsl = 1, nslm
2563             DO ji=1,kjpindex
[4480]2564                IF ( vmr(ji,jst) > min_sechiba ) THEN
[1118]2565                   mc(ji,jsl,jst) = ( mc(ji,jsl,jst) * resdist(ji,jst) + mc_dilu(ji,jsl) * vmr(ji,jst) ) / soiltile(ji,jst)
2566                   ! NB : soiltile can not be zero for case vmr > zero, see slowproc_veget
[947]2567                ENDIF
[1118]2568             ENDDO
2569          ENDDO
2570       ENDDO
2571       
[3969]2572       ! 3.4.2 Update water2inft
[1118]2573       DO jst=1,nstm
2574          DO ji=1,kjpindex
[4480]2575             IF ( vmr(ji,jst) > min_sechiba ) THEN !donc soiltile>0     
[1118]2576                water2infilt(ji,jst) = ( water2infilt(ji,jst) * resdist(ji,jst) + infil_dilu(ji) * vmr(ji,jst) ) / soiltile(ji,jst)
2577             ENDIF !donc resdist>0
2578          ENDDO
2579       ENDDO
2580
[3969]2581       ! 3.4.3 Case where soiltile < min_sechiba
[1118]2582       DO jst=1,nstm
2583          DO ji=1,kjpindex
2584             IF ( soiltile(ji,jst) .LT. min_sechiba ) THEN
2585                water2infilt(ji,jst) = zero
2586                mc(ji,:,jst) = zero
[947]2587             ENDIF
2588          ENDDO
[1118]2589       ENDDO
2590
[3969]2591    ENDIF ! soil_upd
[1118]2592
[3969]2593    !! 4. Update tmc and humtot
2594   
[1118]2595    DO jst=1,nstm
2596       DO ji=1,kjpindex
[2651]2597             tmc(ji,jst) = dz(2) * ( trois*mc(ji,1,jst) + mc(ji,2,jst) )/huit
[1118]2598             DO jsl = 2,nslm-1
[2651]2599                tmc(ji,jst) = tmc(ji,jst) + dz(jsl) * (trois*mc(ji,jsl,jst)+mc(ji,jsl-1,jst))/huit &
2600                     + dz(jsl+1) * (trois*mc(ji,jsl,jst)+mc(ji,jsl+1,jst))/huit
[1118]2601             ENDDO
[2651]2602             tmc(ji,jst) = tmc(ji,jst) + dz(nslm) * (trois*mc(ji,nslm,jst) + mc(ji,nslm-1,jst))/huit
[1118]2603             tmc(ji,jst) = tmc(ji,jst) + water2infilt(ji,jst)
[3969]2604             ! WARNING tmc is increased by includes water2infilt(ji,jst)
[1118]2605       ENDDO
[947]2606    ENDDO
2607
[1118]2608    humtot(:) = zero
2609    DO jst=1,nstm
2610       DO ji=1,kjpindex
[4724]2611          humtot(ji) = humtot(ji) + vegtot(ji) * soiltile(ji,jst) * tmc(ji,jst) ! average over grid-cell (i.e. total land)
[1118]2612       ENDDO
2613    ENDDO
[947]2614
[1118]2615
2616    !! Now that the work is done, update resdist
2617    resdist(:,:) = soiltile(:,:)
2618
[2348]2619    IF (printlev>=3) WRITE (numout,*) ' hydrol_tmc_update done '
[947]2620
2621  END SUBROUTINE hydrol_tmc_update
2622
2623!! ================================================================================================================================
2624!! SUBROUTINE   : hydrol_var_init
2625!!
[2589]2626!>\BRIEF        This routine initializes hydrologic parameters to define K and D, and diagnostic hydrologic variables. 
[947]2627!!
2628!! DESCRIPTION  :
2629!! - 1 compute the depths
2630!! - 2 compute the profile for roots
[4764]2631!! - 3 compute the profile for a and n Van Genuchten parameter
[947]2632!! - 4 compute the linearized values of k, a, b and d for the resolution of Fokker Planck equation
2633!! - 5 water reservoirs initialisation
2634!!
2635!! RECENT CHANGE(S) : None
2636!!
2637!! MAIN OUTPUT VARIABLE(S) :
2638!!
2639!! REFERENCE(S) :
2640!!
2641!! FLOWCHART    : None
2642!! \n
2643!_ ================================================================================================================================
2644!_ hydrol_var_init
2645
[6954]2646  SUBROUTINE hydrol_var_init (ks, nvan, avan, mcr, mcs, mcfc, mcw, &
2647       kjpindex, veget, veget_max, soiltile, njsc, &
[3969]2648       mx_eau_var, shumdiag_perma, &
[4637]2649       drysoil_frac, qsintveg, mc_layh, mcl_layh) 
[947]2650
[8]2651    ! interface description
[947]2652
2653    !! 0. Variable and parameter declaration
2654
2655    !! 0.1 Input variables
[8]2656    ! input scalar
[2589]2657    INTEGER(i_std), INTENT(in)                          :: kjpindex      !! Domain size (number of grid cells) (1)
[8]2658    ! input fields
[2589]2659    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)   :: veget_max     !! PFT fractions within grid-cells (1; 1)
2660    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)   :: veget         !! Effective fraction of vegetation by PFT (1; 1)
2661    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)    :: njsc          !! Index of the dominant soil textural class
2662                                                                         !! in the grid cell (1-nscm, unitless)
[3969]2663    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT (in) :: soiltile      !! Fraction of each soil tile within vegtot (0-1, unitless)
[7239]2664   
2665    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: ks               !! Hydraulic conductivity at saturation (mm {-1})
2666    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: nvan             !! Van Genuchten coeficients n (unitless)
2667    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: avan             !! Van Genuchten coeficients a (mm-1})
2668    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
2669    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
2670    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcfc             !! Volumetric water content at field capacity (m^{3} m^{-3})
2671    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcw              !! Volumetric water content at wilting point (m^{3} m^{-3})
2672 
[947]2673    !! 0.2 Output variables
2674
[2589]2675    REAL(r_std),DIMENSION (kjpindex), INTENT (out)      :: mx_eau_var    !! Maximum water content of the soil
2676                                                                         !! @tex $(kg m^{-2})$ @endtex
[4631]2677    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out) :: shumdiag_perma!! Percent of porosity filled with water (mc/mcs)
[2589]2678                                                                         !! used for the thermal computations
[2868]2679    REAL(r_std),DIMENSION (kjpindex), INTENT (inout)    :: drysoil_frac  !! function of litter humidity
[2922]2680    REAL(r_std), DIMENSION (kjpindex,nslm), INTENT (out):: mc_layh       !! Volumetric soil moisture content for each layer in hydrol(liquid+ice) [m3/m3]
2681    REAL(r_std), DIMENSION (kjpindex,nslm), INTENT (out):: mcl_layh      !! Volumetric soil moisture content for each layer in hydrol(liquid) [m3/m3]
[8]2682
[947]2683    !! 0.3 Modified variables
[2589]2684    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (inout)  :: qsintveg    !! Water on vegetation due to interception
2685                                                                         !! @tex $(kg m^{-2})$ @endtex 
[947]2686
2687    !! 0.4 Local variables
2688
[2589]2689    INTEGER(i_std)                                      :: ji, jv        !! Grid-cell and PFT indices (1)
2690    INTEGER(i_std)                                      :: jst, jsc, jsl !! Soiltile, Soil Texture, and Soil layer indices (1)
[4637]2691    INTEGER(i_std)                                      :: i             !! Index (1)
[2589]2692    REAL(r_std)                                         :: m             !! m=1-1/n (unitless)
2693    REAL(r_std)                                         :: frac          !! Relative linearized VWC (unitless)
2694    REAL(r_std)                                         :: avan_mod      !! VG parameter a modified from  exponantial profile
2695                                                                         !! @tex $(mm^{-1})$ @endtex
2696    REAL(r_std)                                         :: nvan_mod      !! VG parameter n  modified from  exponantial profile
2697                                                                         !! (unitless)
[6954]2698    REAL(r_std), DIMENSION(nslm,kjpindex)               :: afact, nfact  !! Multiplicative factor for decay of a and n with depth
[2589]2699                                                                         !! (unitless)
[947]2700    ! parameters for "soil densification" with depth
[2589]2701    REAL(r_std)                                         :: dp_comp       !! Depth at which the 'compacted' value of ksat
2702                                                                         !! is reached (m)
2703    REAL(r_std)                                         :: f_ks          !! Exponential factor for decay of ksat with depth
2704                                                                         !! @tex $(m^{-1})$ @endtex
[947]2705    ! Fixed parameters from fitted relationships
[1082]2706    REAL(r_std)                                         :: n0            !! fitted value for relation log((n-n0)/(n_ref-n0)) =
[947]2707                                                                         !! nk_rel * log(k/k_ref)
[2589]2708                                                                         !! (unitless)
[1082]2709    REAL(r_std)                                         :: nk_rel        !! fitted value for relation log((n-n0)/(n_ref-n0)) =
[947]2710                                                                         !! nk_rel * log(k/k_ref)
[2589]2711                                                                         !! (unitless)
[1082]2712    REAL(r_std)                                         :: a0            !! fitted value for relation log((a-a0)/(a_ref-a0)) =
[947]2713                                                                         !! ak_rel * log(k/k_ref)
[2589]2714                                                                         !! @tex $(mm^{-1})$ @endtex
[1082]2715    REAL(r_std)                                         :: ak_rel        !! fitted value for relation log((a-a0)/(a_ref-a0)) =
[2589]2716                                                                         !! ak_rel * log(k/k_ref)
2717                                                                         !! (unitless)
2718    REAL(r_std)                                         :: kfact_max     !! Maximum factor for Ks decay with depth (unitless)
[947]2719    REAL(r_std)                                         :: k_tmp, tmc_litter_ratio
[1082]2720    INTEGER(i_std), PARAMETER                           :: error_level = 3 !! Error level for consistency check
2721                                                                           !! Switch to 2 tu turn fatal errors into warnings
[4812]2722    REAL(r_std), DIMENSION (kjpindex,nslm)              :: alphavg         !! VG param a modified with depth at each node
2723                                                                           !! @tex $(mm^{-1})$ @endtexe
2724    REAL(r_std), DIMENSION (kjpindex,nslm)              :: nvg             !! VG param n modified with depth at each node
2725                                                                           !! (unitless)
[3082]2726                                                                           !! need special treatment
[6954]2727    INTEGER(i_std)                                      :: ii
2728    INTEGER(i_std)                                      :: iiref           !! To identify the mc_lins where k_lin and d_lin
2729                                                                           !! need special treatment
[8]2730
[1082]2731!_ ================================================================================================================================
[8]2732
[1082]2733    !Config Key   = CWRR_NKS_N0
2734    !Config Desc  = fitted value for relation log((n-n0)/(n_ref-n0)) = nk_rel * log(k/k_ref)
[4962]2735    !Config Def   = 0.0
[5454]2736    !Config If    =
[947]2737    !Config Help  =
2738    !Config Units = [-]
[4962]2739    n0 = 0.0
[1082]2740    CALL getin_p("CWRR_NKS_N0",n0)
2741
2742    !! Check parameter value (correct range)
2743    IF ( n0 < zero ) THEN
2744       CALL ipslerr_p(error_level, "hydrol_var_init.", &
2745            &     "Wrong parameter value for CWRR_NKS_N0.", &
2746            &     "This parameter should be non-negative. ", &
2747            &     "Please, check parameter value in run.def. ")
2748    END IF
2749
2750
2751    !Config Key   = CWRR_NKS_POWER
2752    !Config Desc  = fitted value for relation log((n-n0)/(n_ref-n0)) = nk_rel * log(k/k_ref)
[4962]2753    !Config Def   = 0.0
[5454]2754    !Config If    =
[1082]2755    !Config Help  =
2756    !Config Units = [-]
[4962]2757    nk_rel = 0.0
[1082]2758    CALL getin_p("CWRR_NKS_POWER",nk_rel)
2759
2760    !! Check parameter value (correct range)
2761    IF ( nk_rel < zero ) THEN
2762       CALL ipslerr_p(error_level, "hydrol_var_init.", &
2763            &     "Wrong parameter value for CWRR_NKS_POWER.", &
2764            &     "This parameter should be non-negative. ", &
2765            &     "Please, check parameter value in run.def. ")
2766    END IF
2767
2768
2769    !Config Key   = CWRR_AKS_A0
[1260]2770    !Config Desc  = fitted value for relation log((a-a0)/(a_ref-a0)) = ak_rel * log(k/k_ref)
[4962]2771    !Config Def   = 0.0
[5454]2772    !Config If    =
[1082]2773    !Config Help  =
[2589]2774    !Config Units = [1/mm]
[4962]2775    a0 = 0.0
[1082]2776    CALL getin_p("CWRR_AKS_A0",a0)
2777
2778    !! Check parameter value (correct range)
2779    IF ( a0 < zero ) THEN
2780       CALL ipslerr_p(error_level, "hydrol_var_init.", &
2781            &     "Wrong parameter value for CWRR_AKS_A0.", &
2782            &     "This parameter should be non-negative. ", &
2783            &     "Please, check parameter value in run.def. ")
2784    END IF
2785
2786
2787    !Config Key   = CWRR_AKS_POWER
[1260]2788    !Config Desc  = fitted value for relation log((a-a0)/(a_ref-a0)) = ak_rel * log(k/k_ref)
[4962]2789    !Config Def   = 0.0
[5454]2790    !Config If    =
[1082]2791    !Config Help  =
2792    !Config Units = [-]
[4962]2793    ak_rel = 0.0
[1260]2794    CALL getin_p("CWRR_AKS_POWER",ak_rel)
[1082]2795
2796    !! Check parameter value (correct range)
2797    IF ( nk_rel < zero ) THEN
2798       CALL ipslerr_p(error_level, "hydrol_var_init.", &
2799            &     "Wrong parameter value for CWRR_AKS_POWER.", &
2800            &     "This parameter should be non-negative. ", &
2801            &     "Please, check parameter value in run.def. ")
2802    END IF
2803
2804
2805    !Config Key   = KFACT_DECAY_RATE
[947]2806    !Config Desc  = Factor for Ks decay with depth
2807    !Config Def   = 2.0
[5454]2808    !Config If    =
[947]2809    !Config Help  = 
[2589]2810    !Config Units = [1/m]
[1082]2811    f_ks = 2.0
2812    CALL getin_p ("KFACT_DECAY_RATE", f_ks)
2813
2814    !! Check parameter value (correct range)
[4202]2815    IF ( f_ks < zero ) THEN
[1082]2816       CALL ipslerr_p(error_level, "hydrol_var_init.", &
2817            &     "Wrong parameter value for KFACT_DECAY_RATE.", &
2818            &     "This parameter should be positive. ", &
2819            &     "Please, check parameter value in run.def. ")
2820    END IF
2821
2822
2823    !Config Key   = KFACT_STARTING_DEPTH
[947]2824    !Config Desc  = Depth for compacted value of Ks
2825    !Config Def   = 0.3
[5454]2826    !Config If    =
[947]2827    !Config Help  = 
[2589]2828    !Config Units = [m]
[947]2829    dp_comp = 0.3
[1082]2830    CALL getin_p ("KFACT_STARTING_DEPTH", dp_comp)
2831
2832    !! Check parameter value (correct range)
2833    IF ( dp_comp <= zero ) THEN
2834       CALL ipslerr_p(error_level, "hydrol_var_init.", &
2835            &     "Wrong parameter value for KFACT_STARTING_DEPTH.", &
2836            &     "This parameter should be positive. ", &
2837            &     "Please, check parameter value in run.def. ")
2838    END IF
2839
2840
2841    !Config Key   = KFACT_MAX
2842    !Config Desc  = Maximum Factor for Ks increase due to vegetation
2843    !Config Def   = 10.0
[5454]2844    !Config If    =
[1082]2845    !Config Help  =
2846    !Config Units = [-]
2847    kfact_max = 10.0
2848    CALL getin_p ("KFACT_MAX", kfact_max)
2849
2850    !! Check parameter value (correct range)
2851    IF ( kfact_max < 10. ) THEN
2852       CALL ipslerr_p(error_level, "hydrol_var_init.", &
2853            &     "Wrong parameter value for KFACT_MAX.", &
2854            &     "This parameter should be greater than 10. ", &
2855            &     "Please, check parameter value in run.def. ")
2856    END IF
2857
[7476]2858
2859
2860    !Config Key   = KFACT_ROOT_CONST
2861    !Config Desc  = Set constant kfact_root in every soil layer. Otherwise kfact_root increase over soil depth in the rootzone.
2862    !Config If    =
2863    !Config Def   = n
2864    !Config Help  = Use KFACT_ROOT_CONST=true to impose kfact_root=1 in every soil layer. Otherwise kfact_root increase over soil depth in the rootzone.
2865    !Config Units = [y/n]
2866    kfact_root_const = .FALSE.
2867    CALL getin_p("KFACT_ROOT_CONST",kfact_root_const)
2868
[2651]2869   
2870    !-
[4210]2871    !! 1 Create local variables in mm for the vertical depths
2872    !!   Vertical depth variables (znh, dnh, dlh) are stored in module vertical_soil_var in m.
[2917]2873    DO jsl=1,nslm
[2928]2874       zz(jsl) = znh(jsl)*mille
2875       dz(jsl) = dnh(jsl)*mille
2876       dh(jsl) = dlh(jsl)*mille
[2651]2877    ENDDO
2878
[4363]2879    !-
2880    !! 2 Compute the root density profile if not ok_dynroot
2881    !!   For the case with ok_dynroot, the calculations are done at each time step in hydrol_soil
2882    IF (.NOT. ok_dynroot) THEN
2883       DO ji=1, kjpindex
2884          !-
2885          !! The three following equations concerning nroot computation are derived from the integrals
2886          !! of equations C9 to C11 of De Rosnay's (1999) PhD thesis (page 158).
2887          !! The occasional absence of minus sign before humcste parameter is correct.
2888          DO jv = 1,nvm
2889             DO jsl = 2, nslm-1
2890                nroot(ji,jv,jsl) = (EXP(-humcste(jv)*zz(jsl)/mille)) * &
[2651]2891                     & (EXP(humcste(jv)*dz(jsl)/mille/deux) - &
2892                     & EXP(-humcste(jv)*dz(jsl+1)/mille/deux))/ &
2893                     & (EXP(-humcste(jv)*dz(2)/mille/deux) &
2894                     & -EXP(-humcste(jv)*zz(nslm)/mille))
[4363]2895             ENDDO
2896             nroot(ji,jv,1) = zero
2897
2898             nroot(ji,jv,nslm) = (EXP(humcste(jv)*dz(nslm)/mille/deux) -un) * &
[2651]2899                  & EXP(-humcste(jv)*zz(nslm)/mille) / &
2900                  & (EXP(-humcste(jv)*dz(2)/mille/deux) &
2901                  & -EXP(-humcste(jv)*zz(nslm)/mille))
[4363]2902          ENDDO
[947]2903       ENDDO
[4363]2904    END IF
[947]2905
[6954]2906 
2907
[947]2908    !-
[4764]2909    !! 3 Compute the profile for a and n
[947]2910    !-
[6954]2911    DO ji = 1, kjpindex
[2589]2912       DO jsl=1,nslm
2913          ! PhD thesis of d'Orgeval, 2006, p81, Eq. 4.38; d'Orgeval et al. 2008, Eq. 2
2914          ! Calibrated against Hapex-Sahel measurements
[6954]2915          kfact(jsl,ji) = MIN(MAX(EXP(- f_ks * (zz(jsl)/mille - dp_comp)), un/kfact_max),un)
2916          ! PhD thesis of d'Orgeval, 2006, p81, Eqs. 4.39; 4.42, and Fig 4.14
2917
2918          nfact(jsl,ji) = ( kfact(jsl,ji) )**nk_rel
2919          afact(jsl,ji) = ( kfact(jsl,ji) )**ak_rel
[947]2920       ENDDO
[2589]2921    ENDDO
[6954]2922   
2923    ! For every grid cell
2924     DO ji = 1, kjpindex
[947]2925       !-
[4764]2926       !! 4 Compute the linearized values of k, a, b and d
2927       !!   The effect of kfact_root on ks thus on k, a, n and d, is taken into account further in the code,
2928       !!   in hydrol_soil_coef.
[947]2929       !-
[2589]2930       ! Calculate the matrix coef for Dublin model (de Rosnay, 1999; p149)
2931       ! piece-wise linearised hydraulic conductivity k_lin=alin * mc_lin + b_lin
2932       ! and diffusivity d_lin in each interval of mc, called mc_lin,
2933       ! between imin, for residual mcr, and imax for saturation mcs.
[947]2934
[2589]2935       ! We define 51 bounds for 50 bins of mc between mcr and mcs
[6954]2936       mc_lin(imin,ji)=mcr(ji)
2937       mc_lin(imax,ji)=mcs(ji)
2938       DO ii= imin+1, imax-1 ! ii=2,50
2939          mc_lin(ii,ji) = mcr(ji) + (ii-imin)*(mcs(ji)-mcr(ji))/(imax-imin)
[8]2940       ENDDO
2941
[947]2942       DO jsl = 1, nslm
[2589]2943          ! From PhD thesis of d'Orgeval, 2006, p81, Eq. 4.42
[6954]2944          nvan_mod = n0 + (nvan(ji)-n0) * nfact(jsl,ji)
2945          avan_mod = a0 + (avan(ji)-a0) * afact(jsl,ji)
[947]2946          m = un - un / nvan_mod
[4812]2947          ! Creation of arrays for SP-MIP output by landpoint
[6954]2948          nvan_mod_tab(jsl,ji) = nvan_mod
2949          avan_mod_tab(jsl,ji) = avan_mod
2950          ! We apply Van Genuchten equation for K(theta) based on Ks(z)=ks(ji) * kfact(jsl,ji)
2951          DO ii = imax,imin,-1
2952             frac=MIN(un,(mc_lin(ii,ji)-mcr(ji))/(mcs(ji)-mcr(ji)))
2953             k_lin(ii,jsl,ji) = ks(ji) * kfact(jsl,ji) * (frac**0.5) * ( un - ( un - frac ** (un/m)) ** m )**2
[947]2954          ENDDO
[3082]2955
2956          ! k_lin should not be zero, nor too small
[6954]2957          ! We track iiref, the bin under which mc is too small and we may get zero k_lin
2958          !salma: ji replaced with ii and jiref replaced with iiref and jsc with ji
2959          ii=imax-1
2960          DO WHILE ((k_lin(ii,jsl,ji) > 1.e-32) .and. (ii>0))
2961             iiref=ii
2962             ii=ii-1
[3082]2963          ENDDO
[6954]2964          DO ii=iiref-1,imin,-1
2965             k_lin(ii,jsl,ji)=k_lin(ii+1,jsl,ji)/10.
[3082]2966          ENDDO
[6954]2967
2968          DO ii = imin,imax-1 ! ii=1,50
[2589]2969             ! We deduce a_lin and b_lin based on continuity between segments k_lin = a_lin*mc-lin+b_lin
[6954]2970             a_lin(ii,jsl,ji) = (k_lin(ii+1,jsl,ji)-k_lin(ii,jsl,ji)) / (mc_lin(ii+1,ji)-mc_lin(ii,ji))
2971             b_lin(ii,jsl,ji)  = k_lin(ii,jsl,ji) - a_lin(ii,jsl,ji)*mc_lin(ii,ji)
[947]2972
[2589]2973             ! We calculate the d_lin for each mc bin, from Van Genuchten equation for D(theta)
[6954]2974             ! d_lin is constant and taken as the arithmetic mean between the values at the bounds of each bin
2975             IF (ii.NE.imin .AND. ii.NE.imax-1) THEN
2976                frac=MIN(un,(mc_lin(ii,ji)-mcr(ji))/(mcs(ji)-mcr(ji)))
2977                d_lin(ii,jsl,ji) =(k_lin(ii,jsl,ji) / (avan_mod*m*nvan_mod)) *  &
2978                     ( (frac**(-un/m))/(mc_lin(ii,ji)-mcr(ji)) ) * &
[3082]2979                     (  frac**(-un/m) -un ) ** (-m)
[6954]2980                frac=MIN(un,(mc_lin(ii+1,ji)-mcr(ji))/(mcs(ji)-mcr(ji)))
2981                d_lin(ii+1,jsl,ji) =(k_lin(ii+1,jsl,ji) / (avan_mod*m*nvan_mod))*&
2982                     ( (frac**(-un/m))/(mc_lin(ii+1,ji)-mcr(ji)) ) * &
[3082]2983                     (  frac**(-un/m) -un ) ** (-m)
[6954]2984                d_lin(ii,jsl,ji) = undemi * (d_lin(ii,jsl,ji)+d_lin(ii+1,jsl,ji))
2985             ELSE IF(ii.EQ.imax-1) THEN
2986                d_lin(ii,jsl,ji) =(k_lin(ii,jsl,ji) / (avan_mod*m*nvan_mod)) * &
2987                     ( (frac**(-un/m))/(mc_lin(ii,ji)-mcr(ji)) ) *  &
[3082]2988                     (  frac**(-un/m) -un ) ** (-m)
[947]2989             ENDIF
[7239]2990          ENDDO
[3082]2991
[6954]2992          ! Special case for ii=imin
2993          d_lin(imin,jsl,ji) = d_lin(imin+1,jsl,ji)/1000.
[3082]2994
2995          ! We adjust d_lin where k_lin was previously adjusted otherwise we might get non-monotonous variations
2996          ! We don't want d_lin = zero
[6954]2997          DO ii=iiref-1,imin,-1
2998             d_lin(ii,jsl,ji)=d_lin(ii+1,jsl,ji)/10.
[3082]2999          ENDDO
3000
[8]3001       ENDDO
3002    ENDDO
3003
[6954]3004
[4812]3005    ! Output of alphavg and nvg at each node for SP-MIP
3006    DO jsl = 1, nslm
[6954]3007       alphavg(:,jsl) = avan_mod_tab(jsl,:)*1000. ! from mm-1 to m-1
3008       nvg(:,jsl) = nvan_mod_tab(jsl,:)
[4812]3009    ENDDO
3010    CALL xios_orchidee_send_field("alphavg",alphavg) ! in m-1
3011    CALL xios_orchidee_send_field("nvg",nvg) ! unitless
3012
[947]3013    !! 5 Water reservoir initialisation
3014    !
3015!!$    DO jst = 1,nstm
3016!!$       DO ji = 1, kjpindex
3017!!$          mx_eau_var(ji) = mx_eau_var(ji) + soiltile(ji,jst)*&
[2928]3018!!$               &   zmaxh*mille*mcs(njsc(ji))
[947]3019!!$       END DO
3020!!$    END DO
[8]3021
[947]3022    mx_eau_var(:) = zero
[6954]3023    mx_eau_var(:) = zmaxh*mille*mcs(:)
[8]3024
[6954]3025    DO ji = 1,kjpindex
[947]3026       IF (vegtot(ji) .LE. zero) THEN
[2928]3027          mx_eau_var(ji) = mx_eau_nobio*zmaxh
[2589]3028          ! Aurelien: what does vegtot=0 mean? is it like frac_nobio=1? But if 0<frac_nobio<1 ???
[1082]3029       ENDIF
[947]3030
3031    END DO
3032
[3402]3033    ! Compute the litter humidity, shumdiag and fry
[2222]3034    shumdiag_perma(:,:) = zero
[8]3035    humtot(:) = zero
3036    tmc(:,:) = zero
3037
[2589]3038    ! Loop on soiltiles to compute the variables (ji,jst)
[6954]3039    DO jst=1,nstm
[947]3040       DO ji = 1, kjpindex
[6954]3041          tmcs(ji,jst)=zmaxh* mille*mcs(ji)
3042          tmcr(ji,jst)=zmaxh* mille*mcr(ji)
3043          tmcfc(ji,jst)=zmaxh* mille*mcfc(ji)
3044          tmcw(ji,jst)=zmaxh* mille*mcw(ji)
[947]3045       ENDDO
3046    ENDDO
[6954]3047
[2589]3048    ! The total soil moisture for each soiltile:
3049    DO jst=1,nstm
[8]3050       DO ji=1,kjpindex
[2651]3051          tmc(ji,jst)= dz(2) * ( trois*mc(ji,1,jst)+ mc(ji,2,jst))/huit
[8]3052       END DO
[947]3053    ENDDO
[8]3054
[6954]3055    DO jst=1,nstm
[8]3056       DO jsl=2,nslm-1
3057          DO ji=1,kjpindex
[2651]3058             tmc(ji,jst) = tmc(ji,jst) + dz(jsl) * ( trois*mc(ji,jsl,jst) + mc(ji,jsl-1,jst))/huit &
3059                  & + dz(jsl+1)*(trois*mc(ji,jsl,jst) + mc(ji,jsl+1,jst))/huit
[8]3060          END DO
3061       END DO
[947]3062    ENDDO
[8]3063
[6954]3064    DO jst=1,nstm
[8]3065       DO ji=1,kjpindex
[2651]3066          tmc(ji,jst) = tmc(ji,jst) +  dz(nslm) * (trois * mc(ji,nslm,jst) + mc(ji,nslm-1,jst))/huit
[947]3067          tmc(ji,jst) = tmc(ji,jst) + water2infilt(ji,jst)
3068       ENDDO
3069    END DO
[8]3070
[6954]3071!JG: hydrol_tmc_update should not be called in the initialization phase. Call of hydrol_tmc_update makes the model restart differenlty.
[2868]3072!    ! If veget has been updated before restart (with LAND USE or DGVM),
3073!    ! tmc and mc must be modified with respect to humtot conservation.
[3969]3074!   CALL hydrol_tmc_update ( kjpindex, veget_max, soiltile, qsintveg)
[8]3075
[947]3076    ! The litter variables:
3077    ! level 1
[6954]3078    DO jst=1,nstm
[8]3079       DO ji=1,kjpindex
[4783]3080          tmc_litter(ji,jst) = dz(2) * (trois*mcl(ji,1,jst)+mcl(ji,2,jst))/huit
[6954]3081          tmc_litter_wilt(ji,jst) = dz(2) * mcw(ji) / deux
3082          tmc_litter_res(ji,jst) = dz(2) * mcr(ji) / deux
3083          tmc_litter_field(ji,jst) = dz(2) * mcfc(ji) / deux
3084          tmc_litter_sat(ji,jst) = dz(2) * mcs(ji) / deux
[7239]3085          tmc_litter_awet(ji,jst) = dz(2) * mc_awet(njsc(ji)) / deux
3086          tmc_litter_adry(ji,jst) = dz(2) * mc_adry(njsc(ji)) / deux
[947]3087       ENDDO
3088    END DO
3089    ! sum from level 2 to 4
[6954]3090    DO jst=1,nstm
[8]3091       DO jsl=2,4
3092          DO ji=1,kjpindex
[6954]3093             tmc_litter(ji,jst) = tmc_litter(ji,jst) + dz(jsl) * &
[4783]3094                  & ( trois*mcl(ji,jsl,jst) + mcl(ji,jsl-1,jst))/huit &
3095                  & + dz(jsl+1)*(trois*mcl(ji,jsl,jst) + mcl(ji,jsl+1,jst))/huit
[8]3096             tmc_litter_wilt(ji,jst) = tmc_litter_wilt(ji,jst) + &
[6954]3097                  &(dz(jsl)+ dz(jsl+1))*&
3098                  & mcw(ji)/deux
[8]3099             tmc_litter_res(ji,jst) = tmc_litter_res(ji,jst) + &
[6954]3100                  &(dz(jsl)+ dz(jsl+1))*&
3101                  & mcr(ji)/deux
[8]3102             tmc_litter_sat(ji,jst) = tmc_litter_sat(ji,jst) + &
[6954]3103                  &(dz(jsl)+ dz(jsl+1))* &
3104                  & mcs(ji)/deux
[8]3105             tmc_litter_field(ji,jst) = tmc_litter_field(ji,jst) + &
[6954]3106                  & (dz(jsl)+ dz(jsl+1))* &
3107                  & mcfc(ji)/deux
[8]3108             tmc_litter_awet(ji,jst) = tmc_litter_awet(ji,jst) + &
[6954]3109                  &(dz(jsl)+ dz(jsl+1))* &
[7239]3110                  & mc_awet(njsc(ji))/deux
[8]3111             tmc_litter_adry(ji,jst) = tmc_litter_adry(ji,jst) + &
[6954]3112                  & (dz(jsl)+ dz(jsl+1))* &
[7239]3113                  & mc_adry(njsc(ji))/deux
[8]3114          END DO
3115       END DO
[947]3116    END DO
[8]3117
[4534]3118
[6954]3119    DO jst=1,nstm
[8]3120       DO ji=1,kjpindex
[3402]3121          ! here we set that humrelv=0 in PFT1
[6954]3122         humrelv(ji,1,jst) = zero
[947]3123       ENDDO
3124    END DO
[8]3125
[2222]3126
[4637]3127    ! Calculate shumdiag_perma for thermosoil
[6954]3128    ! Use resdist instead of soiltile because we here need to have
[3402]3129    ! shumdiag_perma at the value from previous time step.
3130    ! Here, soilmoist is only used as a temporary variable to calculate shumdiag_perma
[3969]3131    ! (based on resdist=soiltile from previous timestep, but normally equal to soiltile)
3132    ! For consistency with hydrol_soil, we want to calculate a grid-cell average
[1943]3133    soilmoist(:,:) = zero
3134    DO jst=1,nstm
3135       DO ji=1,kjpindex
[3402]3136          soilmoist(ji,1) = soilmoist(ji,1) + resdist(ji,jst) * &
3137               dz(2) * ( trois*mc(ji,1,jst) + mc(ji,2,jst) )/huit
3138          DO jsl = 2,nslm-1
3139             soilmoist(ji,jsl) = soilmoist(ji,jsl) + resdist(ji,jst) * &
3140                  ( dz(jsl) * (trois*mc(ji,jsl,jst)+mc(ji,jsl-1,jst))/huit &
3141                  + dz(jsl+1) * (trois*mc(ji,jsl,jst)+mc(ji,jsl+1,jst))/huit )
3142          END DO
3143          soilmoist(ji,nslm) = soilmoist(ji,nslm) + resdist(ji,jst) * &
3144               dz(nslm) * (trois*mc(ji,nslm,jst) + mc(ji,nslm-1,jst))/huit
3145       ENDDO
3146    ENDDO
[3969]3147    DO ji=1,kjpindex
[6954]3148        soilmoist(ji,:) = soilmoist(ji,:) * vegtot_old(ji) ! grid cell average
[3969]3149    ENDDO
[6954]3150
[3969]3151    ! -- shumdiag_perma for restart
[6954]3152   !  For consistency with hydrol_soil, we want to calculate a grid-cell average
[4637]3153    DO jsl = 1, nslm
[6954]3154       DO ji=1,kjpindex
3155          shumdiag_perma(ji,jsl) = soilmoist(ji,jsl) / (dh(jsl)*mcs(ji))
3156          shumdiag_perma(ji,jsl) = MAX(MIN(shumdiag_perma(ji,jsl), un), zero)
[3402]3157       ENDDO
3158    ENDDO
[6954]3159
[3402]3160    ! Calculate drysoil_frac if it was not found in the restart file
[3969]3161    ! For simplicity, we set drysoil_frac to 0.5 in this case
[2868]3162    IF (ALL(drysoil_frac(:) == val_exp)) THEN
3163       DO ji=1,kjpindex
[3969]3164          drysoil_frac(ji) = 0.5
[2868]3165       END DO
3166    END IF
[8]3167
[6954]3168    !! Calculate the volumetric soil moisture content (mc_layh and mcl_layh) needed in
3169    !! thermosoil for the thermal conductivity.
[3969]3170    ! These values are only used in thermosoil_init in absence of a restart file
[6954]3171
[2922]3172    mc_layh(:,:) = zero
3173    mcl_layh(:,:) = zero
[6954]3174     
[2922]3175    DO jst=1,nstm
[4637]3176       DO jsl=1,nslm
3177          DO ji=1,kjpindex
3178            mc_layh(ji,jsl) = mc_layh(ji,jsl) + mc(ji,jsl,jst) * resdist(ji,jst)  * vegtot_old(ji)
3179            mcl_layh(ji,jsl) = mcl_layh(ji,jsl) + mcl(ji,jsl,jst) * resdist(ji,jst) * vegtot_old(ji)
[2922]3180         ENDDO
3181      END DO
3182    END DO
3183
[2348]3184    IF (printlev>=3) WRITE (numout,*) ' hydrol_var_init done '
[8]3185
3186  END SUBROUTINE hydrol_var_init
3187
[947]3188
3189
3190   
3191!! ================================================================================================================================
3192!! SUBROUTINE   : hydrol_canop
3193!!
3194!>\BRIEF        This routine computes canopy processes.
3195!!
3196!! DESCRIPTION  :
3197!! - 1 evaporation off the continents
3198!! - 1.1 The interception loss is take off the canopy.
3199!! - 1.2 precip_rain is shared for each vegetation type
3200!! - 1.3 Limits the effect and sum what receives soil
3201!! - 1.4 swap qsintveg to the new value
3202!!
3203!! RECENT CHANGE(S) : None
3204!!
3205!! MAIN OUTPUT VARIABLE(S) :
3206!!
3207!! REFERENCE(S) :
3208!!
3209!! FLOWCHART    : None
3210!! \n
3211!_ ================================================================================================================================
3212!_ hydrol_canop
3213
3214  SUBROUTINE hydrol_canop (kjpindex, precip_rain, vevapwet, veget_max, veget, qsintmax, &
[8]3215       & qsintveg,precisol,tot_melt)
3216
3217    !
3218    ! interface description
3219    !
[947]3220
3221    !! 0. Variable and parameter declaration
3222
3223    !! 0.1 Input variables
3224
[8]3225    INTEGER(i_std), INTENT(in)                               :: kjpindex    !! Domain size
3226    ! input fields
3227    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: precip_rain !! Rain precipitation
3228    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(in)        :: vevapwet    !! Interception loss
[947]3229    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(in)        :: veget_max   !! max fraction of vegetation type
[8]3230    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(in)        :: veget       !! Fraction of vegetation type
3231    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(in)        :: qsintmax    !! Maximum water on vegetation for interception
[947]3232    REAL(r_std), DIMENSION  (kjpindex), INTENT (in)          :: tot_melt    !! Total melt
3233
3234    !! 0.2 Output variables
3235
[4753]3236    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(out)       :: precisol    !! Water fallen onto the ground (throughfall+Totmelt)
[947]3237
3238    !! 0.3 Modified variables
3239
[8]3240    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(inout)     :: qsintveg    !! Water on vegetation due to interception
3241
[947]3242    !! 0.4 Local variables
[8]3243
[947]3244    INTEGER(i_std)                                           :: ji, jv
3245    REAL(r_std), DIMENSION (kjpindex,nvm)                    :: zqsintvegnew
3246
[1082]3247!_ ================================================================================================================================
3248
[8]3249    ! boucle sur les points continentaux
3250    ! calcul de qsintveg au pas de temps suivant
3251    ! par ajout du flux interception loss
3252    ! calcule par enerbil en fonction
3253    ! des calculs faits dans diffuco
3254    ! calcul de ce qui tombe sur le sol
3255    ! avec accumulation dans precisol
3256    ! essayer d'harmoniser le traitement du sol nu
3257    ! avec celui des differents types de vegetation
3258    ! fait si on impose qsintmax ( ,1) = 0.0
3259    !
3260    ! loop for continental subdomain
3261    !
3262    !
[947]3263    !! 1 evaporation off the continents
[8]3264    !
[947]3265    !! 1.1 The interception loss is take off the canopy.
3266    DO jv=2,nvm
[8]3267       qsintveg(:,jv) = qsintveg(:,jv) - vevapwet(:,jv)
3268    END DO
3269
[947]3270    !     It is raining :
3271    !! 1.2 precip_rain is shared for each vegetation type
[8]3272    !
[947]3273    qsintveg(:,1) = zero
3274    DO jv=2,nvm
[2381]3275       qsintveg(:,jv) = qsintveg(:,jv) + veget(:,jv) * ((1-throughfall_by_pft(jv))*precip_rain(:))
[8]3276    END DO
3277
3278    !
[947]3279    !! 1.3 Limits the effect and sum what receives soil
[8]3280    !
[947]3281    precisol(:,1)=veget_max(:,1)*precip_rain(:)
3282    DO jv=2,nvm
[8]3283       DO ji = 1, kjpindex
3284          zqsintvegnew(ji,jv) = MIN (qsintveg(ji,jv),qsintmax(ji,jv)) 
[2381]3285          precisol(ji,jv) = (veget(ji,jv)*throughfall_by_pft(jv)*precip_rain(ji)) + &
3286               qsintveg(ji,jv) - zqsintvegnew (ji,jv) + &
3287               (veget_max(ji,jv) - veget(ji,jv))*precip_rain(ji)
[8]3288       ENDDO
3289    END DO
[4753]3290       
3291    ! Precisol is currently the same as throughfall, save it for diagnostics
3292    throughfall(:,:) = precisol(:,:)
3293
[8]3294    DO jv=1,nvm
3295       DO ji = 1, kjpindex
3296          IF (vegtot(ji).GT.min_sechiba) THEN
[947]3297             precisol(ji,jv) = precisol(ji,jv)+tot_melt(ji)*veget_max(ji,jv)/vegtot(ji)
[8]3298          ENDIF
3299       ENDDO
3300    END DO
3301    !   
3302    !
[947]3303    !! 1.4 swap qsintveg to the new value
[8]3304    !
[947]3305    DO jv=2,nvm
[8]3306       qsintveg(:,jv) = zqsintvegnew (:,jv)
3307    END DO
3308
[2348]3309    IF (printlev>=3) WRITE (numout,*) ' hydrol_canop done '
[8]3310
3311  END SUBROUTINE hydrol_canop
[947]3312
3313
3314!! ================================================================================================================================
3315!! SUBROUTINE   : hydrol_vegupd
3316!!
3317!>\BRIEF        Vegetation update   
3318!!
3319!! DESCRIPTION  :
3320!!   The vegetation cover has changed and we need to adapt the reservoir distribution
3321!!   and the distribution of plants on different soil types.
3322!!   You may note that this occurs after evaporation and so on have been computed. It is
3323!!   not a problem as a new vegetation fraction will start with humrel=0 and thus will have no
3324!!   evaporation. If this is not the case it should have been caught above.
3325!!
3326!! - 1 Update of vegetation is it needed?
3327!! - 2 calculate water mass that we have to redistribute
3328!! - 3 put it into reservoir of plant whose surface area has grown
3329!! - 4 Soil tile gestion
3330!! - 5 update the corresponding masks
3331!!
3332!! RECENT CHANGE(S) : None
3333!!
3334!! MAIN OUTPUT VARIABLE(S) :
3335!!
3336!! REFERENCE(S) :
3337!!
3338!! FLOWCHART    : None
3339!! \n
3340!_ ================================================================================================================================
3341!_ hydrol_vegupd
3342
[3969]3343  SUBROUTINE hydrol_vegupd(kjpindex, veget, veget_max, soiltile, qsintveg, frac_bare, drain_upd, runoff_upd)
[947]3344
3345
3346    !! 0. Variable and parameter declaration
3347
3348    !! 0.1 Input variables
3349
[8]3350    ! input scalar
[947]3351    INTEGER(i_std), INTENT(in)                            :: kjpindex 
[8]3352    ! input fields
[947]3353    REAL(r_std), DIMENSION (kjpindex, nvm), INTENT(in)    :: veget            !! New vegetation map
3354    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)     :: veget_max        !! Max. fraction of vegetation type
[3969]3355    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT (in)   :: soiltile         !! Fraction of each soil tile within vegtot (0-1, unitless)
[947]3356
3357    !! 0.2 Output variables
[3969]3358    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(out)    :: frac_bare        !! Fraction(of veget_max) of bare soil
3359                                                                              !! in each vegetation type
3360    REAL(r_std),DIMENSION (kjpindex), INTENT(out)         :: drain_upd        !! Change in drainage due to decrease in vegtot
3361                                                                              !! on mc [kg/m2/dt]
3362    REAL(r_std),DIMENSION (kjpindex), INTENT(out)         :: runoff_upd       !! Change in runoff due to decrease in vegtot
3363                                                                              !! on water2infilt[kg/m2/dt]
3364   
[947]3365
3366    !! 0.3 Modified variables
3367
3368    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (inout)  :: qsintveg         !! Water on old vegetation
3369
3370    !! 0.4 Local variables
3371
3372    INTEGER(i_std)                                 :: ji,jv,jst
3373
[1082]3374!_ ================================================================================================================================
[947]3375
3376    !! 1 If veget has been updated at last time step (with LAND USE or DGVM),
3377    !! tmc and mc must be modified with respect to humtot conservation.
[3969]3378    CALL hydrol_tmc_update ( kjpindex, veget_max, soiltile, qsintveg, drain_upd, runoff_upd)
[8]3379
3380
[947]3381    ! Compute the masks for veget
3382   
3383    mask_veget(:,:) = 0
3384    mask_soiltile(:,:) = 0
3385   
3386    DO jst=1,nstm
3387       DO ji = 1, kjpindex
3388          IF(soiltile(ji,jst) .GT. min_sechiba) THEN
3389             mask_soiltile(ji,jst) = 1
3390          ENDIF
3391       END DO
3392    ENDDO
3393         
[8]3394    DO jv = 1, nvm
3395       DO ji = 1, kjpindex
[947]3396          IF(veget_max(ji,jv) .GT. min_sechiba) THEN
3397             mask_veget(ji,jv) = 1
[8]3398          ENDIF
[947]3399       END DO
3400    END DO
3401
[3687]3402    ! Compute vegetmax_soil
3403    vegetmax_soil(:,:,:) = zero
[947]3404    DO jv = 1, nvm
3405       jst = pref_soil_veg(jv)
3406       DO ji=1,kjpindex
3407          ! for veget distribution used in sechiba via humrel
3408          IF (mask_soiltile(ji,jst).GT.0 .AND. vegtot(ji) > min_sechiba) THEN
[3687]3409             vegetmax_soil(ji,jv,jst)=veget_max(ji,jv)/soiltile(ji,jst)
[947]3410          ENDIF
[8]3411       ENDDO
3412    ENDDO
3413
[2718]3414    ! Calculate frac_bare (previosly done in slowproc_veget)
3415    DO ji =1, kjpindex
3416       IF( veget_max(ji,1) .GT. min_sechiba ) THEN
3417          frac_bare(ji,1) = un
3418       ELSE
3419          frac_bare(ji,1) = zero
3420       ENDIF
3421    ENDDO
3422    DO jv = 2, nvm
3423       DO ji =1, kjpindex
3424          IF( veget_max(ji,jv) .GT. min_sechiba ) THEN
3425             frac_bare(ji,jv) = un - veget(ji,jv)/veget_max(ji,jv)
3426          ELSE
3427             frac_bare(ji,jv) = zero
3428          ENDIF
3429       ENDDO
3430    ENDDO
3431
3432    ! Tout dans cette routine est maintenant certainement obsolete (veget_max etant constant) en dehors des lignes
3433    ! suivantes et le calcul de frac_bare:
[947]3434    frac_bare_ns(:,:) = zero
3435    DO jst = 1, nstm
3436       DO jv = 1, nvm
3437          DO ji =1, kjpindex
3438             IF(vegtot(ji) .GT. min_sechiba) THEN
[3687]3439                frac_bare_ns(ji,jst) = frac_bare_ns(ji,jst) + vegetmax_soil(ji,jv,jst) * frac_bare(ji,jv) / vegtot(ji)
[947]3440             ENDIF
3441          END DO
3442       ENDDO
3443    END DO
[2718]3444   
[2348]3445    IF (printlev>=3) WRITE (numout,*) ' hydrol_vegupd done '
[8]3446
[947]3447  END SUBROUTINE hydrol_vegupd
[8]3448
3449
[947]3450!! ================================================================================================================================
3451!! SUBROUTINE   : hydrol_flood
3452!!
3453!>\BRIEF        This routine computes the evolution of the surface reservoir (floodplain). 
3454!!
3455!! DESCRIPTION  :
3456!! - 1 Take out vevapflo from the reservoir and transfer the remaining to subsinksoil
3457!! - 2 Compute the total flux from floodplain floodout (transfered to routing)
3458!! - 3 Discriminate between precip over land and over floodplain
3459!!
3460!! RECENT CHANGE(S) : None
3461!!
3462!! MAIN OUTPUT VARIABLE(S) :
3463!!
3464!! REFERENCE(S) :
3465!!
3466!! FLOWCHART    : None
3467!! \n
3468!_ ================================================================================================================================
3469!_ hydrol_flood
[8]3470
[2591]3471  SUBROUTINE hydrol_flood (kjpindex, vevapflo, flood_frac, flood_res, floodout)
[8]3472
[947]3473    !! 0. Variable and parameter declaration
[8]3474
[947]3475    !! 0.1 Input variables
[8]3476
[947]3477    ! input scalar
3478    INTEGER(i_std), INTENT(in)                               :: kjpindex         !!
3479    ! input fields
3480    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: flood_frac       !! Fraction of floodplains in grid box
[8]3481
[947]3482    !! 0.2 Output variables
[8]3483
[947]3484    REAL(r_std), DIMENSION (kjpindex), INTENT(out)           :: floodout         !! Flux to take out from floodplains
[8]3485
[947]3486    !! 0.3 Modified variables
[8]3487
[947]3488    REAL(r_std), DIMENSION (kjpindex), INTENT(inout)         :: flood_res        !! Floodplains reservoir estimate
3489    REAL(r_std), DIMENSION (kjpindex), INTENT(inout)         :: vevapflo         !! Evaporation over floodplains
3490
3491    !! 0.4 Local variables
3492
3493    INTEGER(i_std)                                           :: ji, jv           !! Indices
3494    REAL(r_std), DIMENSION (kjpindex)                        :: temp             !!
3495
[1082]3496!_ ================================================================================================================================
[947]3497    !-
3498    !! 1 Take out vevapflo from the reservoir and transfer the remaining to subsinksoil
3499    !-
3500    DO ji = 1,kjpindex
3501       temp(ji) = MIN(flood_res(ji), vevapflo(ji))
3502    ENDDO
3503    DO ji = 1,kjpindex
3504       flood_res(ji) = flood_res(ji) - temp(ji)
3505       subsinksoil(ji) = subsinksoil(ji) + vevapflo(ji) - temp(ji)
3506       vevapflo(ji) = temp(ji)
3507    ENDDO
3508
3509    !-
3510    !! 2 Compute the total flux from floodplain floodout (transfered to routing)
3511    !-
3512    DO ji = 1,kjpindex
3513       floodout(ji) = vevapflo(ji) - flood_frac(ji) * SUM(precisol(ji,:))
3514    ENDDO
3515
3516    !-
3517    !! 3 Discriminate between precip over land and over floodplain
3518    !-
3519    DO jv=1, nvm
3520       DO ji = 1,kjpindex
3521          precisol(ji,jv) = precisol(ji,jv) * (1 - flood_frac(ji))
[8]3522       ENDDO
[947]3523    ENDDO 
[8]3524
[2348]3525    IF (printlev>=3) WRITE (numout,*) ' hydrol_flood done'
[8]3526
[947]3527  END SUBROUTINE hydrol_flood
[8]3528
[947]3529!! ================================================================================================================================
3530!! SUBROUTINE   : hydrol_soil
3531!!
[3402]3532!>\BRIEF        This routine computes soil processes with CWRR scheme (Richards equation solved by finite differences).
3533!! Note that the water fluxes are in kg/m2/dt_sechiba.
[947]3534!!
3535!! DESCRIPTION  :
[3402]3536!! 0. Initialisation, and split 2d variables to 3d variables, per soil tile
3537!! -- START MAIN LOOP (prognostic loop to update mc and mcl) OVER SOILTILES
3538!! 1. FIRSTLY, WE CHANGE MC BASED ON EXTERNAL FLUXES, ALL APPLIED AT THE SOIL SURFACE
3539!! 1.1 Reduces water2infilt and water2extract to their difference
3540!! 1.2 To remove water2extract (including bare soilevaporation) from top layer
3541!! 1.3 Infiltration
3542!! 1.4 Reinfiltration of surface runoff : compute temporary surface water and extract from runoff
3543!! 2. SECONDLY, WE UPDATE MC FROM DIFFUSION, INCLUDING DRAINAGE AND ROOTSINK
3544!!    This will act on mcl (liquid water content) only
3545!! 2.1 K and D are recomputed after infiltration
3546!! 2.2 Set the tridiagonal matrix coefficients for the diffusion/redistribution scheme
3547!! 2.3 We define mcl (liquid water content) based on mc and profil_froz_hydro_ns
3548!! 2.4 We calculate the total SM at the beginning of the routine tridiag for water conservation check
3549!! 2.5 Defining where diffusion is solved : everywhere
3550!! 2.6 We define the system of linear equations for mcl redistribution
3551!! 2.7 Solves diffusion equations
3552!! 2.8 Computes drainage = bottom boundary condition, consistent with rhs(ji,jsl=nslm)
3553!! 2.9 For water conservation check during redistribution, we calculate the total liquid SM
3554!!     at the end of the routine tridiag, and we compare the difference with the flux...
3555!! 3. AFTER DIFFUSION/REDISTRIBUTION
3556!! 3.1 Updating mc, as all the following checks against saturation will compare mc to mcs
3557!! 3.2 Correct here the possible over-saturation values (subroutine hydrol_soil_smooth_over_mcs2 acts on mc)
3558!!     Here hydrol_soil_smooth_over_mcs2 discard all excess as ru_corr_ns, oriented to either ru_ns or dr_ns
3559!! 3.3 Negative runoff is reported to drainage
3560!! 3.4 Optional block to force saturation below zwt_force
3561!! 3.5 Diagnosing the effective water table depth
3562!! 3.6 Diagnose under_mcr to adapt water stress calculation below
3563!! 4. At the end of the prognostic calculations, we recompute important moisture variables
3564!! 4.1 Total soil moisture content (water2infilt added below)
3565!! 4.2 mcl is a module variable; we update it here for calculating bare soil evaporation,
3566!! 5. Optional check of the water balance of soil column (if check_cwrr)
3567!! 5.1 Computation of the vertical water fluxes
3568!! 6. SM DIAGNOSTICS FOR OTHER ROUTINES, MODULES, OR NEXT STEP
3569!! 6.1 Total soil moisture, soil moisture at litter levels, soil wetness, us, humrelv, vesgtressv
3570!! 6.2 We need to turn off evaporation when is_under_mcr
3571!! 6.3 Calculate the volumetric soil moisture content (mc_layh and mcl_layh) needed in thermosoil
3572!! 6.4 The hydraulic conductivities exported here are the ones used in the diffusion/redistribution
3573!! -- ENDING THE MAIN LOOP ON SOILTILES
3574!! 7. Summing 3d variables into 2d variables
3575!! 8. XIOS export of local variables, including water conservation checks
3576!! 9. COMPUTING EVAP_BARE_LIM_NS FOR NEXT TIME STEP, WITH A LOOP ON SOILTILES
3577!!    The principle is to run a dummy integration of the water redistribution scheme
3578!!    to check if the SM profile can sustain a potential evaporation.
3579!!    If not, the dummy integration is redone from the SM profile of the end of the normal integration,
3580!!    with a boundary condition leading to a very severe water limitation: mc(1)=mcr
3581!! 10. evap_bar_lim is the grid-cell scale beta
[947]3582!!
[3402]3583!! RECENT CHANGE(S) : 2016 by A. Ducharne
[947]3584!!
3585!! MAIN OUTPUT VARIABLE(S) :
3586!!
[3402]3587!! REFERENCE(S) :
[947]3588!!
3589!! FLOWCHART    : None
3590!! \n
3591!_ ================================================================================================================================
3592!_ hydrol_soil
[6954]3593  SUBROUTINE hydrol_soil (ks, nvan, avan, mcr, mcs, mcfc, mcw, &
3594       kjpindex, veget_max, soiltile, njsc, reinf_slope, &
[2222]3595       & transpir, vevapnu, evapot, evapot_penm, runoff, drainage, &
3596       & returnflow, reinfiltration, irrigation, &
[5805]3597       & tot_melt, evap_bare_lim, evap_bare_lim_ns, shumdiag, shumdiag_perma,&
[2222]3598       & k_litt, litterhumdiag, humrel,vegstress, drysoil_frac, &
3599       & stempdiag,snow, &
[4637]3600       & snowdz, tot_bare_soil, u, v, tq_cdrag, mc_layh, mcl_layh)
[8]3601    !
3602    ! interface description
[947]3603
3604    !! 0. Variable and parameter declaration
3605
3606    !! 0.1 Input variables
[7239]3607   
3608    INTEGER(i_std), INTENT(in)                               :: kjpindex 
3609    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT (in)       :: veget_max        !! Map of max vegetation types [-]
3610    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)         :: njsc             !! Index of the dominant soil textural class
3611                                                                                 !!   in the grid cell (1-nscm, unitless)
3612   
[6954]3613    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: ks               !! Hydraulic conductivity at saturation (mm {-1})
3614    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: nvan             !! Van Genuchten coeficients n (unitless)
3615    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: avan             !! Van Genuchten coeficients a (mm-1})
3616    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
3617    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
3618    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcfc             !! Volumetric water content at field capacity (m^{3} m^{-3})
3619    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcw              !! Volumetric water content at wilting point (m^{3} m^{-3})
[7239]3620   
[3969]3621    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT (in)      :: soiltile         !! Fraction of each soil tile within vegtot (0-1, unitless)
[3402]3622    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT(in)        :: transpir         !! Transpiration 
3623                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3624    REAL(r_std), DIMENSION (kjpindex), INTENT (in)           :: reinf_slope      !! Fraction of surface runoff that reinfiltrates
3625                                                                                 !!  (unitless, [0-1])
3626    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: returnflow       !! Water returning to the soil from the bottom
3627                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3628    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: reinfiltration   !! Water returning to the top of the soil
3629                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3630    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: irrigation       !! Irrigation
3631                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3632    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: evapot           !! Potential evaporation
3633                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3634    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: evapot_penm      !! Potential evaporation "Penman" (Milly's correction)
3635                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3636    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: tot_melt         !! Total melt from snow and ice
3637                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
[4631]3638    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (in)       :: stempdiag        !! Diagnostic temp profile from thermosoil
[3402]3639    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: snow             !! Snow mass
3640                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3641    REAL(r_std), DIMENSION (kjpindex,nsnow),INTENT(in)       :: snowdz           !! Snow depth (m)
[2718]3642    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: tot_bare_soil    !! Total evaporating bare soil fraction
[3402]3643                                                                                 !!  (unitless, [0-1])
[3975]3644    REAL(r_std),DIMENSION (kjpindex), INTENT(in)             :: u,v              !! Horizontal wind speed
3645    REAL(r_std),DIMENSION (kjpindex), INTENT(in)             :: tq_cdrag         !! Surface drag coefficient
[947]3646
3647    !! 0.2 Output variables
3648
[3402]3649    REAL(r_std), DIMENSION (kjpindex), INTENT(out)           :: runoff           !! Surface runoff
3650                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3651    REAL(r_std), DIMENSION (kjpindex), INTENT(out)           :: drainage         !! Drainage
3652                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3653    REAL(r_std), DIMENSION (kjpindex), INTENT(out)           :: evap_bare_lim    !! Limitation factor (beta) for bare soil evaporation 
3654                                                                                 !! on each soil column (unitless, [0-1])
[5805]3655    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT(out)      :: evap_bare_lim_ns !! Limitation factor (beta) for bare soil evaporation 
3656                                                                                 !! on each soil column (unitless, [0-1])
[4631]3657    REAL(r_std), DIMENSION (kjpindex,nslm), INTENT (out)     :: shumdiag         !! Relative soil moisture in each diag soil layer
[4724]3658                                                                                 !! with respect to (mcfc-mcw) (unitless, [0-1])
[4631]3659    REAL(r_std), DIMENSION (kjpindex,nslm), INTENT (out)     :: shumdiag_perma   !! Percent of porosity filled with water (mc/mcs)
[3402]3660                                                                                 !! in each diag soil layer (for the thermal computations)
3661                                                                                 !! (unitless, [0-1])
[2589]3662    REAL(r_std), DIMENSION (kjpindex), INTENT (out)          :: k_litt           !! Litter approximated hydraulic conductivity
[3402]3663                                                                                 !!  @tex $(mm d^{-1})$ @endtex
3664    REAL(r_std), DIMENSION (kjpindex), INTENT (out)          :: litterhumdiag    !! Mean of soil_wet_litter across soil tiles
3665                                                                                 !! (unitless, [0-1])
[947]3666    REAL(r_std), DIMENSION (kjpindex, nvm), INTENT(out)      :: vegstress        !! Veg. moisture stress (only for vegetation
[3402]3667                                                                                 !! growth) (unitless, [0-1])
[2589]3668    REAL(r_std), DIMENSION (kjpindex), INTENT (out)          :: drysoil_frac     !! Function of the litter humidity
[3402]3669    REAL(r_std), DIMENSION (kjpindex,nslm), INTENT (out)     :: mc_layh          !! Volumetric water content (liquid + ice) for each soil layer
[3969]3670                                                                                 !! averaged over the mesh (for thermosoil)
[3402]3671                                                                                 !!  @tex $(m^{3} m^{-3})$ @endtex
3672    REAL(r_std), DIMENSION (kjpindex,nslm), INTENT (out)     :: mcl_layh         !! Volumetric liquid water content for each soil layer
[3969]3673                                                                                 !! averaged over the mesh (for thermosoil)
[3402]3674                                                                                 !!  @tex $(m^{3} m^{-3})$ @endtex
[947]3675    !! 0.3 Modified variables
3676
[2589]3677    REAL(r_std), DIMENSION (kjpindex), INTENT(inout)         :: vevapnu          !! Bare soil evaporation
[3402]3678                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3679    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT (inout)    :: humrel           !! Relative humidity (0-1, dimensionless)
[947]3680
3681    !! 0.4 Local variables
3682
[3402]3683    INTEGER(i_std)                                 :: ji, jv, jsl, jst           !! Indices
[2589]3684    REAL(r_std), PARAMETER                         :: frac_mcs = 0.66            !! Temporary depth
3685    REAL(r_std), DIMENSION(kjpindex)               :: temp                       !! Temporary value for fluxes
[3402]3686    REAL(r_std), DIMENSION(kjpindex)               :: tmcold                     !! Total SM at beginning of hydrol_soil (kg/m2)
3687    REAL(r_std), DIMENSION(kjpindex)               :: tmcint                     !! Ancillary total SM (kg/m2)
[8]3688    REAL(r_std), DIMENSION(kjpindex,nslm)          :: mcint                      !! To save mc values for future use
[3402]3689    REAL(r_std), DIMENSION(kjpindex,nslm)          :: mclint                     !! To save mcl values for future use
3690    LOGICAL, DIMENSION(kjpindex,nstm)              :: is_under_mcr               !! Identifies under residual soil moisture points
3691    LOGICAL, DIMENSION(kjpindex)                   :: is_over_mcs                !! Identifies over saturated soil moisture points
[947]3692    REAL(r_std), DIMENSION(kjpindex)               :: deltahum,diff              !!
3693    LOGICAL(r_std), DIMENSION(kjpindex)            :: test                       !!
[3402]3694    REAL(r_std), DIMENSION(kjpindex)               :: water2extract              !! Water flux to be extracted at the soil surface
3695                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
[947]3696    REAL(r_std), DIMENSION(kjpindex)               :: returnflow_soil            !! Water from the routing back to the bottom of
[3402]3697                                                                                 !! the soil @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
[947]3698    REAL(r_std), DIMENSION(kjpindex)               :: reinfiltration_soil        !! Water from the routing back to the top of the
[3402]3699                                                                                 !! soil @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3700    REAL(r_std), DIMENSION(kjpindex)               :: irrigation_soil            !! Water from irrigation returning to soil moisture
3701                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
[2589]3702    REAL(r_std), DIMENSION(kjpindex)               :: flux_infilt                !! Water to infiltrate
3703                                                                                 !!  @tex $(kg m^{-2})$ @endtex
[2222]3704    REAL(r_std), DIMENSION(kjpindex)               :: flux_bottom                !! Flux at bottom of the soil column
[3402]3705                                                                                 !!  @tex $(kg m^{-2})$ @endtex
[2589]3706    REAL(r_std), DIMENSION(kjpindex)               :: flux_top                   !! Flux at top of the soil column (for bare soil evap)
[3402]3707                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3708    REAL(r_std), DIMENSION (kjpindex,nstm)         :: qinfilt_ns                 !! Effective infiltration flux per soil tile
3709                                                                                 !!  @tex $(kg m^{-2})$ @endtex   
3710    REAL(r_std), DIMENSION (kjpindex)              :: qinfilt                    !! Effective infiltration flux 
3711                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3712    REAL(r_std), DIMENSION (kjpindex,nstm)         :: ru_infilt_ns               !! Surface runoff from hydrol_soil_infilt per soil tile
3713                                                                                 !!  @tex $(kg m^{-2})$ @endtex   
3714    REAL(r_std), DIMENSION (kjpindex)              :: ru_infilt                  !! Surface runoff from hydrol_soil_infilt
3715                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3716    REAL(r_std), DIMENSION (kjpindex,nstm)         :: ru_corr_ns                 !! Surface runoff produced to correct excess per soil tile
3717                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3718    REAL(r_std), DIMENSION (kjpindex)              :: ru_corr                    !! Surface runoff produced to correct excess
3719                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex 
3720    REAL(r_std), DIMENSION (kjpindex,nstm)         :: ru_corr2_ns                !! Correction of negative surface runoff per soil tile
3721                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3722    REAL(r_std), DIMENSION (kjpindex)              :: ru_corr2                   !! Correction of negative surface runoff
3723                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3724    REAL(r_std), DIMENSION (kjpindex,nstm)         :: dr_corr_ns                 !! Drainage produced to correct excess
3725                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3726    REAL(r_std), DIMENSION (kjpindex,nstm)         :: dr_corrnum_ns              !! Drainage produced to correct numerical errors in tridiag
3727                                                                                 !!  @tex $(kg m^{-2})$ @endtex   
3728    REAL(r_std), DIMENSION (kjpindex)              :: dr_corr                    !! Drainage produced to correct excess
3729                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3730    REAL(r_std), DIMENSION (kjpindex)              :: dr_corrnum                 !! Drainage produced to correct numerical errors in tridiag
3731                                                                                 !!  @tex $(kg m^{-2} dt\_sechiba^{-1})$ @endtex
3732    REAL(r_std), DIMENSION (kjpindex,nslm)         :: dmc                        !! Delta mc when forcing saturation (zwt_force)
3733                                                                                 !!  @tex $(m^{3} m^{-3})$ @endtex
3734    REAL(r_std), DIMENSION (kjpindex,nstm)         :: dr_force_ns                !! Delta drainage when forcing saturation (zwt_force)
3735                                                                                 !!  per soil tile  @tex $(kg m^{-2})$ @endtex
3736    REAL(r_std), DIMENSION (kjpindex)              :: dr_force                   !! Delta drainage when forcing saturation (zwt_force)
3737                                                                                 !!  @tex $(kg m^{-2})$ @endtex 
3738    REAL(r_std), DIMENSION (kjpindex,nstm)         :: wtd_ns                     !! Effective water table depth (m)
3739    REAL(r_std), DIMENSION (kjpindex)              :: wtd                        !! Mean water table depth in the grid-cell (m)
[947]3740
[4534]3741    ! For the calculation of soil_wet_ns and us/humrel/vegstress
3742    REAL(r_std), DIMENSION (kjpindex,nslm)         :: sm                         !! Soil moisture of each layer (liquid phase)
[3473]3743                                                                                 !!  @tex $(kg m^{-2})$ @endtex
[4534]3744    REAL(r_std), DIMENSION (kjpindex,nslm)         :: smt                        !! Soil moisture of each layer (liquid+solid phase)
3745                                                                                 !!  @tex $(kg m^{-2})$ @endtex
[3473]3746    REAL(r_std), DIMENSION (kjpindex,nslm)         :: smw                        !! Soil moisture of each layer at wilting point
3747                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3748    REAL(r_std), DIMENSION (kjpindex,nslm)         :: smf                        !! Soil moisture of each layer at field capacity
3749                                                                                 !!  @tex $(kg m^{-2})$ @endtex   
3750    REAL(r_std), DIMENSION (kjpindex,nslm)         :: sms                        !! Soil moisture of each layer at saturation
3751                                                                                 !!  @tex $(kg m^{-2})$ @endtex
3752    REAL(r_std), DIMENSION (kjpindex,nslm)         :: sm_nostress                !! Soil moisture of each layer at which us reaches 1
3753                                                                                 !!  @tex $(kg m^{-2})$ @endtex
[3402]3754    ! For water conservation checks (in mm/dtstep unless otherwise mentioned)
3755    REAL(r_std), DIMENSION (kjpindex,nstm)         :: check_infilt_ns             !! Water conservation diagnostic at routine scale
3756    REAL(r_std), DIMENSION (kjpindex,nstm)         :: check1_ns                   !! Water conservation diagnostic at routine scale
3757    REAL(r_std), DIMENSION (kjpindex,nstm)         :: check_tr_ns                 !! Water conservation diagnostic at routine scale
3758    REAL(r_std), DIMENSION (kjpindex,nstm)         :: check_over_ns               !! Water conservation diagnostic at routine scale
3759    REAL(r_std), DIMENSION (kjpindex,nstm)         :: check_under_ns              !! Water conservation diagnostic at routine scale
3760    REAL(r_std), DIMENSION(kjpindex)               :: tmci                        !! Total soil moisture at beginning of routine (kg/m2)
3761    REAL(r_std), DIMENSION(kjpindex)               :: tmcf                        !! Total soil moisture at end of routine (kg/m2)
3762    REAL(r_std), DIMENSION(kjpindex)               :: diag_tr                     !! Transpiration flux
3763    REAL(r_std), DIMENSION (kjpindex)              :: check_infilt                !! Water conservation diagnostic at routine scale
3764    REAL(r_std), DIMENSION (kjpindex)              :: check1                      !! Water conservation diagnostic at routine scale
3765    REAL(r_std), DIMENSION (kjpindex)              :: check_tr                    !! Water conservation diagnostic at routine scale
3766    REAL(r_std), DIMENSION (kjpindex)              :: check_over                  !! Water conservation diagnostic at routine scale
3767    REAL(r_std), DIMENSION (kjpindex)              :: check_under                 !! Water conservation diagnostic at routine scale
3768
[5506]3769    ! Diagnostic of the vertical soil water fluxes 
3770    REAL(r_std), DIMENSION (kjpindex,nslm)         :: qflux                       !! Local upward flux into soil layer
3771                                                                                  !! from lower interface
3772                                                                                  !!  @tex $(kg m^{-2})$ @endtex
3773    REAL(r_std), DIMENSION (kjpindex)              :: check_top                   !! Water budget residu in top soil layer
3774                                                                                  !!  @tex $(kg m^{-2})$ @endtex
3775
[3975]3776    ! Variables for calculation of a soil resistance, option do_rsoil (following the formulation of Sellers et al 1992, implemented in Oleson et al. 2008)
3777    REAL(r_std)                                    :: speed                      !! magnitude of wind speed required for Aerodynamic resistance
3778    REAL(r_std)                                    :: ra                         !! diagnosed aerodynamic resistance
3779    REAL(r_std), DIMENSION(kjpindex)               :: mc_rel                     !! first layer relative soil moisture, required for rsoil
3780    REAL(r_std), DIMENSION(kjpindex)               :: evap_soil                  !! soil evaporation from Oleson et al 2008
3781    REAL(r_std), DIMENSION(kjpindex,nstm)          :: r_soil_ns                  !! soil resistance from Oleson et al 2008
3782    REAL(r_std), DIMENSION(kjpindex)               :: r_soil                     !! soil resistance from Oleson et al 2008
3783    REAL(r_std), DIMENSION(kjpindex)               :: tmcs_litter                !! Saturated soil moisture in the 4 "litter" soil layers
[4764]3784    REAL(r_std), DIMENSION(nslm)                   :: nroot_tmp                  !! Temporary variable to calculate the nroot
[3975]3785
[4812]3786    ! For CMIP6 and SP-MIP : ksat and matric pressure head psi(theta)
3787    REAL(r_std)                                    :: mc_ratio, mvg, avg
3788    REAL(r_std)                                    :: psi                        !! Matric head (per soil layer and soil tile) [mm=kg/m2]
3789    REAL(r_std), DIMENSION (kjpindex,nslm)         :: psi_moy                    !! Mean matric head per soil layer [mm=kg/m2] 
3790    REAL(r_std), DIMENSION (kjpindex,nslm)         :: ksat                       !! Saturated hydraulic conductivity at each node (mm/d) 
3791
[1082]3792!_ ================================================================================================================================
3793
[2589]3794    !! 0.1 Arrays with DIMENSION(kjpindex)
[3402]3795   
[8]3796    returnflow_soil(:) = zero
[947]3797    reinfiltration_soil(:) = zero
[8]3798    irrigation_soil(:) = zero
[5506]3799    qflux_ns(:,:,:) = zero
[3402]3800    mc_layh(:,:) = zero ! for thermosoil
3801    mcl_layh(:,:) = zero ! for thermosoil
[4812]3802    kk(:,:,:) = zero
3803    kk_moy(:,:) = zero
[3402]3804    undermcr(:) = zero ! needs to be initialized outside from jst loop
[4764]3805    ksat(:,:) = zero
[4812]3806    psi_moy(:,:) = zero
[3402]3807
[2222]3808    IF (ok_freeze_cwrr) THEN
[3402]3809       
3810       ! 0.1 Calculate the temperature and fozen fraction at the hydrological levels
3811       
[7255]3812       ! Calculates profil_froz_hydro_ns as a function of stempdiag and mc if ok_thermodynamical_freezing
[3402]3813       ! These values will be kept till the end of the prognostic loop
3814       DO jst=1,nstm
[7255]3815          CALL hydrol_soil_froz(nvan, avan, mcr, mcs, kjpindex,jst,njsc,stempdiag)
[3402]3816       ENDDO
3817
3818    ELSE
3819 
3820       profil_froz_hydro_ns(:,:,:) = zero
3821             
[2222]3822    ENDIF
[3402]3823   
[2589]3824    !! 0.2 Split 2d variables to 3d variables, per soil tile
[3402]3825    !  Here, the evaporative fluxes are distributed over the soiltiles as a function of the
3826    !    corresponding control factors; they are normalized to vegtot
3827    !  At step 7, the reverse transformation is used for the fluxes produced in hydrol_soil
3828    !    flux_cell(ji)=sum(flux_ns(ji,jst)*soiltile(ji,jst)*vegtot(ji))
[5805]3829    CALL hydrol_split_soil (kjpindex, veget_max, soiltile, vevapnu, transpir, humrel, &
3830         evap_bare_lim, evap_bare_lim_ns, tot_bare_soil)
[3402]3831   
[2589]3832    !! 0.3 Common variables related to routing, with all return flow applied to the soil surface
[3402]3833    ! The fluxes coming from the routing are uniformly splitted into the soiltiles,
3834    !    but are normalized to vegtot like the above fluxes:
3835    !            flux_ns(ji,jst)=flux_cell(ji)/vegtot(ji)
3836    ! It is the case for : irrigation_soil(ji) and reinfiltration_soil(ji) cf below
3837    ! It is also the case for subsinksoil(ji), which is divided by (1-tot_frac_nobio) at creation in hydrol_snow
3838    ! AD16*** The transformation in 0.2 and 0.3 is likely to induce conservation problems
3839    !         when tot_frac_nobio NE 0, since sum(soiltile) NE vegtot in this case
3840   
[8]3841    DO ji=1,kjpindex
3842       IF(vegtot(ji).GT.min_sechiba) THEN
[3402]3843          ! returnflow_soil is assumed to enter from the bottom, but it is not possible with CWRR
[947]3844          returnflow_soil(ji) = zero
3845          reinfiltration_soil(ji) = (returnflow(ji) + reinfiltration(ji))/vegtot(ji)
[8]3846          irrigation_soil(ji) = irrigation(ji)/vegtot(ji)
[947]3847       ELSE
3848          returnflow_soil(ji) = zero
3849          reinfiltration_soil(ji) = zero
3850          irrigation_soil(ji) = zero
[8]3851       ENDIF
[2589]3852    ENDDO       
[3402]3853   
3854    !! -- START MAIN LOOP (prognostic loop to update mc and mcl) OVER SOILTILES
3855    !!    The called subroutines work on arrays with DIMENSION(kjpindex),
3856    !!    recursively used for each soiltile jst
3857   
[8]3858    DO jst = 1,nstm
[3402]3859
3860       is_under_mcr(:,jst) = .FALSE.
3861       is_over_mcs(:) = .FALSE.
3862       
[2589]3863       !! 0.4. Keep initial values for future check-up
[3402]3864       
[2589]3865       ! Total moisture content (including water2infilt) is saved for balance checks at the end
3866       ! In hydrol_tmc_update, tmc is increased by water2infilt(ji,jst), but mc is not modified !
[8]3867       tmcold(:) = tmc(:,jst)
[3402]3868       
3869       ! The value of mc is kept in mcint (nstm dimension removed), in case needed for water balance checks
[8]3870       DO jsl = 1, nslm
3871          DO ji = 1, kjpindex
[947]3872             mcint(ji,jsl) = mask_soiltile(ji,jst) * mc(ji,jsl,jst)
[8]3873          ENDDO
3874       ENDDO
[2589]3875       !
3876       ! Initial total moisture content : tmcint does not include water2infilt, contrarily to tmcold
[8]3877       DO ji = 1, kjpindex
[2651]3878          tmcint(ji) = dz(2) * ( trois*mcint(ji,1) + mcint(ji,2) )/huit 
[8]3879       ENDDO
3880       DO jsl = 2,nslm-1
3881          DO ji = 1, kjpindex
[2651]3882             tmcint(ji) = tmcint(ji) + dz(jsl) &
[8]3883                  & * (trois*mcint(ji,jsl)+mcint(ji,jsl-1))/huit &
[2651]3884                  & + dz(jsl+1) * (trois*mcint(ji,jsl)+mcint(ji,jsl+1))/huit
[8]3885          ENDDO
[947]3886       ENDDO
[8]3887       DO ji = 1, kjpindex
[2651]3888          tmcint(ji) = tmcint(ji) + dz(nslm) &
[8]3889               & * (trois * mcint(ji,nslm) + mcint(ji,nslm-1))/huit
3890       ENDDO
3891
[3402]3892       !! 1. FIRSTLY, WE CHANGE MC BASED ON EXTERNAL FLUXES, ALL APPLIED AT THE SOIL SURFACE
[2589]3893       !!   Input = water2infilt(ji,jst) + irrigation_soil(ji) + reinfiltration_soil(ji) + precisol_ns(ji,jst)
[3402]3894       !!      - negative evaporation fluxes (MIN(ae_ns(ji,jst),zero)+ MIN(subsinksoil(ji),zero))
3895       !!   Output = MAX(ae_ns(ji,jst),zero) + subsinksoil(ji) = positive evaporation flux = water2extract
3896       ! In practice, negative subsinksoil(ji) is not possible
[2589]3897
[3402]3898       !! 1.1 Reduces water2infilt and water2extract to their difference
[2589]3899
[3402]3900       ! Compares water2infilt and water2extract to keep only difference
3901       ! Here, temp is used as a temporary variable to store the min of water to infiltrate vs evaporate
[947]3902       DO ji = 1, kjpindex
[3402]3903          temp(ji) = MIN(water2infilt(ji,jst) + irrigation_soil(ji) + reinfiltration_soil(ji) &
3904                         - MIN(ae_ns(ji,jst),zero) - MIN(subsinksoil(ji),zero) + precisol_ns(ji,jst), &
3905                           MAX(ae_ns(ji,jst),zero) + MAX(subsinksoil(ji),zero) )
[947]3906       ENDDO
3907
[2589]3908       ! The water to infiltrate at the soil surface is either 0, or the difference to what has to be evaporated
3909       !   - the initial water2infilt (right hand side) results from qsintveg changes with vegetation updates
3910       !   - irrigation_soil is the input flux to the soil surface from irrigation
3911       !   - reinfiltration_soil is the input flux to the soil surface from routing 'including returnflow)
3912       !   - eventually, water2infilt holds all fluxes to the soil surface except precisol (reduced by water2extract)
[947]3913       DO ji = 1, kjpindex
[3402]3914          water2infilt(ji,jst) = water2infilt(ji,jst) + irrigation_soil(ji) + reinfiltration_soil(ji) &
3915                - MIN(ae_ns(ji,jst),zero) - MIN(subsinksoil(ji),zero) + precisol_ns(ji,jst) &
3916                - temp(ji) 
[947]3917       ENDDO       
[8]3918             
[3402]3919       ! The water to evaporate from the sol surface is either the difference to what has to be infiltrated, or 0
[2589]3920       !   - subsinksoil is the residual from sublimation is the snowpack is not sufficient
3921       !   - how are the negative values of ae_ns taken into account ???
[947]3922       DO ji = 1, kjpindex
[3402]3923          water2extract(ji) =  MAX(ae_ns(ji,jst),zero) + MAX(subsinksoil(ji),zero) - temp(ji) 
[8]3924       ENDDO
3925
[3402]3926       ! Here we acknowledge that subsinksoil is part of ae_ns, but ae_ns is not used further
3927       ae_ns(:,jst) = ae_ns(:,jst) + subsinksoil(:) 
[947]3928
[3402]3929       !! 1.2 To remove water2extract (including bare soil) from top layer
3930       flux_top(:) = water2extract(:)
[947]3931
[3402]3932       !! 1.3 Infiltration
[947]3933
[3402]3934       !! Definition of flux_infilt
[947]3935       DO ji = 1, kjpindex
[3402]3936          ! Initialise the flux to be infiltrated 
3937          flux_infilt(ji) = water2infilt(ji,jst) 
[947]3938       ENDDO
[3402]3939       
3940       !! K and D are computed for the profile of mc before infiltration
3941       !! They depend on the fraction of soil ice, given by profil_froz_hydro_ns
[6954]3942       CALL hydrol_soil_coef(mcr, mcs, kjpindex,jst,njsc)
[8]3943
[3402]3944       !! Infiltration and surface runoff are computed
3945       !! Infiltration stems from comparing liquid water2infilt to initial total mc (liquid+ice)
3946       !! The conductivity comes from hydrol_soil_coef and relates to the liquid phase only
3947       !  This seems consistent with ok_freeze
[7255]3948       CALL hydrol_soil_infilt(ks, nvan, avan, mcr, mcs, mcfc, mcw, kjpindex, jst, njsc, flux_infilt,  stempdiag, &
3949                               qinfilt_ns, ru_infilt_ns, check_infilt_ns)
[3402]3950       ru_ns(:,jst) = ru_infilt_ns(:,jst) 
[947]3951
[3402]3952       !! 1.4 Reinfiltration of surface runoff : compute temporary surface water and extract from runoff
3953       ! Evrything here is liquid
3954       ! RK: water2infilt is both a volume for future reinfiltration (in mm) and a correction term for surface runoff (in mm/dt_sechiba)
3955       IF ( .NOT. doponds ) THEN ! this is the general case...
3956          DO ji = 1, kjpindex
3957             water2infilt(ji,jst) = reinf_slope(ji) * ru_ns(ji,jst)
3958          ENDDO
3959       ELSE
3960          DO ji = 1, kjpindex           
3961             water2infilt(ji,jst) = zero
3962          ENDDO
3963       ENDIF
3964       !
3965       DO ji = 1, kjpindex           
3966          ru_ns(ji,jst) = ru_ns(ji,jst) - water2infilt(ji,jst)
[8]3967       END DO
3968
[3402]3969       !! 2. SECONDLY, WE UPDATE MC FROM DIFFUSION, INCLUDING DRAINAGE AND ROOTSINK
3970       !!    This will act on mcl only
3971       
3972       !! 2.1 K and D are recomputed after infiltration
3973       !! They depend on the fraction of soil ice, still given by profil_froz_hydro_ns
[6954]3974       CALL hydrol_soil_coef(mcr, mcs,kjpindex,jst,njsc)
[947]3975 
[3402]3976       !! 2.2 Set the tridiagonal matrix coefficients for the diffusion/redistribution scheme
3977       !! This process will further act on mcl only, based on a, b, d from hydrol_soil_coef
[2591]3978       CALL hydrol_soil_setup(kjpindex,jst)
[8]3979
[3402]3980       !! 2.3 We define mcl (liquid water content) based on mc and profil_froz_hydro_ns
3981       DO jsl = 1, nslm
3982          DO ji =1, kjpindex
[6954]3983             mcl(ji,jsl,jst)= MIN( mc(ji,jsl,jst), mcr(ji) + &
3984                  (un-profil_froz_hydro_ns(ji,jsl,jst))*(mc(ji,jsl,jst)-mcr(ji)) )
[3402]3985             ! we always have mcl<=mc
3986             ! if mc>mcr, then mcl>mcr; if mc=mcr,mcl=mcr; if mc<mcr, then mcl<mcr
3987             ! if profil_froz_hydro_ns=0 (including NOT ok_freeze_cwrr) we keep mcl=mc
3988          ENDDO
[947]3989       ENDDO
[3402]3990
3991       ! The value of mcl is kept in mclint (nstm dimension removed), used in the flux computation after diffusion
[947]3992       DO jsl = 1, nslm
[3402]3993          DO ji = 1, kjpindex
3994             mclint(ji,jsl) = mask_soiltile(ji,jst) * mcl(ji,jsl,jst)
3995          ENDDO
[947]3996       ENDDO
[8]3997
[4812]3998       !! 2.3bis Diagnostic of the matric potential used for redistribution by Richards/tridiag (in m)
3999       !  We use VG relationship giving psi as a function of mc (mcl in our case)
4000       !  With patches against numerical pbs when (mc_ratio - un) becomes very slightly negative (gives NaN)
4001       !  or if psi become too strongly negative (pbs with xios output)
4002       DO jsl=1, nslm
4003          DO ji = 1, kjpindex
4004             IF (soiltile(ji,jst) .GT. zero) THEN
[6954]4005                mvg = un - un / nvan_mod_tab(jsl,ji)
4006                avg = avan_mod_tab(jsl,ji)*1000. ! to convert in m-1
4007                mc_ratio = MAX( 10.**(-14*mvg), (mcl(ji,jsl,jst) - mcr(ji))/(mcs(ji) - mcr(ji)) )**(-un/mvg)
4008                psi = - MAX(zero,(mc_ratio - un))**(un/nvan_mod_tab(jsl,ji)) / avg ! in m
[4812]4009                psi_moy(ji,jsl) = psi_moy(ji,jsl) + soiltile(ji,jst) * psi ! average across soil tiles
4010             ENDIF
4011          ENDDO
4012       ENDDO
4013
[3402]4014       !! 2.4 We calculate the total SM at the beginning of the routine tridiag for water conservation check
4015       !  (on mcl only, since the diffusion only modifies mcl)
4016       tmci(:) = dz(2) * ( trois*mcl(:,1,jst) + mcl(:,2,jst) )/huit
4017       DO jsl = 2,nslm-1
4018          tmci(:) = tmci(:) + dz(jsl) * (trois*mcl(:,jsl,jst)+mcl(:,jsl-1,jst))/huit &
4019               + dz(jsl+1) * (trois*mcl(:,jsl,jst)+mcl(:,jsl+1,jst))/huit
4020       ENDDO
4021       tmci(:) = tmci(:) + dz(nslm) * (trois*mcl(:,nslm,jst) + mcl(:,nslm-1,jst))/huit
[3012]4022
[3402]4023       !! 2.5 Defining where diffusion is solved : everywhere
4024       !! Since mc>mcs is not possible after infiltration, and we accept that mc<mcr
4025       !! (corrected later by shutting off all evaporative fluxes in this case)
4026       !  Nothing is done if resolv=F
4027       resolv(:) = (mask_soiltile(:,jst) .GT. 0)
[2222]4028
[3402]4029       !! 2.6 We define the system of linear equations for mcl redistribution,
4030       !! based on the matrix coefficients from hydrol_soil_setup
[2589]4031       !! following the PhD thesis of de Rosnay (1999), p155-157
[3402]4032       !! The bare soil evaporation (subtracted from infiltration) is used directly as flux_top
[2589]4033       ! rhs for right-hand side term; fp for f'; gp for g'; ep for e'; with flux=0 !
[3402]4034       
[947]4035       !- First layer
4036       DO ji = 1, kjpindex
[8]4037          tmat(ji,1,1) = zero
4038          tmat(ji,1,2) = f(ji,1)
4039          tmat(ji,1,3) = g1(ji,1)
[2222]4040          rhs(ji,1)    = fp(ji,1) * mcl(ji,1,jst) + gp(ji,1)*mcl(ji,2,jst) &
[2591]4041               &  - flux_top(ji) - (b(ji,1)+b(ji,2))/deux *(dt_sechiba/one_day) - rootsink(ji,1,jst)
[947]4042       ENDDO
4043       !- soil body
4044       DO jsl=2, nslm-1
4045          DO ji = 1, kjpindex
[8]4046             tmat(ji,jsl,1) = e(ji,jsl)
4047             tmat(ji,jsl,2) = f(ji,jsl)
4048             tmat(ji,jsl,3) = g1(ji,jsl)
[2222]4049             rhs(ji,jsl) = ep(ji,jsl)*mcl(ji,jsl-1,jst) + fp(ji,jsl)*mcl(ji,jsl,jst) &
4050                  & +  gp(ji,jsl) * mcl(ji,jsl+1,jst) & 
[2591]4051                  & + (b(ji,jsl-1) - b(ji,jsl+1)) * (dt_sechiba/one_day) / deux & 
[8]4052                  & - rootsink(ji,jsl,jst) 
4053          ENDDO
[2589]4054       ENDDO       
4055       !- Last layer, including drainage
[947]4056       DO ji = 1, kjpindex
4057          jsl=nslm
[8]4058          tmat(ji,jsl,1) = e(ji,jsl)
4059          tmat(ji,jsl,2) = f(ji,jsl)
4060          tmat(ji,jsl,3) = zero
[2222]4061          rhs(ji,jsl) = ep(ji,jsl)*mcl(ji,jsl-1,jst) + fp(ji,jsl)*mcl(ji,jsl,jst) &
[2591]4062               & + (b(ji,jsl-1) + b(ji,jsl)*(un-deux*free_drain_coef(ji,jst))) * (dt_sechiba/one_day) / deux &
[8]4063               & - rootsink(ji,jsl,jst)
[947]4064       ENDDO
[2589]4065       !- Store the equations in case needed again
[947]4066       DO jsl=1,nslm
4067          DO ji = 1, kjpindex
[8]4068             srhs(ji,jsl) = rhs(ji,jsl)
4069             stmat(ji,jsl,1) = tmat(ji,jsl,1)
4070             stmat(ji,jsl,2) = tmat(ji,jsl,2)
4071             stmat(ji,jsl,3) = tmat(ji,jsl,3) 
4072          ENDDO
4073       ENDDO
[2589]4074       
[3402]4075       !! 2.7 Solves diffusion equations, but only in grid-cells where resolv is true, i.e. everywhere (cf 2.2)
[2589]4076       !!     The result is an updated mcl profile
[8]4077
4078       CALL hydrol_soil_tridiag(kjpindex,jst)
[3402]4079
4080       !! 2.8 Computes drainage = bottom boundary condition, consistent with rhs(ji,jsl=nslm)
4081       ! dr_ns in mm/dt_sechiba, from k in mm/d
4082       ! This should be done where resolv=T, like tridiag (drainage is part of the linear system !)
[947]4083       DO ji = 1, kjpindex
[3402]4084          IF (resolv(ji)) THEN
4085             dr_ns(ji,jst) = mask_soiltile(ji,jst)*k(ji,nslm)*free_drain_coef(ji,jst) * (dt_sechiba/one_day)
4086          ELSE
4087             dr_ns(ji,jst) = zero
4088          ENDIF
[947]4089       ENDDO
[8]4090
[3402]4091       !! 2.9 For water conservation check during redistribution AND CORRECTION,
4092       !!     we calculate the total liquid SM at the end of the routine tridiag
4093       tmcf(:) = dz(2) * ( trois*mcl(:,1,jst) + mcl(:,2,jst) )/huit
4094       DO jsl = 2,nslm-1
4095          tmcf(:) = tmcf(:) + dz(jsl) * (trois*mcl(:,jsl,jst)+mcl(:,jsl-1,jst))/huit &
4096               + dz(jsl+1) * (trois*mcl(:,jsl,jst)+mcl(:,jsl+1,jst))/huit
4097       ENDDO
4098       tmcf(:) = tmcf(:) + dz(nslm) * (trois*mcl(:,nslm,jst) + mcl(:,nslm-1,jst))/huit
4099         
4100       !! And we compare the difference with the flux...
4101       ! Normally, tcmf=tmci-flux_top(ji)-transpir-dr_ns
4102       DO ji=1,kjpindex
4103          diag_tr(ji)=SUM(rootsink(ji,:,jst))
4104       ENDDO
4105       ! Here, check_tr_ns holds the inaccuracy during the redistribution phase
4106       check_tr_ns(:,jst) = tmcf(:)-(tmci(:)-flux_top(:)-dr_ns(:,jst)-diag_tr(:))
[3012]4107
[3402]4108       !! We solve here the numerical errors that happen when the soil is close to saturation
4109       !! and drainage very high, and which lead to negative check_tr_ns: the soil dries more
4110       !! than what is demanded by the fluxes, so we need to increase the fluxes.
[4307]4111       !! This is done by increasing the drainage.
[3402]4112       !! There are also instances of positive check_tr_ns, larger when the drainage is high
[4307]4113       !! They are similarly corrected by a decrease of dr_ns, in the limit of keeping a positive drainage.
[3402]4114       DO ji=1,kjpindex
[4307]4115          IF ( check_tr_ns(ji,jst) .LT. zero ) THEN
4116              dr_corrnum_ns(ji,jst) = -check_tr_ns(ji,jst)
[3402]4117          ELSE
[4307]4118              dr_corrnum_ns(ji,jst) = -MIN(dr_ns(ji,jst),check_tr_ns(ji,jst))             
[3402]4119          ENDIF
[4307]4120          dr_ns(ji,jst) = dr_ns(ji,jst) + dr_corrnum_ns(ji,jst) ! dr_ns increases/decrease if check_tr negative/positive
[3402]4121       ENDDO
4122       !! For water conservation check during redistribution
[5506]4123       IF (check_cwrr) THEN         
[3402]4124          check_tr_ns(:,jst) = tmcf(:)-(tmci(:)-flux_top(:)-dr_ns(:,jst)-diag_tr(:)) 
[2222]4125       ENDIF
4126
[3402]4127       !! 3. AFTER DIFFUSION/REDISTRIBUTION
[8]4128
[3402]4129       !! 3.1 Updating mc, as all the following checks against saturation will compare mc to mcs
4130       !      The frozen fraction is constant, so that any water flux to/from a layer changes
4131       !      both mcl and the ice amount. The assumption behind this is that water entering/leaving
4132       !      a soil layer immediately freezes/melts with the proportion profil_froz_hydro_ns/(1-profil_...)
4133       DO jsl = 1, nslm
4134          DO ji =1, kjpindex
4135             mc(ji,jsl,jst) = MAX( mcl(ji,jsl,jst), mcl(ji,jsl,jst) + &
[6954]4136                  profil_froz_hydro_ns(ji,jsl,jst)*(mc(ji,jsl,jst)-mcr(ji)) )
[3402]4137             ! if profil_froz_hydro_ns=0 (including NOT ok_freeze_cwrr) we get mc=mcl
4138          ENDDO
4139       ENDDO
[2589]4140
[3402]4141       !! 3.2 Correct here the possible over-saturation values (subroutine hydrol_soil_smooth_over_mcs2 acts on mc)
4142       !    Oversaturation results from numerical inaccuracies and can be frequent if free_drain_coef=0
4143       !    Here hydrol_soil_smooth_over_mcs2 discard all excess as ru_corr_ns, oriented to either ru_ns or dr_ns
4144       !    The former routine hydrol_soil_smooth_over_mcs, which keeps most of the excess in the soiltile
4145       !    after smoothing, first downward then upward, is kept in the module but not used here
4146       dr_corr_ns(:,jst) = zero
4147       ru_corr_ns(:,jst) = zero
[6954]4148       call hydrol_soil_smooth_over_mcs2(mcs, kjpindex, jst, njsc, is_over_mcs, ru_corr_ns, check_over_ns)
[3402]4149       
4150       ! In absence of freezing, if F is large enough, the correction of oversaturation is sent to drainage       
[947]4151       DO ji = 1, kjpindex
[3402]4152          IF ((free_drain_coef(ji,jst) .GE. 0.5) .AND. (.NOT. ok_freeze_cwrr) ) THEN
4153             dr_corr_ns(ji,jst) = ru_corr_ns(ji,jst) 
4154             ru_corr_ns(ji,jst) = zero
[947]4155          ENDIF
4156       ENDDO
[3402]4157       dr_ns(:,jst) = dr_ns(:,jst) + dr_corr_ns(:,jst)
4158       ru_ns(:,jst) = ru_ns(:,jst) + ru_corr_ns(:,jst)
4159
4160       !! 3.3 Negative runoff is reported to drainage
4161       !  Since we computed ru_ns directly from hydrol_soil_infilt, ru_ns should not be negative
4162             
4163       ru_corr2_ns(:,jst) = zero
[947]4164       DO ji = 1, kjpindex
[3402]4165          IF (ru_ns(ji,jst) .LT. zero) THEN
4166             IF (printlev>=3)  WRITE (numout,*) 'NEGATIVE RU_NS: runoff and drainage before correction',&
4167                  ru_ns(ji,jst),dr_ns(ji,jst)
4168             dr_ns(ji,jst)=dr_ns(ji,jst)+ru_ns(ji,jst)
4169             ru_corr2_ns(ji,jst) = -ru_ns(ji,jst)
4170             ru_ns(ji,jst)= 0.
4171          END IF         
[8]4172       ENDDO
4173
[5450]4174       !! 3.4.1 Optional nudging for soil moisture
4175       IF (ok_nudge_mc) THEN
4176          CALL hydrol_nudge_mc(kjpindex, jst, mc)
4177       END IF
4178
4179
4180       !! 3.4.2 Optional block to force saturation below zwt_force
[4812]4181       ! This block is not compatible with freezing; in this case, mcl must be corrected too
[3402]4182       ! We test if zwt_force(1,jst) <= zmaxh, to avoid steps 1 and 2 if unnecessary
4183       
4184       IF (zwt_force(1,jst) <= zmaxh) THEN
[2589]4185
[3402]4186          !! We force the nodes below zwt_force to be saturated
4187          !  As above, we compare mc to mcs
4188          DO jsl = 1,nslm
4189             DO ji = 1, kjpindex
4190                dmc(ji,jsl) = zero
4191                IF ( ( zz(jsl) >= zwt_force(ji,jst)*mille ) ) THEN
[6954]4192                   dmc(ji,jsl) = mcs(ji) - mc(ji,jsl,jst) ! addition to reach mcs (m3/m3) = positive value
4193                   mc(ji,jsl,jst) = mcs(ji)
[3402]4194                ENDIF
4195             ENDDO
4196          ENDDO
4197         
4198          !! To ensure conservation, this needs to be balanced by a negative change in drainage (in kg/m2/dt)
4199          DO ji = 1, kjpindex
4200             dr_force_ns(ji,jst) = dz(2) * ( trois*dmc(ji,1) + dmc(ji,2) )/huit ! top layer = initialization
4201          ENDDO
4202          DO jsl = 2,nslm-1 ! intermediate layers
4203             DO ji = 1, kjpindex
4204                dr_force_ns(ji,jst) = dr_force_ns(ji,jst) + dz(jsl) &
4205                     & * (trois*dmc(ji,jsl)+dmc(ji,jsl-1))/huit &
4206                     & + dz(jsl+1) * (trois*dmc(ji,jsl)+dmc(ji,jsl+1))/huit
4207             ENDDO
4208          ENDDO
4209          DO ji = 1, kjpindex
4210             dr_force_ns(ji,jst) = dr_force_ns(ji,jst) + dz(nslm) & ! bottom layer
4211                  & * (trois * dmc(ji,nslm) + dmc(ji,nslm-1))/huit
4212             dr_ns(ji,jst) = dr_ns(ji,jst) - dr_force_ns(ji,jst) ! dr_force_ns is positive and dr_ns must be reduced
4213          END DO
[1118]4214
[3402]4215       ELSE         
[1118]4216
[3402]4217          dr_force_ns(:,jst) = zero 
[8]4218
[947]4219       ENDIF
[8]4220
[3402]4221       !! 3.5 Diagnosing the effective water table depth:
4222       !!     Defined as as the smallest jsl value when mc(jsl) is no more at saturation (mcs), starting from the bottom
4223       !      If there is a part of the soil which is saturated but underlain with unsaturated nodes,
4224       !      this is not considered as a water table
[2589]4225       DO ji = 1, kjpindex
[3402]4226          wtd_ns(ji,jst) = undef_sechiba ! in meters
4227          jsl=nslm
[6954]4228          DO WHILE ( (mc(ji,jsl,jst) .EQ. mcs(ji)) .AND. (jsl > 1) )
[3402]4229             wtd_ns(ji,jst) = zz(jsl)/mille ! in meters
4230             jsl=jsl-1
[2589]4231          ENDDO
4232       ENDDO
[1118]4233
[3402]4234       !! 3.6 Diagnose under_mcr to adapt water stress calculation below
4235       !      This routine does not change tmc but decides where we should turn off ET to prevent further mc decrease
4236       !      Like above, the tests are made on total mc, compared to mcr
[6954]4237       CALL hydrol_soil_smooth_under_mcr(mcr, kjpindex, jst, njsc, is_under_mcr, check_under_ns)
[3402]4238 
4239       !! 4. At the end of the prognostic calculations, we recompute important moisture variables
4240
4241       !! 4.1 Total soil moisture content (water2infilt added below)
[947]4242       DO ji = 1, kjpindex
[2651]4243          tmc(ji,jst) = dz(2) * ( trois*mc(ji,1,jst) + mc(ji,2,jst) )/huit
[8]4244       ENDDO
[1118]4245       DO jsl = 2,nslm-1
[947]4246          DO ji = 1, kjpindex
[2651]4247             tmc(ji,jst) = tmc(ji,jst) + dz(jsl) &
[1118]4248                  & * (trois*mc(ji,jsl,jst)+mc(ji,jsl-1,jst))/huit &
[2651]4249                  & + dz(jsl+1) * (trois*mc(ji,jsl,jst)+mc(ji,jsl+1,jst))/huit
[947]4250          ENDDO
4251       ENDDO
[1118]4252       DO ji = 1, kjpindex
[2651]4253          tmc(ji,jst) = tmc(ji,jst) + dz(nslm) &
[1118]4254               & * (trois * mc(ji,nslm,jst) + mc(ji,nslm-1,jst))/huit
4255       END DO
4256
[3402]4257       !! 4.2 mcl is a module variable; we update it here for calculating bare soil evaporation,
4258       !!     and in case we would like to export it (xios)
4259       DO jsl = 1, nslm
4260          DO ji =1, kjpindex
[6954]4261             mcl(ji,jsl,jst)= MIN( mc(ji,jsl,jst), mcr(ji) + &
4262                  (un-profil_froz_hydro_ns(ji,jsl,jst))*(mc(ji,jsl,jst)-mcr(ji)) )
[3402]4263             ! if profil_froz_hydro_ns=0 (including NOT ok_freeze_cwrr) we keep mcl=mc
4264          ENDDO
[947]4265       ENDDO
[3402]4266       
4267       !! 5. Optional check of the water balance of soil column (if check_cwrr)
[8]4268
[3402]4269       IF (check_cwrr) THEN
4270
[5506]4271          !! 5.1 Computation of the vertical water fluxes and water balance of the top layer
4272          CALL hydrol_diag_soil_flux(kjpindex,jst,mclint,flux_top)
[8]4273
[947]4274       ENDIF
[8]4275
[3402]4276       !! 6. SM DIAGNOSTICS FOR OTHER ROUTINES, MODULES, OR NEXT STEP
4277       !    Starting here, mc and mcl should not change anymore
4278       
4279       !! 6.1 Total soil moisture, soil moisture at litter levels, soil wetness, us, humrelv, vesgtressv
4280       !!     (based on mc)
[8]4281
[3402]4282       !! In output, tmc includes water2infilt(ji,jst)
[8]4283       DO ji=1,kjpindex
[947]4284          tmc(ji,jst) = tmc(ji,jst) + water2infilt(ji,jst)
[8]4285       END DO
[3402]4286       
[1118]4287       ! The litter is the 4 top levels of the soil
4288       ! Compute various field of soil moisture for the litter (used for stomate and for albedo)
[4812]4289       ! We exclude the frozen water from the calculation
[8]4290       DO ji=1,kjpindex
[4783]4291          tmc_litter(ji,jst) = dz(2) * ( trois*mcl(ji,1,jst)+ mcl(ji,2,jst))/huit
[8]4292       END DO
4293       ! sum from level 1 to 4
4294       DO jsl=2,4
4295          DO ji=1,kjpindex
[2651]4296             tmc_litter(ji,jst) = tmc_litter(ji,jst) + dz(jsl) * & 
[4783]4297                  & ( trois*mcl(ji,jsl,jst) + mcl(ji,jsl-1,jst))/huit &
4298                  & + dz(jsl+1)*(trois*mcl(ji,jsl,jst) + mcl(ji,jsl+1,jst))/huit
[8]4299          END DO
4300       END DO
4301
[4724]4302       ! Subsequent calculation of soil_wet_litter (tmc-tmcw)/(tmcfc-tmcw)
[4812]4303       ! Based on liquid water content
[8]4304       DO ji=1,kjpindex
4305          soil_wet_litter(ji,jst) = MIN(un, MAX(zero,&
4306               & (tmc_litter(ji,jst)-tmc_litter_wilt(ji,jst)) / &
4307               & (tmc_litter_field(ji,jst)-tmc_litter_wilt(ji,jst)) ))
4308       END DO
4309
[3473]4310       ! Preliminary calculation of various soil moistures (for each layer, in kg/m2)
[4202]4311       sm(:,1)  = dz(2) * (trois*mcl(:,1,jst) + mcl(:,2,jst))/huit
[4534]4312       smt(:,1) = dz(2) * (trois*mc(:,1,jst) + mc(:,2,jst))/huit
[6954]4313       smw(:,1) = dz(2) * (quatre*mcw(:))/huit
4314       smf(:,1) = dz(2) * (quatre*mcfc(:))/huit
4315       sms(:,1) = dz(2) * (quatre*mcs(:))/huit
[3473]4316       DO jsl = 2,nslm-1
[4202]4317          sm(:,jsl)  = dz(jsl) * (trois*mcl(:,jsl,jst)+mcl(:,jsl-1,jst))/huit &
4318               + dz(jsl+1) * (trois*mcl(:,jsl,jst)+mcl(:,jsl+1,jst))/huit
[4534]4319          smt(:,jsl) = dz(jsl) * (trois*mc(:,jsl,jst)+mc(:,jsl-1,jst))/huit &
4320               + dz(jsl+1) * (trois*mc(:,jsl,jst)+mc(:,jsl+1,jst))/huit
[6954]4321          smw(:,jsl) = dz(jsl) * ( quatre*mcw(:) )/huit &
4322               + dz(jsl+1) * ( quatre*mcw(:) )/huit
4323          smf(:,jsl) = dz(jsl) * ( quatre*mcfc(:) )/huit &
4324               + dz(jsl+1) * ( quatre*mcfc(:) )/huit
4325          sms(:,jsl) = dz(jsl) * ( quatre*mcs(:) )/huit &
4326               + dz(jsl+1) * ( quatre*mcs(:) )/huit
[3473]4327       ENDDO
[4534]4328       sm(:,nslm)  = dz(nslm) * (trois*mcl(:,nslm,jst) + mcl(:,nslm-1,jst))/huit 
4329       smt(:,nslm) = dz(nslm) * (trois*mc(:,nslm,jst) + mc(:,nslm-1,jst))/huit     
[6954]4330       smw(:,nslm) = dz(nslm) * (quatre*mcw(:))/huit
4331       smf(:,nslm) = dz(nslm) * (quatre*mcfc(:))/huit
4332       sms(:,nslm) = dz(nslm) * (quatre*mcs(:))/huit
[3473]4333       ! sm_nostress = soil moisture of each layer at which us reaches 1, here at the middle of [smw,smf]
4334       DO jsl = 1,nslm
[7239]4335          sm_nostress(:,jsl) = smw(:,jsl) + pcent(njsc(:)) * (smf(:,jsl)-smw(:,jsl))
[3473]4336       END DO
[3975]4337
4338       ! Saturated litter soil moisture for rsoil
4339       tmcs_litter(:) = zero
4340       DO jsl = 1,4
4341          tmcs_litter(:) = tmcs_litter(:) + sms(:,jsl)
4342       END DO
[3473]4343             
[3402]4344       ! Soil wetness profiles (W-Ww)/(Ws-Ww)
[4534]4345       ! soil_wet_ns is the ratio of available soil moisture to max available soil moisture
[8]4346       ! (ie soil moisture at saturation minus soil moisture at wilting point).
[3473]4347       ! soil wet is a water stress for stomate, to control C decomposition
[4783]4348       ! Based on liquid water content
[8]4349       DO jsl=1,nslm
4350          DO ji=1,kjpindex
[4534]4351             soil_wet_ns(ji,jsl,jst) = MIN(un, MAX(zero, &
[3473]4352                  (sm(ji,jsl)-smw(ji,jsl))/(sms(ji,jsl)-smw(ji,jsl)) ))
[8]4353          END DO
4354       END DO
4355
[3402]4356       ! Compute us and the new humrelv to use in sechiba (with loops on the vegetation types)
[3473]4357       ! This is the water stress for transpiration (diffuco) and photosynthesis (diffuco)
4358       ! humrel is never used in stomate
[4783]4359       ! Based on liquid water content
[3473]4360
4361       ! -- PFT1
4362       humrelv(:,1,jst) = zero       
[3402]4363       ! -- Top layer
[8]4364       DO jv = 2,nvm
4365          DO ji=1,kjpindex
[947]4366             !- Here we make the assumption that roots do not take water from the 1st layer.
[8]4367             us(ji,jv,jst,1) = zero
[3473]4368             humrelv(ji,jv,jst) = zero ! initialisation of the sum
[8]4369          END DO
[947]4370       ENDDO
[4363]4371
4372       !! Dynamic nroot to optimize water use: the root profile used to weight the water stress function
4373       !! of each soil layer is updated at each time step in order to match the soil water profile
4374       !! (the soil water content of each layer available for transpiration)
4375       IF (ok_dynroot) THEN
4376          DO jv = 1, nvm
4377             IF ( is_tree(jv) ) THEN
4378                DO ji = 1, kjpindex
4379                   nroot_tmp(:) = zero
4380                   DO jsl = 2, nslm
4381                      nroot_tmp(jsl) = MAX(zero,sm(ji,jsl)-smw(ji,jsl) )
4382                   ENDDO
4383                   IF (SUM(nroot_tmp(:)) .GT. min_sechiba ) THEN
4384                      nroot(ji,jv,:) = nroot_tmp(:)/SUM(nroot_tmp(:))
4385                   ELSE
4386                      nroot(ji,jv,:) = zero
4387                   END IF
4388                ENDDO
4389             ELSE
4390                ! Specific case for grasses where we only consider the first 1m of soil.               
4391                DO ji = 1, kjpindex
4392                   nroot_tmp(:) = zero
4393                   DO jsl = 2, nslm
4394                      IF (znt(jsl) .LT. un) THEN
4395                         nroot_tmp(jsl) = MAX(zero,sm(ji,jsl)-smw(ji,jsl) )
4396                      END IF
4397                   ENDDO
4398                   
4399                   IF (SUM(nroot_tmp(:)) .GT. min_sechiba ) THEN
4400                      DO jsl = 2,nslm
4401                         IF (znt(jsl) .LT. un) THEN
4402                            nroot(ji,jv,jsl) = nroot_tmp(jsl)/SUM(nroot_tmp(:))
4403                         ELSE
4404                            nroot(ji,jv,jsl) = zero
4405                         END IF
4406                      ENDDO
4407                      nroot(ji,jv,1) = zero
4408                   END IF
4409                ENDDO
4410             END IF
4411          ENDDO
4412       ENDIF
4413
[3473]4414       ! -- Intermediate and bottom layers
4415       DO jsl = 2,nslm
[947]4416          DO jv = 2, nvm
[8]4417             DO ji=1,kjpindex
[3473]4418                ! AD16*** Although plants can only withdraw liquid water, we compute here the water stress
[4724]4419                ! based on mc and the corresponding thresholds mcs, pcent, or potentially mcw and mcfc
[3473]4420                ! This is consistent with assuming that ice is uniformly distributed within the poral space
4421                ! In such a case, freezing makes mcl and the "liquid" porosity smaller than the "total" values
4422                ! And it is the same for all the moisture thresholds, which are proportional to porosity.
4423                ! Since the stress is based on relative moisture, it could thus independent from the porosity
[4534]4424                ! at first order, thus independent from freezing.   
4425                ! 26-07-2017: us and humrel now based on liquid soil moisture, so the stress is stronger
[3972]4426                IF(new_watstress) THEN
4427                   IF((sm(ji,jsl)-smw(ji,jsl)) .GT. min_sechiba) THEN
4428                      us(ji,jv,jst,jsl) = MIN(un, MAX(zero, &
4429                           (EXP(- alpha_watstress * &
4430                           ( (smf(ji,jsl) - smw(ji,jsl)) / ( sm_nostress(ji,jsl) - smw(ji,jsl)) ) * &
4431                           ( (sm_nostress(ji,jsl) - sm(ji,jsl)) / ( sm(ji,jsl) - smw(ji,jsl)) ) ) ) ))&
[4363]4432                           * nroot(ji,jv,jsl)
[3972]4433                   ELSE
4434                      us(ji,jv,jst,jsl) = 0.
4435                   ENDIF
4436                ELSE
4437                   us(ji,jv,jst,jsl) = MIN(un, MAX(zero, &
[4363]4438                        (sm(ji,jsl)-smw(ji,jsl))/(sm_nostress(ji,jsl)-smw(ji,jsl)) )) * nroot(ji,jv,jsl)
[3972]4439                ENDIF
[3473]4440                humrelv(ji,jv,jst) = humrelv(ji,jv,jst) + us(ji,jv,jst,jsl)
[8]4441             END DO
4442          END DO
[947]4443       ENDDO
[3473]4444
4445       !! vegstressv is the water stress for phenology in stomate
4446       !! It varies linearly from zero at wilting point to 1 at field capacity
4447       vegstressv(:,:,jst) = zero
[947]4448       DO jv = 2, nvm
[8]4449          DO ji=1,kjpindex
[3473]4450             DO jsl=1,nslm
4451                vegstressv(ji,jv,jst) = vegstressv(ji,jv,jst) + &
4452                     MIN(un, MAX(zero, (sm(ji,jsl)-smw(ji,jsl))/(smf(ji,jsl)-smw(ji,jsl)) )) &
[4363]4453                     * nroot(ji,jv,jsl)
[3473]4454             END DO
[8]4455          END DO
4456       END DO
[3473]4457
4458
4459       ! -- If the PFT is absent, the corresponding humrelv and vegstressv = 0
[947]4460       DO jv = 2, nvm
4461          DO ji = 1, kjpindex
[3687]4462             IF (vegetmax_soil(ji,jv,jst) .LT. min_sechiba) THEN
[3473]4463                humrelv(ji,jv,jst) = zero
4464                vegstressv(ji,jv,jst) = zero
4465                us(ji,jv,jst,:) = zero
[947]4466             ENDIF
4467          END DO
4468       END DO
[8]4469
[3402]4470       !! 6.2 We need to turn off evaporation when is_under_mcr
4471       !!     We set us, humrelv and vegstressv to zero in this case
[3473]4472       !!     WARNING: It's different from having locally us=0 in the soil layers(s) where mc<mcr
4473       !!              This part is crucial to preserve water conservation
[2927]4474       DO jsl = 1,nslm
4475          DO jv = 2, nvm
[3402]4476             WHERE (is_under_mcr(:,jst))
[2927]4477                us(:,jv,jst,jsl) = zero
4478             ENDWHERE
4479          ENDDO
4480       ENDDO
4481       DO jv = 2, nvm
[3402]4482          WHERE (is_under_mcr(:,jst))
[2927]4483             humrelv(:,jv,jst) = zero
4484          ENDWHERE
4485       ENDDO
4486       
[4534]4487       ! For consistency in stomate, we also set moderwilt and soil_wet_ns to zero in this case.
[3402]4488       ! They are used later for shumdiag and shumdiag_perma
[2927]4489       DO jsl = 1,nslm
[3402]4490          WHERE (is_under_mcr(:,jst))
[4534]4491             soil_wet_ns(:,jsl,jst) = zero
[2927]4492          ENDWHERE
4493       ENDDO
4494
[3402]4495       ! Counting the nb of under_mcr occurences in each grid-cell
4496       WHERE (is_under_mcr(:,jst))
4497          undermcr = undermcr + un
4498       ENDWHERE
4499
4500       !! 6.3 Calculate the volumetric soil moisture content (mc_layh and mcl_layh) needed in
[4637]4501       !!     thermosoil for the thermal conductivity.
[3969]4502       !! The multiplication by vegtot creates grid-cell average values
4503       ! *** To be checked for consistency with the use of nobio properties in thermosoil
[6954]4504           
[4637]4505       DO jsl=1,nslm
4506          DO ji=1,kjpindex
[3594]4507             mc_layh(ji,jsl) = mc_layh(ji,jsl) + mc(ji,jsl,jst) * soiltile(ji,jst) * vegtot(ji) 
4508             mcl_layh(ji,jsl) = mcl_layh(ji,jsl) + mcl(ji,jsl,jst) * soiltile(ji,jst) * vegtot(ji)
[2922]4509          ENDDO
4510       END DO
4511
[3402]4512       !! 6.4 The hydraulic conductivities exported here are the ones used in the diffusion/redistribution
4513       ! (no call of hydrol_soil_coef since 2.1)
[4764]4514       ! We average the values of each soiltile and keep the specific value (no multiplication by vegtot)
4515       DO ji = 1, kjpindex
4516          kk_moy(ji,:) = kk_moy(ji,:) + soiltile(ji,jst) * k(ji,:) 
4517          kk(ji,:,jst) = k(ji,:)
4518       ENDDO
[3402]4519       
[4764]4520       !! 6.5 We also want to export ksat at each node for CMIP6
4521       !  (In the output, done only once according to field_def_orchidee.xml; same averaging as for kk)
4522       DO jsl = 1, nslm
4523          ksat(:,jsl) = ksat(:,jsl) + soiltile(:,jst) * &
[6954]4524               ( ks(:) * kfact(jsl,:) * kfact_root(:,jsl,jst) ) 
[4764]4525       ENDDO
4526             
[3402]4527      IF (printlev>=3) WRITE (numout,*) ' prognostic/diagnostic part of hydrol_soil done for jst =', jst         
[2222]4528
[4764]4529    END DO  ! end of loop on soiltile
[947]4530
[2589]4531    !! -- ENDING THE MAIN LOOP ON SOILTILES
[1057]4532
[3402]4533    !! 7. Summing 3d variables into 2d variables
[6954]4534    CALL hydrol_diag_soil (ks, nvan, avan, mcr, mcs, mcfc, mcw, kjpindex, veget_max, soiltile, njsc, runoff, drainage, &
[1118]4535         & evapot, vevapnu, returnflow, reinfiltration, irrigation, &
[2222]4536         & shumdiag,shumdiag_perma, k_litt, litterhumdiag, humrel, vegstress, drysoil_frac,tot_melt)
[8]4537
[3402]4538    ! Means of wtd, runoff and drainage corrections, across soiltiles   
4539    wtd(:) = zero 
4540    ru_corr(:) = zero
4541    ru_corr2(:) = zero
4542    dr_corr(:) = zero
4543    dr_corrnum(:) = zero
4544    dr_force(:) = zero
4545    DO jst = 1, nstm
4546       DO ji = 1, kjpindex 
[3969]4547          wtd(ji) = wtd(ji) + soiltile(ji,jst) * wtd_ns(ji,jst) ! average over vegtot only
[3402]4548          IF (vegtot(ji) .GT. min_sechiba) THEN ! to mimic hydrol_diag_soil
[3969]4549             ! We average the values of each soiltile and multiply by vegtot to transform to a grid-cell mean
4550             ru_corr(ji) = ru_corr(ji) + vegtot(ji) * soiltile(ji,jst) * ru_corr_ns(ji,jst) 
4551             ru_corr2(ji) = ru_corr2(ji) + vegtot(ji) * soiltile(ji,jst) * ru_corr2_ns(ji,jst) 
4552             dr_corr(ji) = dr_corr(ji) + vegtot(ji) * soiltile(ji,jst) * dr_corr_ns(ji,jst) 
[3402]4553             dr_corrnum(ji) = dr_corrnum(ji) + vegtot(ji) * soiltile(ji,jst) * dr_corrnum_ns(ji,jst)
4554             dr_force(ji) = dr_force(ji) - vegtot(ji) * soiltile(ji,jst) * dr_force_ns(ji,jst)
4555                                       ! the sign is OK to get a negative drainage flux
4556          ENDIF
4557       ENDDO
4558    ENDDO
4559
4560    ! Means local variables, including water conservation checks
4561    ru_infilt(:)=0.
4562    qinfilt(:)=0.
4563    check_infilt(:)=0.
4564    check_tr(:)=0.
4565    check_over(:)=0.
4566    check_under(:)=0.
[5506]4567    qflux(:,:)=0.
4568    check_top(:)=0.
[3402]4569    DO jst = 1, nstm
4570       DO ji = 1, kjpindex 
4571          IF (vegtot(ji) .GT. min_sechiba) THEN ! to mimic hydrol_diag_soil
[3969]4572             ! We average the values of each soiltile and multiply by vegtot to transform to a grid-cell mean
[3402]4573             ru_infilt(ji) = ru_infilt(ji) + vegtot(ji) * soiltile(ji,jst) * ru_infilt_ns(ji,jst)
4574             qinfilt(ji) = qinfilt(ji) + vegtot(ji) * soiltile(ji,jst) * qinfilt_ns(ji,jst)
4575          ENDIF
4576       ENDDO
4577    ENDDO
4578 
[5506]4579    IF (check_cwrr) THEN
[3402]4580       DO jst = 1, nstm
4581          DO ji = 1, kjpindex 
4582             IF (vegtot(ji) .GT. min_sechiba) THEN ! to mimic hydrol_diag_soil
[3969]4583                ! We average the values of each soiltile and multiply by vegtot to transform to a grid-cell mean
[3402]4584                check_infilt(ji) = check_infilt(ji) + vegtot(ji) * soiltile(ji,jst) * check_infilt_ns(ji,jst)
4585                check_tr(ji) = check_tr(ji) + vegtot(ji) * soiltile(ji,jst) * check_tr_ns(ji,jst)
4586                check_over(ji) = check_over(ji) + vegtot(ji) * soiltile(ji,jst) * check_over_ns(ji,jst)
4587                check_under(ji) =  check_under(ji) + vegtot(ji) * soiltile(ji,jst) * check_under_ns(ji,jst)
[5506]4588                !
4589                qflux(ji,:) = qflux(ji,:) + vegtot(ji) * soiltile(ji,jst) * qflux_ns(ji,:,jst)
4590                check_top(ji) =  check_top(ji) + vegtot(ji) * soiltile(ji,jst) * check_top_ns(ji,jst)
[3402]4591             ENDIF
4592          ENDDO
4593       ENDDO
4594    END IF
[4534]4595
[3402]4596    !! 8. COMPUTING EVAP_BARE_LIM_NS FOR NEXT TIME STEP, WITH A LOOP ON SOILTILES
4597    !!    The principle is to run a dummy integration of the water redistribution scheme
4598    !!    to check if the SM profile can sustain a potential evaporation.
4599    !!    If not, the dummy integration is redone from the SM profile of the end of the normal integration,
4600    !!    with a boundary condition leading to a very severe water limitation: mc(1)=mcr
4601
4602    ! evap_bare_lim = beta factor for bare soil evaporation
[1118]4603    evap_bare_lim(:) = zero
4604    evap_bare_lim_ns(:,:) = zero
4605
[3402]4606    ! Loop on soil tiles 
[1118]4607    DO jst = 1,nstm
4608
[3402]4609       !! 8.1 Save actual mc, mcl, and tmc for restoring at the end of the time step
4610       !!      and calculate tmcint corresponding to mc without water2infilt
[1118]4611       DO jsl = 1, nslm
4612          DO ji = 1, kjpindex
4613             mcint(ji,jsl) = mask_soiltile(ji,jst) * mc(ji,jsl,jst)
[3402]4614             mclint(ji,jsl) = mask_soiltile(ji,jst) * mcl(ji,jsl,jst)
[1118]4615          ENDDO
4616       ENDDO
4617
4618       DO ji = 1, kjpindex
4619          temp(ji) = tmc(ji,jst)
[3402]4620          tmcint(ji) = temp(ji) - water2infilt(ji,jst) ! to estimate bare soil evap based on water budget
[1118]4621       ENDDO
4622
[3402]4623       !! 8.2 Since we estimate bare soile evap for the next time step, we update profil_froz_hydro and mcl
[7255]4624       !     (effect of mc only, the change in stempdiag is neglected)
4625       IF ( ok_freeze_cwrr ) CALL hydrol_soil_froz(nvan, avan, mcr, mcs,kjpindex,jst,njsc,stempdiag)
4626       DO jsl = 1, nslm
[3402]4627          DO ji =1, kjpindex
[6954]4628             mcl(ji,jsl,jst)= MIN( mc(ji,jsl,jst), mcr(ji) + &
4629                  (un-profil_froz_hydro_ns(ji,jsl,jst))*(mc(ji,jsl,jst)-mcr(ji)) )
[3402]4630             ! if profil_froz_hydro_ns=0 (including NOT ok_freeze_cwrr) we keep mcl=mc
[1118]4631          ENDDO
[3402]4632       ENDDO         
[1118]4633
[3402]4634       !! 8.3 K and D are recomputed for the updated profile of mc/mcl
[6954]4635       CALL hydrol_soil_coef(mcr, mcs, kjpindex,jst,njsc)
[1118]4636
[3402]4637       !! 8.4 Set the tridiagonal matrix coefficients for the diffusion/redistribution scheme
[2591]4638       CALL hydrol_soil_setup(kjpindex,jst)
[3402]4639       resolv(:) = (mask_soiltile(:,jst) .GT. 0) 
[1118]4640
[3402]4641       !! 8.5 We define the system of linear equations, based on matrix coefficients,
4642
4643       !- Impose potential evaporation as flux_top in mm/step, assuming the water is available
4644       ! Note that this should lead to never have evapnu>evapot_penm(ji)
4645
[3975]4646       DO ji = 1, kjpindex
4647         
4648          IF (vegtot(ji).GT.min_sechiba) THEN
4649             
[4783]4650             ! We calculate a reduced demand, by means of a soil resistance (Sellers et al., 1992)
[4812]4651             ! It is based on the liquid SM only, like for us and humrel
[3975]4652             IF (do_rsoil) THEN
[4783]4653                mc_rel(ji) = tmc_litter(ji,jst)/tmcs_litter(ji) ! tmc_litter based on mcl
[3975]4654                ! based on SM in the top 4 soil layers (litter) to smooth variability
4655                r_soil_ns(ji,jst) = exp(8.206 - 4.255 * mc_rel(ji))
4656             ELSE
4657                r_soil_ns(ji,jst) = zero
4658             ENDIF
4659
4660             ! Aerodynamic resistance
4661             speed = MAX(min_wind, SQRT (u(ji)*u(ji) + v(ji)*v(ji)))
4662             IF (speed * tq_cdrag(ji) .GT. min_sechiba) THEN
4663                ra = un / (speed * tq_cdrag(ji))
4664                evap_soil(ji) = evapot_penm(ji) / (un + r_soil_ns(ji,jst)/ra)
4665             ELSE
4666                evap_soil(ji) = evapot_penm(ji)
4667             ENDIF
[5805]4668                         
[3975]4669             flux_top(ji) = evap_soil(ji) * &
[1118]4670                  AINT(frac_bare_ns(ji,jst)+un-min_sechiba)
[2222]4671          ELSE
[3975]4672             
[2222]4673             flux_top(ji) = zero
[6954]4674             r_soil_ns(ji,jst) = zero
[3975]4675             
[1118]4676          ENDIF
4677       ENDDO
[2222]4678
[3402]4679       ! We don't use rootsinks, because we assume there is no transpiration in the bare soil fraction (??)
[1118]4680       !- First layer
4681       DO ji = 1, kjpindex
4682          tmat(ji,1,1) = zero
4683          tmat(ji,1,2) = f(ji,1)
4684          tmat(ji,1,3) = g1(ji,1)
[2222]4685          rhs(ji,1)    = fp(ji,1) * mcl(ji,1,jst) + gp(ji,1)*mcl(ji,2,jst) &
[2591]4686               - flux_top(ji) - (b(ji,1)+b(ji,2))/deux *(dt_sechiba/one_day)
[1118]4687       ENDDO
4688       !- soil body
4689       DO jsl=2, nslm-1
4690          DO ji = 1, kjpindex
4691             tmat(ji,jsl,1) = e(ji,jsl)
4692             tmat(ji,jsl,2) = f(ji,jsl)
4693             tmat(ji,jsl,3) = g1(ji,jsl)
[2222]4694             rhs(ji,jsl) = ep(ji,jsl)*mcl(ji,jsl-1,jst) + fp(ji,jsl)*mcl(ji,jsl,jst) &
4695                  +  gp(ji,jsl) * mcl(ji,jsl+1,jst) &
[2591]4696                  + (b(ji,jsl-1) - b(ji,jsl+1)) * (dt_sechiba/one_day) / deux
[1118]4697          ENDDO
4698       ENDDO
4699       !- Last layer
4700       DO ji = 1, kjpindex
4701          jsl=nslm
4702          tmat(ji,jsl,1) = e(ji,jsl)
4703          tmat(ji,jsl,2) = f(ji,jsl)
4704          tmat(ji,jsl,3) = zero
[2222]4705          rhs(ji,jsl) = ep(ji,jsl)*mcl(ji,jsl-1,jst) + fp(ji,jsl)*mcl(ji,jsl,jst) &
[2591]4706               + (b(ji,jsl-1) + b(ji,jsl)*(un-deux*free_drain_coef(ji,jst))) * (dt_sechiba/one_day) / deux
[1118]4707       ENDDO
[3402]4708       !- Store the equations for later use (9.6)
[1118]4709       DO jsl=1,nslm
4710          DO ji = 1, kjpindex
4711             srhs(ji,jsl) = rhs(ji,jsl)
4712             stmat(ji,jsl,1) = tmat(ji,jsl,1)
4713             stmat(ji,jsl,2) = tmat(ji,jsl,2)
4714             stmat(ji,jsl,3) = tmat(ji,jsl,3)
4715          ENDDO
4716       ENDDO
4717
[3402]4718       !! 8.6 Solve the diffusion equation, assuming that flux_top=evapot_penm (updates mcl)
[1118]4719       CALL hydrol_soil_tridiag(kjpindex,jst)
4720
[3402]4721       !! 9.7 Alternative solution with mc(1)=mcr in points where the above solution leads to mcl<mcr
4722       ! hydrol_soil_tridiag calculates mc recursively from the top as a fonction of rhs and tmat
4723       ! We re-use these the above values, but for mc(1)=mcr and the related tmat
4724       
[1118]4725       DO ji = 1, kjpindex
[3402]4726          ! by construction, mc and mcl are always on the same side of mcr, so we can use mcl here
[6954]4727          resolv(ji) = (mcl(ji,1,jst).LT.(mcr(ji)).AND.flux_top(ji).GT.min_sechiba)
[1118]4728       ENDDO
[3402]4729       !! Reset the coefficient for diffusion (tridiag is only solved if resolv(ji) = .TRUE.)O
[1118]4730       DO jsl=1,nslm
4731          !- The new condition is to put the upper layer at residual soil moisture
4732          DO ji = 1, kjpindex
4733             rhs(ji,jsl) = srhs(ji,jsl)
4734             tmat(ji,jsl,1) = stmat(ji,jsl,1)
4735             tmat(ji,jsl,2) = stmat(ji,jsl,2)
4736             tmat(ji,jsl,3) = stmat(ji,jsl,3)
4737          END DO
4738       END DO
4739       
4740       DO ji = 1, kjpindex
4741          tmat(ji,1,2) = un
4742          tmat(ji,1,3) = zero
[6954]4743          rhs(ji,1) = mcr(ji)
[1118]4744       ENDDO
4745       
[3402]4746       ! Solves the diffusion equation with new surface bc where resolv=T
[1118]4747       CALL hydrol_soil_tridiag(kjpindex,jst)
4748
[3402]4749       !! 8.8 In both case, we have drainage to be consistent with rhs
[1118]4750       DO ji = 1, kjpindex
[3402]4751          flux_bottom(ji) = mask_soiltile(ji,jst)*k(ji,nslm)*free_drain_coef(ji,jst) * (dt_sechiba/one_day)
[1118]4752       ENDDO
[3402]4753       
4754       !! 8.9 Water budget to assess the top flux = soil evaporation
4755       !      Where resolv=F at the 2nd step (9.6), it should simply be the potential evaporation
[1118]4756
[3402]4757       ! Total soil moisture content for water budget
[1118]4758
[3402]4759       DO jsl = 1, nslm
4760          DO ji =1, kjpindex
4761             mc(ji,jsl,jst) = MAX( mcl(ji,jsl,jst), mcl(ji,jsl,jst) + &
[6954]4762                  profil_froz_hydro_ns(ji,jsl,jst)*(mc(ji,jsl,jst)-mcr(ji)) )
[3402]4763             ! if profil_froz_hydro_ns=0 (including NOT ok_freeze_cwrr) we get mc=mcl
4764          ENDDO
[1118]4765       ENDDO
[3402]4766       
[1118]4767       DO ji = 1, kjpindex
[2651]4768          tmc(ji,jst) = dz(2) * ( trois*mc(ji,1,jst) + mc(ji,2,jst) )/huit
[2589]4769       ENDDO       
[1118]4770       DO jsl = 2,nslm-1
4771          DO ji = 1, kjpindex
[2651]4772             tmc(ji,jst) = tmc(ji,jst) + dz(jsl) &
[1118]4773                  * (trois*mc(ji,jsl,jst)+mc(ji,jsl-1,jst))/huit &
[2651]4774                  + dz(jsl+1) * (trois*mc(ji,jsl,jst)+mc(ji,jsl+1,jst))/huit
[1118]4775          ENDDO
4776       ENDDO
4777       DO ji = 1, kjpindex
[2651]4778          tmc(ji,jst) = tmc(ji,jst) + dz(nslm) &
[1118]4779               * (trois * mc(ji,nslm,jst) + mc(ji,nslm-1,jst))/huit
4780       END DO
4781   
[3402]4782       ! Deduce upper flux from soil moisture variation and bottom flux
4783       ! TMCi-D-BSE=TMC (BSE=bare soil evap=TMCi-TMC-D)
4784       ! The numerical errors of tridiag close to saturation cannot be simply solved here,
4785       ! we can only hope they are not too large because we don't add water at this stage...
[1118]4786       DO ji = 1, kjpindex
4787          evap_bare_lim_ns(ji,jst) = mask_soiltile(ji,jst) * &
[2222]4788               (tmcint(ji)-tmc(ji,jst)-flux_bottom(ji))
[1118]4789       END DO
4790
[3402]4791       !! 8.10 evap_bare_lim_ns is turned from an evaporation rate to a beta
[1118]4792       DO ji = 1, kjpindex
4793          ! Here we weight evap_bare_lim_ns by the fraction of bare evaporating soil.
4794          ! This is given by frac_bare_ns, taking into account bare soil under vegetation
4795          IF(vegtot(ji) .GT. min_sechiba) THEN
[1852]4796             evap_bare_lim_ns(ji,jst) = evap_bare_lim_ns(ji,jst) * frac_bare_ns(ji,jst)
[1118]4797          ELSE
[1852]4798             evap_bare_lim_ns(ji,jst) = 0.
[1118]4799          ENDIF
4800       END DO
4801
[2589]4802       ! We divide by evapot, which is consistent with diffuco (evap_bare_lim_ns < evapot_penm/evapot)
[2927]4803       ! Further decrease if tmc_litter is below the wilting point
[1118]4804
[3975]4805       IF (do_rsoil) THEN
4806          DO ji=1,kjpindex
[4144]4807             IF (evapot(ji).GT.min_sechiba) THEN
[3975]4808                evap_bare_lim_ns(ji,jst) = evap_bare_lim_ns(ji,jst) / evapot(ji)
4809             ELSE
4810                evap_bare_lim_ns(ji,jst) = zero ! not redundant with the is_under_mcr case below
4811                                                ! but not necessarily useful
4812             END IF
4813             evap_bare_lim_ns(ji,jst)=MAX(MIN(evap_bare_lim_ns(ji,jst),1.),0.)
4814          END DO
4815       ELSE
4816          DO ji=1,kjpindex
4817             IF ((evapot(ji).GT.min_sechiba) .AND. &
4818                  (tmc_litter(ji,jst).GT.(tmc_litter_wilt(ji,jst)))) THEN
4819                evap_bare_lim_ns(ji,jst) = evap_bare_lim_ns(ji,jst) / evapot(ji)
4820             ELSEIF((evapot(ji).GT.min_sechiba).AND. &
4821                  (tmc_litter(ji,jst).GT.(tmc_litter_res(ji,jst)))) THEN
4822                evap_bare_lim_ns(ji,jst) =  (un/deux) * evap_bare_lim_ns(ji,jst) / evapot(ji)
4823                ! This is very arbitrary, with no justification from the literature
4824             ELSE
4825                evap_bare_lim_ns(ji,jst) = zero
4826             END IF
4827             evap_bare_lim_ns(ji,jst)=MAX(MIN(evap_bare_lim_ns(ji,jst),1.),0.)
4828          END DO
4829       ENDIF
4830
[3402]4831       !! 8.11 Set evap_bare_lim_ns to zero if is_under_mcr at the end of the prognostic loop
4832       !!      (cf us, humrelv, vegstressv in 5.2)
4833       WHERE (is_under_mcr(:,jst))
[2927]4834          evap_bare_lim_ns(:,jst) = zero
4835       ENDWHERE
4836
[3402]4837       !! 8.12 Restores mc, mcl, and tmc, to erase the effect of the dummy integrations
4838       !!      on these prognostic variables
[1118]4839       DO jsl = 1, nslm
4840          DO ji = 1, kjpindex
4841             mc(ji,jsl,jst) = mask_soiltile(ji,jst) * mcint(ji,jsl)
[3402]4842             mcl(ji,jsl,jst) = mask_soiltile(ji,jst) * mclint(ji,jsl)
[1118]4843          ENDDO
4844       ENDDO
4845       DO ji = 1, kjpindex
4846          tmc(ji,jst) = temp(ji)
4847       ENDDO
4848
[3402]4849    ENDDO !end loop on tiles for dummy integration
[1118]4850
[3402]4851    !! 9. evap_bar_lim is the grid-cell scale beta
[1118]4852    DO ji = 1, kjpindex
4853       evap_bare_lim(ji) =  SUM(evap_bare_lim_ns(ji,:)*vegtot(ji)*soiltile(ji,:))
[3975]4854       r_soil(ji) =  SUM(r_soil_ns(ji,:)*vegtot(ji)*soiltile(ji,:))
[1118]4855    ENDDO
[5805]4856    ! si vegtot LE min_sechiba, evap_bare_lim_ns et evap_bare_lim valent zero
[1118]4857
[5805]4858
[3402]4859    !! 10. XIOS export of local variables, including water conservation checks
[4764]4860   
4861    CALL xios_orchidee_send_field("ksat",ksat) ! mm/d (for CMIP6, once)
[4812]4862    CALL xios_orchidee_send_field("psi_moy",psi_moy) ! mm (for SP-MIP)
[3402]4863    CALL xios_orchidee_send_field("wtd",wtd) ! in m
4864    CALL xios_orchidee_send_field("ru_corr",ru_corr/dt_sechiba)   ! adjustment flux added to surface runoff (included in runoff)
4865    CALL xios_orchidee_send_field("ru_corr2",ru_corr2/dt_sechiba)
4866    CALL xios_orchidee_send_field("dr_corr",dr_corr/dt_sechiba)   ! adjustment flux added to drainage (included in drainage)
4867    CALL xios_orchidee_send_field("dr_corrnum",dr_corrnum/dt_sechiba) 
4868    CALL xios_orchidee_send_field("dr_force",dr_force/dt_sechiba) ! adjustement flux added to drainage to sustain a forced wtd
4869    CALL xios_orchidee_send_field("qinfilt",qinfilt/dt_sechiba)
4870    CALL xios_orchidee_send_field("ru_infilt",ru_infilt/dt_sechiba)
[3975]4871    CALL xios_orchidee_send_field("r_soil",r_soil) ! s/m
[3402]4872
[5506]4873    IF (check_cwrr) THEN
[3402]4874       CALL xios_orchidee_send_field("check_infilt",check_infilt/dt_sechiba)
4875       CALL xios_orchidee_send_field("check_tr",check_tr/dt_sechiba)
4876       CALL xios_orchidee_send_field("check_over",check_over/dt_sechiba)
[5506]4877       CALL xios_orchidee_send_field("check_under",check_under/dt_sechiba) 
4878       ! Variables calculated in hydrol_diag_soil_flux
4879       CALL xios_orchidee_send_field("qflux",qflux/dt_sechiba) ! upward water flux at the low interface of each layer
4880       CALL xios_orchidee_send_field("check_top",check_top/dt_sechiba) !water budget residu in top layer
[3402]4881    END IF
4882
[1057]4883
[8]4884  END SUBROUTINE hydrol_soil
4885
4886
[947]4887!! ================================================================================================================================
[2589]4888!! SUBROUTINE   : hydrol_soil_infilt
[947]4889!!
4890!>\BRIEF        Infiltration
4891!!
4892!! DESCRIPTION  :
[3402]4893!! 1. We calculate the total SM at the beginning of the routine
4894!! 2. Infiltration process
4895!! 2.1 Initialization of time counter and infiltration rate
4896!! 2.2 Infiltration layer by layer, accounting for an exponential law for subgrid variability
4897!! 2.3 Resulting infiltration and surface runoff
4898!! 3. For water conservation check, we calculate the total SM at the beginning of the routine,
4899!!    and export the difference with the flux
4900!! 5. Local verification
[947]4901!!
[3402]4902!! RECENT CHANGE(S) : 2016 by A. Ducharne
4903!! Adding checks and interactions variables with hydrol_soil, but the processes are unchanged
[947]4904!!
4905!! MAIN OUTPUT VARIABLE(S) :
4906!!
4907!! REFERENCE(S) :
4908!!
4909!! FLOWCHART    : None
4910!! \n
4911!_ ================================================================================================================================
4912!_ hydrol_soil_infilt
[8]4913
[7255]4914  SUBROUTINE hydrol_soil_infilt(ks, nvan, avan, mcr, mcs, mcfc, mcw, kjpindex, ins, njsc, flux_infilt, stempdiag, &
4915                                qinfilt_ns, ru_infilt, check)
[947]4916
4917    !! 0. Variable and parameter declaration
4918
4919    !! 0.1 Input variables
4920
4921    ! GLOBAL (in or inout)
4922    INTEGER(i_std), INTENT(in)                        :: kjpindex        !! Domain size
[2651]4923    INTEGER(i_std), INTENT(in)                        :: ins
[3402]4924    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)  :: njsc            !! Index of the dominant soil textural class in the grid cell
4925                                                                         !!  (1-nscm, unitless)
[7239]4926    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: ks               !! Hydraulic conductivity at saturation (mm {-1})
4927    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: nvan             !! Van Genuchten coeficients n (unitless)
4928    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: avan             !! Van Genuchten coeficients a (mm-1})
4929    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
4930    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
4931    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcfc             !! Volumetric water content at field capacity (m^{3} m^{-3})
4932    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcw              !! Volumetric water content at wilting point (m^{3} m^{-3})
[947]4933    REAL(r_std), DIMENSION (kjpindex), INTENT (in)    :: flux_infilt     !! Water to infiltrate
[2589]4934                                                                         !!  @tex $(kg m^{-2})$ @endtex
[7255]4935    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (in):: stempdiag       !! Diagnostic temp profile from thermosoil                                                                     
[947]4936    !! 0.2 Output variables
[3402]4937    REAL(r_std), DIMENSION(kjpindex,nstm), INTENT(out) :: check       !! delta SM - flux (mm/dt_sechiba)
4938    REAL(r_std), DIMENSION(kjpindex,nstm), INTENT(out) :: ru_infilt   !! Surface runoff from soil_infilt (mm/dt_sechiba)
4939    REAL(r_std), DIMENSION(kjpindex,nstm), INTENT(out) :: qinfilt_ns  !! Effective infiltration flux (mm/dt_sechiba)
[947]4940
4941    !! 0.3 Modified variables
4942
4943    !! 0.4 Local variables
4944
[3402]4945    INTEGER(i_std)                                :: ji, jsl      !! Indices
4946    REAL(r_std), DIMENSION (kjpindex)             :: wat_inf_pot  !! infiltrable water in the layer
4947    REAL(r_std), DIMENSION (kjpindex)             :: wat_inf      !! infiltrated water in the layer
4948    REAL(r_std), DIMENSION (kjpindex)             :: dt_tmp       !! time remaining before the end of the time step
4949    REAL(r_std), DIMENSION (kjpindex)             :: dt_inf       !! the time it takes to complete the infiltration in the
4950                                                                  !! layer
4951    REAL(r_std)                                   :: k_m          !! the mean conductivity used for the saturated front
4952    REAL(r_std), DIMENSION (kjpindex)             :: infilt_tmp   !! infiltration rate for the considered layer
4953    REAL(r_std), DIMENSION (kjpindex)             :: infilt_tot   !! total infiltration
4954    REAL(r_std), DIMENSION (kjpindex)             :: flux_tmp     !! rate at which precip hits the ground
[947]4955
[3402]4956    REAL(r_std), DIMENSION(kjpindex)              :: tmci         !! total SM at beginning of routine (kg/m2)
4957    REAL(r_std), DIMENSION(kjpindex)              :: tmcf         !! total SM at end of routine (kg/m2)
4958   
4959
[1082]4960!_ ================================================================================================================================
4961
[947]4962    ! If data (or coupling with GCM) was available, a parameterization for subgrid rainfall could be performed
4963
[3402]4964    !! 1. We calculate the total SM at the beginning of the routine
[5506]4965    IF (check_cwrr) THEN
[3402]4966       tmci(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
4967       DO jsl = 2,nslm-1
4968          tmci(:) = tmci(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
4969               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
4970       ENDDO
4971       tmci(:) = tmci(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
4972    ENDIF
4973
4974    !! 2. Infiltration process
4975
4976    !! 2.1 Initialization
4977
[947]4978    DO ji = 1, kjpindex
[3402]4979       !! First we fill up the first layer (about 1mm) without any resistance and quasi-immediately
[6954]4980       wat_inf_pot(ji) = MAX((mcs(ji)-mc(ji,1,ins)) * dz(2) / deux, zero)
[947]4981       wat_inf(ji) = MIN(wat_inf_pot(ji), flux_infilt(ji))
[2651]4982       mc(ji,1,ins) = mc(ji,1,ins) + wat_inf(ji) * deux / dz(2)
[947]4983       !
4984    ENDDO
[3402]4985
4986    !! Initialize a countdown for infiltration during the time-step and the value of potential runoff
[2591]4987    dt_tmp(:) = dt_sechiba / one_day
[947]4988    infilt_tot(:) = wat_inf(:)
[3402]4989    !! Compute the rate at which water will try to infiltrate each layer
[2589]4990    ! flux_temp is converted here to the same unit as k_m
[947]4991    flux_tmp(:) = (flux_infilt(:)-wat_inf(:)) / dt_tmp(:)
[3402]4992
4993    !! 2.2 Infiltration layer by layer
[947]4994    DO jsl = 2, nslm-1
4995       DO ji = 1, kjpindex
[3402]4996          !! Infiltrability of each layer if under a saturated one
[947]4997          ! This is computed by an simple arithmetic average because
4998          ! the time step (30min) is not appropriate for a geometric average (advised by Haverkamp and Vauclin)
[6954]4999          k_m = (k(ji,jsl) + ks(ji)*kfact(jsl-1,ji)*kfact_root(ji,jsl,ins)) / deux 
[947]5000
[2222]5001          IF (ok_freeze_cwrr) THEN
[7255]5002             IF (stempdiag(ji, jsl) .LT. ZeroCelsius) THEN
[2222]5003                k_m = k(ji,jsl)
5004             ENDIF
5005          ENDIF
5006
[3402]5007          !! We compute the mean rate at which water actually infiltrate:
[2589]5008          ! Subgrid: Exponential distribution of k around k_m, but average p directly used
[3402]5009          ! See d'Orgeval 2006, p 78, but it's not fully clear to me (AD16***)
[947]5010          infilt_tmp(ji) = k_m * (un - EXP(- flux_tmp(ji) / k_m)) 
5011
[3402]5012          !! From which we deduce the time it takes to fill up the layer or to end the time step...
[6954]5013          wat_inf_pot(ji) =  MAX((mcs(ji)-mc(ji,jsl,ins)) * (dz(jsl) + dz(jsl+1)) / deux, zero)
[947]5014          IF ( infilt_tmp(ji) > min_sechiba) THEN
5015             dt_inf(ji) =  MIN(wat_inf_pot(ji)/infilt_tmp(ji), dt_tmp(ji))
5016             ! The water infiltration TIME has to limited by what is still available for infiltration.
5017             IF ( dt_inf(ji) * infilt_tmp(ji) > flux_infilt(ji)-infilt_tot(ji) ) THEN
5018                dt_inf(ji) = MAX(flux_infilt(ji)-infilt_tot(ji),zero)/infilt_tmp(ji)
5019             ENDIF
5020          ELSE
5021             dt_inf(ji) = dt_tmp(ji)
5022          ENDIF
5023
[3402]5024          !! The water enters in the layer
[947]5025          wat_inf(ji) = dt_inf(ji) * infilt_tmp(ji)
5026          ! bviously the moisture content
5027          mc(ji,jsl,ins) = mc(ji,jsl,ins) + &
[2651]5028               & wat_inf(ji) * deux / (dz(jsl) + dz(jsl+1))
[947]5029          ! the time remaining before the next time step
5030          dt_tmp(ji) = dt_tmp(ji) - dt_inf(ji)
5031          ! and finally the infilt_tot (which is just used to check if there is a problem, below)
5032          infilt_tot(ji) = infilt_tot(ji) + infilt_tmp(ji) * dt_inf(ji)
5033       ENDDO
5034    ENDDO
[3402]5035
5036    !! 2.3 Resulting infiltration and surface runoff
5037    ru_infilt(:,ins) = flux_infilt(:) - infilt_tot(:)
5038    qinfilt_ns(:,ins) = infilt_tot(:)
5039
5040    !! 3. For water conservation check: we calculate the total SM at the beginning of the routine
5041    !!    and export the difference with the flux
[5506]5042    IF (check_cwrr) THEN
[3402]5043       tmcf(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
5044       DO jsl = 2,nslm-1
5045          tmcf(:) = tmcf(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
5046               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
5047       ENDDO
5048       tmcf(:) = tmcf(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
5049       ! Normally, tcmf=tmci+infilt_tot
5050       check(:,ins) = tmcf(:)-(tmci(:)+infilt_tot(:))
5051    ENDIF
[947]5052   
[3402]5053    !! 5. Local verification
[947]5054    DO ji = 1, kjpindex
5055       IF (infilt_tot(ji) .LT. -min_sechiba .OR. infilt_tot(ji) .GT. flux_infilt(ji) + min_sechiba) THEN
5056          WRITE (numout,*) 'Error in the calculation of infilt tot', infilt_tot(ji)
5057          WRITE (numout,*) 'k, ji, jst, mc', k(ji,1:2), ji, ins, mc(ji,1,ins)
[1078]5058          CALL ipslerr_p(3, 'hydrol_soil_infilt', 'We will STOP now.','Error in calculation of infilt tot','')
[947]5059       ENDIF
5060    ENDDO
5061
5062  END SUBROUTINE hydrol_soil_infilt
5063
5064
5065!! ================================================================================================================================
[3402]5066!! SUBROUTINE   : hydrol_soil_smooth_under_mcr
[947]5067!!
[3402]5068!>\BRIEF        : Modifies the soil moisture profile to avoid under-residual values,
[2589]5069!!                then diagnoses the points where such "excess" values remain.
[947]5070!!
5071!! DESCRIPTION  :
[3402]5072!! The "excesses" under-residual are corrected from top to bottom, by transfer of excesses
[2589]5073!! to the lower layers. The reverse transfer is performed to smooth any remaining "excess" in the bottom layer.
5074!! If some "excess" remain afterwards, the entire soil profile is at the threshold value (mcs or mcr),
5075!! and the remaining "excess" is necessarily concentrated in the top layer.
[3402]5076!! This allowing diagnosing the flag is_under_mcr.
[2589]5077!! Eventually, the remaining "excess" is split over the entire profile
[3402]5078!! 1. We calculate the total SM at the beginning of the routine
5079!! 2. Smoothes the profile to avoid negative values of punctual soil moisture
5080!! Note that we check that mc > min_sechiba in hydrol_soil
5081!! 3. For water conservation check, We calculate the total SM at the beginning of the routine,
5082!!    and export the difference with the flux
[947]5083!!
[3402]5084!! RECENT CHANGE(S) : 2016 by A. Ducharne
[947]5085!!
5086!! MAIN OUTPUT VARIABLE(S) :
5087!!
5088!! REFERENCE(S) :
5089!!
5090!! FLOWCHART    : None
5091!! \n
5092!_ ================================================================================================================================
[3402]5093!_ hydrol_soil_smooth_under_mcr
[947]5094
[6954]5095  SUBROUTINE hydrol_soil_smooth_under_mcr(mcr, kjpindex, ins, njsc, is_under_mcr, check)
[947]5096
[8]5097    !- arguments
[947]5098
5099    !! 0. Variable and parameter declaration
5100
5101    !! 0.1 Input variables
5102
[3402]5103    INTEGER(i_std), INTENT(in)                         :: kjpindex     !! Domain size
5104    INTEGER(i_std), INTENT(in)                         :: ins          !! Soiltile index (1-nstm, unitless)
5105    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)   :: njsc         !! Index of the dominant soil textural class in grid cell
[7239]5106                                                                       !! (1-nscm, unitless) 
5107    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: mcr          !! Residual volumetric water content (m^{3} m^{-3}) 
[3402]5108   
[947]5109    !! 0.2 Output variables
[8]5110
[3402]5111    LOGICAL, DIMENSION(kjpindex,nstm), INTENT(out)     :: is_under_mcr !! Flag diagnosing under residual soil moisture
5112    REAL(r_std), DIMENSION(kjpindex,nstm), INTENT(out) :: check        !! delta SM - flux
[8]5113
[947]5114    !! 0.3 Modified variables
[8]5115
[947]5116    !! 0.4 Local variables
5117
5118    INTEGER(i_std)                       :: ji,jsl
5119    REAL(r_std)                          :: excess
5120    REAL(r_std), DIMENSION(kjpindex)     :: excessji
[3402]5121    REAL(r_std), DIMENSION(kjpindex)     :: tmci      !! total SM at beginning of routine
5122    REAL(r_std), DIMENSION(kjpindex)     :: tmcf      !! total SM at end of routine
[947]5123
[1082]5124!_ ================================================================================================================================       
[2589]5125
[3402]5126    !! 1. We calculate the total SM at the beginning of the routine
[5506]5127    IF (check_cwrr) THEN
[3402]5128       tmci(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
5129       DO jsl = 2,nslm-1
5130          tmci(:) = tmci(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
5131               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
5132       ENDDO
5133       tmci(:) = tmci(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
5134    ENDIF
[947]5135
[3402]5136    !! 2. Smoothes the profile to avoid negative values of punctual soil moisture
5137
5138    ! 2.1 smoothing from top to bottom
5139    DO jsl = 1,nslm-2
[947]5140       DO ji=1, kjpindex
[6954]5141          excess = MAX(mcr(ji)-mc(ji,jsl,ins),zero)
[3402]5142          mc(ji,jsl,ins) = mc(ji,jsl,ins) + excess
5143          mc(ji,jsl+1,ins) = mc(ji,jsl+1,ins) - excess * &
[2651]5144               &  (dz(jsl)+dz(jsl+1))/(dz(jsl+1)+dz(jsl+2))
[947]5145       ENDDO
5146    ENDDO
5147
5148    jsl = nslm-1
5149    DO ji=1, kjpindex
[6954]5150       excess = MAX(mcr(ji)-mc(ji,jsl,ins),zero)
[3402]5151       mc(ji,jsl,ins) = mc(ji,jsl,ins) + excess
5152       mc(ji,jsl+1,ins) = mc(ji,jsl+1,ins) - excess * &
[2651]5153            &  (dz(jsl)+dz(jsl+1))/dz(jsl+1)
[947]5154    ENDDO
5155
5156    jsl = nslm
5157    DO ji=1, kjpindex
[6954]5158       excess = MAX(mcr(ji)-mc(ji,jsl,ins),zero)
[3402]5159       mc(ji,jsl,ins) = mc(ji,jsl,ins) + excess
5160       mc(ji,jsl-1,ins) = mc(ji,jsl-1,ins) - excess * &
[2651]5161            &  dz(jsl)/(dz(jsl-1)+dz(jsl))
[947]5162    ENDDO
[2589]5163
[3402]5164    ! 2.2 smoothing from bottom to top
[947]5165    DO jsl = nslm-1,2,-1
5166       DO ji=1, kjpindex
[6954]5167          excess = MAX(mcr(ji)-mc(ji,jsl,ins),zero)
[3402]5168          mc(ji,jsl,ins) = mc(ji,jsl,ins) + excess
5169          mc(ji,jsl-1,ins) = mc(ji,jsl-1,ins) - excess * &
[2651]5170               &  (dz(jsl)+dz(jsl+1))/(dz(jsl-1)+dz(jsl))
[947]5171       ENDDO
5172    ENDDO
5173
[3402]5174    ! 2.3 diagnoses is_under_mcr(ji), and updates the entire profile
5175    ! excess > 0
[947]5176    DO ji=1, kjpindex
[6954]5177       excessji(ji) = mask_soiltile(ji,ins) * MAX(mcr(ji)-mc(ji,1,ins),zero)
[947]5178    ENDDO
5179    DO ji=1, kjpindex
[3402]5180       mc(ji,1,ins) = mc(ji,1,ins) + excessji(ji) ! then mc(1)=mcr
5181       is_under_mcr(ji,ins) = (excessji(ji) .GT. min_sechiba)
5182    ENDDO
[947]5183
[3402]5184    ! 2.4 The amount of water corresponding to excess in the top soil layer is redistributed in all soil layers
5185      ! -excess(ji) * dz(2) / deux donne le deficit total, negatif, en mm
5186      ! diviser par la profondeur totale en mm donne des delta_mc identiques en chaque couche, en mm
5187      ! retransformes en delta_mm par couche selon les bonnes eqs (eqs_hydrol.pdf, Eqs 13-15), puis sommes
5188      ! retourne bien le deficit total en mm
5189    DO jsl = 1, nslm
5190       DO ji=1, kjpindex
5191          mc(ji,jsl,ins) = mc(ji,jsl,ins) - excessji(ji) * dz(2) / (deux * zmaxh*mille)
5192       ENDDO
[947]5193    ENDDO
[3402]5194    ! This can lead to mc(jsl) < mcr depending on the value of excess,
5195    ! but this is no major pb for the diffusion
5196    ! Yet, we need to prevent evaporation if is_under_mcr
5197   
5198    !! Note that we check that mc > min_sechiba in hydrol_soil
5199
5200    ! We just make sure that mc remains at 0 where soiltile=0
[947]5201    DO jsl = 1, nslm
5202       DO ji=1, kjpindex
[3402]5203          mc(ji,jsl,ins) = mask_soiltile(ji,ins) * mc(ji,jsl,ins)
[947]5204       ENDDO
5205    ENDDO
5206
[3402]5207    !! 3. For water conservation check, We calculate the total SM at the beginning of the routine,
5208    !!    and export the difference with the flux
[5506]5209    IF (check_cwrr) THEN
[3402]5210       tmcf(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
5211       DO jsl = 2,nslm-1
5212          tmcf(:) = tmcf(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
5213               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
5214       ENDDO
5215       tmcf(:) = tmcf(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
5216       ! Normally, tcmf=tmci since we just redistribute the deficit
5217       check(:,ins) = tmcf(:)-tmci(:)
5218    ENDIF
5219       
5220  END SUBROUTINE hydrol_soil_smooth_under_mcr
[947]5221
[2589]5222
[3402]5223!! ================================================================================================================================
5224!! SUBROUTINE   : hydrol_soil_smooth_over_mcs
5225!!
5226!>\BRIEF        : Modifies the soil moisture profile to avoid over-saturation values,
5227!!                by putting the excess in ru_ns
5228!!                Thus, no point remain where such "excess" values remain (is_over_mcs becomes useless)
5229!!
5230!! DESCRIPTION  :
5231!! The "excesses" over-saturation are corrected from top to bottom, by transfer of excesses
5232!! to the lower layers. The reverse transfer is performed to smooth any remaining "excess" in the bottom layer.
5233!! If some "excess" remain afterwards, the entire soil profile is at the threshold value (mcs or mcr),
5234!! and the remaining "excess" is necessarily concentrated in the top layer.
5235!! Eventually, the remaining "excess" creates rudr_corr, to be added to ru_ns or dr_ns
5236!! 1. We calculate the total SM at the beginning of the routine
5237!! 2. In case of over-saturation we put the water where it is possible by smoothing
5238!! 3. The excess is transformed into surface runoff, with conversion from m3/m3 to kg/m2
5239!! 4. For water conservation checks, we calculate the total SM at the beginning of the routine,
5240!!    and export the difference with the flux
5241!!
5242!! RECENT CHANGE(S) : 2016 by A. Ducharne
5243!!
5244!! MAIN OUTPUT VARIABLE(S) :
5245!!
5246!! REFERENCE(S) :
5247!!
5248!! FLOWCHART    : None
5249!! \n
5250!_ ================================================================================================================================
5251!_ hydrol_soil_smooth_over_mcs
5252
[6954]5253  SUBROUTINE hydrol_soil_smooth_over_mcs(mcs ,kjpindex, ins, njsc, is_over_mcs, rudr_corr, check)
[3402]5254
5255    !- arguments
5256
5257    !! 0. Variable and parameter declaration
5258
[6954]5259    !! 0.1 Input variables
[3402]5260    INTEGER(i_std), INTENT(in)                           :: kjpindex        !! Domain size
5261    INTEGER(i_std), INTENT(in)                           :: ins             !! Soiltile index (1-nstm, unitless)
5262    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)     :: njsc            !! Index of the dominant soil textural class in grid cell
5263                                                                            !! (1-nscm, unitless)
[7239]5264    REAL(r_std),DIMENSION (kjpindex), INTENT (in)        :: mcs             !! Saturated volumetric water content (m^{3} m^{-3})
[3402]5265   
5266    !! 0.2 Output variables
5267
5268    LOGICAL, DIMENSION(kjpindex), INTENT(out)            :: is_over_mcs     !! Flag diagnosing over saturated soil moisture 
5269    REAL(r_std), DIMENSION(kjpindex,nstm), INTENT(out)   :: check           !! delta SM - flux
5270   
5271    !! 0.3 Modified variables   
5272    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT(inout):: rudr_corr         !! Surface runoff produced to correct excess (mm/dtstep)
5273
5274    !! 0.4 Local variables
5275
5276    INTEGER(i_std)                        :: ji,jsl
5277    REAL(r_std)                           :: excess
5278    REAL(r_std), DIMENSION(kjpindex)      :: tmci    !! total SM at beginning of routine
5279    REAL(r_std), DIMENSION(kjpindex)      :: tmcf    !! total SM at end of routine
5280
5281    !_ ================================================================================================================================
5282
5283    !! 1. We calculate the total SM at the beginning of the routine
[5506]5284    IF (check_cwrr) THEN
[3402]5285       tmci(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
5286       DO jsl = 2,nslm-1
5287          tmci(:) = tmci(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
5288               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
5289       ENDDO
5290       tmci(:) = tmci(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
5291    ENDIF
5292
5293    !! 2. In case of over-saturation we put the water where it is possible by smoothing
5294
5295    ! 2.1 smoothing from top to bottom
5296    DO jsl = 1, nslm-2
[947]5297       DO ji=1, kjpindex
[6954]5298          excess = MAX(mc(ji,jsl,ins)-mcs(ji),zero)
[3402]5299          mc(ji,jsl,ins) = mc(ji,jsl,ins) - excess
5300          mc(ji,jsl+1,ins) = mc(ji,jsl+1,ins) + excess * &
[2651]5301               &  (dz(jsl)+dz(jsl+1))/(dz(jsl+1)+dz(jsl+2))
[947]5302       ENDDO
5303    ENDDO
5304
5305    jsl = nslm-1
5306    DO ji=1, kjpindex
[6954]5307       excess = MAX(mc(ji,jsl,ins)-mcs(ji),zero)
[3402]5308       mc(ji,jsl,ins) = mc(ji,jsl,ins) - excess
5309       mc(ji,jsl+1,ins) = mc(ji,jsl+1,ins) + excess * &
[2651]5310            &  (dz(jsl)+dz(jsl+1))/dz(jsl+1)
[947]5311    ENDDO
5312
5313    jsl = nslm
5314    DO ji=1, kjpindex
[6954]5315       excess = MAX(mc(ji,jsl,ins)-mcs(ji),zero)
[3402]5316       mc(ji,jsl,ins) = mc(ji,jsl,ins) - excess
5317       mc(ji,jsl-1,ins) = mc(ji,jsl-1,ins) + excess * &
[2651]5318            &  dz(jsl)/(dz(jsl-1)+dz(jsl))
[947]5319    ENDDO
5320
[3402]5321    ! 2.2 smoothing from bottom to top, leading  to keep most of the excess in the soil column
[947]5322    DO jsl = nslm-1,2,-1
5323       DO ji=1, kjpindex
[6954]5324          excess = MAX(mc(ji,jsl,ins)-mcs(ji),zero)
[3402]5325          mc(ji,jsl,ins) = mc(ji,jsl,ins) - excess
5326          mc(ji,jsl-1,ins) = mc(ji,jsl-1,ins) + excess * &
[2651]5327               &  (dz(jsl)+dz(jsl+1))/(dz(jsl-1)+dz(jsl))
[947]5328       ENDDO
5329    ENDDO
5330
[3402]5331    !! 3. The excess is transformed into surface runoff, with conversion from m3/m3 to kg/m2
5332
[947]5333    DO ji=1, kjpindex
[6954]5334       excess = mask_soiltile(ji,ins) * MAX(mc(ji,1,ins)-mcs(ji),zero)
[3402]5335       mc(ji,1,ins) = mc(ji,1,ins) - excess ! then mc(1)=mcs
5336       rudr_corr(ji,ins) = rudr_corr(ji,ins) + excess * dz(2) / deux 
5337       is_over_mcs(ji) = .FALSE.
[947]5338    ENDDO
5339
[3402]5340    !! 4. For water conservation checks, we calculate the total SM at the beginning of the routine,
5341    !!    and export the difference with the flux
5342
[5506]5343    IF (check_cwrr) THEN
[3402]5344       tmcf(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
5345       DO jsl = 2,nslm-1
5346          tmcf(:) = tmcf(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
5347               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
5348       ENDDO
5349       tmcf(:) = tmcf(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
5350       ! Normally, tcmf=tmci-rudr_corr
5351       check(:,ins) = tmcf(:)-(tmci(:)-rudr_corr(:,ins))
5352    ENDIF
5353   
5354  END SUBROUTINE hydrol_soil_smooth_over_mcs
5355
5356 !! ================================================================================================================================
5357!! SUBROUTINE   : hydrol_soil_smooth_over_mcs2
5358!!
5359!>\BRIEF        : Modifies the soil moisture profile to avoid over-saturation values,
5360!!                by putting the excess in ru_ns
5361!!                Thus, no point remain where such "excess" values remain (is_over_mcs becomes useless)
5362!!
5363!! DESCRIPTION  :
5364!! The "excesses" over-saturation are corrected, by directly discarding the excess as rudr_corr,
5365!! to be added to ru_ns or dr_nsrunoff (via rudr_corr).
5366!! Therefore, there is no more smoothing, and this helps preventing the saturation of too many layers,
5367!! which leads to numerical errors with tridiag.
5368!! 1. We calculate the total SM at the beginning of the routine
5369!! 2. In case of over-saturation, we directly eliminate the excess via rudr_corr
5370!!    The calculation of the adjustement flux needs to account for nodes n-1 and n+1.
5371!! 3. For water conservation checks, we calculate the total SM at the beginning of the routine,
5372!!    and export the difference with the flux   
5373!!
5374!! RECENT CHANGE(S) : 2016 by A. Ducharne
5375!!
5376!! MAIN OUTPUT VARIABLE(S) :
5377!!
5378!! REFERENCE(S) :
5379!!
5380!! FLOWCHART    : None
5381!! \n
5382!_ ================================================================================================================================
5383!_ hydrol_soil_smooth_over_mcs2
5384
[6954]5385  SUBROUTINE hydrol_soil_smooth_over_mcs2(mcs, kjpindex, ins, njsc, is_over_mcs, rudr_corr, check)
[3402]5386
5387    !- arguments
5388
5389    !! 0. Variable and parameter declaration
5390
5391    !! 0.1 Input variables
5392    INTEGER(i_std), INTENT(in)                           :: kjpindex        !! Domain size
5393    INTEGER(i_std), INTENT(in)                           :: ins             !! Soiltile index (1-nstm, unitless)
5394    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)     :: njsc            !! Index of the dominant soil textural class in grid cell
5395                                                                            !! (1-nscm, unitless)
[7239]5396    REAL(r_std),DIMENSION (kjpindex), INTENT (in)        :: mcs             !! Saturated volumetric water content (m^{3} m^{-3})
[3402]5397   
5398    !! 0.2 Output variables
5399
5400    LOGICAL, DIMENSION(kjpindex), INTENT(out)            :: is_over_mcs     !! Flag diagnosing over saturated soil moisture 
5401    REAL(r_std), DIMENSION(kjpindex,nstm), INTENT(out)   :: check           !! delta SM - flux
5402   
5403    !! 0.3 Modified variables   
5404    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT(inout):: rudr_corr         !! Surface runoff produced to correct excess (mm/dtstep)
5405
5406    !! 0.4 Local variables
5407
5408    INTEGER(i_std)                        :: ji,jsl
5409    REAL(r_std), DIMENSION(kjpindex,nslm) :: excess
5410    REAL(r_std), DIMENSION(kjpindex)      :: tmci    !! total SM at beginning of routine
5411    REAL(r_std), DIMENSION(kjpindex)      :: tmcf    !! total SM at end of routine
5412
5413!_ ================================================================================================================================       
5414    !-
5415
5416    !! 1. We calculate the total SM at the beginning of the routine
[5506]5417    IF (check_cwrr) THEN
[3402]5418       tmci(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
5419       DO jsl = 2,nslm-1
5420          tmci(:) = tmci(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
5421               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
5422       ENDDO
5423       tmci(:) = tmci(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
5424    ENDIF 
5425
5426    !! 2. In case of over-saturation, we don't do any smoothing,
5427    !! but directly eliminate the excess as runoff (via rudr_corr)
5428    !    we correct the calculation of the adjustement flux, which needs to account for nodes n-1 and n+1 
5429    !    for the calculation to remain simple and accurate, we directly drain all the oversaturated mc,
5430    !    without transfering to lower layers       
5431
5432    !! 2.1 thresholding from top to bottom, with excess defined along jsl
[947]5433    DO jsl = 1, nslm
5434       DO ji=1, kjpindex
[6954]5435          excess(ji,jsl) = MAX(mc(ji,jsl,ins)-mcs(ji),zero) ! >=0
[3402]5436          mc(ji,jsl,ins) = mc(ji,jsl,ins) - excess(ji,jsl) ! here mc either does not change or decreases
[947]5437       ENDDO
5438    ENDDO
5439
[3402]5440    !! 2.2 To ensure conservation, this needs to be balanced by additional drainage (in kg/m2/dt)                       
5441    DO ji = 1, kjpindex
5442       rudr_corr(ji,ins) = dz(2) * ( trois*excess(ji,1) + excess(ji,2) )/huit ! top layer = initialisation 
5443    ENDDO
5444    DO jsl = 2,nslm-1 ! intermediate layers     
5445       DO ji = 1, kjpindex
5446          rudr_corr(ji,ins) = rudr_corr(ji,ins) + dz(jsl) &
5447               & * (trois*excess(ji,jsl)+excess(ji,jsl-1))/huit &
5448               & + dz(jsl+1) * (trois*excess(ji,jsl)+excess(ji,jsl+1))/huit
[947]5449       ENDDO
5450    ENDDO
[3402]5451    DO ji = 1, kjpindex
5452       rudr_corr(ji,ins) = rudr_corr(ji,ins) + dz(nslm) &    ! bottom layer
5453            & * (trois * excess(ji,nslm) + excess(ji,nslm-1))/huit
5454       is_over_mcs(ji) = .FALSE. 
5455    END DO
5456
5457    !! 3. For water conservation checks, we calculate the total SM at the beginning of the routine,
5458    !!    and export the difference with the flux
5459
[5506]5460    IF (check_cwrr) THEN
[3402]5461       tmcf(:) = dz(2) * ( trois*mc(:,1,ins) + mc(:,2,ins) )/huit
5462       DO jsl = 2,nslm-1
5463          tmcf(:) = tmcf(:) + dz(jsl) * (trois*mc(:,jsl,ins)+mc(:,jsl-1,ins))/huit &
5464               + dz(jsl+1) * (trois*mc(:,jsl,ins)+mc(:,jsl+1,ins))/huit
5465       ENDDO
5466       tmcf(:) = tmcf(:) + dz(nslm) * (trois*mc(:,nslm,ins) + mc(:,nslm-1,ins))/huit
5467       ! Normally, tcmf=tmci-rudr_corr
5468       check(:,ins) = tmcf(:)-(tmci(:)-rudr_corr(:,ins))
5469    ENDIF
[947]5470   
[3402]5471  END SUBROUTINE hydrol_soil_smooth_over_mcs2
[947]5472
5473
5474!! ================================================================================================================================
[5506]5475!! SUBROUTINE   : hydrol_diag_soil_flux
[947]5476!!
[3402]5477!>\BRIEF        : This subroutine diagnoses the vertical liquid water fluxes between the
5478!!                different soil layers, based on each layer water budget. It also checks the
5479!!                corresponding water conservation (during redistribution).
[947]5480!!
5481!! DESCRIPTION  :
[5506]5482!! 1. Initialize qflux_ns from the bottom, with dr_ns
[3402]5483!! 2. Between layer nslm and nslm-1, by means of water budget knowing mc changes and flux at the lowest interface
[5506]5484!! 3. We go up, and deduct qflux_ns(1:nslm-2), still by means of water budget
[3402]5485!! 4. Water balance verification: pursuing upward water budget, the flux at the surface should equal -flux_top 
[947]5486!!
[3402]5487!! RECENT CHANGE(S) : 2016 by A. Ducharne to fit hydrol_soil
[947]5488!!
5489!! MAIN OUTPUT VARIABLE(S) :
5490!!
5491!! REFERENCE(S) :
5492!!
5493!! FLOWCHART    : None
5494!! \n
5495!_ ================================================================================================================================
5496
[5506]5497  SUBROUTINE hydrol_diag_soil_flux(kjpindex,ins,mclint,flux_top)
[947]5498    !
5499    !! 0. Variable and parameter declaration
5500
5501    !! 0.1 Input variables
5502
5503    INTEGER(i_std), INTENT(in)                         :: kjpindex        !! Domain size
5504    INTEGER(i_std), INTENT(in)                         :: ins             !! index of soil type
[3402]5505    REAL(r_std), DIMENSION (kjpindex,nslm), INTENT(in) :: mclint          !! mc values at the beginning of the time step
5506    REAL(r_std), DIMENSION (kjpindex), INTENT(in)      :: flux_top        !! Exfiltration (bare soil evaporation minus infiltration)
5507   
[947]5508    !! 0.2 Output variables
5509
5510    !! 0.3 Modified variables
5511
5512    !! 0.4 Local variables
[5506]5513    REAL(r_std), DIMENSION (kjpindex)                  :: check_temp      !! Diagnosed flux at soil surface, should equal -flux_top
[947]5514    INTEGER(i_std)                                     :: jsl,ji
[1082]5515
[3402]5516    !_ ================================================================================================================================
5517
5518    !- Compute the diffusion flux at every level from bottom to top (using mcl,mclint, and sink values)
[947]5519    DO ji = 1, kjpindex
[3402]5520
[5506]5521       !! 1. Initialize qflux_ns from the bottom, with dr_ns
[947]5522       jsl = nslm
[5506]5523       qflux_ns(ji,jsl,ins) = dr_ns(ji,ins)
5524       !! 2. Between layer nslm and nslm-1, by means of water budget
5525       !!    knowing mc changes and flux at the lowest interface
5526       !     qflux_ns is downward
[947]5527       jsl = nslm-1
[5506]5528       qflux_ns(ji,jsl,ins) = qflux_ns(ji,jsl+1,ins) & 
[3402]5529            &  + (mcl(ji,jsl,ins)-mclint(ji,jsl) &
5530            &  + trois*mcl(ji,jsl+1,ins) - trois*mclint(ji,jsl+1)) &
[2651]5531            &  * (dz(jsl+1)/huit) &
[947]5532            &  + rootsink(ji,jsl+1,ins) 
5533    ENDDO
[3402]5534
[5506]5535    !! 3. We go up, and deduct qflux_ns(1:nslm-2), still by means of water budget
5536    ! Here, qflux_ns(ji,1,ins) is the downward flux between the top soil layer and the 2nd one
[947]5537    DO jsl = nslm-2,1,-1
5538       DO ji = 1, kjpindex
[5506]5539          qflux_ns(ji,jsl,ins) = qflux_ns(ji,jsl+1,ins) & 
[3402]5540               &  + (mcl(ji,jsl,ins)-mclint(ji,jsl) &
5541               &  + trois*mcl(ji,jsl+1,ins) - trois*mclint(ji,jsl+1)) &
[2651]5542               &  * (dz(jsl+1)/huit) &
[947]5543               &  + rootsink(ji,jsl+1,ins) &
[2651]5544               &  + (dz(jsl+2)/huit) &
[3402]5545               &  * (trois*mcl(ji,jsl+1,ins) - trois*mclint(ji,jsl+1) &
5546               &  + mcl(ji,jsl+2,ins)-mclint(ji,jsl+2)) 
[947]5547       END DO
5548    ENDDO
5549   
[5506]5550    !! 4. Water balance verification: pursuing upward water budget, the flux at the surface (check_temp)
5551    !! should equal -flux_top
[947]5552    DO ji = 1, kjpindex
[5506]5553
5554       check_temp(ji) =  qflux_ns(ji,1,ins) + (dz(2)/huit) &
[3402]5555            &  * (trois* (mcl(ji,1,ins)-mclint(ji,1)) + (mcl(ji,2,ins)-mclint(ji,2))) &
[5506]5556            &  + rootsink(ji,1,ins)   
5557       ! flux_top is positive when upward, while check_temp is positive when downward
5558       check_top_ns(ji,ins) = flux_top(ji)+check_temp(ji)
[947]5559
[5506]5560       IF (ABS(check_top_ns(ji,ins))/dt_sechiba .GT. min_sechiba) THEN
5561          ! Diagnosed (check_temp) and imposed (flux_top) differ by more than 1.e-8 mm/s
5562          WRITE(numout,*) 'Problem in the water balance, qflux_ns computation, surface fluxes', flux_top(ji),check_temp(ji)
5563          WRITE(numout,*) 'Diagnosed and imposed fluxes differ by more than 1.e-8 mm/s: ', check_top_ns(ji,ins)
[947]5564          WRITE(numout,*) 'ji', ji, 'jsl',jsl,'ins',ins
[3402]5565          WRITE(numout,*) 'mclint', mclint(ji,:)
5566          WRITE(numout,*) 'mcl', mcl(ji,:,ins)
[947]5567          WRITE (numout,*) 'rootsink', rootsink(ji,1,ins)
[5506]5568          CALL ipslerr_p(1, 'hydrol_diag_soil_flux', 'NOTE:',&
5569               & 'Problem in the water balance, qflux_ns computation','')
[947]5570       ENDIF
5571    ENDDO
5572
[5506]5573  END SUBROUTINE hydrol_diag_soil_flux
[947]5574
5575
5576!! ================================================================================================================================
5577!! SUBROUTINE   : hydrol_soil_tridiag
5578!!
5579!>\BRIEF        This subroutine solves a set of linear equations which has a tridiagonal coefficient matrix.
5580!!
[2589]5581!! DESCRIPTION  : It is only applied in the grid-cells where resolv(ji)=TRUE
[947]5582!!
5583!! RECENT CHANGE(S) : None
5584!!
[2222]5585!! MAIN OUTPUT VARIABLE(S) : mcl (global module variable)
[947]5586!!
5587!! REFERENCE(S) :
5588!!
5589!! FLOWCHART    : None
5590!! \n
5591!_ ================================================================================================================================
5592!_ hydrol_soil_tridiag
5593
5594  SUBROUTINE hydrol_soil_tridiag(kjpindex,ins)
5595
5596    !- arguments
5597
5598    !! 0. Variable and parameter declaration
5599
5600    !! 0.1 Input variables
5601
5602    INTEGER(i_std), INTENT(in)                         :: kjpindex        !! Domain size
5603    INTEGER(i_std), INTENT(in)                         :: ins             !! number of soil type
5604
5605    !! 0.2 Output variables
5606
5607    !! 0.3 Modified variables
5608
5609    !! 0.4 Local variables
5610
[2222]5611    INTEGER(i_std)                                     :: ji,jsl
[947]5612    REAL(r_std), DIMENSION(kjpindex)                   :: bet
[2222]5613    REAL(r_std), DIMENSION(kjpindex,nslm)              :: gam
[947]5614
[1082]5615!_ ================================================================================================================================
[947]5616    DO ji = 1, kjpindex
5617
[8]5618       IF (resolv(ji)) THEN
5619          bet(ji) = tmat(ji,1,2)
[2222]5620          mcl(ji,1,ins) = rhs(ji,1)/bet(ji)
[947]5621       ENDIF
5622    ENDDO
[8]5623
[947]5624    DO jsl = 2,nslm
5625       DO ji = 1, kjpindex
5626         
5627          IF (resolv(ji)) THEN
5628
[8]5629             gam(ji,jsl) = tmat(ji,jsl-1,3)/bet(ji)
5630             bet(ji) = tmat(ji,jsl,2) - tmat(ji,jsl,1)*gam(ji,jsl)
[2222]5631             mcl(ji,jsl,ins) = (rhs(ji,jsl)-tmat(ji,jsl,1)*mcl(ji,jsl-1,ins))/bet(ji)
[947]5632          ENDIF
[8]5633
[947]5634       ENDDO
5635    ENDDO
5636
5637    DO ji = 1, kjpindex
5638       IF (resolv(ji)) THEN
5639          DO jsl = nslm-1,1,-1
[2222]5640             mcl(ji,jsl,ins) = mcl(ji,jsl,ins) - gam(ji,jsl+1)*mcl(ji,jsl+1,ins)
[8]5641          ENDDO
5642       ENDIF
5643    ENDDO
[2222]5644
[8]5645  END SUBROUTINE hydrol_soil_tridiag
5646
[2222]5647
[947]5648!! ================================================================================================================================
5649!! SUBROUTINE   : hydrol_soil_coef
5650!!
5651!>\BRIEF        Computes coef for the linearised hydraulic conductivity
5652!! k_lin=a_lin mc_lin+b_lin and the linearised diffusivity d_lin.
5653!!
5654!! DESCRIPTION  :
5655!! First, we identify the interval i in which the current value of mc is located.
5656!! Then, we give the values of the linearized parameters to compute
5657!! conductivity and diffusivity as K=a*mc+b and d.
5658!!
[3402]5659!! RECENT CHANGE(S) : Addition of the dependence to profil_froz_hydro_ns
[947]5660!!
5661!! MAIN OUTPUT VARIABLE(S) :
5662!!
5663!! REFERENCE(S) :
5664!!
5665!! FLOWCHART    : None
5666!! \n
5667!_ ================================================================================================================================
5668!_ hydrol_soil_coef
[8]5669
[6954]5670  SUBROUTINE hydrol_soil_coef(mcr, mcs, kjpindex,ins,njsc)
5671
[8]5672    IMPLICIT NONE
5673    !
[947]5674    !! 0. Variable and parameter declaration
5675
5676    !! 0.1 Input variables
[7239]5677    INTEGER(i_std), INTENT(in)                        :: kjpindex         !! Domain size
5678    INTEGER(i_std), INTENT(in)                        :: ins              !! Index of soil type
5679    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)  :: njsc             !! Index of the dominant soil textural class
5680                                                                          !! in the grid cell (1-nscm, unitless)
[6954]5681    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
5682    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
[8]5683
[947]5684    !! 0.2 Output variables
[8]5685
[947]5686    !! 0.3 Modified variables
5687
5688    !! 0.4 Local variables
5689
5690    INTEGER(i_std)                                    :: jsl,ji,i
5691    REAL(r_std)                                       :: mc_ratio
[2222]5692    REAL(r_std)                                       :: mc_used    !! Used liquid water content
5693    REAL(r_std)                                       :: x,m
5694   
5695!_ ================================================================================================================================
[947]5696
[2222]5697    IF (ok_freeze_cwrr) THEN
[8]5698   
[2222]5699       ! Calculation of liquid and frozen saturation degrees with respect to residual
5700       ! x=liquid saturation degree/residual=(mcl-mcr)/(mcs-mcr)
[4724]5701       ! 1-x=frozen saturation degree/residual=(mcfc-mcr)/(mcs-mcr) (=profil_froz_hydro)
[2222]5702       
5703       DO jsl=1,nslm
[2397]5704          DO ji=1,kjpindex
[3402]5705             
5706             x = 1._r_std - profil_froz_hydro_ns(ji, jsl,ins)
5707             
5708             ! mc_used is used in the calculation of hydrological properties
5709             ! It corresponds to a liquid mc, but the expression is different from mcl in hydrol_soil,
5710             ! to ensure that we get the a, b, d of the first bin when mcl<mcr
[6954]5711             mc_used = mcr(ji)+x*MAX((mc(ji,jsl, ins)-mcr(ji)),zero) 
[3402]5712             !
5713             ! calcul de k based on mc_liq
5714             !
[6954]5715             i= MAX(imin, MIN(imax-1, INT(imin +(imax-imin)*(mc_used-mcr(ji))/(mcs(ji)-mcr(ji)))))
5716             a(ji,jsl) = a_lin(i,jsl,ji) * kfact_root(ji,jsl,ins) ! in mm/d
5717             b(ji,jsl) = b_lin(i,jsl,ji) * kfact_root(ji,jsl,ins) ! in mm/d
5718             d(ji,jsl) = d_lin(i,jsl,ji) * kfact_root(ji,jsl,ins) ! in mm^2/d
5719             k(ji,jsl) = kfact_root(ji,jsl,ins) * MAX(k_lin(imin+1,jsl,ji), &
5720                  a_lin(i,jsl,ji) * mc_used + b_lin(i,jsl,ji)) ! in mm/d
[3402]5721          ENDDO ! loop on grid
5722       ENDDO
5723             
5724    ELSE
5725       ! .NOT. ok_freeze_cwrr
5726       DO jsl=1,nslm
5727          DO ji=1,kjpindex 
5728             
5729             ! it is impossible to consider a mc<mcr for the binning
[6954]5730             mc_ratio = MAX(mc(ji,jsl,ins)-mcr(ji), zero)/(mcs(ji)-mcr(ji))
[3402]5731             
5732             i= MAX(MIN(INT((imax-imin)*mc_ratio)+imin , imax-1), imin)
[6954]5733             a(ji,jsl) = a_lin(i,jsl,ji) * kfact_root(ji,jsl,ins) ! in mm/d
5734             b(ji,jsl) = b_lin(i,jsl,ji) * kfact_root(ji,jsl,ins) ! in mm/d
5735             d(ji,jsl) = d_lin(i,jsl,ji) * kfact_root(ji,jsl,ins) ! in mm^2/d
5736             k(ji,jsl) = kfact_root(ji,jsl,ins) * MAX(k_lin(imin+1,jsl,ji), &
5737                  a_lin(i,jsl,ji) * mc(ji,jsl,ins) + b_lin(i,jsl,ji))  ! in mm/d
[3402]5738          END DO
5739       END DO
5740    ENDIF
5741   
5742  END SUBROUTINE hydrol_soil_coef
5743
5744!! ================================================================================================================================
5745!! SUBROUTINE   : hydrol_soil_froz
5746!!
5747!>\BRIEF        Computes profil_froz_hydro_ns, the fraction of frozen water in the soil layers.
5748!!
5749!! DESCRIPTION  :
5750!!
5751!! RECENT CHANGE(S) : Created by A. Ducharne in 2016.
5752!!
5753!! MAIN OUTPUT VARIABLE(S) : profil_froz_hydro_ns
5754!!
5755!! REFERENCE(S) :
5756!!
5757!! FLOWCHART    : None
5758!! \n
5759!_ ================================================================================================================================
5760!_ hydrol_soil_froz
5761 
[7255]5762  SUBROUTINE hydrol_soil_froz(nvan, avan, mcr, mcs, kjpindex,ins,njsc,stempdiag)
[3402]5763
5764    IMPLICIT NONE
5765    !
5766    !! 0. Variable and parameter declaration
5767
5768    !! 0.1 Input variables
[7239]5769
5770    INTEGER(i_std), INTENT(in)                        :: kjpindex         !! Domain size
5771    INTEGER(i_std), INTENT(in)                        :: ins              !! Index of soil type
5772    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)  :: njsc             !! Index of the dominant soil textural class
5773                                                                          !! in the grid cell (1-nscm, unitless)
[6954]5774    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: nvan             !! Van Genuchten coeficients n (unitless)
5775    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: avan             !! Van Genuchten coeficients a (mm-1})
5776    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
5777    REAL(r_std),DIMENSION (kjpindex), INTENT (in)     :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
[7255]5778    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (in):: stempdiag        !! Diagnostic temp profile from thermosoil
[3402]5779
5780    !! 0.2 Output variables
5781
5782    !! 0.3 Modified variables
5783
5784    !! 0.4 Local variables
5785
5786    INTEGER(i_std)                                    :: jsl,ji,i
5787    REAL(r_std)                                       :: x,m
[4061]5788    REAL(r_std)                                       :: denom
5789    REAL(r_std),DIMENSION (kjpindex)                  :: froz_frac_moy
[4202]5790    REAL(r_std),DIMENSION (kjpindex)                  :: smtot_moy
5791    REAL(r_std),DIMENSION (kjpindex,nslm)             :: mc_ns
[3402]5792   
5793!_ ================================================================================================================================
5794
5795!    ONLY FOR THE (ok_freeze_cwrr) CASE
5796   
5797       ! Calculation of liquid and frozen saturation degrees above residual moisture
5798       !   x=liquid saturation degree/residual=(mcl-mcr)/(mcs-mcr)
[4724]5799       !   1-x=frozen saturation degree/residual=(mcfc-mcr)/(mcs-mcr) (=profil_froz_hydro)
[3402]5800       ! It's important for the good work of the water diffusion scheme (tridiag) that the total
5801       ! liquid water also includes mcr, so mcl > 0 even when x=0
5802       
5803       DO jsl=1,nslm
5804          DO ji=1,kjpindex
[2397]5805             ! Van Genuchten parameter for thermodynamical calculation
[6954]5806             m = 1. -1./nvan(ji)
[2397]5807           
[6954]5808             IF ((.NOT. ok_thermodynamical_freezing).OR.(mc(ji,jsl, ins).LT.(mcr(ji)+min_sechiba))) THEN
[2222]5809                ! Linear soil freezing or soil moisture below residual
[7255]5810                IF (stempdiag(ji, jsl).GE.(ZeroCelsius+fr_dT/2.)) THEN
[2222]5811                   x=1._r_std
[7255]5812                ELSE IF ( (stempdiag(ji,jsl) .GE. (ZeroCelsius-fr_dT/2.)) .AND. &
5813                     (stempdiag(ji,jsl) .LT. (ZeroCelsius+fr_dT/2.)) ) THEN
5814                   x=(stempdiag(ji, jsl)-(ZeroCelsius-fr_dT/2.))/fr_dT
[2222]5815                ELSE
5816                   x=0._r_std
5817                ENDIF
5818             ELSE IF (ok_thermodynamical_freezing) THEN
5819                ! Thermodynamical soil freezing
[7255]5820                IF (stempdiag(ji, jsl).GE.(ZeroCelsius+fr_dT/2.)) THEN
[2222]5821                   x=1._r_std
[7255]5822                ELSE IF ( (stempdiag(ji,jsl) .GE. (ZeroCelsius-fr_dT/2.)) .AND. &
5823                     (stempdiag(ji,jsl) .LT. (ZeroCelsius+fr_dT/2.)) ) THEN
[3402]5824                   ! Factor 2.2 from the PhD of Isabelle Gouttevin
[6954]5825                   x=MIN(((mcs(ji)-mcr(ji)) &
[7255]5826                        *((2.2*1000.*avan(ji)*(ZeroCelsius+fr_dT/2.-stempdiag(ji, jsl)) &
[6954]5827                        *lhf/ZeroCelsius/10.)**nvan(ji)+1.)**(-m)) / &
5828                        (mc(ji,jsl, ins)-mcr(ji)),1._r_std)               
[2222]5829                ELSE
[3402]5830                   x=0._r_std 
[2222]5831                ENDIF
5832             ENDIF
5833             
[3402]5834             profil_froz_hydro_ns(ji,jsl,ins) = 1._r_std-x
5835             
[6954]5836             mc_ns(ji,jsl)=mc(ji,jsl,ins)/mcs(ji)
[4202]5837
[2222]5838          ENDDO ! loop on grid
5839       ENDDO
5840   
[4061]5841       ! Applay correction on the frozen fraction
[4764]5842       ! Depends on two external parameters: froz_frac_corr and smtot_corr
[4061]5843       froz_frac_moy(:)=zero
5844       denom=zero
5845       DO jsl=1,nslm
5846          froz_frac_moy(:)=froz_frac_moy(:)+dh(jsl)*profil_froz_hydro_ns(:,jsl,ins)
5847          denom=denom+dh(jsl)
5848       ENDDO
5849       froz_frac_moy(:)=froz_frac_moy(:)/denom
[4202]5850
5851       smtot_moy(:)=zero
5852       denom=zero
5853       DO jsl=1,nslm-1
5854          smtot_moy(:)=smtot_moy(:)+dh(jsl)*mc_ns(:,jsl)
5855          denom=denom+dh(jsl)
5856       ENDDO
5857       smtot_moy(:)=smtot_moy(:)/denom
5858
[4061]5859       DO jsl=1,nslm
[4202]5860          profil_froz_hydro_ns(:,jsl,ins)=MIN(profil_froz_hydro_ns(:,jsl,ins)* &
5861                                              (froz_frac_moy(:)**froz_frac_corr)*(smtot_moy(:)**smtot_corr), max_froz_hydro)
[4061]5862       ENDDO
5863
[3402]5864     END SUBROUTINE hydrol_soil_froz
5865     
[8]5866
[947]5867!! ================================================================================================================================
5868!! SUBROUTINE   : hydrol_soil_setup
5869!!
5870!>\BRIEF        This subroutine computes the matrix coef. 
5871!!
5872!! DESCRIPTION  : None
5873!!
5874!! RECENT CHANGE(S) : None
5875!!
5876!! MAIN OUTPUT VARIABLE(S) : matrix coef
5877!!
5878!! REFERENCE(S) :
5879!!
5880!! FLOWCHART    : None
5881!! \n
5882!_ ================================================================================================================================
5883
[2591]5884  SUBROUTINE hydrol_soil_setup(kjpindex,ins)
[947]5885
5886
5887    IMPLICIT NONE
5888    !
5889    !! 0. Variable and parameter declaration
5890
5891    !! 0.1 Input variables
5892    INTEGER(i_std), INTENT(in)                        :: kjpindex          !! Domain size
5893    INTEGER(i_std), INTENT(in)                        :: ins               !! index of soil type
5894
5895    !! 0.2 Output variables
5896
5897    !! 0.3 Modified variables
5898
5899    !! 0.4 Local variables
5900
5901    INTEGER(i_std) :: jsl,ji
5902    REAL(r_std)                        :: temp3, temp4
5903
[1082]5904!_ ================================================================================================================================
[947]5905    !-we compute tridiag matrix coefficients (LEFT and RIGHT)
[8]5906    ! of the system to solve [LEFT]*mc_{t+1}=[RIGHT]*mc{t}+[add terms]:
5907    ! e(nslm),f(nslm),g1(nslm) for the [left] vector
5908    ! and ep(nslm),fp(nslm),gp(nslm) for the [right] vector
5909
[947]5910    ! w_time=1 (in constantes_soil) indicates implicit computation for diffusion
[2591]5911    temp3 = w_time*(dt_sechiba/one_day)/deux
5912    temp4 = (un-w_time)*(dt_sechiba/one_day)/deux
[8]5913
[947]5914    ! Passage to arithmetic means for layer averages also in this subroutine : Aurelien 11/05/10
[8]5915
[947]5916    !- coefficient for first layer
5917    DO ji = 1, kjpindex
5918       e(ji,1) = zero
[2651]5919       f(ji,1) = trois * dz(2)/huit  + temp3 &
5920            & * ((d(ji,1)+d(ji,2))/(dz(2))+a(ji,1))
5921       g1(ji,1) = dz(2)/(huit)       - temp3 &
5922            & * ((d(ji,1)+d(ji,2))/(dz(2))-a(ji,2))
[947]5923       ep(ji,1) = zero
[2651]5924       fp(ji,1) = trois * dz(2)/huit - temp4 &
5925            & * ((d(ji,1)+d(ji,2))/(dz(2))+a(ji,1))
5926       gp(ji,1) = dz(2)/(huit)       + temp4 &
5927            & * ((d(ji,1)+d(ji,2))/(dz(2))-a(ji,2))
[947]5928    ENDDO
[8]5929
[947]5930    !- coefficient for medium layers
[8]5931
[947]5932    DO jsl = 2, nslm-1
5933       DO ji = 1, kjpindex
[2651]5934          e(ji,jsl) = dz(jsl)/(huit)                        - temp3 &
5935               & * ((d(ji,jsl)+d(ji,jsl-1))/(dz(jsl))+a(ji,jsl-1))
[8]5936
[2651]5937          f(ji,jsl) = trois * (dz(jsl)+dz(jsl+1))/huit  + temp3 &
5938               & * ((d(ji,jsl)+d(ji,jsl-1))/(dz(jsl)) + &
5939               & (d(ji,jsl)+d(ji,jsl+1))/(dz(jsl+1)) )
[947]5940
[2651]5941          g1(ji,jsl) = dz(jsl+1)/(huit)                     - temp3 &
5942               & * ((d(ji,jsl)+d(ji,jsl+1))/(dz(jsl+1))-a(ji,jsl+1))
[947]5943
[2651]5944          ep(ji,jsl) = dz(jsl)/(huit)                       + temp4 &
5945               & * ((d(ji,jsl)+d(ji,jsl-1))/(dz(jsl))+a(ji,jsl-1))
[947]5946
[2651]5947          fp(ji,jsl) = trois * (dz(jsl)+dz(jsl+1))/huit - temp4 &
5948               & * ( (d(ji,jsl)+d(ji,jsl-1))/(dz(jsl)) + &
5949               & (d(ji,jsl)+d(ji,jsl+1))/(dz(jsl+1)) )
[947]5950
[2651]5951          gp(ji,jsl) = dz(jsl+1)/(huit)                     + temp4 &
5952               & *((d(ji,jsl)+d(ji,jsl+1))/(dz(jsl+1))-a(ji,jsl+1))
[8]5953       ENDDO
5954    ENDDO
5955
[947]5956    !- coefficient for last layer
5957    DO ji = 1, kjpindex
[2651]5958       e(ji,nslm) = dz(nslm)/(huit)        - temp3 &
5959            & * ((d(ji,nslm)+d(ji,nslm-1)) /(dz(nslm))+a(ji,nslm-1))
5960       f(ji,nslm) = trois * dz(nslm)/huit  + temp3 &
5961            & * ((d(ji,nslm)+d(ji,nslm-1)) / (dz(nslm)) &
[1119]5962            & -a(ji,nslm)*(un-deux*free_drain_coef(ji,ins)))
[947]5963       g1(ji,nslm) = zero
[2651]5964       ep(ji,nslm) = dz(nslm)/(huit)       + temp4 &
5965            & * ((d(ji,nslm)+d(ji,nslm-1)) /(dz(nslm))+a(ji,nslm-1))
5966       fp(ji,nslm) = trois * dz(nslm)/huit - temp4 &
5967            & * ((d(ji,nslm)+d(ji,nslm-1)) /(dz(nslm)) &
[1119]5968            & -a(ji,nslm)*(un-deux*free_drain_coef(ji,ins)))
[947]5969       gp(ji,nslm) = zero
5970    ENDDO
5971
[8]5972  END SUBROUTINE hydrol_soil_setup
5973
[2589]5974 
[947]5975!! ================================================================================================================================
5976!! SUBROUTINE   : hydrol_split_soil
5977!!
[2589]5978!>\BRIEF        Splits 2d variables into 3d variables, per soiltile (_ns suffix), at the beginning of hydrol
[3969]5979!!              At this stage, the forcing fluxes to hydrol are transformed from grid-cell averages
5980!!              to mean fluxes over vegtot=sum(soiltile) 
[947]5981!!
5982!! DESCRIPTION  :
[3402]5983!! 1. Split 2d variables into 3d variables, per soiltile
5984!! 1.1 Throughfall
5985!! 1.2 Bare soil evaporation
5986!! 1.2.2 ae_ns new
5987!! 1.3 transpiration
5988!! 1.4 root sink
5989!! 2. Verification: Check if the deconvolution is correct and conserves the fluxes
5990!! 2.1 precisol
5991!! 2.2 ae_ns and evapnu
5992!! 2.3 transpiration
5993!! 2.4 root sink
[947]5994!!
[3402]5995!! RECENT CHANGE(S) : 2016 by A. Ducharne to match the simplification of hydrol_soil
[947]5996!!
5997!! MAIN OUTPUT VARIABLE(S) :
5998!!
5999!! REFERENCE(S) :
6000!!
6001!! FLOWCHART    : None
6002!! \n
6003!_ ================================================================================================================================
6004!_ hydrol_split_soil
6005
[5805]6006  SUBROUTINE hydrol_split_soil (kjpindex, veget_max, soiltile, vevapnu, transpir, humrel, &
6007       evap_bare_lim, evap_bare_lim_ns, tot_bare_soil)
[8]6008    !
6009    ! interface description
[947]6010
6011    !! 0. Variable and parameter declaration
6012
6013    !! 0.1 Input variables
6014
[8]6015    INTEGER(i_std), INTENT(in)                               :: kjpindex
[947]6016    REAL(r_std), DIMENSION (kjpindex, nvm), INTENT(in)       :: veget_max        !! max Vegetation map
[3969]6017    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT (in)      :: soiltile         !! Fraction of each soiltile within vegtot (0-1, unitless)
[8]6018    REAL(r_std), DIMENSION (kjpindex), INTENT (in)           :: vevapnu          !! Bare soil evaporation
6019    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT (in)       :: transpir         !! Transpiration
6020    REAL(r_std), DIMENSION (kjpindex,nvm), INTENT (in)       :: humrel           !! Relative humidity
[947]6021    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: evap_bare_lim    !!   
[5805]6022    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT(in)       :: evap_bare_lim_ns !!   
[2718]6023    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: tot_bare_soil    !! Total evaporating bare soil fraction
[947]6024
6025    !! 0.4 Local variables
6026
6027    INTEGER(i_std)                                :: ji, jv, jsl, jst
[1118]6028    REAL(r_std), DIMENSION (kjpindex)             :: tmp_check1
6029    REAL(r_std), DIMENSION (kjpindex)             :: tmp_check2
[8]6030    REAL(r_std), DIMENSION (kjpindex,nstm)        :: tmp_check3
[5805]6031    LOGICAL                                       :: error
[1082]6032!_ ================================================================================================================================
[3402]6033   
6034    !! 1. Split 2d variables into 3d variables, per soiltile
6035   
[2589]6036    ! Reminders:
[3969]6037    !  corr_veg_soil(:,nvm,nstm) = PFT fraction per soiltile in each grid-cell
6038    !      corr_veg_soil(ji,jv,jst)=veget_max(ji,jv)/soiltile(ji,jst)
6039    !  soiltile(:,nstm) = fraction of vegtot covered by each soiltile (0-1, unitless)
[2589]6040    !  vegtot(:) = total fraction of grid-cell covered by PFTs (fraction with bare soil + vegetation)
6041    !  veget_max(:,nvm) = PFT fractions of vegtot+frac_nobio
6042    !  veget(:,nvm) =  fractions (of vegtot+frac_nobio) covered by vegetation in each PFT
6043    !       BUT veget(:,1)=veget_max(:,1)
6044    !  frac_bare(:,nvm) = fraction (of veget_max) with bare soil in each PFT
[3969]6045    !  tot_bare_soil(:) = fraction of grid mesh covered by all bare soil (=SUM(frac_bare*veget_max))
[2589]6046    !  frac_bare_ns(:,nstm) = evaporating bare soil fraction (of vegtot) per soiltile (defined in hydrol_vegupd)
[3402]6047   
[2589]6048    !! 1.1 Throughfall
[3969]6049    ! Transformation from precisol (flux from PFT jv in m2 of grid-mesh)
6050    ! to  precisol_ns (flux from contributing PFTs with another unit, in m2 of soiltile)
[8]6051    precisol_ns(:,:)=zero
6052    DO jv=1,nvm
[3969]6053       DO ji=1,kjpindex
6054          jst=pref_soil_veg(jv)
6055          IF((veget_max(ji,jv).GT.min_sechiba) .AND. ((soiltile(ji,jst)*vegtot(ji)) .GT. min_sechiba)) THEN
6056             precisol_ns(ji,jst) = precisol_ns(ji,jst) + &
6057                     precisol(ji,jv) / (soiltile(ji,jst)*vegtot(ji))               
6058          ENDIF
[8]6059       END DO
6060    END DO
[3402]6061   
[5805]6062    !! 1.2 Bare soil evaporation and ae_ns
6063    ae_ns(:,:)=zero
[8]6064    DO jst=1,nstm
6065       DO ji=1,kjpindex
[5805]6066          IF(evap_bare_lim(ji).GT.min_sechiba) THEN       
6067             ae_ns(ji,jst) = vevapnu(ji) * evap_bare_lim_ns(ji,jst)/evap_bare_lim(ji)
[947]6068          ENDIF
[5805]6069       ENDDO
6070    ENDDO
6071
[947]6072    !! 1.3 transpiration
[3969]6073    ! Transformation from transpir (flux from PFT jv in m2 of grid-mesh)
6074    ! to tr_ns (flux from contributing PFTs with another unit, in m2 of soiltile)
6075    ! To do next: simplify the use of humrelv(ji,jv,jst) /humrel(ji,jv), since both are equal
[8]6076    tr_ns(:,:)=zero
6077    DO jv=1,nvm
[3969]6078       jst=pref_soil_veg(jv)
6079       DO ji=1,kjpindex
6080          IF ((humrel(ji,jv).GT.min_sechiba) .AND. ((soiltile(ji,jst)*vegtot(ji)) .GT.min_sechiba))THEN
6081             tr_ns(ji,jst)= tr_ns(ji,jst) &
6082                  + transpir(ji,jv) * (humrelv(ji,jv,jst) / humrel(ji,jv)) &
6083                  / (soiltile(ji,jst)*vegtot(ji))
6084                     
[8]6085             ENDIF
6086       END DO
6087    END DO
6088
[947]6089    !! 1.4 root sink
[3969]6090    ! Transformation from transpir (flux from PFT jv in m2 of grid-mesh)
6091    ! to root_sink (flux from contributing PFTs and soil layer with another unit, in m2 of soiltile)
[8]6092    rootsink(:,:,:)=zero
6093    DO jv=1,nvm
[3969]6094       jst=pref_soil_veg(jv)
[8]6095       DO jsl=1,nslm
[3969]6096          DO ji=1,kjpindex
6097             IF ((humrel(ji,jv).GT.min_sechiba) .AND. ((soiltile(ji,jst)*vegtot(ji)) .GT.min_sechiba)) THEN
6098                rootsink(ji,jsl,jst) = rootsink(ji,jsl,jst) &
6099                        + transpir(ji,jv) * (us(ji,jv,jst,jsl) / humrel(ji,jv)) &
6100                        / (soiltile(ji,jst)*vegtot(ji))                     
[3402]6101                   ! rootsink(ji,1,jst)=0 as us(ji,jv,jst,1)=0
[3969]6102             END IF
[8]6103          END DO
6104       END DO
6105    END DO
6106
6107
[5805]6108    !! 2. Verification: Check if the deconvolution is correct and conserves the fluxes (grid-cell average)
[3969]6109
[5805]6110    IF (check_cwrr) THEN
6111
6112       error=.FALSE.
6113
6114       !! 2.1 precisol
6115
6116       tmp_check1(:)=zero
6117       DO jst=1,nstm
6118          DO ji=1,kjpindex
6119             tmp_check1(ji)=tmp_check1(ji) + precisol_ns(ji,jst)*soiltile(ji,jst)*vegtot(ji)
6120          END DO
6121       END DO
6122       
6123       tmp_check2(:)=zero 
6124       DO jv=1,nvm
6125          DO ji=1,kjpindex
6126             tmp_check2(ji)=tmp_check2(ji) + precisol(ji,jv)
6127          END DO
6128       END DO
6129
6130       DO ji=1,kjpindex   
6131          IF(ABS(tmp_check1(ji) - tmp_check2(ji)).GT.allowed_err) THEN
6132             WRITE(numout,*) 'PRECISOL SPLIT FALSE:ji=',ji,tmp_check1(ji),tmp_check2(ji)
6133             WRITE(numout,*) 'err',ABS(tmp_check1(ji)- tmp_check2(ji))
6134             WRITE(numout,*) 'vegtot',vegtot(ji)
6135             DO jv=1,nvm
6136                WRITE(numout,'(a,i2.2,"|",F13.4,"|",F13.4,"|",3(F9.6))') &
6137                     'jv,veget_max, precisol, vegetmax_soil ', &
6138                     jv,veget_max(ji,jv),precisol(ji,jv),vegetmax_soil(ji,jv,:)
6139             END DO
6140             DO jst=1,nstm
6141                WRITE(numout,*) 'jst,precisol_ns',jst,precisol_ns(ji,jst)
6142                WRITE(numout,*) 'soiltile', soiltile(ji,jst)
6143             END DO
6144             error=.TRUE.
6145             CALL ipslerr_p(2, 'hydrol_split_soil', 'We will STOP in the end of this subroutine.',&
6146                  & 'check_CWRR','PRECISOL SPLIT FALSE')
6147          ENDIF
6148       END DO
6149       
6150       !! 2.2 ae_ns and evapnu
6151
6152       tmp_check1(:)=zero
6153       DO jst=1,nstm
6154          DO ji=1,kjpindex
6155             tmp_check1(ji)=tmp_check1(ji) + ae_ns(ji,jst)*soiltile(ji,jst)*vegtot(ji)
6156          END DO
6157       END DO
6158
6159       DO ji=1,kjpindex   
6160
6161          IF(ABS(tmp_check1(ji) - vevapnu(ji)).GT.allowed_err) THEN
6162             WRITE(numout,*) 'VEVAPNU SPLIT FALSE:ji, Sum(ae_ns), vevapnu =',ji,tmp_check1(ji),vevapnu(ji)
6163             WRITE(numout,*) 'err',ABS(tmp_check1(ji)- vevapnu(ji))
6164             WRITE(numout,*) 'ae_ns',ae_ns(ji,:)
6165             WRITE(numout,*) 'vegtot',vegtot(ji)
6166             WRITE(numout,*) 'evap_bare_lim, evap_bare_lim_ns',evap_bare_lim(ji), evap_bare_lim_ns(ji,:)
6167             DO jst=1,nstm
6168                WRITE(numout,*) 'jst,ae_ns',jst,ae_ns(ji,jst)
6169                WRITE(numout,*) 'soiltile', soiltile(ji,jst)
6170             END DO
6171             error=.TRUE.
6172             CALL ipslerr_p(2, 'hydrol_split_soil', 'We will STOP in the end of this subroutine.',&
6173                  & 'check_CWRR','VEVAPNU SPLIT FALSE')
6174          ENDIF
6175       ENDDO
6176
6177    !! 2.3 transpiration
6178
6179       tmp_check1(:)=zero
6180       DO jst=1,nstm
6181          DO ji=1,kjpindex
6182             tmp_check1(ji)=tmp_check1(ji) + tr_ns(ji,jst)*soiltile(ji,jst)*vegtot(ji)
6183          END DO
6184       END DO
6185       
6186       tmp_check2(:)=zero 
6187       DO jv=1,nvm
6188          DO ji=1,kjpindex
6189             tmp_check2(ji)=tmp_check2(ji) + transpir(ji,jv)
6190          END DO
6191       END DO
6192
6193       DO ji=1,kjpindex   
6194          IF(ABS(tmp_check1(ji)- tmp_check2(ji)).GT.allowed_err) THEN
6195             WRITE(numout,*) 'TRANSPIR SPLIT FALSE:ji=',ji,tmp_check1(ji),tmp_check2(ji)
6196             WRITE(numout,*) 'err',ABS(tmp_check1(ji)- tmp_check2(ji))
6197             WRITE(numout,*) 'vegtot',vegtot(ji)
6198             DO jv=1,nvm
6199                WRITE(numout,*) 'jv,veget_max, transpir',jv,veget_max(ji,jv),transpir(ji,jv)
6200                DO jst=1,nstm
6201                   WRITE(numout,*) 'vegetmax_soil:ji,jv,jst',ji,jv,jst,vegetmax_soil(ji,jv,jst)
6202                END DO
6203             END DO
6204             DO jst=1,nstm
6205                WRITE(numout,*) 'jst,tr_ns',jst,tr_ns(ji,jst)
6206                WRITE(numout,*) 'soiltile', soiltile(ji,jst)
6207             END DO
6208             error=.TRUE.
6209             CALL ipslerr_p(2, 'hydrol_split_soil', 'We will STOP in the end of this subroutine.',&
6210                  & 'check_CWRR','TRANSPIR SPLIT FALSE')
6211          ENDIF
6212
6213       END DO
6214
6215    !! 2.4 root sink
6216
6217       tmp_check3(:,:)=zero
6218       DO jst=1,nstm
6219          DO jsl=1,nslm
6220             DO ji=1,kjpindex
6221                tmp_check3(ji,jst)=tmp_check3(ji,jst) + rootsink(ji,jsl,jst)
6222             END DO
6223          END DO
6224       ENDDO
6225
6226       DO jst=1,nstm
6227          DO ji=1,kjpindex
6228             IF(ABS(tmp_check3(ji,jst) - tr_ns(ji,jst)).GT.allowed_err) THEN
6229                WRITE(numout,*) 'ROOTSINK SPLIT FALSE:ji,jst=', ji,jst,&
6230                     & tmp_check3(ji,jst),tr_ns(ji,jst)
6231                WRITE(numout,*) 'err',ABS(tmp_check3(ji,jst)- tr_ns(ji,jst))
6232                WRITE(numout,*) 'HUMREL(jv=1:13)',humrel(ji,:)
6233                WRITE(numout,*) 'TRANSPIR',transpir(ji,:)
6234                DO jv=1,nvm 
6235                   WRITE(numout,*) 'jv=',jv,'us=',us(ji,jv,jst,:)
6236                ENDDO
6237                error=.TRUE.
6238                CALL ipslerr_p(2, 'hydrol_split_soil', 'We will STOP in the end of this subroutine.',&
6239                  & 'check_CWRR','ROOTSINK SPLIT FALSE')
6240             ENDIF
6241          END DO
6242       END DO
6243
6244
6245       !! Exit if error was found previously in this subroutine
6246       IF ( error ) THEN
6247          WRITE(numout,*) 'One or more errors have been detected in hydrol_split_soil. Model stops.'
6248          CALL ipslerr_p(3, 'hydrol_split_soil', 'We will STOP now.',&
6249               & 'One or several fatal errors were found previously.','')
6250       END IF
6251
6252    ENDIF ! end of check_cwrr
6253
6254
[8]6255  END SUBROUTINE hydrol_split_soil
[2589]6256 
[8]6257
[947]6258!! ================================================================================================================================
6259!! SUBROUTINE   : hydrol_diag_soil
6260!!
[3402]6261!>\BRIEF        Calculates diagnostic variables at the grid-cell scale
[947]6262!!
6263!! DESCRIPTION  :
[3402]6264!! - 1. Apply mask_soiltile
6265!! - 2. Sum 3d variables in 2d variables with fraction of vegetation per soil type
[947]6266!!
[3402]6267!! RECENT CHANGE(S) : 2016 by A. Ducharne for the claculation of shumdiag_perma
[947]6268!!
6269!! MAIN OUTPUT VARIABLE(S) :
6270!!
6271!! REFERENCE(S) :
6272!!
6273!! FLOWCHART    : None
6274!! \n
6275!_ ================================================================================================================================
6276!_ hydrol_diag_soil
6277
[6954]6278  SUBROUTINE hydrol_diag_soil (ks, nvan, avan, mcr, mcs, mcfc, mcw, kjpindex, veget_max, soiltile, njsc, runoff, drainage, &
[1118]6279       & evapot, vevapnu, returnflow, reinfiltration, irrigation, &
[2222]6280       & shumdiag,shumdiag_perma, k_litt, litterhumdiag, humrel, vegstress, drysoil_frac, tot_melt)
[8]6281    !
6282    ! interface description
[947]6283
6284    !! 0. Variable and parameter declaration
6285
6286    !! 0.1 Input variables
[7239]6287
6288    ! input scalar
6289    INTEGER(i_std), INTENT(in)                               :: kjpindex 
6290    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)        :: veget_max       !! Max. vegetation type
6291    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)         :: njsc            !! Index of the dominant soil textural class in the grid cell (1-nscm, unitless)
6292    REAL(r_std), DIMENSION (kjpindex,nstm), INTENT (in)      :: soiltile        !! Fraction of each soil tile within vegtot (0-1, unitless)
[6954]6293    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: ks               !! Hydraulic conductivity at saturation (mm {-1})
6294    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: nvan             !! Van Genuchten coeficients n (unitless)
6295    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: avan             !! Van Genuchten coeficients a (mm-1})
6296    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcr              !! Residual volumetric water content (m^{3} m^{-3})
6297    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcs              !! Saturated volumetric water content (m^{3} m^{-3})
6298    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcfc             !! Volumetric water content at field capacity (m^{3} m^{-3})
6299    REAL(r_std),DIMENSION (kjpindex), INTENT (in)            :: mcw              !! Volumetric water content at wilting point (m^{3} m^{-3})
[947]6300    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: evapot          !!
6301    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: returnflow      !! Water returning to the deep reservoir
6302    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: reinfiltration  !! Water returning to the top of the soil
6303    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: irrigation      !! Water from irrigation
6304    REAL(r_std), DIMENSION (kjpindex), INTENT(in)            :: tot_melt        !!
6305
6306    !! 0.2 Output variables
6307
[8]6308    REAL(r_std), DIMENSION (kjpindex), INTENT (out)          :: drysoil_frac    !! Function of litter wetness
6309    REAL(r_std), DIMENSION (kjpindex), INTENT(out)           :: runoff          !! complete runoff
6310    REAL(r_std), DIMENSION (kjpindex), INTENT(out)           :: drainage        !! Drainage
[4631]6311    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out)      :: shumdiag        !! relative soil moisture
6312    REAL(r_std),DIMENSION (kjpindex,nslm), INTENT (out)      :: shumdiag_perma  !! Percent of porosity filled with water (mc/mcs) used for the thermal computations
[947]6313    REAL(r_std),DIMENSION (kjpindex), INTENT (out)           :: k_litt          !! litter cond.
[8]6314    REAL(r_std),DIMENSION (kjpindex), INTENT (out)           :: litterhumdiag   !! litter humidity
6315    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (out)       :: humrel          !! Relative humidity
[947]6316    REAL(r_std), DIMENSION (kjpindex, nvm), INTENT(out)      :: vegstress       !! Veg. moisture stress (only for vegetation growth)
6317 
6318    !! 0.3 Modified variables
6319
6320    REAL(r_std), DIMENSION (kjpindex), INTENT(inout)         :: vevapnu         !!
6321
6322    !! 0.4 Local variables
6323
[4637]6324    INTEGER(i_std)                                           :: ji, jv, jsl, jst, i
[2222]6325    REAL(r_std), DIMENSION (kjpindex)                        :: mask_vegtot
[947]6326    REAL(r_std)                                              :: k_tmp, tmc_litter_ratio
[1057]6327
[1082]6328!_ ================================================================================================================================
[8]6329    !
6330    ! Put the prognostics variables of soil to zero if soiltype is zero
6331
[3402]6332    !! 1. Apply mask_soiltile
6333   
[8]6334    DO jst=1,nstm 
6335       DO ji=1,kjpindex
6336
[947]6337             ae_ns(ji,jst) = ae_ns(ji,jst) * mask_soiltile(ji,jst)
6338             dr_ns(ji,jst) = dr_ns(ji,jst) * mask_soiltile(ji,jst)
6339             ru_ns(ji,jst) = ru_ns(ji,jst) * mask_soiltile(ji,jst)
6340             tmc(ji,jst) =  tmc(ji,jst) * mask_soiltile(ji,jst)
[8]6341
6342             DO jv=1,nvm
[947]6343                humrelv(ji,jv,jst) = humrelv(ji,jv,jst) * mask_soiltile(ji,jst)
[8]6344                DO jsl=1,nslm
[947]6345                   us(ji,jv,jst,jsl) = us(ji,jv,jst,jsl)  * mask_soiltile(ji,jst)
[8]6346                END DO
6347             END DO
6348
6349             DO jsl=1,nslm         
[947]6350                mc(ji,jsl,jst) = mc(ji,jsl,jst)  * mask_soiltile(ji,jst)
[8]6351             END DO
6352
6353       END DO
6354    END DO
6355
6356    runoff(:) = zero
6357    drainage(:) = zero
6358    humtot(:) = zero
6359    shumdiag(:,:)= zero
[2222]6360    shumdiag_perma(:,:)=zero
[947]6361    k_litt(:) = zero
[8]6362    litterhumdiag(:) = zero
[2868]6363    tmc_litt_dry_mea(:) = zero
6364    tmc_litt_wet_mea(:) = zero
[8]6365    tmc_litt_mea(:) = zero
6366    humrel(:,:) = zero
6367    vegstress(:,:) = zero
[2222]6368    IF (ok_freeze_cwrr) THEN
[3402]6369       profil_froz_hydro(:,:)=zero ! initialisation for the mean of profil_froz_hydro_ns
[2222]6370    ENDIF
6371   
[3402]6372    !! 2. Sum 3d variables in 2d variables with fraction of vegetation per soil type
[8]6373
6374    DO ji = 1, kjpindex
[947]6375       mask_vegtot(ji) = 0
6376       IF(vegtot(ji) .GT. min_sechiba) THEN
6377          mask_vegtot(ji) = 1
6378       ENDIF
6379    END DO
6380   
6381    DO ji = 1, kjpindex 
6382       ! Here we weight ae_ns by the fraction of bare evaporating soil.
6383       ! This is given by frac_bare_ns, taking into account bare soil under vegetation
6384       ae_ns(ji,:) = mask_vegtot(ji) * ae_ns(ji,:) * frac_bare_ns(ji,:)
6385    END DO
[8]6386
[3969]6387    ! We average the values of each soiltile and multiply by vegtot to transform to a grid-cell mean
[947]6388    DO jst = 1, nstm
6389       DO ji = 1, kjpindex 
6390          drainage(ji) = mask_vegtot(ji) * (drainage(ji) + vegtot(ji)*soiltile(ji,jst) * dr_ns(ji,jst))
6391          runoff(ji) = mask_vegtot(ji) *  (runoff(ji) +   vegtot(ji)*soiltile(ji,jst) * ru_ns(ji,jst)) &
[3969]6392               &   + (1 - mask_vegtot(ji)) * (tot_melt(ji) + irrigation(ji) + returnflow(ji) + reinfiltration(ji))
6393          humtot(ji) = mask_vegtot(ji) * (humtot(ji) + vegtot(ji)*soiltile(ji,jst) * tmc(ji,jst)) 
[2222]6394          IF (ok_freeze_cwrr) THEN 
[3402]6395             !  profil_froz_hydro_ns comes from hydrol_soil, to remain the same as in the prognotic loop
[2222]6396             profil_froz_hydro(ji,:)=mask_vegtot(ji) * &
[3969]6397                  (profil_froz_hydro(ji,:) + vegtot(ji)*soiltile(ji,jst) * profil_froz_hydro_ns(ji,:, jst))
[2222]6398          ENDIF
[947]6399       END DO
[8]6400    END DO
6401
6402    ! we add the excess of snow sublimation to vevapnu
[3402]6403    ! - because vevapsno is modified in hydrol_snow if subsinksoil
6404    ! - it is multiplied by vegtot because it is devided by 1-tot_frac_nobio at creation in hydrol_snow
[8]6405
6406    DO ji = 1,kjpindex
6407       vevapnu(ji) = vevapnu (ji) + subsinksoil(ji)*vegtot(ji)
6408    END DO
6409
6410    DO jst=1,nstm
6411       DO jv=1,nvm
6412          DO ji=1,kjpindex
6413             IF(veget_max(ji,jv).GT.min_sechiba) THEN
[3473]6414                vegstress(ji,jv)=vegstress(ji,jv)+vegstressv(ji,jv,jst)
[947]6415                vegstress(ji,jv)= MAX(vegstress(ji,jv),zero)
[8]6416             ENDIF
[947]6417          END DO
6418       END DO
6419    END DO
[8]6420
[947]6421    DO jst=1,nstm
6422       DO jv=1,nvm
6423          DO ji=1,kjpindex
[3473]6424             humrel(ji,jv)=humrel(ji,jv)+humrelv(ji,jv,jst)
[947]6425             humrel(ji,jv)=MAX(humrel(ji,jv),zero)
[8]6426          END DO
6427       END DO
6428    END DO
6429
[3969]6430    !! Litter... the goal is to calculate drysoil_frac, to calculate the albedo in condveg
6431    ! In condveg, drysoil_frac serve to calculate the albedo of drysoil, excluding the nobio contribution which is further added
6432    ! In conclusion, we calculate drysoil_frac based on moisture averages restricted to the soiltile (no multiplication by vegtot)
[4783]6433    ! BUT THIS IS NOT USED ANYMORE WITH THE NEW BACKGROUNG ALBEDO
6434    !! k_litt is calculated here as a grid-cell average (for consistency with drainage)   
[3969]6435    !! litterhumdiag, like shumdiag, is averaged over the soiltiles for transmission to stomate
[3402]6436    DO jst=1,nstm       
[947]6437       DO ji=1,kjpindex
[3402]6438          ! We compute here a mean k for the 'litter' used for reinfiltration from floodplains of ponds       
[947]6439          IF ( tmc_litter(ji,jst) < tmc_litter_res(ji,jst)) THEN
6440             i = imin
6441          ELSE
6442             tmc_litter_ratio = (tmc_litter(ji,jst)-tmc_litter_res(ji,jst)) / &
6443                  & (tmc_litter_sat(ji,jst)-tmc_litter_res(ji,jst))
6444             i= MAX(MIN(INT((imax-imin)*tmc_litter_ratio)+imin, imax-1), imin)
[3402]6445          ENDIF       
[6954]6446          k_tmp = MAX(k_lin(i,1,ji)*ks(ji), zero)
[3969]6447          k_litt(ji) = k_litt(ji) + vegtot(ji)*soiltile(ji,jst) * SQRT(k_tmp) ! grid-cell average
[3402]6448       ENDDO     
[8]6449       DO ji=1,kjpindex
6450          litterhumdiag(ji) = litterhumdiag(ji) + &
[947]6451               & soil_wet_litter(ji,jst) * soiltile(ji,jst)
[8]6452
[2868]6453          tmc_litt_wet_mea(ji) =  tmc_litt_wet_mea(ji) + & 
6454               & tmc_litter_awet(ji,jst)* soiltile(ji,jst)
6455
6456          tmc_litt_dry_mea(ji) = tmc_litt_dry_mea(ji) + &
6457               & tmc_litter_adry(ji,jst) * soiltile(ji,jst) 
6458
[8]6459          tmc_litt_mea(ji) = tmc_litt_mea(ji) + &
[947]6460               & tmc_litter(ji,jst) * soiltile(ji,jst) 
[3402]6461       ENDDO
6462    ENDDO
6463   
6464    DO ji=1,kjpindex
6465       IF ( tmc_litt_wet_mea(ji) - tmc_litt_dry_mea(ji) > zero ) THEN
6466          drysoil_frac(ji) = un + MAX( MIN( (tmc_litt_dry_mea(ji) - tmc_litt_mea(ji)) / &
6467               & (tmc_litt_wet_mea(ji) - tmc_litt_dry_mea(ji)), zero), - un)
6468       ELSE
6469          drysoil_frac(ji) = zero
6470       ENDIF
[947]6471    END DO
[3402]6472   
6473    ! Calculate soilmoist, as a function of total water content (mc)
[3969]6474    ! We average the values of each soiltile and multiply by vegtot to transform to a grid-cell mean
[1943]6475    soilmoist(:,:) = zero
6476    DO jst=1,nstm
6477       DO ji=1,kjpindex
6478             soilmoist(ji,1) = soilmoist(ji,1) + soiltile(ji,jst) * &
[2651]6479                  dz(2) * ( trois*mc(ji,1,jst) + mc(ji,2,jst) )/huit
[1943]6480             DO jsl = 2,nslm-1
6481                soilmoist(ji,jsl) = soilmoist(ji,jsl) + soiltile(ji,jst) * &
[2651]6482                     ( dz(jsl) * (trois*mc(ji,jsl,jst)+mc(ji,jsl-1,jst))/huit &
6483                     + dz(jsl+1) * (trois*mc(ji,jsl,jst)+mc(ji,jsl+1,jst))/huit )
[1943]6484             END DO
6485             soilmoist(ji,nslm) = soilmoist(ji,nslm) + soiltile(ji,jst) * &
[2651]6486                  dz(nslm) * (trois*mc(ji,nslm,jst) + mc(ji,nslm-1,jst))/huit
[1943]6487       END DO
6488    END DO
[3969]6489    DO ji=1,kjpindex
6490       soilmoist(ji,:) = soilmoist(ji,:) * vegtot(ji) ! conversion to grid-cell average
6491    ENDDO
[4650]6492
6493    soilmoist_liquid(:,:) = zero
6494    DO jst=1,nstm
6495       DO ji=1,kjpindex
6496          soilmoist_liquid(ji,1) = soilmoist_liquid(ji,1) + soiltile(ji,jst) * &
6497               dz(2) * ( trois*mcl(ji,1,jst) + mcl(ji,2,jst) )/huit
6498          DO jsl = 2,nslm-1
6499             soilmoist_liquid(ji,jsl) = soilmoist_liquid(ji,jsl) + soiltile(ji,jst) * &
6500                  ( dz(jsl) * (trois*mcl(ji,jsl,jst)+mcl(ji,jsl-1,jst))/huit &
6501                  + dz(jsl+1) * (trois*mcl(ji,jsl,jst)+mcl(ji,jsl+1,jst))/huit )
6502          END DO
6503          soilmoist_liquid(ji,nslm) = soilmoist_liquid(ji,nslm) + soiltile(ji,jst) * &
6504               dz(nslm) * (trois*mcl(ji,nslm,jst) + mcl(ji,nslm-1,jst))/huit
6505       ENDDO
6506    ENDDO
6507    DO ji=1,kjpindex
6508        soilmoist_liquid(ji,:) = soilmoist_liquid(ji,:) * vegtot_old(ji) ! grid cell average
6509    ENDDO
[3402]6510   
[4650]6511   
[4534]6512    ! Shumdiag: we start from soil_wet_ns, change the range over which the relative moisture is calculated,
[4637]6513    ! then do a spatial average, excluding the nobio fraction on which stomate doesn't act
[3402]6514    DO jst=1,nstm     
[4637]6515       DO jsl=1,nslm
[3402]6516          DO ji=1,kjpindex
[4637]6517             shumdiag(ji,jsl) = shumdiag(ji,jsl) + soil_wet_ns(ji,jsl,jst) * soiltile(ji,jst) * &
[6954]6518                               ((mcs(ji)-mcw(ji))/(mcfc(ji)-mcw(ji)))
[4637]6519             shumdiag(ji,jsl) = MAX(MIN(shumdiag(ji,jsl), un), zero) 
[3402]6520          ENDDO
6521       ENDDO
6522    ENDDO
6523   
[3969]6524    ! Shumdiag_perma is based on soilmoist / moisture at saturation in the layer
6525    ! Her we start from grid averages by hydrol soil layer and transform it to the diag levels
6526    ! We keep a grid-cell average, like for all variables transmitted to ok_freeze
[4637]6527    DO jsl=1,nslm             
[3402]6528       DO ji=1,kjpindex
[6954]6529          shumdiag_perma(ji,jsl) = soilmoist(ji,jsl) / (dh(jsl)*mcs(ji))
[4637]6530          shumdiag_perma(ji,jsl) = MAX(MIN(shumdiag_perma(ji,jsl), un), zero) 
[3402]6531       ENDDO
6532    ENDDO
6533   
[2589]6534  END SUBROUTINE hydrol_diag_soil 
[8]6535
6536
[947]6537!! ================================================================================================================================
6538!! SUBROUTINE   : hydrol_alma
6539!!
6540!>\BRIEF        This routine computes the changes in soil moisture and interception storage for the ALMA outputs. 
6541!!
6542!! DESCRIPTION  : None
6543!!
6544!! RECENT CHANGE(S) : None
6545!!
6546!! MAIN OUTPUT VARIABLE(S) :
6547!!
6548!! REFERENCE(S) :
6549!!
6550!! FLOWCHART    : None
6551!! \n
6552!_ ================================================================================================================================
6553!_ hydrol_alma
6554
[3850]6555  SUBROUTINE hydrol_alma (kjpindex, index, lstep_init, qsintveg, snow, snow_nobio, soilwet)
[8]6556    !
[947]6557    !! 0. Variable and parameter declaration
6558
6559    !! 0.1 Input variables
6560
[8]6561    INTEGER(i_std), INTENT (in)                        :: kjpindex     !! Domain size
6562    INTEGER(i_std),DIMENSION (kjpindex), INTENT (in)   :: index        !! Indeces of the points on the map
[3850]6563    LOGICAL, INTENT (in)                               :: lstep_init   !! At which time is this routine called ?
[8]6564    REAL(r_std),DIMENSION (kjpindex,nvm), INTENT (in)  :: qsintveg     !! Water on vegetation due to interception
6565    REAL(r_std),DIMENSION (kjpindex), INTENT (in)      :: snow         !! Snow water equivalent
[3850]6566    REAL(r_std),DIMENSION (kjpindex,nnobio), INTENT (in) :: snow_nobio !! Water balance on ice, lakes, .. [Kg/m^2]
[947]6567
6568    !! 0.2 Output variables
6569
[8]6570    REAL(r_std),DIMENSION (kjpindex), INTENT (out)      :: soilwet     !! Soil wetness
[947]6571
6572    !! 0.3 Modified variables
6573
6574    !! 0.4 Local variables
6575
[8]6576    INTEGER(i_std) :: ji
6577    REAL(r_std) :: watveg
[1082]6578
6579!_ ================================================================================================================================
[8]6580    !
6581    !
[3850]6582    IF ( lstep_init ) THEN
[2900]6583       ! Initialize variables if they were not found in the restart file
[8]6584
6585       DO ji = 1, kjpindex
6586          watveg = SUM(qsintveg(ji,:))
6587          tot_watveg_beg(ji) = watveg
[2902]6588          tot_watsoil_beg(ji) = humtot(ji)
[3969]6589          snow_beg(ji)        = snow(ji) + SUM(snow_nobio(ji,:))
[8]6590       ENDDO
6591
6592       RETURN
6593
6594    ENDIF
6595    !
6596    ! Calculate the values for the end of the time step
6597    !
6598    DO ji = 1, kjpindex
[3969]6599       watveg = SUM(qsintveg(ji,:)) ! average within the mesh
[8]6600       tot_watveg_end(ji) = watveg
[3969]6601       tot_watsoil_end(ji) = humtot(ji) ! average within the mesh
6602       snow_end(ji) = snow(ji)+ SUM(snow_nobio(ji,:)) ! average within the mesh
[2900]6603
[3969]6604       delintercept(ji) = tot_watveg_end(ji) - tot_watveg_beg(ji) ! average within the mesh
[8]6605       delsoilmoist(ji) = tot_watsoil_end(ji) - tot_watsoil_beg(ji)
[3969]6606       delswe(ji)       = snow_end(ji) - snow_beg(ji) ! average within the mesh
[8]6607    ENDDO
6608    !
6609    !
6610    ! Transfer the total water amount at the end of the current timestep top the begining of the next one.
6611    !
6612    tot_watveg_beg = tot_watveg_end
6613    tot_watsoil_beg = tot_watsoil_end
6614    snow_beg(:) = snow_end(:)
6615    !
6616    DO ji = 1,kjpindex
[947]6617       IF ( mx_eau_var(ji) > 0 ) THEN
6618          soilwet(ji) = tot_watsoil_end(ji) / mx_eau_var(ji)
6619       ELSE
6620          soilwet(ji) = zero
6621       ENDIF
[8]6622    ENDDO
6623    !
6624  END SUBROUTINE hydrol_alma
6625  !
[2222]6626
6627!! ================================================================================================================================
[5450]6628!! SUBROUTINE   : hydrol_nudge_mc_read
[4565]6629!!
[5450]6630!>\BRIEF         Read soil moisture from file and interpolate to the current time step
[4565]6631!!
[5450]6632!! DESCRIPTION  : Nudging of soil moisture and/or snow variables is done if OK_NUDGE_MC=y and/or OK_NUDGE_SNOW=y in run.def.
6633!!                This subroutine reads and interpolates spatialy if necessary and temporary the soil moisture from file.
6634!!                The values for the soil moisture will be applaied later using hydrol_nudge_mc
[4565]6635!!
6636!! RECENT CHANGE(S) : None
6637!!
6638!! \n
6639!_ ================================================================================================================================
6640
[5450]6641  SUBROUTINE hydrol_nudge_mc_read(kjit)
[4565]6642
6643    !! 0.1 Input variables
6644    INTEGER(i_std), INTENT(in)                         :: kjit        !! Timestep number
6645
6646    !! 0.3 Locals variables
6647    REAL(r_std)                                :: tau                   !! Position between to values in nudge mc file
[4636]6648    REAL(r_std), DIMENSION(iim_g,jjm_g,nslm,1) :: mc_read_glo2D_1       !! mc from file at global 2D(lat,lon) grid per soiltile
6649    REAL(r_std), DIMENSION(iim_g,jjm_g,nslm,1) :: mc_read_glo2D_2       !! mc from file at global 2D(lat,lon) grid per soiltile
6650    REAL(r_std), DIMENSION(iim_g,jjm_g,nslm,1) :: mc_read_glo2D_3       !! mc from file at global 2D(lat,lon) grid per soiltile
6651    REAL(r_std), DIMENSION(nbp_glo,nslm,nstm)  :: mc_read_glo1D         !! mc_read_glo2D on land-only vector form, in global
[5450]6652    INTEGER(i_std), SAVE                       :: istart_mc !! start index to read from input file
[6189]6653!$OMP THREADPRIVATE(istart_mc)
[4636]6654    INTEGER(i_std)                             :: iend                  !! end index to read from input file
[4687]6655    INTEGER(i_std)                             :: i, j, ji, jg, jst, jsl!! loop index
[4639]6656    INTEGER(i_std)                             :: iim_file, jjm_file, llm_file !! Dimensions in input file
[5450]6657    INTEGER(i_std), SAVE                       :: ttm_mc      !! Time dimensions in input file
[6189]6658!$OMP THREADPRIVATE(ttm_mc)
[5450]6659    INTEGER(i_std), SAVE                       :: mc_id        !! index for netcdf files
[6189]6660!$OMP THREADPRIVATE(mc_id)
[4636]6661    LOGICAL, SAVE                              :: firsttime_mc=.TRUE.
[6189]6662!$OMP THREADPRIVATE(firsttime_mc)
[4565]6663
[4636]6664 
[4565]6665    !! 1. Nudging of soil moisture
6666
6667       !! 1.2 Read mc from file, once a day only
[4687]6668       !!     The forcing file must contain daily frequency variable for the full year of the simulation
[4565]6669       IF (MOD(kjit,INT(one_day/dt_sechiba)) == 1) THEN 
6670          ! Save mc read from file from previous day
6671          mc_read_prev = mc_read_next
6672
[4636]6673          IF (nudge_interpol_with_xios) THEN
6674             ! Read mc from input file. XIOS interpolates it to the model grid before it is received here.
6675             CALL xios_orchidee_recv_field("moistc_interp", mc_read_next)
[4565]6676
[4636]6677             ! Read and interpolation the mask for variable mc from input file.
6678             ! This is only done to be able to output the mask it later for validation purpose.
6679             ! The mask corresponds to the fraction of the input source file which was underlaying the model grid cell.
6680             ! If the msask is 0 for a model grid cell, then the default value 0.2 set in field_def_orchidee.xml, is used for that grid cell.
6681             CALL xios_orchidee_recv_field("mask_moistc_interp", mask_mc_interp)
6682
6683          ELSE
6684
6685             ! Only read fields from the file. We here suppose that no interpolation is needed.
6686             IF (is_root_prc) THEN
6687                IF (firsttime_mc) THEN
6688                   ! Open and read dimenions in file
[4639]6689                   CALL flininfo('nudge_moistc.nc',  iim_file, jjm_file, llm_file, ttm_mc, mc_id)
[4636]6690                   
6691                   ! Coherence test between dimension in the file and in the model run
6692                   IF ((iim_file /= iim_g) .OR. (jjm_file /= jjm_g)) THEN
[4639]6693                      WRITE(numout,*) 'hydrol_nudge: iim_file, jjm_file, llm_file, ttm_mc=', &
6694                           iim_file, jjm_file, llm_file, ttm_mc
[4636]6695                      WRITE(numout,*) 'hydrol_nudge: iim_g, jjm_g=', iim_g, jjm_g
6696                      CALL ipslerr_p(2,'hydrol_nudge','Problem in coherence between dimensions in nudge_moistc.nc file and model',&
6697                           'iim_file should be equal to iim_g','jjm_file should be equal to jjm_g')
6698                   END IF
6699                   
6700                   firsttime_mc=.FALSE.
6701                   istart_mc=julian_diff-1 ! initialize time counter to read
6702                   IF (printlev>=2) WRITE(numout,*) "Start read nudge_moistc.nc file at time step: ", istart_mc+1
6703                END IF
6704
6705                istart_mc=istart_mc+1  ! read next time step in the file
6706                iend=istart_mc         ! only read 1 time step
6707               
6708                ! Read mc from file, one variable per soiltile
[4643]6709                IF (printlev>=3) WRITE(numout,*) &
6710                     "Read variables moistc_1, moistc_2 and moistc_3 from nudge_moistc.nc at time step: ", istart_mc
[4639]6711                CALL flinget (mc_id, 'moistc_1', iim_g, jjm_g, nslm, ttm_mc, istart_mc, iend, mc_read_glo2D_1)
6712                CALL flinget (mc_id, 'moistc_2', iim_g, jjm_g, nslm, ttm_mc, istart_mc, iend, mc_read_glo2D_2)
6713                CALL flinget (mc_id, 'moistc_3', iim_g, jjm_g, nslm, ttm_mc, istart_mc, iend, mc_read_glo2D_3)
[4636]6714
6715                ! Transform from global 2D(iim_g, jjm_g) into into land-only global 1D(nbp_glo)
6716                ! Put the variables on the 3 soiltiles in the same file
6717                DO ji = 1, nbp_glo
6718                   j = ((index_g(ji)-1)/iim_g) + 1
6719                   i = (index_g(ji) - (j-1)*iim_g)
6720                   mc_read_glo1D(ji,:,1) = mc_read_glo2D_1(i,j,:,1)
6721                   mc_read_glo1D(ji,:,2) = mc_read_glo2D_2(i,j,:,1)
6722                   mc_read_glo1D(ji,:,3) = mc_read_glo2D_3(i,j,:,1)
6723                END DO
6724             END IF
6725
6726             ! Distribute the fields on all processors
6727             CALL scatter(mc_read_glo1D, mc_read_next)
6728
6729             ! No interpolation is done, set the mask to 1
6730             mask_mc_interp(:,:,:) = 1
6731
6732          END IF ! nudge_interpol_with_xios
6733       END IF ! MOD(kjit,INT(one_day/dt_sechiba)) == 1
[4565]6734       
6735     
6736       !! 1.3 Linear time interpolation between daily fields to the current time step
6737       tau   = (kjit-1)*dt_sechiba/one_day - AINT((kjit-1)*dt_sechiba/one_day)
6738       mc_read_current(:,:,:) = (1.-tau)*mc_read_prev(:,:,:) + tau*mc_read_next(:,:,:)
6739
6740       !! 1.4 Output daily fields and time interpolated fields only for debugging and validation purpose
6741       CALL xios_orchidee_send_field("mc_read_next", mc_read_next)
6742       CALL xios_orchidee_send_field("mc_read_current", mc_read_current)
6743       CALL xios_orchidee_send_field("mc_read_prev", mc_read_prev)
6744       CALL xios_orchidee_send_field("mask_mc_interp_out", mask_mc_interp)
6745
[5450]6746
6747  END SUBROUTINE hydrol_nudge_mc_read
6748
6749!! ================================================================================================================================
6750!! SUBROUTINE   : hydrol_nudge_mc
6751!!
6752!>\BRIEF         Applay nuding for soil moisture
6753!!
6754!! DESCRIPTION  : Applay nudging for soil moisture. The nuding values were previously read and interpolated using
6755!!                the subroutine hydrol_nudge_mc_read
6756!!                This subroutine is called from a loop over all soil tiles.
6757!!
6758!! RECENT CHANGE(S) : None
6759!!
6760!! \n
6761!_ ================================================================================================================================
6762  SUBROUTINE hydrol_nudge_mc(kjpindex, jst, mc_loc)
6763
6764    !! 0.1 Input variables
6765    INTEGER(i_std), INTENT(in)                         :: kjpindex    !! Domain size
6766    INTEGER(i_std), INTENT(in)                         :: jst         !! Index for current soil tile
[4565]6767       
[5450]6768    !! 0.2 Modified variables
6769    REAL(r_std), DIMENSION(kjpindex,nslm,nstm), INTENT(inout) :: mc_loc      !! Soil moisture
[4687]6770   
[5450]6771    !! 0.2 Locals variables
6772    REAL(r_std), DIMENSION(kjpindex,nslm,nstm) :: mc_aux                !! Temorary variable for calculation of nudgincsm
6773    INTEGER(i_std)                             :: ji, jsl               !! loop index   
6774   
6775   
6776    !! 1.5 Applay nudging of soil moisture using alpha_nudge_mc at each model sechiba time step.
6777    !!     alpha_mc_nudge calculated using the parameter for relaxation time NUDGE_TAU_MC set in module constantes.
6778    !!     alpha_nudge_mc is between 0-1
6779    !!     If alpha_nudge_mc=1, the new mc will be replaced by the one read from file
6780    mc_loc(:,:,jst) = (1-alpha_nudge_mc)*mc_loc(:,:,jst) + alpha_nudge_mc * mc_read_current(:,:,jst)
6781   
6782   
6783    !! 1.6 Calculate diagnostic for nudging increment of water in soil moisture
6784    !!     Here calculate tmc_aux for the current soil tile. Later in hydrol_nudge_mc_diag, this will be used to calculate nudgincsm
6785    mc_aux(:,:,jst)  = alpha_nudge_mc * ( mc_read_current(:,:,jst) - mc_loc(:,:,jst))
6786    DO ji=1,kjpindex
6787       tmc_aux(ji,jst) = dz(2) * ( trois*mc_aux(ji,1,jst) + mc_aux(ji,2,jst) )/huit
6788       DO jsl = 2,nslm-1
6789          tmc_aux(ji,jst) = tmc_aux(ji,jst) + dz(jsl) *  (trois*mc_aux(ji,jsl,jst)+mc_aux(ji,jsl-1,jst))/huit &
6790               + dz(jsl+1) * (trois*mc_aux(ji,jsl,jst)+mc_aux(ji,jsl+1,jst))/huit
[4687]6791       ENDDO
[5450]6792       tmc_aux(ji,jst) = tmc_aux(ji,jst) + dz(nslm) * (trois*mc_aux(ji,nslm,jst) + mc_aux(ji,nslm-1,jst))/huit
6793    ENDDO
[4687]6794       
[5450]6795
6796  END SUBROUTINE hydrol_nudge_mc
6797
6798
6799  SUBROUTINE hydrol_nudge_mc_diag(kjpindex, soiltile)
6800    !! 0.1 Input variables   
6801    INTEGER(i_std), INTENT(in)                         :: kjpindex    !! Domain size
6802    REAL(r_std), DIMENSION(kjpindex,nstm), INTENT (in) :: soiltile    !! Fraction of each soil tile within vegtot (0-1, unitless)
6803
6804    !! 0.2 Locals variables
6805    REAL(r_std), DIMENSION(kjpindex)           :: nudgincsm             !! Nudging increment of water in soil moisture
6806    INTEGER(i_std)                             :: ji, jst               !! loop index
6807
6808
6809    ! Average over grid-cell
6810    nudgincsm(:) = zero
6811    DO jst=1,nstm
6812       DO ji=1,kjpindex
6813          nudgincsm(ji) = nudgincsm(ji) + vegtot(ji) * soiltile(ji,jst) * tmc_aux(ji,jst)
[4687]6814       ENDDO
[5450]6815    ENDDO
6816   
6817    CALL xios_orchidee_send_field("nudgincsm", nudgincsm)
[4565]6818
[5450]6819  END SUBROUTINE hydrol_nudge_mc_diag
[4565]6820
[5450]6821
6822  !! ================================================================================================================================
6823  !! SUBROUTINE   : hydrol_nudge_snow
6824  !!
6825  !>\BRIEF         Read, interpolate and applay nudging snow variables
6826  !!
6827  !! DESCRIPTION  : Nudging of snow variables is done if OK_NUDGE_SNOW=y is set in run.def
6828  !!
6829  !! RECENT CHANGE(S) : None
6830  !!
6831  !! MAIN IN-OUTPUT VARIABLE(S) : snowdz, snowrho, snowtemp
6832  !!
6833  !! REFERENCE(S) :
6834  !!
6835  !! \n
6836  !_ ================================================================================================================================
6837
6838
6839  SUBROUTINE hydrol_nudge_snow(kjit,   kjpindex, snowdz, snowrho, snowtemp )
6840
6841    !! 0.1 Input variables
6842    INTEGER(i_std), INTENT(in)                         :: kjit        !! Timestep number
6843    INTEGER(i_std), INTENT(in)                         :: kjpindex    !! Domain size
6844
6845    !! 0.2 Modified variables
6846    REAL(r_std), DIMENSION(kjpindex,nsnow), INTENT(inout)     :: snowdz      !! Snow layer thickness
6847    REAL(r_std), DIMENSION(kjpindex,nsnow), INTENT(inout)     :: snowrho     !! Snow density
6848    REAL(r_std), DIMENSION(kjpindex,nsnow), INTENT(inout)     :: snowtemp    !! Snow temperature
6849
6850
6851
6852    !! 0.3 Locals variables
6853    REAL(r_std)                                :: tau                   !! Position between to values in nudge mc file
6854    REAL(r_std), DIMENSION(kjpindex,nsnow)     :: snowdz_read_current   !! snowdz from file interpolated to current timestep
6855    REAL(r_std), DIMENSION(kjpindex,nsnow)     :: snowrho_read_current  !! snowrho from file interpolated to current timestep
6856    REAL(r_std), DIMENSION(kjpindex,nsnow)     :: snowtemp_read_current !! snowtemp from file interpolated to current timestep
6857    REAL(r_std), DIMENSION(kjpindex)           :: nudgincswe            !! Nudging increment of water in snow
6858    REAL(r_std), DIMENSION(iim_g,jjm_g,nsnow,1):: snowdz_read_glo2D     !! snowdz from file at global 2D(lat,lon) grid
6859    REAL(r_std), DIMENSION(iim_g,jjm_g,nsnow,1):: snowrho_read_glo2D    !! snowrho from file at global 2D(lat,lon) grid
6860    REAL(r_std), DIMENSION(iim_g,jjm_g,nsnow,1):: snowtemp_read_glo2D   !! snowrho from file at global 2D(lat,lon) grid
6861    REAL(r_std), DIMENSION(nbp_glo,nsnow)      :: snowdz_read_glo1D     !! snowdz_read_glo2D on land-only vector form, in global
6862    REAL(r_std), DIMENSION(nbp_glo,nsnow)      :: snowrho_read_glo1D    !! snowdz_read_glo2D on land-only vector form, in global
6863    REAL(r_std), DIMENSION(nbp_glo,nsnow)      :: snowtemp_read_glo1D   !! snowdz_read_glo2D on land-only vector form, in global
6864    INTEGER(i_std), SAVE                       ::  istart_snow!! start index to read from input file
[6189]6865!$OMP THREADPRIVATE(istart_snow)
[5450]6866    INTEGER(i_std)                             :: iend                  !! end index to read from input file
6867    INTEGER(i_std)                             :: i, j, ji, jg, jst, jsl!! loop index
6868    INTEGER(i_std)                             :: iim_file, jjm_file, llm_file !! Dimensions in input file
6869    INTEGER(i_std), SAVE                       :: ttm_snow      !! Time dimensions in input file
[6189]6870!$OMP THREADPRIVATE(ttm_snow)
[5450]6871    INTEGER(i_std), SAVE                       :: snow_id        !! index for netcdf files
[6189]6872!$OMP THREADPRIVATE(snow_id)
[5450]6873    LOGICAL, SAVE                              :: firsttime_snow=.TRUE.
[6189]6874!$OMP THREADPRIVATE(firsttime_snow)
[5450]6875
6876 
[4565]6877    !! 2. Nudging of snow variables
6878    IF (ok_nudge_snow) THEN
6879
6880       !! 2.1 Read snow variables from file, once a day only
6881       !!     The forcing file must contain daily frequency values for the full year of the simulation
6882       IF (MOD(kjit,INT(one_day/dt_sechiba)) == 1) THEN 
6883          ! Save variables from previous day
6884          snowdz_read_prev   = snowdz_read_next
6885          snowrho_read_prev  = snowrho_read_next
6886          snowtemp_read_prev = snowtemp_read_next
6887         
[4636]6888          IF (nudge_interpol_with_xios) THEN
6889             ! Read and interpolation snow variables and the mask from input file
6890             CALL xios_orchidee_recv_field("snowdz_interp", snowdz_read_next)
6891             CALL xios_orchidee_recv_field("snowrho_interp", snowrho_read_next)
6892             CALL xios_orchidee_recv_field("snowtemp_interp", snowtemp_read_next)
6893             CALL xios_orchidee_recv_field("mask_snow_interp", mask_snow_interp)
6894
6895          ELSE
6896             ! Only read fields from the file. We here suppose that no interpolation is needed.
6897             IF (is_root_prc) THEN
6898                IF (firsttime_snow) THEN
6899                   ! Open and read dimenions in file
[4639]6900                   CALL flininfo('nudge_snow.nc',  iim_file, jjm_file, llm_file, ttm_snow, snow_id)
[4636]6901                   
6902                   ! Coherence test between dimension in the file and in the model run
6903                   IF ((iim_file /= iim_g) .OR. (jjm_file /= jjm_g)) THEN
[4639]6904                      WRITE(numout,*) 'hydrol_nudge: iim_file, jjm_file, llm_file, ttm_snow=', &
6905                           iim_file, jjm_file, llm_file, ttm_snow
[4636]6906                      WRITE(numout,*) 'hydrol_nudge: iim_g, jjm_g=', iim_g, jjm_g
6907                      CALL ipslerr_p(3,'hydrol_nudge','Problem in coherence between dimensions in nudge_snow.nc file and model',&
6908                           'iim_file should be equal to iim_g','jjm_file should be equal to jjm_g')
6909                   END IF
[4639]6910                                         
[4636]6911                   firsttime_snow=.FALSE.
6912                   istart_snow=julian_diff-1  ! initialize time counter to read
6913                   IF (printlev>=2) WRITE(numout,*) "Start read nudge_snow.nc file at time step: ", istart_snow+1
6914                END IF
6915
6916                istart_snow=istart_snow+1  ! read next time step in the file
6917                iend=istart_snow      ! only read 1 time step
6918               
6919                ! Read snowdz, snowrho and snowtemp from file
[5450]6920                IF (printlev>=2) WRITE(numout,*) &
6921                  "Read variables snowdz, snowrho and snowtemp from nudge_snow.nc at time step: ", istart_snow,ttm_snow
[4639]6922                CALL flinget (snow_id, 'snowdz', iim_g, jjm_g, nsnow, ttm_snow, istart_snow, iend, snowdz_read_glo2D)
6923                CALL flinget (snow_id, 'snowrho', iim_g, jjm_g, nsnow, ttm_snow, istart_snow, iend, snowrho_read_glo2D)
6924                CALL flinget (snow_id, 'snowtemp', iim_g, jjm_g, nsnow, ttm_snow, istart_snow, iend, snowtemp_read_glo2D)
[4636]6925
6926
6927                ! Transform from global 2D(iim_g, jjm_g) variables into into land-only global 1D variables (nbp_glo)
6928                DO ji = 1, nbp_glo
6929                   j = ((index_g(ji)-1)/iim_g) + 1
6930                   i = (index_g(ji) - (j-1)*iim_g)
6931                   snowdz_read_glo1D(ji,:) = snowdz_read_glo2D(i,j,:,1)
6932                   snowrho_read_glo1D(ji,:) = snowrho_read_glo2D(i,j,:,1)
6933                   snowtemp_read_glo1D(ji,:) = snowtemp_read_glo2D(i,j,:,1)
6934                END DO
6935             END IF
6936
6937             ! Distribute the fields on all processors
6938             CALL scatter(snowdz_read_glo1D, snowdz_read_next)
6939             CALL scatter(snowrho_read_glo1D, snowrho_read_next)
6940             CALL scatter(snowtemp_read_glo1D, snowtemp_read_next)
6941
6942             ! No interpolation is done, set the mask to 1
6943             mask_snow_interp=1
6944
6945          END IF ! nudge_interpol_with_xios
[5387]6946
6947         
6948          ! Test if the values for depth of snow is in a valid range when read from the file,
6949          ! else set as no snow cover
6950          DO ji=1,kjpindex
6951             IF ((SUM(snowdz_read_next(ji,:)) .LE. 0.0) .OR. (SUM(snowdz_read_next(ji,:)) .GT. 100)) THEN
6952                ! Snowdz has no valide values in the file, set here as no snow
6953                snowdz_read_next(ji,:)   = 0
6954                snowrho_read_next(ji,:)  = 50.0
6955                snowtemp_read_next(ji,:) = tp_00
6956             END IF
6957          END DO
6958
[4636]6959       END IF ! MOD(kjit,INT(one_day/dt_sechiba)) == 1
[4565]6960       
6961     
6962       !! 2.2 Linear time interpolation between daily fields for current time step
6963       tau   = (kjit-1)*dt_sechiba/one_day - AINT((kjit-1)*dt_sechiba/one_day)
6964       snowdz_read_current(:,:) = (1.-tau)*snowdz_read_prev(:,:) + tau*snowdz_read_next(:,:)
6965       snowrho_read_current(:,:) = (1.-tau)*snowrho_read_prev(:,:) + tau*snowrho_read_next(:,:)
6966       snowtemp_read_current(:,:) = (1.-tau)*snowtemp_read_prev(:,:) + tau*snowtemp_read_next(:,:)
6967
6968       !! 2.3 Output daily fields and time interpolated fields only for debugging and validation purpose
6969       CALL xios_orchidee_send_field("snowdz_read_next", snowdz_read_next)
6970       CALL xios_orchidee_send_field("snowdz_read_current", snowdz_read_current)
6971       CALL xios_orchidee_send_field("snowdz_read_prev", snowdz_read_prev)
6972       CALL xios_orchidee_send_field("snowrho_read_next", snowrho_read_next)
6973       CALL xios_orchidee_send_field("snowrho_read_current", snowrho_read_current)
6974       CALL xios_orchidee_send_field("snowrho_read_prev", snowrho_read_prev)
6975       CALL xios_orchidee_send_field("snowtemp_read_next", snowtemp_read_next)
6976       CALL xios_orchidee_send_field("snowtemp_read_current", snowtemp_read_current)
6977       CALL xios_orchidee_send_field("snowtemp_read_prev", snowtemp_read_prev)
6978       CALL xios_orchidee_send_field("mask_snow_interp_out", mask_snow_interp)
6979
6980       !! 2.4 Applay nudging of snow variables using alpha_nudge_snow at each model sechiba time step.
6981       !!     alpha_snow_nudge calculated using the parameter for relaxation time NUDGE_TAU_SNOW set in module constantes.
6982       !!     alpha_nudge_snow is between 0-1
6983       !!     If alpha_nudge_snow=1, the new snow variables will be replaced by the ones read from file.
6984       snowdz(:,:) = (1-alpha_nudge_snow)*snowdz(:,:) + alpha_nudge_snow * snowdz_read_current(:,:)
6985       snowrho(:,:) = (1-alpha_nudge_snow)*snowrho(:,:) + alpha_nudge_snow * snowrho_read_current(:,:)
6986       snowtemp(:,:) = (1-alpha_nudge_snow)*snowtemp(:,:) + alpha_nudge_snow * snowtemp_read_current(:,:)
6987
[4687]6988       !! 2.5 Calculate diagnostic for the nudging increment of water in snow
6989       nudgincswe=0.
6990       DO jg = 1, nsnow 
6991          nudgincswe(:) = nudgincswe(:) +  &
6992               alpha_nudge_snow*(snowdz_read_current(:,jg)*snowrho_read_current(:,jg)-snowdz(:,jg)*snowrho(:,jg))
6993       END DO
6994       CALL xios_orchidee_send_field("nudgincswe", nudgincswe)
6995       
[4565]6996    END IF
6997
[5450]6998  END SUBROUTINE hydrol_nudge_snow
[4565]6999
[8]7000END MODULE hydrol
Note: See TracBrowser for help on using the repository browser.