Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • dynorg
  • daria
  • alaska
  • LAKE3.0
5 results

lake.f90

Blame
  • Forked from Victor Stepanenko / LAKE
    Source project has a limited visibility.
    lake.f90 99.90 KiB
    MODULE LAKE_MOD
    
    contains
    SUBROUTINE INIT_LAKE(nx0,ny0,nx,ny,fnmap1,dt)
    
    !The subroutine INIT_LAKE implements
    !initialisation of the model (but not initial conditions)
    
    use LAKE_DATATYPES, only : ireals, iintegers
    use PHYS_PARAMETERS
    use NUMERIC_PARAMS
    use PHYS_CONSTANTS
    use DRIVING_PARAMS 
    use ATMOS
    use ARRAYS
    use TURB_CONST, only : &
    & TURB_CONST_DERIVED_SET
    use INOUT_PARAMETERS, only : &
    & lake_subr_unit_min, &
    & lake_subr_unit_max
    use WATER_DENSITY
    use SOIL_MOD, only : COMSOILFORLAKE
    use SURF_SCHEME1_MOD, only : PBLDAT
    use SURF_SCHEME_INM, only : PBLDAT_INM
    use INOUT, only : fext2, readgrd_lake
    use BL_MOD_LAKE, only : BL_MOD_LAKE_ALLOC
    use SNOWSOIL_MOD, only : SNOWSOIL_MOD_ALLOC
    use METH_OXYG_CONSTANTS, only : SET_METH_OXYG_CONSTANTS
    
    implicit none
    
    !Input variables
    !Reals
    real(kind=ireals), intent(in) :: dt
    
    !Integers
    integer(kind=iintegers), intent(in) :: nx0, ny0, nx, ny
    
    !Characters
    character(len=*), intent(in) :: fnmap1
    
    !Output variables
    
    !Local variables
    !Reals
    real(kind=ireals), parameter :: hour_sec = 60.*60.
    real(kind=ireals) :: x1
    
    !Integers
    integer(kind=iintegers) :: n_unit = lake_subr_unit_min
    integer(kind=iintegers) :: i, j, dnx, dny
    
    !Logicals
    logical :: uniform_depth
    
    !Characters
    character(len=80) :: path2
    character(len=80) :: fnmap
    
    data uniform_depth /.true./
    !data n_unit /999/
    
    dnx = nx - nx0 + 1
    dny = ny - ny0 + 1
    
    fnmap = fnmap1
    
    call DEFINE_PHYS_PARAMETERS
    call DEFINE_PHYS_CONSTANTS
    call DEFINE_DRIVING_PARAMS
    call SET_METH_OXYG_CONSTANTS
    call ALLOCARRAYS(dnx,dny)
    call BL_MOD_LAKE_ALLOC
    call SNOWSOIL_MOD_ALLOC
    
    call PBLDAT
    call PBLDAT_INM
    call COMSOILFORLAKE
    call TURB_CONST_DERIVED_SET
    call SET_DENS_CONSTS(eos%par)
    
    if (error_cov==1) then
      if (runmode%par == 2) then
        print*, 'The error covariance estimation algorithm works &
        &only in standalone runs: STOP'
        STOP
      endif
      if (assim == 1) then
        print*, 'assim = 1 and error_cov = 1: these regimes could not &
        &be turned on simultaneously: STOP'
        STOP
      endif
      if (dnx> 1 .or. dny > 1) then
        print*, 'Error covariance calculation is currently adjusted &
        &only for one-point stand-alone runs of the lake model: STOP'
        STOP
      endif
    endif
    if (assim==1.and.(dnx>1.or.dny>1)) then
      print*, 'Data assimilation is currently adjusted &
      &only for one-point stand-alone lake model: STOP'
      STOP
    endif
    
    if (dt_out%par<dt/hour_sec) then
      print*, 'dt_out must be larger or equal to timestep: STOP'
      STOP
    endif
       
    if (runmode%par == 2.and.(.not.uniform_depth)) then
      path2 = fext2(fnmap,'dep')
      call CHECK_UNIT(lake_subr_unit_min,lake_subr_unit_max,n_unit)
      open (n_unit, file=path(1:len_trim(path))// &
      & path2(1:len_trim(path2)), status='old')
      call READGRD_LAKE(n_unit,dep_2d,0,nx-1,0,ny-1)
      close (n_unit)
      dep_av = 0.
      x1 = 0.
      do i = 1, nx-1
        do j = 1, ny-1
          if (dep_2d(i,j) > 0.) then
            dep_av = dep_av + dep_2d(i,j)
            x1 = x1 + 1.
          endif
        enddo
      enddo
      dep_av = dep_av / x1
    endif
    
    !print*, 'Lake model is initialized'
    
    END SUBROUTINE INIT_LAKE
    
    !>MAIN SUBROUTINE OF THE MODEL 
    !!Calculates all parameters characterizing the state of a lake (temperature, currents,
    !!eddy diffusivity coefficients, snow, ice, sediments characteristics, biogeochemistry etc.) 
    !!at the next timestep (i.e. implements evolution of variables 
    !!from i-th time step to (i+1)-th )
    !!In the atmospheric model must be called once each timestep,
    !!or once each N timesteps, where N = dt_lake/dt_atmos 
    !!(dt_lake - timestep in the lake model, dt_atmos - timestep the atmospheric model) 
    SUBROUTINE LAKE &
    & (tempair1,humair1,pressure1,uwind1,vwind1, &
    & longwave1,netrad1,shortwave1,precip1,Sflux01, &
    & ch4_pres_atm, co2_pres_atm, o2_pres_atm, zref1, dtl, &
    & h10, l10, ls10, hs10, Ts0, Tb0, Tbb0, h_ML0, extwat, extice, &
    & kor_in, trib_inflow, Sals0, Salb0, fetch, phi, lam, us0, vs0, &
    & Tm, alphax, alphay, a_veg, c_veg, h_veg, area_lake, cellipt, depth_area, &
    & tsw,hw1,xlew1,cdmw1,surfrad1,cloud1,SurfTemp1,ftot,h2_out, &
    & ix,iy,nx0,ny0,nx,ny,nx_max,ny_max,ndatamax,year,month,day,hour,init_T,flag_assim,flag_print, &
    & outpath1,spinup_done,dataread,lakeform,comm3d,rank_comm3d,coords,parallel,icp,step_final)
    
    !OUTPUT VARIABLES:   
    !tsw--- surface temperature of a lake, K;
    !hw1--- sensible heat flux from lake, W/m**2; 
    !xlew1   --- latent heat flux from lake, W/m**2; 
    !cdmw    --- exchange coefficient, m/s ( == wind_speed*exchange_nondimensional_coeficient)
    
    use LAKE_DATATYPES, only : ireals, iintegers
    use OMP_LIB
    
    use COMPARAMS, only: &
    & num_ompthr, parparams
    
    use NUMERIC_PARAMS
    use DRIVING_PARAMS
    use ATMOS
    use PHYS_CONSTANTS
    use ARRAYS
    use ARRAYS_GRID
    use ARRAYS_BATHYM
    use ARRAYS_SOIL
    use ARRAYS_TURB
    use ARRAYS_WATERSTATE
    use ARRAYS_METHANE
    use ARRAYS_OXYGEN
    use MODI_MASSFLUX_CONVECTION
    use CONVECTPAR, only : UnDenGrMix
    use SALINITY, only : S_DIFF, UPDATE_ICE_SALINITY
    use TURB, only : K_EPSILON, ED_TEMP_HOSTETLER, ED_TEMP_HOSTETLER2, ZIRIVMODEL
    use TURB_CONST, only : min_diff
    use DZETA_MOD, only : VARMEAN
    
    use MOMENTUM, only : &
    & MOMENTUM_SOLVER
    
    use VERTADV, only : &
    & VERTADV_UPDATE
    
    use METHANE_MOD, only : &
    & METHANE, METHANE_OXIDATION
    
    use SOIL_MOD, only : &
    & SOILFORLAKE, &
    & SOIL_COND_HEAT_COEF, &
    & SOILCOLSTEMP, &
    & LATERHEAT
    
    use INIT_VAR_MOD, only : &
    & INIT_VAR
    
    use T_SOLVER_MOD, only : &
    & T_SOLVER
    
    use WATER_DENSITY, only: &
    & DENSITY_W
    
    use PHYS_FUNC, only: &
    & TURB_SCALES, &
    & MELTPNT, &
    & WATER_FREEZE_MELT, &
    & TURB_DENS_FLUX, &
    & SINH0, &
    & WATER_ALBEDO, &
    & EXTINCT_SNOW, &
    & UNFRWAT, &
    & WI_MAX, &
    & WL_MAX, &
    & MIXED_LAYER_CALC, &
    & HC_CORR_CARBEQUIL, &
    & DIFFMIN_HS
    
    use EVOLUTION_VARIABLES, only : &
    & UPDATE_CURRENT_TIMESTEP, &
    & UPDATE_NEXT_TIMESTEP
    
    use TURB_CONST, only : &
    & lamTM, min_diff
    
    use METH_OXYG_CONSTANTS, only : &
    & r0_methprod_phot, r0_oldorg2_star, &
    & ngasb, mf, &
    & molm3tonM, &
    & molm3toppm_co2,molm3toppm_o2,molm3toppm_ch4, &
    & molm3tomgl_co2,molm3tomkgl_ch4,molm3tomgl_o2, &
    & molm3tomcM, &
    & photic_threshold, &
    & pH, &
    & molmass_p
    
    use OXYGEN_MOD, only : &
    & OXYGEN, OXYGEN_PRODCONS, &
    & ADDOXPRODCONS, &
    & CHLOROPHYLLA
    
    use CARBON_DIOXIDE_MOD, only : &
    & CARBON_DIOXIDE
    
    use PHOSPHORUS_MOD, only : &
    & PHOSPHORUS
    
    use TIMEVAR, only : &
    & hour_sec, &
    & day_sec, &
    & year_sec, &
    & month_sec
    
    use OUT_MOD
    
    use BUBBLE_MOD, only : BUBBLE, BUBBLEFLUXAVER
    
    use CONTROL_POINT, only : CONTROL_POINT_OUT, CONTROL_POINT_IN
    
    use TRIBUTARIES, only : TRIBTEMP
    
    use BATHYMSUBR, only : BATHYMETRY
    
    use NUMERICS, only : ACCUMM
    
    use BL_MOD_LAKE
    
    use SNOWSOIL_MOD
    
    use RADIATION, only : &
    & RadWater, RadIce, RadDeepIce, &
    & fracbands, nbands, extwatbands
    
    implicit none
    
    !Input variables
    !Reals
    !> Air temperature, K
    real(kind=ireals), intent(in) :: tempair1
    !> Specific humidity, kg/kg
    real(kind=ireals), intent(in) :: humair1
    !> Air pressure, Pa
    real(kind=ireals), intent(in) :: pressure1
    !> x- and y-components of wind, m/s
    real(kind=ireals), intent(in) :: uwind1, vwind1
    !> Longwave downward radiation, W/m**2
    real(kind=ireals), intent(in) :: longwave1
    !> Net radiation, W/m**2
    real(kind=ireals), intent(in) :: netrad1
    !> Height of level above the lake surface, where the forcing is given, m
    real(kind=ireals), intent(in) :: zref1
    !> Global shortwave radiation, W/m**2
    real(kind=ireals), intent(in) :: shortwave1
    !> Precipitation intensity, m/s
    real(kind=ireals), intent(in) :: precip1
    real(kind=ireals), intent(in) :: Sflux01
    !> Cloudiness, fraction
    real(kind=ireals), intent(in) :: cloud1
    !> Surface temperature, K
    real(kind=ireals), intent(in) :: SurfTemp1
    
    real(kind=ireals), intent(in) :: ch4_pres_atm, co2_pres_atm, o2_pres_atm
    !> Time step for the LAKE model, s
    real(kind=ireals), intent(in) :: dtl
    
    real(kind=ireals), intent(in) :: hour
    
    real(kind=ireals), intent(in) :: h10, l10, ls10, hs10
    real(kind=ireals), intent(in) :: Ts0, Tb0, Tbb0
    real(kind=ireals), intent(in) :: h_ML0
    real(kind=ireals), intent(in) :: extwat, extice
    real(kind=ireals), intent(in) :: kor_in
    
    !> Tributary inflow discharge, m**3/s
    real(kind=ireals), intent(in) :: trib_inflow
    real(kind=ireals), intent(in) :: Sals0, Salb0
    real(kind=ireals), intent(in) :: fetch
    real(kind=ireals), intent(in) :: phi, lam
    real(kind=ireals), intent(in) :: us0, vs0
    real(kind=ireals), intent(in) :: Tm
    real(kind=ireals), intent(inout) :: alphax, alphay
    real(kind=ireals), intent(in) :: a_veg, c_veg, h_veg
    real(kind=ireals), intent(in) :: area_lake, cellipt
    real(kind=ireals), intent(in) :: depth_area(1:ndatamax,1:2)
    
    !Integers
    
    !> Indicator of the lake cross-section form
    !! 1 - ellipse
    !! 2 - rectangle
    integer(kind=iintegers), intent(in) :: lakeform
    
    !> Coordinates of the current lake on a horizontal mesh
    integer(kind=iintegers), intent(in) :: ix, iy
    
    !> Dimensions of the horizontal mesh
    integer(kind=iintegers), intent(in) :: nx, ny
    integer(kind=iintegers), intent(in) :: nx0, ny0, nx_max, ny_max
    integer(kind=iintegers), intent(in) :: ndatamax
    integer(kind=iintegers), intent(in) :: year, month, day
    integer(kind=iintegers), intent(in) :: init_T
    !> MPI parameters
    integer(kind=iintegers), intent(in) :: comm3d, rank_comm3d, coords(1:3) 
    !> Control point (CP) switch: 0 - do nothing
    !!                       1 - write CP                             
    !!                       2 - read CP as initial conditions                                           
    integer(kind=iintegers), intent(in) :: icp 
    
                                               
    !Characters
    character(len=60), intent(in) :: outpath1
    
    !Logicals
    logical, intent(in) :: flag_assim
    logical, intent(in) :: flag_print
    logical, intent(in) :: spinup_done 
    logical, intent(in) :: dataread
    logical, intent(in) :: parallel
    !> Indicator of the last time step
    logical, intent(in) :: step_final
    
    !Output variables
    !Reals
    real(kind=ireals), intent(inout) :: hw1, xlew1, cdmw1, surfrad1
    real(kind=ireals), intent(out) :: tsw
    real(kind=ireals), intent(out) :: ftot
    real(kind=ireals), intent(out) :: h2_out
    
    !------------------------ MAIN VARIABLES ------------------------
    !  arrays:    Tw1 and Tw2 - temperature of water, C
    ! Ti1 and Ti2 - temperature of ice, C
    ! T - temperature of snow, C
    !  functions of time:h1 and h2 - thickness of water, m
    ! l1 and l2 - thickness of ice, m
    ! hs1 - thickness of snow, m  
    ! flag_ice_surf - shows if ice is melting on the top surface, n/d  
    !  constants: cw - specific heat of water, J/(kg*K) 
    ! ci - specific heat of ice, J/(kg*K)
    ! row0 - density of water, kg/m**3
    ! roi - density of ice, kg/m**3
    ! lamw - thermal conductivity of water, J*sec/(m**3*K)
    ! lami - thermal conductivity of ice, J*sec/(m**3*K)
    ! L - specific heat of melting, J/kg
    ! Lwv - specific heat of evaporation, J/kg
    ! Liv - specific heat of sublimation, J/kg    
    ! ddz - size of grid element (space), m
    ! dt - size of grid element (time), sec
    ! kstratwater - coefficient for linear initial conditions in water
    ! kstratice - coefficient for linear initial conditions in ice 
    !  boundary conditions:
    ! eFlux - total heat flux on the upper surface,
    !   shortwave(1-A)-T**4+longwave-H-LE, J/(m**2*sec)
    ! Elatent - latent heat flux, J/(m**2*sec) 
    ! Erad - shortwave radiation, penetrated below a surface, J/(m**2*sec)
    ! tempair - air temperature (2 m), C
    ! precip - precipitation, m/sec
    !(M) number of layers in water and snow   
    
    !Local variables
    !Reals
    real(kind=ireals), allocatable :: work1(:), work2(:), work3(:), work4(:), work5(:), work6(:)
    real(kind=ireals), allocatable :: radflux(:)
    real(kind=ireals) :: l2, h2, ls2
    real(kind=ireals) :: totalevap, totalprecip, totalmelt, totalpen, totalwat
    real(kind=ireals) :: snowmass, snowmass_init
    real(kind=ireals) :: totalerad, totalhflux
    real(kind=ireals) :: h_ML0zv
    real(kind=ireals) :: x, xx, y, yy, zz, zzz, vol_, vol_2, tt, ttt, ww, ww1, www
    real(kind=ireals) :: kor
    real(kind=ireals) :: Ti10 ! Initial temperature of the ice surface (if l10 > 0)
    
    real(kind=ireals), dimension(1:vector_length) :: a, b, c, d 
    
    real(kind=ireals) :: dt
    real(kind=ireals) :: b0
    real(kind=ireals) :: tau_air, tau_i, tau_gr
    real(kind=ireals) :: eflux0_kinem_water
    real(kind=ireals) :: totmeth0, totmethc, metracc = 0.
    
    real(kind=ireals), dimension(1:vector_length) :: Temp
    
    real(kind=ireals) :: flux1, flux2
    
    real(kind=ireals) :: dTisnmelt, dTiimp, dTmax, fracsn, fracimp
    
    real(kind=ireals) :: calibr_par_min(1:2), calibr_par_max(1:2)
    !data calibr_par_min /1.7d-8/5., 1.d-10/5./
    !data calibr_par_max /1.7d-8*5., 1.d-10*5./
    real(kind=ireals) :: step_calibr(1:2)
    
    
    !Integers    
    integer(kind=iintegers) :: i, j, k, nn = 0, i2, j2
    integer(kind=iintegers) :: i_ML
    integer(kind=iintegers) :: flag_snow
    integer(kind=iintegers) :: nstep_meas
    integer(kind=iintegers) :: n_1cm, n_5cm
    integer(kind=iintegers) :: layer_case
    integer(kind=iintegers) :: ndec
    integer(kind=iintegers) :: npoint_calibr(1:2) = 12
    integer(kind=iintegers) :: dnx, dny
    
    !Logicals
    logical :: uniform_depth
    logical :: flag
    logical :: accum = .false.
    logical :: add_to_winter
    logical :: firstcall = .true.
    logical :: multsoil
    logical :: worklog, worklog1, indTMprev = .false.
    
    !Characters
    character(len=60) :: workchar
    
    data uniform_depth /.true./
    data nstep_meas /0/
     
    SAVE
      
    !BODY OF PROGRAM
    
    ! Getting the number of cores
    num_ompthr = OMP_GET_NUM_PROCS()
    ! MPI parameters
    parparams%comm3d = comm3d
    parparams%rank_comm3d = rank_comm3d
    parparams%coords = coords
    parparams%parallel = parallel
    
    !call TIMEC(0)
    
    gs%ix = ix
    gs%iy = iy
    
    dnx = nx - nx0 + 1
    dny = ny - ny0 + 1
    
    
    !if (firstcall)  then
    !  if (calibrate_parameter) then
    !    ! Calibration runs are performed only when ny = 1
    !    if (npoint_calibr(1)*npoint_calibr(2) /= dnx) then
    !      write(*,*) 'npoint_calibr(1)*npoint_calibr(2) /= dnx in LAKE: STOP'
    !      STOP
    !    else
    !      ! Calibration of constants r0_methprod_phot and r0_oldorg2_star
    !      calibr_par1 => r0_methprod_phot
    !      calibr_par2 => r0_oldorg2_star
    !      cost_function => febultot
    !      
    !!      calibr_par_min(1) = calibr_par1/2. ; calibr_par_max(1) = calibr_par1*2.
    !      calibr_par_min(1) = 2.25d-8 ; calibr_par_max(1) = 3.d-8
    !!      calibr_par_min(2) = calibr_par2/sqrt(2.) ; calibr_par_max(2) = calibr_par2*sqrt(2.)
    !      calibr_par_min(2) = 6.d-11 ; calibr_par_max(2) = 8.d-11
    !      step_calibr(1:2) = (calibr_par_max(1:2) - calibr_par_min(1:2))/ &
    !      & real(npoint_calibr(1:2)-1)
    !    endif
    !  endif
    !endif
    !
    !if (calibrate_parameter) then
    !  if (mod(ix,npoint_calibr(1)) == 0) then
    !    i = npoint_calibr(1)
    !    j = ix/npoint_calibr(1)
    !  else
    !    i = mod(ix,npoint_calibr(1))
    !    j = 1 + ix/npoint_calibr(1)
    !  endif
    !  calibr_par1(:) = calibr_par_min(1) + (i-1)*step_calibr(1)
    !  calibr_par2    = calibr_par_min(2) + (j-1)*step_calibr(2)
    !endif
    
    !Checking if forcing data is read
    if ( (.not.dataread) .and. PBLpar%par /= 0) then
      write(*,*) 'Atmospheric forcing is not available while PBLpar /= 0: STOP'
      STOP
    endif
    
    tempair = tempair1 - Kelvin0
    humair = humair1
    pressure = pressure1
    uwind = uwind1
    vwind = vwind1
    zref  = zref1
    precip = precip1
    Sflux0 = Sflux01*(roa0/row0)
    outpath = outpath1
    cloud = cloud1
    if (SurfTemp1 /= missing_value) then
      SurfTemp = SurfTemp1 - Kelvin0
    else
      SurfTemp = missing_value
    endif
    
    hw_input = hw1
    xlew_input = xlew1
    cdmw_input = cdmw1
    surfrad_input = surfrad1
    
    if (kor_in == -999.d0) then
      kor = 2.d0*omega*sin(phi*pi/180.d0)
    else
      kor = kor_in
    endif
    
    !extwatarr(:) = extwat
    allocate(radflux(1:nbands))
    if (nbands > 1) then
      forall (i=1:M+1) RadWater%extinct(i,1:nbands) = extwatbands(1:nbands)
      RadWater  %extinct(:,2) = extwat ! extwat is treated as extinction coefficient for PAR
    else
      RadWater  %extinct(:,:) = extwat
    endif
    RadIce    %extinct(:,:) = extice
    RadDeepIce%extinct(:,:) = extice
    if (ifrad%par == 1) then
      longwave  = longwave1
      shortwave = max(shortwave1,0._ireals)
    elseif (ifrad%par == 0) then
      longwave  = 0.e0_ireals
      shortwave = 0.e0_ireals
    endif
    ! If atmospheric radiation is missing, net radiation to be used to compute this variable
    if (longwave1 /= missing_value) then
      netrad = missing_value
    else
      netrad = netrad1
    endif
    
    !print*, tempair, humair, pressure, uwind, vwind, longwave, shortwave
    
    if (longwave1 == missing_value .and. firstcall) then
      write(*,*) 'Atmospheric radiation is missing in input file and will be calculated &
      &from net longwave radiation or net radiation'
      if (cloud1 == missing_value) then
        write(*,*) 'Cloudiness data is missing: atmospheric radation to be computed from net radiation' 
        if (netrad1 == missing_value) then
          STOP 'Net radiation data is missing!: STOP'
        endif
      endif
    endif
    
    if (uwind == 0) uwind = minwind
    if (vwind == 0) vwind = minwind
    wind = sqrt(uwind**2+vwind**2)
    !wind10 = wind*log(10./roughness0)/log(zref/roughness0)
    precip = 0.
    !Control of the input atmospheric forcing
    flag = .false.
    if (tempair>60.or.tempair<-90) then
      print*, 'The air temperature ', tempair, 'is illegal: STOP'
      flag = .true.
    elseif (abs(humair)>1.) then
      print*, 'The air humidity ', humair, 'is illegal: STOP'
      flag = .true.
    elseif (pressure > 110000 .or. pressure < 80000.) then
      print*, 'The air pressure ', pressure, 'is illegal: STOP'
      flag = .true.
    elseif (abs(uwind)>200.) then
      print*, 'The x-component of wind ', uwind, 'is illegal: STOP'
      flag = .true.
    elseif (abs(vwind)>200.) then
      print*, 'The y-component of wind ', vwind, 'is illegal: STOP'
      flag = .true.
    elseif (abs(longwave)>1000.) then
      print*, 'The longwave radiation ',longwave,'is illegal: STOP'
      flag = .true.
    elseif (abs(shortwave)>1400.) then
      print*, 'The shortwave radiation ', shortwave, 'is illegal: STOP'
      flag = .true.
    elseif (abs(precip)>1.) then
      print*, 'The atmospheric precipitation ',precip, &
      & 'is illegal: STOP'
      flag = .true.
    endif
    if (flag) then
      write(*,*) 'Temperature = ', tempair, &
      & 'Humidity = ', humair, &
      & 'Pressure = ', pressure, &
      & 'Uwind = ', uwind, &
      & 'Vwind = ', vwind, &
      & 'Longwave = ', longwave, &
      & 'Shortwave = ', shortwave, &
      & 'Precip = ', precip
      STOP
    endif
    
    dt = dtl
    dt05 = 0.5d0*dt
    dt_keps = dt/real(nstep_keps%par)
    dt_inv = 1.d0/dt
    dt_inv05 = 0.5d0*dt_inv
    
    ! Logical, indicating multiple soil columns configuration
    multsoil = (nsoilcols > 1 .and. depth_area(1,2) >= 0. .and. soilswitch%par == 1)
    
    if (init(ix,iy) == 0_iintegers) then
      ! Specification of initial profiles   
      
      rosoil(:) = 1200. ! Bulk soil density for initialization
      call INIT_VAR &
      ( M, Mice, ns, ms, ml, nsoilcols, ndatamax, &
      & init_T, skin%par, zero_model%par, &
      & h10, l10, hs10, ls10, tempair, Ts0, Tb0, Tm, Tbb0, &
      & Sals0, Salb0, us0, vs0, h_ML0, &
      & rosoil, rosdry, por, depth_area, ip, isp, &
      
      & flag_snow, flag_snow_init, itop, nstep, itherm, &
      & h1, l1, hs1, ls1, &
      & hx1, hx2, hy1, hy2, &
      & hx1t, hx2t, hy1t, hy2t, &
      & hx1ml, hx2ml, hy1ml, hy2ml, &
      & veg, snmelt, snowmass, cdmw, velfrict_prev, &
      & roughness, eflux0_kinem, Elatent, &
      & totalevap, totalmelt, totalprecip, totalwat, totalpen, &
      & time, dhwfsoil, dhw, dhw0, dhi, dhi0, dls0, &
      
      & E1, eps1, zsoilcols(1,ix,iy), Tsoil1, wi1, wl1, Sals1, &
      & rootss, qsoil, TgrAnn, qwater(1,1), &
      & oxyg(1,1), DIC(1,1), phosph, oxygsoil, Sal1, &
      & u1, v1, Tw1, Tskin, T_0dim, Eseiches, &
      & Ti1, salice, porice, Tis1, z_full, ddz, &
      & dz, T, wl, dens, lamw, &
      & dzeta_int, zsoil, pressure )
    
      Sals2(1:ns,1:nsoilcols) = Sals1(1:ns,1:nsoilcols) !Salinity is currently not calculated in lateral columns 
          
      !if (runmode%par == 2 .and. (uniform_depth .eqv. .false.)) then
      !  if (ix <= nx-1 .and. iy <= ny-1) then
      !    h1 = dep_2d(ix,iy)
      !  else
      !    h1 = dep_av
      !  endif  
      !  if (h1 <= 0) then
      !    print*, 'Negative or zero initial depth at ix=',ix, &
      !    & 'iy=',iy,'h1=',h1,':terminating program'
      !    STOP 
      !  endif
      !endif
    
    endif
    
    if (init(ix,iy) == 0_iintegers .and. icp == 2_iintegers &
      & .and. ix == 1 .and. iy == 1) then
      ! Read control point for inital conditions of all lakes of the domain
      call CONTROL_POINT_IN(nx,nx0,nx_max,ny,ny0,ny_max,gs,parparams)
      print*, 'Control point is read'
    endif
    
    
    if (init(ix,iy) /= 0_iintegers .or. &
      & (init(ix,iy) == 0_iintegers .and. icp == 2_iintegers )) then
      call UPDATE_CURRENT_TIMESTEP ( &
      & ix, iy, dnx, dny, M, Mice, ns, ms, ml, nsoilcols, &
      & l1, h1, hx1, hx2, hy1, hy2, ls1, hs1, &
      & hx1t, hx2t, hy1t, hy2t, &
      & hx1ml, hx2ml, hy1ml, hy2ml, &
      & gradpx_tend, gradpy_tend, &
      & u1, v1, &
      & E1, eps1, k_turb_T_flux, &
      & Tsoil1, Sals1, wi1, wl1, &
      & Tw1, Sal1, lamw, &
      & Tskin(1), &
      & Ti1, Tis1, &
      !& ueffl, veffl, Tweffl, Saleffl, &
      & dz, T, wl, dens, &
      & qwater(1,1), qsoil, &
      & oxyg(1,1), oxygsoil, &
      & DIC(1,1), DOC, POCL, POCD, phosph, &
      & snmelt, snowmass, &
      & cdmw, &
      & time, &
      & dhwfsoil, &
      & Elatent, &
      & dhw, dhw0, &
      & dhi, dhi0, dls0, &
      & velfrict_prev, &
      & roughness, &
      & eflux0_kinem, &
      & tot_ice_meth_bubbles, &
      & febul0, Eseiches, salice, porice, &
      
      & flag_snow, flag_snow_init, &
      & itop, &
      & nstep, i_maxN, itherm )
    endif
    
    ! Updating bathymetry 
    call BATHYMETRY(M,Mice,ns,ix,iy,ndatamax,month,day,lakeform,hour,dt, &
                   & depth_area,area_lake,cellipt, &
                   & multsoil,trib_inflow,dhwtrib,vol,botar)
    ! Tributary inflow
    if (trib_inflow /= -9999.) then
      dhwtrib = trib_inflow*dt/area_int(1)
      ! Will be corrected for water abstraction in BATHYMETRY 
    else
      dhwtrib = (h10 - h1)/10. ! 10 - arbitrary value, the "time" of depth damping towards initial depth
    endif
    
    time = time + dt
    nstep = nstep + 1
    
    layer_case = 1
    if (h1 >  0  .and. l1 >  0) layer_case = 2 
    if (h1 == 0  .and. l1 >  0) layer_case = 3
    if (h1 == 0  .and. l1 == 0) layer_case = 4
    
    if (layer_case == 1 .and. &
    & WATER_FREEZE_MELT(Tw1(1), 0.5*ddz(1)*h1, &
    & Meltpnt(Sal1(1),preswat(1),nmeltpoint%par), +1) .and. &
    & h1 - min_ice_thick * roi/row0 > min_water_thick) then
      layer_case = 2
    endif 
    
    if (layer_case == 3 .and. &
    & WATER_FREEZE_MELT(Ti1(Mice+1), 0.5*ddzi(Mice)*l1, Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par), -1) .and. &
    & l1 - min_water_thick * row0_d_roi > min_ice_thick) then
      layer_case = 2
    endif  
    
    if (layer_case == 3 .and. &
    & WATER_FREEZE_MELT(Ti1(1), 0.5*ddzi(1)*l1, Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par), -1) .and. &
    & l1 - min_water_thick * row0_d_roi > min_ice_thick .and. flag_snow == 0) then
      h1 = min_water_thick ; dhw = 0.; dhw0 = 0.
      Tw1 = Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par) + T_phase_threshold 
      Sal1 = 1.d-5
      ls1 = l1 - min_water_thick * row0_d_roi
      Tis1 = Ti1
      l2 = 0
      Ti2 = 0
      porice(:) = poricebot * saltice%par
      salice(:) = porice(:) * Sal1(1) * row0
      if (ls1 < 0.009999) print*, 'Thin layer! - ls'
      layer_case = 1 
    endif
    
      
    if1: IF (layer_case == 1) THEN 
    
    !---------------------------- CASE 1: LIQUID WATER LAYER AT THE TOP ("Summer")-----------------------
    
    
    !Check the bottom layer water temperature
    x = Meltpnt(Sal1(M+1),preswat(M+1),nmeltpoint%par)
    if (WATER_FREEZE_MELT(Tw1(M+1), 0.5*ddz(M)*h1, x, +1) .and. &
    & ls1 == 0 .and. h1 - min_ice_thick * roi/row0 > min_water_thick) then
      ls1 = min_ice_thick ; dls = 0.; dls0 = 0.
      Tis1 = x - T_phase_threshold
      h1 = h1 - min_ice_thick*roi/row0
    endif   
    
    ! Updating bathymetry 
    call BATHYMETRY(M,Mice,ns,ix,iy,ndatamax,month,day,lakeform,hour,dt, &
                    & depth_area,area_lake,cellipt, &
                    & multsoil,trib_inflow,dhwtrib,vol,botar)
    
    !Check the liquid temperature to be above melting point
    do i = 2, M
      Tw1(i) = max(Tw1(i),Meltpnt(Sal1(i),preswat(i),nmeltpoint%par))
    enddo
    
    !Calculation of water density profile at the current timestep
    call DENSITY_W(M,eos%par,lindens%par,Tw1,Sal1,preswat,row)
    call MIXED_LAYER_CALC(row,ddz,ddz2,dzeta_int,dzeta_05int,h1,M,i_ML,H_mixed_layer,maxN)
    
    !The salinity flux at the surface are passed to
    !TURB_DENS_FLUX as zeros since they are currently      ______
    !not taken into account in calculation of density flux w'row'	
     
    turb_density_flux = TURB_DENS_FLUX(eflux0_kinem,0.e0_ireals,Tw1(1),0.e0_ireals)
    Buoyancy0 = g/row0*turb_density_flux
    
    ! Updating tributaries data and adding inflow of all substances
    if (tribheat%par > 0) then
      call TRIBTEMP(time,dt,h1,dhwtrib,z_full,area_int,area_half,gsp,gas,wst,spinup_done)
      ! Adding tendency due to mean vertical velocity
      call VERTADV_UPDATE(M,dt,h1,gsp,bathymwater,wst,gas)
    endif
    
    !if (massflux%par == 1) then
    !!Updating density profile for massflux convection
    !!Updating z-grid properties 
    !  do i = 1, M
    !    dz_full (i) = ddz(i)  *h1
    !    z_half  (i) = dzeta_05int(i)*h1
    !  enddo
    !  call MASSFLUX_CONVECTION( &
    !  & nstep,dt,z_half,z_full,dz_full, &
    !  & turb_density_flux,eflux0_kinem, &
    !! The latent heat flux and salinity flux at the surface are passed as zeros,
    !! as far as currently they are not taken 
    !! into account in massflux conection parameterization
    !  & 0.e0_ireals,0.e0_ireals, &
    !! The surface wind stress components are passed as zeros,
    !! as far as currently they are not taken 
    !! into account in massflux conection parameterization
    !  & 0.e0_ireals,0.e0_ireals, &
    !  & u1,v1,w1,E1(1:M), &
    !  & u1,v1,w1,row,Tw1,Sal1, &
    !  & PEMF,PDENS_DOWN,PT_DOWN,PSAL_DOWN,zinv,1,M)
    !! Debugging purposes only
    !! PEMF = 0.e0_ireals
    !! call TEMP_MASSFLUX(PEMF,PT_DOWN,ddz,h1,dt,Tw2,T_massflux)
    !  do i = 1, M
    !    pt_down_f(i) = 0.5d0*(PT_DOWN(i) + PT_DOWN(i+1))
    !  enddo
    !endif
    
    ! The solar radiation, absorbed by the water surface
    if (varalb%par == 0) then
      Erad = shortwave*(1-albedoofwater)
    elseif (varalb%par == 1) then
      Erad = shortwave* &
      & (1 - WATER_ALBEDO( SINH0(year,month,day,hour,phi) ) ) ! Note: the time here must be a local one
    endif  ! time, not UTC
    
    !Radiation fluxes in layers
    x = 1._ireals - sabspen*skin%par
    !Partitioning of shortwave energy between wavelength bands
    forall(i=1:nbands) radflux(i) = fracbands(i)*Erad*(1 - sabs0)*x
    call RadWater%RAD_UPDATE(ddz05(0:M)*h1,radflux) !(/Erad*(1 - sabs0)*x/))
    ! Calculating photic zone depth (<1% of surface irradiance)
    if (RadWater%integr(1) > 0) then
      H_photic_zone = h1
      do i = 1, M
        if (RadWater%integr(i)/RadWater%integr(1) < photic_threshold) then
          H_photic_zone = z_full(i)
          exit
        endif
      enddo
    else
      H_photic_zone = 0.
    endif
    if (ls1 /= 0.e0_ireals) then
      ! xx - radiation penetrated through the water - deep ice interface
      forall (i=1:nbands) radflux(i) = RadWater%flux(M+1,i)*(1-albedoofice)
      call RadDeepIce%RAD_UPDATE(ddzi05(0:Mice)*ls1, radflux) !(/xx/))
    endif
    
    !Calculation of the layer's thickness increments
    if (ls1 == 0) then
      ice = 0; snow = 0; water = 1; deepice = 0
      dhwp = precip*dt
      dhwe = - Elatent/(Lwv*row0)*dt
      dhw = dhwp + dhwe + dhwfsoil + dhwtrib
      dhw0 = dhwp + dhwe
      dls = 0.
    else
      ice = 0; snow = 0; water = 1; deepice = 1
      flux1 = - lamw(M)*(Tw1(M+1)-Tw1(M))/(ddz(M)*h1) + RadWater%integr(M) + &
      & cw_m_row0*(dhw-dhw0)*(Tw1(M+1)-Tw1(M))/(2.*dt) + &
      & cw_m_row0*PEMF(M)*(pt_down_f(M)-0.5d0*(Tw1(M+1)+Tw1(M)) )
      flux2 = - lami*(Tis1(2)-Tis1(1))/(ddzi(1)*ls1) + RadDeepIce%integr(1) + &
      & ci_m_roi*dls0*(Tis1(2)-Tis1(1))/(2.*dt)
      dhwls = dt*(flux1 - flux2)/(row0_m_Lwi)
    !  dhwls = -lamw(M)*dt/(ddz(M)*h1*row0_m_Lwi)*(Tw1(M+1) - Tw1(M))+
    !&  lami*dt/(ddz(1)*ls1*row0_m_Lwi)*(Tis1(2) - Tis1(1))+
    !&  (1-albedoofice)*Erad*(1-sabs)*exp(-extwat*h1)/(row0_m_Lwi)*dt 
      dls = - dhwls*row0_d_roi
      dls0 = dls
      dhwp = precip*dt
      dhwe = - Elatent/(Lwv*row0)*dt
      dhw = dhwp + dhwe + dhwfsoil + dhwls + dhwtrib
      dhw0 = dhwp + dhwe
    endif
    
    !Calculation of water current's velocities and turbulent characteristics
    if (Turbpar%par == 2) then
      call MOMENTUM_SOLVER(ix, iy, dnx, dny, ndatamax, &
      & year, month, day, hour, kor, a_veg, c_veg, h_veg, &
      & alphax, alphay, dt, b0, tau_air, tau_i, tau_gr, tau_wav, fetch, depth_area)
    endif
    
    if (soilswitch%par == 1) then
      call SOIL_COND_HEAT_COEF(nsoilcols)
    endif
    if (multsoil) then 
    ! Calculation of heat sources from heat fluxes from mutliple soil columns
      call SOILCOLSTEMP(gs,gsp,dt,ls,ftot,ch4_pres_atm,ddz,ddzi,zsoilcols, &
                       & wst,RadWater%integr,a,b,c,d,add_to_winter, &
                       & bathymwater,bathymice, &
                       & bathymdice,bathymsoil(1,ix,iy), &
                       & soilflux(1,ix,iy),fdiffbot,(/1,0/))
      call LATERHEAT(ix,iy,gs,ls, &
      & bathymwater,bathymice,bathymdice,bathymsoil, &
      & gsp,soilflux(1,ix,iy),.false.,lsh)
    endif
    ! Calculation of the whole temperature profile
    call T_SOLVER(ix,iy,dnx,dny,year,month,day,hour,phi, &
    & RadWater, RadIce, SurfTemp, fetch, dt)
    if (soilswitch%par == 1) then
      call SOILFORLAKE(dt,a,b,c,d,nsoilcols)
    endif
    
    ! Diagnostic calculations
    do i = 1, M
      k_turb_T_flux(i) = - 0.5*lamw(i)/(cw_m_row0) * &
      & ( Tw2(i+1) + Tw1(i+1) - Tw2(i) - Tw1(i)) / (ddz(i)*h1)
      T_massflux(i) = PEMF(i)*(pt_down_f(i) - 0.5d0*(Tw2(i+1) + Tw2(i)))
    enddo
    
    !Assuming all dissolved species diffuse with the same molecular diffusivity as salinity
    lamsal(:)    = (lamw(:) - lamw0)/cw_m_row0 * alsal    + lamsal0
    lammeth(:)   = (lamw(:) - lamw0)/cw_m_row0 * almeth   + lamsal0
    lamoxyg(:)   = (lamw(:) - lamw0)/cw_m_row0 * aloxyg   + lamsal0
    lamcarbdi(:) = (lamw(:) - lamw0)/cw_m_row0 * alcarbdi + lamsal0
    lampart  (:) = (lamw(:) - lamw0)/cw_m_row0 * alcarbdi !no molecular diffusion for particles
    
    ! Salinity diffusion in water and soil
    CALL S_DIFF(dt,ls,salice)
    
    ! Oxygen model precedes methane module, in order sedimentary 
    ! oxygen demand to be available for the latter
    call CHLOROPHYLLA(z_full, H_mixed_layer, H_photic_zone, extwat, RadWater, gas, M, Chl_a, itroph)
    call OXYGEN_PRODCONS(gs, gsp, wst, bathymsoil, gas, area_int, area_half, ddz05, &
    & h1, dt, Tsoil3, Chl_a, dzs, por, oxygsoil, itroph, &
    & prodox, resp, bod, sod, sodbot)
    
    if (soilswitch%par == 1) then
      ! Calculation of methane in all soil columns, except for the lowest one
      if (multsoil) then
        call SOILCOLSTEMP(gs,gsp,dt,ls,ftot,ch4_pres_atm,ddz,ddzi,zsoilcols, &
                         & wst,RadWater%integr,a,b,c,d,add_to_winter, &
                         & bathymwater,bathymice, &
                         & bathymdice,bathymsoil(1,ix,iy), &
                         & soilflux(1,ix,iy), fdiffbot, (/0,1/))
        methsoilflux(1:nsoilcols-1) = fdiffbot(1:nsoilcols-1)
      endif
      call BUBBLE_BLOCK
      ! Calculation of methane sources from methane fluxes from mutliple soil columns
      if (multsoil) then 
        !call LATERHEAT(ix,iy,gs,ls, &
        !& bathymwater,bathymice,bathymdice,bathymsoil, &
        !& gsp,soilflux(1,ix,iy),.false.,lsh)
        call LATERHEAT(ix,iy,gs,ls, &
        & bathymwater,bathymice,bathymdice,bathymsoil, &
        & gsp,methsoilflux,.true.,lsm)
        call LATERHEAT(ix,iy,gs,ls, &
        & bathymwater,bathymice,bathymdice,bathymsoil, &
        & gsp,co2soilflux, .true.,lsc)
        call LATERHEAT(ix,iy,gs,ls, &
        & bathymwater,bathymice,bathymdice,bathymsoil, &
        & gsp,o2soilflux,  .true.,lso)
      endif
    endif
    gs%isoilcol = nsoilcols
    call METHANE &
    & (gas,pressure,wind10,ch4_pres_atm,zsoil,Tsoil3(1,nsoilcols),rosoil,fbbleflx_ch4_sum, &
    & fbbleflx_ch4(0,nsoilcols),wl4(1,nsoilcols),wi2(1,nsoilcols),wa,Sals1, &
    & rootss,rosdry,por,veg,0._ireals,TgrAnn, methgenmh, &
    & ddz,ddz05,wst, lammeth, h1, ls, dhw, dhw0, .true., .false., &
    & lsm, bathymwater, &
    & fplant, febul0(nsoilcols), fdiffbot(nsoilcols), ftot, fdiff_lake_surf, &
    & plant_sum,bull_sum,oxid_sum,rprod_sum, &
    & anox,gs,gsp,dt,eps1(1),sodbot,rprod_total_oldC,rprod_total_newC, &
    & ice_meth_oxid_total, &
    & h_talik,tot_ice_meth_bubbles,add_to_winter)
    qmethane(1:M+1   ) = qwater(1:M+1,2)
    qmethane(M+2:M+ns) = qsoil (2:ns,nsoilcols)
    
    call ADDOXPRODCONS(M,i_maxN,H_mixed_layer,H_photic_zone,prodox,resp,bod,sod,RadWater,dt,ls,gas)
    call OXYGEN (gs, Tw2, fbbleflx_o2_sum, fbbleflx_o2(0,nsoilcols), lamoxyg, gsp, fracb0, pressure, wind10, &
    & o2_pres_atm, ls, bathymwater, lso, dt, febul0(nsoilcols), eps1(1), sodbot, oxyg, soilswitch%par, fo2)
    call CARBON_DIOXIDE (gs, Tw2, fbbleflx_co2_sum, fbbleflx_co2(0,nsoilcols), lamcarbdi, gsp, bathymwater, lsc, fracb0, &
    & pressure, wind10, co2_pres_atm, febul0(nsoilcols), ls, dt, eps1(1), sodbot, gas, soilswitch%par, fco2)
    call PHOSPHORUS(M,dt,ls,gsp,bathymwater,gas,lsp,lamcarbdi)
    call METHANE_OXIDATION(M, i_maxN, dt, ddz, h1, bathymwater, oxyg(1,2), qwater(1,2), DIC(1,2), Tw2, &
    & qwateroxidtot, qwateroxidML)
    
    !Calculation of water density profile at the next timestep
    call DENSITY_W(M,eos%par,lindens%par,Tw2,Sal2,preswat,row2)
    
    if (Turbpar%par == 2) then
      !$OMP PARALLEL NUM_THREADS(num_ompthr) IF(omp%par == 1) PRIVATE(i)
      do i = 1, nstep_keps%par
        call K_EPSILON(ix,iy,dnx,dny, year, month, day, hour, &
        & kor, a_veg, c_veg, h_veg, dt_keps, &
        & b0, tau_air, tau_wav, tau_i, tau_gr, roughness, fetch) ! 0.5*tau_wav 0.5 - arbitrary (!) fraction of momentum loss due to wave breaking
      enddo
      !$OMP END PARALLEL  
    else
    ! Calculation of the of eddy difusivity for temperature
      SELECT CASE (Turbpar%par)
        CASE (8)
          ! Hostetler formulation
          call ED_TEMP_HOSTETLER &
          & (wind,velfrict_prev,zref,phi,z_full,row,KT,M)
          KT(:) = cw_m_row0*KT(:)
          call UnDenGrMix(M,eos%par,ddz*h1,dzs(1),csoil(1),rosoil(1),Tw2,Sal2,preswat,row)
        CASE (9)
          ! Modified Hostetler formulation for shallow lake
          call ED_TEMP_HOSTETLER2 &
          & (wind,velfrict_prev,zref,phi,z_full,row,KT,M)
          KT(:) = cw_m_row0*KT(:)
        CASE (1)
          do i = 1, M
            KT(i) = (k2(i)-niu_wat)*cw_m_row0 
          enddo
        CASE DEFAULT
          KT = lamTM*k2*cw_m_row0 
      ENDSELECT 
    endif
    
    !Background vertical diffusivity
    select case(backdiff%par)
    case(0)
      lamw_back(:) = 0.
    case(1)
      call DIFFMIN_HS(area_lake,wst,gsp,ls,M) !Calculating background heat conductance
    end select
    
    ! Heat conductance at the next timestep
    do i = 1, M
      lamw(i) = lamw0 + KT(i) + lamw_back(i) 
    enddo
    
    !The scales of turbulence
    call TURB_SCALES(gsp,ls, bathymwater, wst, RadWater, &
    & k_turb_T_flux, T_massflux, row, eflux0_kinem, &
    & turb_density_flux, Buoyancy0, tau_air-tau_wav, kor, i_maxN, H_mixed_layer,maxN, w_conv_scale, &
    & T_conv_scale, Wedderburn, LakeNumber, Rossby_rad, ThermThick, ReTherm, RiTherm, trb)
    
    if (zero_model%par == 1) then
    ! Note that zero model is impemented currently only for
    ! 1. one-point simulation
    ! 2. open water conditions
    ! Not operational, when net radiation is given instead of atmospheric radiation
      call ZERODIM_MODEL &
      & (h1, dt, &
      & shortwave, longwave, tempair, humair, pressure, &
      & uwind, vwind, zref, hw_input, xlew_input, cdmw_input, surfrad_input, &
      & cloud, botflux, T_0dim)
    endif
      
    h2 = h1 + dhw
    ls2 = ls1 + dls
    l2 = 0.
    
    ENDIF if1   
    
    if2: IF (layer_case == 2) THEN
    
    !---------------------------CASE 2: WATER AND ICE ("Winter")------------------------------
    
    !call TIMEC(1)
    
    ! Creation of the initial thin ice layer
    if (l1 == 0.) then
      l1 = min_ice_thick; dhi = 0.; dhi0 = 0.; dhilow = 0.; dhihigh = 0.
      h1 = h1 - min_ice_thick * roi/row0
      x = Meltpnt(Sal1(1),0.e0_ireals,nmeltpoint%par)
      if (tempair < 0.) then    
        do i = 1, Mice+1
          Ti1(i) = tempair + float(i-1)/float(Mice) * (x - tempair)
        enddo 
      else 
        Ti1(:) = x - T_phase_threshold
      endif
      porice(:) = poricebot * saltice%par  !Initial ice salinity
      salice(:) = porice(:) * Sal1(1) * row0  !Initial ice porosity
    end if 
    
    !Check for water temperature to be higher than melting point
    do i = 2, M
      Tw1(i) = max(Tw1(i),Meltpnt(Sal1(i),preswat(i),nmeltpoint%par))
    enddo
    
    !Creation of the initial thin water layer
    if (h1 == 0.) then
      h1 = min_water_thick; dhw = 0.; dhw0 = 0.
      Sal1(:) = 1.d-5
      Tw1(:) = Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par) + T_phase_threshold
      l1 = l1 - min_water_thick * row0_d_roi
    end if
    
    !Creation of the initial thin bottom ice layer
    x = Meltpnt(Sal1(M+1),preswat(M+1),nmeltpoint%par)
    if (WATER_FREEZE_MELT(Tw1(M+1), 0.5*ddz(M)*h1, x, +1) .and. &
    & ls1 == 0 .and. h1 - min_ice_thick * roi/row0 > min_water_thick) then
      ls1 = min_ice_thick; dls = 0.; dls0 = 0.
      Tis1 = x - T_phase_threshold
      h1 = h1 - min_ice_thick * roi/row0
    endif
    
    ! Updating bathymetry 
    call BATHYMETRY(M,Mice,ns,ix,iy,ndatamax,month,day,lakeform,hour,dt, &
                    & depth_area,area_lake,cellipt, &
                    & multsoil,trib_inflow,dhwtrib,vol,botar)
    
    
    !Calculation of water density profile at the current timestep
    call DENSITY_W(M,eos%par,lindens%par,Tw1,Sal1,preswat,row)
    
    ! Note: the salinity effects and partial ice coverage 
    ! are currently neglected in density flux at the ice-water interface
    eflux0_kinem_water = - lamw(1)*(Tw1(2)-Tw1(1))/(ddz(1)*h1*cw_m_row0) ! The first-order approximation
    turb_density_flux = TURB_DENS_FLUX(eflux0_kinem_water,0.e0_ireals,Tw1(1),0.e0_ireals)
    Buoyancy0 = g/row0*turb_density_flux
    
    !Currently the EDMF parameterization of convection is not implemented in the code
    !during 'winter' (if the ice layer is present over
    !water layer). This seems to be reasonable, since the temperature profile
    !is stable in this case - until spring convection under thin ice
    !develops.
    
    PEMF = 0.e0_ireals
    pt_down_f = 0.e0_ireals
    
    ! Updating tributaries data and adding inflow of all substances
    if (tribheat%par > 0) then
      call TRIBTEMP(time,dt,h1,dhwtrib,z_full,area_int,area_half,gsp,gas,wst,spinup_done)
      ! Adding tendency due to mean vertical velocity
      call VERTADV_UPDATE(M,dt,h1,gsp,bathymwater,wst,gas)
    endif
    
    ! Specification of volumetric heat capacity and heat conductance for ice
    if   (saltice%par == 0) then
      !Pure ice
      ci_m_roi_v(:) = ci_m_roi
      lami_v    (:) = lami
    elseif (saltice%par == 1) then
      !Ice with por * saltwater%pares filled with water
      do i = 1, Mice+1
        ci_m_roi_v(i) = ci*roi*(1. - porice(i)) + cw*row0*porice(i)
      enddo
      do i = 1, Mice
        x = 0.5*(porice(i) + porice(i+1))
        lami_v(i)      = lami  *(1. - x) + lamw0  *x
      enddo
    endif
    
    
    !CASE 2.1: WATER, ICE AND SNOW 
    
    if (flag_snow == 1) then
    
      call MIXED_LAYER_CALC(row,ddz,ddz2,dzeta_int,dzeta_05int,h1,M,i_ML,H_mixed_layer,maxN)
    
    ! Radiation fluxes in physical layers
      SR_botsnow = shortwave*(1-albedoofsnow)
      if (flag_snow_init /= 1) then
        do i = itop, ms-1
          SR_botsnow = SR_botsnow*EXTINCT_SNOW(dens(i))**dz(i)
        enddo
      endif
      forall (i=1:nbands) radflux(i) = fracbands(i)*SR_botsnow ! assuming the spectrum does not change in snow
      call RadIce  %RAD_UPDATE(ddzi05(0:Mice)*l1, radflux) !(/SR_botsnow/))
      forall (i=1:nbands) radflux(i) = RadIce%flux(Mice+1,i)
      call RadWater%RAD_UPDATE(ddz05 (0:M   )*h1, radflux) !(/RadIce%flux(Mice+1,1)/))
    ! Calculating photic zone depth (<1% of surface irradiance)
      if (RadWater%integr(1) > 0) then
        H_photic_zone = h1
        do i = 1, M
          if (RadWater%integr(i)/RadWater%integr(1) < photic_threshold) then
            H_photic_zone = z_full(i)
            exit
          endif
        enddo
      else
        H_photic_zone = 0.
      endif
      if (ls1 /= 0.e0_ireals) then
        forall (i=1:nbands) radflux(i) = RadWater%flux(M+1,i)
        call RadDeepIce%RAD_UPDATE(ddzi05(0:Mice)*ls1, radflux) ! (/RadWater%flux(M+1,1)/))
      endif
    
    
    ! Calculation of the layer's thickness increments
      flux1 = - lami_v(Mice)*(Ti1(Mice+1)-Ti1(Mice))/(ddzi(Mice)*l1) + RadIce%integr(Mice) + &
      & ci_m_roi_v(Mice+1)*(dhi-dhi0)*(Ti1(Mice+1)-Ti1(Mice))/(2.d0*dt)
      flux2 = - lamw(1)*(Tw1(2)-Tw1(1))/(ddz(1)*h1) + RadWater%integr(1) + &
      & cw_m_row0*dhw0*(Tw1(2)-Tw1(1))/(2.*dt) + &
      & cw_m_row0*PEMF(1)*(pt_down_f(1)-0.5d0*(Tw1(2)+Tw1(1)) )
      ! Limiting the freezing/melting rate by the thicknesses of water and ice
      dhwlow = min(max(dt*(flux1 - flux2)/(row0_m_Lwi),-ddz(1)*h1),ddzi(Mice)*l1*roi_d_row0)
      dhilow = - dhwlow*row0_d_roi
      if (saltice%par == 1) then
        dhwlow = dhwlow * (1. + porice(Mice+1)*row0_d_roi / (1. - porice(Mice+1)) )
        dhilow = dhilow * (1. / (1. - porice(Mice+1)) )
      endif
      x = Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par)
      ! Melting point is that of fresh water, because it is pure ice that melts at the ice top
      if (Ti1(1) > x + T_phase_threshold) then 
        dhwhigh = (Ti1(1) - x - T_phase_threshold) * &
        & ci_m_roi_v(1)*l1*ddzi(1)*0.5d0/(row0_m_Lwi)
        dhihigh = - dhwhigh*row0_d_roi
        Ti1(1) = x + T_phase_threshold
        if (saltice%par == 1) then
          dhwhigh = dhwhigh * (1. + porice(1)*row0_d_roi / (1. - porice(1)) )
          dhihigh = dhihigh * (1. / (1. - porice(1)) )
        endif
      else
        dhwhigh = 0.e0_ireals
        dhihigh = 0.e0_ireals
      endif
      !Treatment of water freezing at the snow-ice interface
      !Porosity and salinity assumed zero at the ice top, so this parameterization is valid
      !for fresh ice only.
      !Freezing snowmelt
      call SNOW_COND_HEAT_COEF() !Needed for cs update
      y = 0.5*(cs(ms)*dens(ms)*dz(ms) + ci_m_roi_v(1)*ddzi(1)*l1)! Heat capacity of snow-ice interface
      dTmax = max((1. - snmeltwat)*snmelt*dt*row0*Lwi/y, 0._ireals)
      dTisnmelt = min(dTmax, x + T_phase_threshold - Ti1(1)) ! x -- melting point!
      dTisnmelt = max(dTisnmelt, 0._ireals)
      fracsn = dTisnmelt/(dTmax + small_value) !Fraction of snowmelt, frozen at the ice top
      snmeltice = dTmax*y/(row0*Lwi)*fracsn
      dhihigh = dhihigh + snmeltice*row0_d_roi ! Adding snowmelt, frozen at the top of ice
    
      !Assessing impoundment of ice from above by water penetrated through cracks
      !Porosity and salinity assumed zero at the ice top (fresh ice is assumed!)
      dTmax = max((snowmass + l1*(roi - row0))*Lwi/y, 0._ireals)
      dTiimp = min(dTmax, x + T_phase_threshold - Ti1(1) - dTisnmelt) ! x -- melting point!
      dTiimp = max(dTiimp, 0._ireals)
      fracimp = dTiimp/(dTmax + small_value)
      dhiimp = icetopfr * dTmax*y/(Lwi*row0)*fracimp
      dhihigh = dhihigh + dhiimp*row0_d_roi
      dhwhigh = dhwhigh - dhiimp
    
      !The showmelt water reaching the water column
      dhwsnmelt = snmeltwat*snmelt*dt + (1. - snmeltwat)*snmelt*dt*(1. - fracsn)
      if (ls1 /= 0) then
        ice = 1; snow = 1; water = 1; deepice = 1
        flux1 = - lamw(M)*(Tw1(M+1)-Tw1(M))/(ddz(M)*h1) + RadWater%integr(M) + &
        & cw_m_row0*(dhw-dhw0)*(Tw1(M+1)-Tw1(M))/(2.d0*dt) + &
        & cw_m_row0*PEMF(M)*(pt_down_f(M)-0.5d0*(Tw1(M+1)+Tw1(M)) )
        flux2 = - lami*(Tis1(2)-Tis1(1))/(ddzi(1)*ls1) + RadDeepIce%integr(1) + &
        & ci_m_roi*dls0*(Tis1(2)-Tis1(1))/(2.d0*dt)
        dhwls = dt*(flux1 - flux2)/(row0_m_Lwi)
        dls = - dhwls*row0_d_roi
        dhw = dhwhigh + dhwlow  + dhwfsoil + dhwls + dhwtrib
        dhw = dhw + dhwsnmelt
        dhw0 = dhwlow + dhwhigh 
        dhw0 = dhw0 + dhwsnmelt
        dls0 = dls
      else
        ice = 1; snow = 1; water = 1; deepice = 0
        dls = 0.
        dhwls = 0.
        dhw =  dhwhigh + dhwlow + dhwfsoil + dhwtrib 
        dhw = dhw + dhwsnmelt
        dhw0 = dhwlow + dhwhigh
        dhw0 = dhw0 + dhwsnmelt
      endif
      dhi = dhilow + dhihigh 
      dhi0 = dhihigh
    
      if (soilswitch%par == 1) then
        call SOIL_COND_HEAT_COEF(nsoilcols)
      endif
      ! Calculation of heat sources from heat fluxes from mutliple soil columns
      if (multsoil) then
        call SOILCOLSTEMP(gs,gsp,dt,ls,ftot,ch4_pres_atm,ddz,ddzi,zsoilcols, &
                         & wst,RadWater%integr,a,b,c,d,add_to_winter, &
                         & bathymwater,bathymice, &
                         & bathymdice,bathymsoil(1,ix,iy), &
                         & soilflux(1,ix,iy), fdiffbot, (/1,0/))
        call LATERHEAT(ix,iy,gs,ls, &
        & bathymwater,bathymice,bathymdice,bathymsoil, &
        & gsp,soilflux(1,ix,iy),.false.,lsh)
      endif
      ! Calculation of the whole temperature profile 
      call T_SOLVER(ix,iy,dnx,dny,year,month,day,hour,phi, &
      & RadWater, RadIce, SurfTemp, fetch, dt)
      if (soilswitch%par == 1) then
        call SOILFORLAKE(dt,a,b,c,d,nsoilcols)
      endif
    
      !Assuming all dissolved species diffuse with the same molecular diffusivity as salinity
      lamsal(:)    = (lamw(:) - lamw0)/cw_m_row0 * alsal    + lamsal0
      lammeth(:)   = (lamw(:) - lamw0)/cw_m_row0 * almeth   + lamsal0
      lamoxyg(:)   = (lamw(:) - lamw0)/cw_m_row0 * aloxyg   + lamsal0
      lamcarbdi(:) = (lamw(:) - lamw0)/cw_m_row0 * alcarbdi + lamsal0
      lampart  (:) = (lamw(:) - lamw0)/cw_m_row0 * alcarbdi !no molecular diffusion for particles
    
      ! Salinity profile in water and soil
      call S_DIFF(dt,ls,salice)
      if (saltice%par == 1) call UPDATE_ICE_SALINITY(dt,ls,wst)
      if (soilswitch%par == 1) then
        ! Calculation of methane in all soil columns, except for the lowest one
        if (multsoil) then
          call SOILCOLSTEMP(gs,gsp,dt,ls,ftot,ch4_pres_atm,ddz,ddzi,zsoilcols, &
                           & wst,RadWater%integr,a,b,c,d,add_to_winter, &
                           & bathymwater,bathymice, &
                           & bathymdice,bathymsoil(1,ix,iy), &
                           & soilflux(1,ix,iy), fdiffbot, (/0,1/))
          methsoilflux(1:nsoilcols-1) = fdiffbot(1:nsoilcols-1)
        endif
      endif
      call SNOWTEMP(ix,iy,dnx,dny,year,month,day,hour,snowmass, &
      & snowmass_init,a,b,c,d,Temp,phi,fetch,dt)
    
      ! Oxygen model precedes methane module, in order sedimentary 
      ! oxygen demand to be available for the latter
      call CHLOROPHYLLA(z_full, H_mixed_layer, H_photic_zone, extwat, RadWater, gas, M, Chl_a, itroph)
      call OXYGEN_PRODCONS(gs, gsp, wst, bathymsoil, gas, area_int, area_half, ddz05, &
      & h1, dt, Tsoil3, Chl_a, dzs, por, oxygsoil, itroph, &
      & prodox, resp, bod, sod, sodbot)
    
      if (soilswitch%par == 1) then
        call BUBBLE_BLOCK
        ! Calculation of methane sources from methane fluxes from mutliple soil columns
        if (multsoil) then 
          call LATERHEAT(ix,iy,gs,ls, &
          & bathymwater,bathymice,bathymdice,bathymsoil, &
          & gsp,methsoilflux,.true.,lsm)
          call LATERHEAT(ix,iy,gs,ls, &
          & bathymwater,bathymice,bathymdice,bathymsoil, &
          & gsp,co2soilflux, .true.,lsc)
          call LATERHEAT(ix,iy,gs,ls, &
          & bathymwater,bathymice,bathymdice,bathymsoil, &
          & gsp,o2soilflux,  .true.,lso)
        endif 
      endif
      gs%isoilcol = nsoilcols
      call METHANE &
      & (gas,pressure,wind10,ch4_pres_atm,zsoil,Tsoil3(1,nsoilcols),rosoil,fbbleflx_ch4_sum, &
      & fbbleflx_ch4(0,nsoilcols),wl4(1,nsoilcols),wi2(1,nsoilcols),wa,Sals1, &
      & rootss,rosdry,por,veg,0._ireals,TgrAnn, methgenmh, &
      & ddz,ddz05,wst, lammeth, h1, ls, dhw, dhw0, .true., .false. ,&
      & lsm, bathymwater, &
      & fplant, febul0(nsoilcols), fdiffbot(nsoilcols), ftot, fdiff_lake_surf, &
      & plant_sum,bull_sum,oxid_sum,rprod_sum, &
      & anox,gs,gsp,dt,eps1(1),sodbot,rprod_total_oldC,rprod_total_newC, &
      & ice_meth_oxid_total, &
      & h_talik,tot_ice_meth_bubbles,add_to_winter)
      qmethane(1:M+1) = qwater(1:M+1,2)
      qmethane(M+2:M+ns) = qsoil(2:ns,nsoilcols)
    
      call ADDOXPRODCONS(M,i_maxN,H_mixed_layer,H_photic_zone,prodox,resp,bod,sod,RadWater,dt,ls,gas)
      call OXYGEN (gs, Tw2, fbbleflx_o2_sum, fbbleflx_o2(0,nsoilcols), lamoxyg, gsp, fracb0, pressure, wind10, &
      & o2_pres_atm, ls, bathymwater, lso, dt, febul0(nsoilcols), eps1(1), sodbot, oxyg, soilswitch%par, fo2)
      call CARBON_DIOXIDE (gs, Tw2, fbbleflx_co2_sum, fbbleflx_co2(0,nsoilcols), lamcarbdi, gsp, bathymwater, lsc, fracb0, &
      & pressure, wind10, co2_pres_atm, febul0(nsoilcols), ls, dt, eps1(1), sodbot, gas, soilswitch%par, fco2)
      call PHOSPHORUS(M,dt,ls,gsp,bathymwater,gas,lsp,lamcarbdi)
      call METHANE_OXIDATION(M, i_maxN, dt, ddz, h1, bathymwater, oxyg(1,2), qwater(1,2), DIC(1,2), Tw2, &
      & qwateroxidtot, qwateroxidML)
    
    !Calculation of water current's velocities and turbulent characteristics
      if (Turbpar%par /= 1) then
      
        if (Turbpar%par == 2) then
          call MOMENTUM_SOLVER(ix, iy, dnx, dny, ndatamax, &
          & year, month, day, hour, kor, a_veg, c_veg, h_veg, &
          & alphax, alphay, dt, b0, tau_air, tau_i, tau_gr, tau_wav, fetch, depth_area)  
        endif
    
        !Calculation of water density profile at the current timestep
        call DENSITY_W(M,eos%par,lindens%par,Tw2,Sal2,preswat,row2)
    
        if (Turbpar%par == 2) then
          !$OMP PARALLEL NUM_THREADS(num_ompthr) IF(omp%par == 1)
          do i = 1, nstep_keps%par
            call K_EPSILON(ix,iy,dnx,dny, year, month, day, hour, &
            & kor, a_veg, c_veg, h_veg, dt_keps, &
            & b0, tau_air, tau_wav, tau_i, tau_gr, roughness, fetch) ! 0.5*tau_wav 0.5 - arbitrary (!) fraction of momentum loss due to wave breaking
          enddo
          !$OMP END PARALLEL
        else
    !     Calculation of the of eddy difusivity for temperature
          SELECT CASE (Turbpar%par)
            CASE (8)
              ! Hostetler formulation
              !call ED_TEMP_HOSTETLER &
              !& (wind,velfrict_prev,zref,phi,z_full,row,KT,M)
              KT(:) = 0.
              call UnDenGrMix(M,eos%par,ddz*h1,dzs(1),csoil(1),rosoil(1),Tw2,Sal2,preswat,row)
            CASE (9)
              ! Modified Hostetler formulation for shallow lake
              ! call ED_TEMP_HOSTETLER2 &
              ! & (wind,velfrict_prev,zref,phi,z_full,row,KT,M)
              KT(:) = 0. !cw_m_row0*KT(:)
            CASE (1)
              do i = 1, M
                KT(i) = (k2(i)-niu_wat)*cw_m_row0 
              enddo
            CASE DEFAULT
              KT = lamTM*k2*cw_m_row0 
          ENDSELECT 
        endif
    
        !Background vertical diffusivity
        !select case(backdiff%par)
        !case(0)
          lamw_back(:) = 0.
        !case(1)
        !  call DIFFMIN_HS(area_lake,wst,gsp,ls,M) !Calculating background heat conductance
        !end select
    
        do i = 1, M
          lamw(i) = lamw0 + KT(i) + lamw_back(i) !+KC(i)
        enddo  
    
      else
        lamw = lamw0*3.d0
      endif
      
      
      h2 = h1 + dhw
      l2 = l1 + dhi 
      ls2 = ls1 + dls
      
    else
    
    !CASE 2.2: WATER AND ICE WITHOUT SNOW
    
      call MIXED_LAYER_CALC(row,ddz,ddz2,dzeta_int,dzeta_05int,h1,M,i_ML,H_mixed_layer,maxN)
    
    !Radiation fluxes in layers
      Erad = shortwave*(1-albedoofice)
      forall (i=1:nbands) radflux(i) = Erad*fracbands(i)
      call RadIce  %RAD_UPDATE(ddzi05(0:Mice)*l1, radflux)! (/Erad/))
      forall (i=1:nbands) radflux(i) = RadIce%flux(Mice+1,i)
      call RadWater%RAD_UPDATE(ddz05 (0:M   )*h1, radflux)!(/RadIce%flux(Mice+1,1)/))
    ! Calculating photic zone depth (<1% of surface irradiance)
      if (RadWater%integr(1) > 0) then
        H_photic_zone = h1
        do i = 1, M
          if (RadWater%integr(i)/RadWater%integr(1) < photic_threshold) then
            H_photic_zone = z_full(i)
            exit
          endif
        enddo
      else
        H_photic_zone = 0.
      endif
      if (ls1 /= 0.e0_ireals) then
        forall (i=1:nbands) radflux(i) = RadWater%flux(M+1,i)
        call RadDeepIce%RAD_UPDATE(ddzi05(0:Mice)*ls1, radflux) !(/RadWater%flux(M+1,1)/))
      endif
    
    !Calculation of the layer's thickness increments
      x = Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par)
      ! Melting point is that of fresh water, because it is pure ice that melts at the ice top
      if (Ti1(1) > x + T_phase_threshold) then
        dhwhigh = (Ti1(1) - x - T_phase_threshold) * &
        & ci_m_roi_v(1)*ddzi(1)*l1*0.5d0/(row0_m_Lwi)
        dhis = 0. 
        dhihigh = - dhwhigh*row0_d_roi   
        if (saltice%par == 1) then
          dhwhigh = dhwhigh * (1. + porice(1)*row0_d_roi / (1. - porice(1)) )
          dhihigh = dhihigh * (1. / (1. - porice(1)) )
        endif
        Ti1(1) = x + T_phase_threshold
      endif
    
    ! Creation of the initial thin snow layer - to be considered at the next timestep
      if (precip > 0. .and. tempair < 0. .and. l1 > 0.05) then
        snowmass = snowmass + precip*dt*row0
        if (snowmass/rofrsn >= 2.*dzmin) then
          flag_snow = 1
          hs1 = 2.*dzmin !0.02
          itop = ms-2
        endif
        dhip = 0.
      else
        dhip = precip*row0_d_roi*dt
      end if
      if (tempair > 0. .and. snowmass > 0.) then
        dhip = dhip + snowmass/row0
        snowmass = 0.
      endif
    
      flux1 = - lami_v(Mice)*(Ti1(Mice+1)-Ti1(Mice))/(ddzi(Mice)*l1)+RadIce%integr(Mice) + &
      &  ci_m_roi_v(Mice+1)*(dhi-dhi0)*(Ti1(Mice+1)-Ti1(Mice))/(2.d0*dt)
      flux2 = -lamw(1)*(Tw1(2)-Tw1(1))/(ddz(1)*h1) + RadWater%integr(1) + &
      &  cw_m_row0*dhw0*(Tw1(2)-Tw1(1))/(2.*dt) + &
      &  cw_m_row0*PEMF(1)*(pt_down_f(1)-0.5d0*(Tw1(2)+Tw1(1)) )
      ! Limiting the freezing/melting rate by the thicknesses of water and ice
      dhwlow = min(max(dt*(flux1 - flux2)/(row0_m_Lwi),-ddz(1)*h1),ddzi(Mice)*l1*roi_d_row0)
      dhilow = - dhwlow*row0_d_roi
      !Correction of layers increments in a case of porous and saline ice
      if (saltice%par == 1) then
        dhwlow = dhwlow * (1. + porice(Mice+1)*row0_d_roi / (1. - porice(Mice+1)) )
        dhilow = dhilow * (1. / (1. - porice(Mice+1)) )
      endif
    
      if (Ti1(1) < Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par) + T_phase_threshold) then
        dhis = - Elatent/(roi*Liv)*dt
        dhwhigh = 0
        dhihigh = 0
      endif
      dhi = dhihigh + dhilow + dhis + dhip
      dhi0 = dhis + dhihigh + dhip
      if (ls1 /=0 ) then
        ice = 1; snow = 0; water = 1; deepice = 1 
        flux1 = - lamw(M)*(Tw1(M+1)-Tw1(M))/(ddz(M)*h1) + RadWater%integr(M) + &
        & cw_m_row0*(dhw-dhw0)*(Tw1(M+1)-Tw1(M))/(2.d0*dt) + &
        & cw_m_row0*PEMF(M)*(pt_down_f(M)-0.5d0*(Tw1(M+1)+Tw1(M)) )
        flux2 = - lami*(Tis1(2)-Tis1(1))/(ddzi(1)*ls1) + RadDeepIce%integr(1) + &
        & ci_m_roi*dls0*(Tis1(2)-Tis1(1))/(2.d0*dt)
        dhwls = dt*(flux1 - flux2)/(row0_m_Lwi)
        dls = - dhwls*row0_d_roi
        dls0 = dls
        dhw = dhwhigh + dhwfsoil + dhwls + dhwlow + dhwtrib
        dhw0 = dhwhigh + dhwlow
      else
        ice = 1; snow = 0; water = 1; deepice = 0
        dhw = dhwhigh + dhwfsoil + dhwlow + dhwtrib
        dhw0 = dhwhigh + dhwlow
        dls = 0.
      endif
    
      if (soilswitch%par == 1) then
        call SOIL_COND_HEAT_COEF(nsoilcols)
      endif
      ! Calculation of heat sources from heat fluxes from mutliple soil columns
      if (multsoil) then 
        call SOILCOLSTEMP(gs,gsp,dt,ls,ftot,ch4_pres_atm,ddz,ddzi,zsoilcols, &
                         & wst,RadWater%integr,a,b,c,d,add_to_winter, &
                         & bathymwater,bathymice, &
                         & bathymdice,bathymsoil(1,ix,iy), &
                         & soilflux(1,ix,iy), fdiffbot, (/1,0/))
        call LATERHEAT(ix,iy,gs,ls, &
        & bathymwater,bathymice,bathymdice,bathymsoil, &
        & gsp,soilflux(1,ix,iy),.false.,lsh)
      endif
      ! Calculation of the whole temperature profile
      call T_SOLVER(ix,iy,dnx,dny,year,month,day,hour,phi, &
      & RadWater, RadIce, SurfTemp, fetch, dt)
      if (soilswitch%par == 1) then
        call SOILFORLAKE(dt,a,b,c,d,nsoilcols)
      endif
    
      !Assuming all dissolved species diffuse with the same molecular diffusivity as salinity
      lamsal(:)    = (lamw(:) - lamw0)/cw_m_row0 * alsal    + lamsal0
      lammeth(:)   = (lamw(:) - lamw0)/cw_m_row0 * almeth   + lamsal0
      lamoxyg(:)   = (lamw(:) - lamw0)/cw_m_row0 * aloxyg   + lamsal0
      lamcarbdi(:) = (lamw(:) - lamw0)/cw_m_row0 * alcarbdi + lamsal0
      lampart  (:) = (lamw(:) - lamw0)/cw_m_row0 * alcarbdi !no molecular diffusion for particles
    
      ! Salinity profile in water and soil
      dhwsnmelt = 0.  !Needed in S_DIFF
      call S_DIFF(dt,ls,salice)
      if (saltice%par == 1) call UPDATE_ICE_SALINITY(dt,ls,wst)
      ! Oxygen model precedes methane module, in order sedimentary 
      ! oxygen demand to be available for the latter
      call CHLOROPHYLLA(z_full, H_mixed_layer, H_photic_zone, extwat, RadWater, gas, M, Chl_a, itroph)
      call OXYGEN_PRODCONS(gs, gsp, wst, bathymsoil, gas, area_int, area_half, ddz05, &
      & h1, dt, Tsoil3, Chl_a, dzs, por, oxygsoil, itroph, &
      & prodox, resp, bod, sod, sodbot)
    
      if (soilswitch%par == 1) then
      ! Calculation of temperature in all soil columns, except for the lowest one
        if (multsoil) then
          call SOILCOLSTEMP(gs,gsp,dt,ls,ftot,ch4_pres_atm,ddz,ddzi,zsoilcols, &
                           & wst,RadWater%integr,a,b,c,d,add_to_winter, &
                           & bathymwater,bathymice, &
                           & bathymdice,bathymsoil(1,ix,iy), &
                           & soilflux(1,ix,iy), fdiffbot, (/0,1/))
          methsoilflux(1:nsoilcols-1) = fdiffbot(1:nsoilcols-1)
        endif
        ! Calling bubble model
        call BUBBLE_BLOCK
        ! Calculation of methane sources from methane fluxes from mutliple soil columns
        if (multsoil) then 
          call LATERHEAT(ix,iy,gs,ls, &
          & bathymwater,bathymice,bathymdice,bathymsoil, &
          & gsp,methsoilflux,.true.,lsm)
          call LATERHEAT(ix,iy,gs,ls, &
          & bathymwater,bathymice,bathymdice,bathymsoil, &
          & gsp,co2soilflux, .true.,lsc)
          call LATERHEAT(ix,iy,gs,ls, &
          & bathymwater,bathymice,bathymdice,bathymsoil, &
          & gsp,o2soilflux,  .true.,lso)
        endif
      endif
      gs%isoilcol = nsoilcols
      call METHANE &
      & (gas,pressure,wind10,ch4_pres_atm,zsoil,Tsoil3(1,nsoilcols),rosoil,fbbleflx_ch4_sum, &
      & fbbleflx_ch4(0,nsoilcols),wl4(1,nsoilcols),wi2(1,nsoilcols),wa,Sals1, &
      & rootss,rosdry,por,veg,0._ireals,TgrAnn, methgenmh, &
      & ddz,ddz05,wst, lammeth, h1, ls, dhw, dhw0, .true., .false., &
      & lsm, bathymwater, &
      & fplant, febul0(nsoilcols), fdiffbot(nsoilcols), ftot, fdiff_lake_surf, &
      & plant_sum,bull_sum,oxid_sum,rprod_sum, &
      & anox,gs,gsp,dt,eps1(1),sodbot,rprod_total_oldC,rprod_total_newC, &
      & ice_meth_oxid_total, &
      & h_talik,tot_ice_meth_bubbles,add_to_winter)
      qmethane(1:M+1)    = qwater(1:M+1,2)
      qmethane(M+2:M+ns) = qsoil (2:ns,nsoilcols)
    
      call ADDOXPRODCONS(M,i_maxN,H_mixed_layer,H_photic_zone,prodox,resp,bod,sod,RadWater,dt,ls,gas)
      call OXYGEN (gs, Tw2, fbbleflx_o2_sum, fbbleflx_o2(0,nsoilcols), lamoxyg, gsp, fracb0, pressure, wind10, &
      & o2_pres_atm, ls, bathymwater, lso, dt, febul0(nsoilcols), eps1(1), sodbot, oxyg, soilswitch%par, fo2)
      call CARBON_DIOXIDE (gs, Tw2, fbbleflx_co2_sum, fbbleflx_co2(0,nsoilcols), lamcarbdi, gsp, bathymwater, lsc, fracb0, &
      & pressure, wind10, co2_pres_atm, febul0(nsoilcols), ls, dt, eps1(1), sodbot, gas, soilswitch%par, fco2)
      call PHOSPHORUS(M,dt,ls,gsp,bathymwater,gas,lsp,lamcarbdi)
      call METHANE_OXIDATION(M, i_maxN, dt, ddz, h1, bathymwater, oxyg(1,2), qwater(1,2), DIC(1,2), Tw2, &
      & qwateroxidtot, qwateroxidML)
    
    !Calculation of water current's velocities and turbulent characteristics
      if (Turbpar%par /= 1) then
      
        if (Turbpar%par == 2) then
          call MOMENTUM_SOLVER(ix, iy, dnx, dny, ndatamax, &
          & year, month, day, hour, kor, a_veg, c_veg, h_veg, &
          & alphax, alphay, dt, b0, tau_air, tau_i, tau_gr, tau_wav, fetch, depth_area)  
        endif
    
        !Calculation of water density profile at the current timestep
        call DENSITY_W(M,eos%par,lindens%par,Tw2,Sal2,preswat,row2)
    
        if (Turbpar%par == 2) then
          !$OMP PARALLEL NUM_THREADS(num_ompthr) IF(omp%par == 1)
          do i = 1, nstep_keps%par
            call K_EPSILON(ix,iy,dnx,dny, &
            & year, month, day, hour, kor, a_veg, c_veg, h_veg, dt_keps, &
            & b0, tau_air, tau_wav, tau_i, tau_gr, roughness, fetch) ! 0.5*tau_wav  0.5 - arbitrary (!) fraction of momentum loss due to wave breaking
          enddo
          !$OMP END PARALLEL
        else
    !     Calculation of the of eddy difusivity for temperature
          SELECT CASE (Turbpar%par)
            CASE (8)
              ! Hostetler formulation
              ! call ED_TEMP_HOSTETLER &
              ! & (wind,velfrict_prev,zref,phi,z_full,row,KT,M)
              KT(:) = 0.
              call UnDenGrMix(M,eos%par,ddz*h1,dzs(1),csoil(1),rosoil(1),Tw2,Sal2,preswat,row)
            CASE (9)
              ! Modified Hostetler formulation for shallow lake
              ! call ED_TEMP_HOSTETLER2 &
              ! & (wind,velfrict_prev,zref,phi,z_full,row,KT,M)
              KT(:) = 0.
            CASE (1)
              do i = 1, M
                KT(i) = (k2(i)-niu_wat)*cw_m_row0 
              enddo
            CASE DEFAULT
              KT = lamTM*k2*cw_m_row0 
          ENDSELECT 
        endif
    
        !Background vertical diffusivity
        !select case(backdiff%par)
        !case(0)
          lamw_back(:) = 0.
        !case(1)
        !  call DIFFMIN_HS(area_lake,wst,gsp,ls,M) !Calculating background heat conductance
        !end select
    
        do i = 1, M
          lamw(i) = lamw0 + KT(i) + lamw_back(i) !+KC(i)
        enddo 
        
      else
        lamw = lamw0*3.d0
      endif
      
    
      h2 = h1 + dhw
      l2 = l1 + dhi
      ls2 = ls1 + dls
     
    endif
    
    !Diagnostic calculations
    do i = 1, M
      k_turb_T_flux(i) = - 0.5*lamw(i)/(cw_m_row0) * &
      & ( Tw2(i+1) + Tw1(i+1) - Tw2(i) - Tw1(i)) / (ddz(i)*h1)
      T_massflux(i) = PEMF(i)*(pt_down_f(i)-0.5d0*(Tw2(i+1)+Tw2(i)))
    enddo
    
    
    !The scales of turbulence
    call TURB_SCALES(gsp,ls, bathymwater, wst, RadWater, &
    & k_turb_T_flux, T_massflux, row, eflux0_kinem_water, &
    & turb_density_flux, Buoyancy0, tau_air-tau_wav, kor, i_maxN, H_mixed_layer,maxN, w_conv_scale, &
    & T_conv_scale, Wedderburn, LakeNumber, Rossby_rad, ThermThick, ReTherm, RiTherm, trb)
     
    ENDIF if2
    
    !CASE 3: ICE WITHOUT WATER
    
    if3: IF (layer_case == 3) THEN
    
    ! Specification of volumetric heat capacity and heat conductance for ice
    if   (saltice%par == 0) then
      !Pure ice
      ci_m_roi_v(:) = ci_m_roi
      lami_v    (:) = lami
    elseif (saltice%par == 1) then
      !Ice with pores filled with water
      do i = 1, Mice+1
        ci_m_roi_v(i) = ci*roi*(1. - porice(i)) + cw*row0*porice(i)
      enddo
      do i = 1, Mice
        x = 0.5*(porice(i) + porice(i+1))
        lami_v(i)      = lami  *(1. - x) + lamw0  *x
      enddo
    endif
       
    !CASE 3.1: ICE WITH SNOW
    
    if (flag_snow == 1) then
    
    ! Radiation fluxes
      SR_botsnow = shortwave*(1-albedoofsnow)
      if (flag_snow_init /= 1) then
        do i = itop, ms-1
          SR_botsnow = SR_botsnow*EXTINCT_SNOW(dens(i))**dz(i)
        enddo
      endif
      forall (i=1:nbands) radflux(i) = SR_botsnow*fracbands(i) !assuming spectrum does not change in snow
      call RadIce%RAD_UPDATE(ddzi05(0:Mice)*l1, radflux) !(/SR_botsnow/))
    
      x = Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par)
      ! Melting point is that of fresh water, because it is pure ice that melts at the ice top
      if (Ti1(1) > x + T_phase_threshold) then
        dhwhigh = (Ti1(1) - x - T_phase_threshold) * &
        & ci_m_roi_v(1)*l1*ddzi(1)*0.5d0/(row0_m_Lwi)
        dhif = - dhwhigh*row0_d_roi
        if (saltice%par == 1) then
          dhwhigh = dhwhigh * (1. + porice(1)*row0_d_roi / (1. - porice(1)) )
          dhif    = dhif * (1. / (1. - porice(1)) )
        endif
        Ti1(1) = x + T_phase_threshold
      else
        dhwhigh = 0
        dhif = 0
      endif
      dhwsnmelt = snmeltwat*snmelt*dt
      dhw = dhwsnmelt + dhwhigh + dhwtrib
      dhi = dhif
      dhi0 = dhi
      ice = 1; snow = 1; water = 0; deepice = 0
    
      call SNOW_COND_HEAT_COEF()
      if (soilswitch%par == 1) then
        call SOIL_COND_HEAT_COEF(nsoilcols)
      endif
      ! Calculation of heat sources from heat fluxes from mutliple soil columns
      if (multsoil) call LATERHEAT(ix,iy,gs,ls, &
      & bathymwater,bathymice,bathymdice,bathymsoil, &
      & gsp,soilflux(1,ix,iy),.false.,lsh)
      ! Temperature profile calculation
      call T_SOLVER(ix,iy,dnx,dny,year,month,day,hour,phi, &
      & RadWater, RadIce, SurfTemp, fetch, dt)
      if (soilswitch%par == 1) then
        call SOILFORLAKE(dt,a,b,c,d,nsoilcols)
      endif
    
      ! Salinity profile
      call S_DIFF(dt,ls,salice)
      if (saltice%par == 1) call UPDATE_ICE_SALINITY(dt,ls,wst)
      call SNOWTEMP(ix,iy,dnx,dny,year,month,day,hour,snowmass, &
      & snowmass_init,a,b,c,d,Temp,phi,fetch,dt)
      if (soilswitch%par == 1) then
        call BUBBLE_BLOCK
      endif
      gs%isoilcol = nsoilcols
      call METHANE &
      & (gas,pressure,wind10,ch4_pres_atm,zsoil,Tsoil3(1,nsoilcols),rosoil,fbbleflx_ch4_sum, &
      & fbbleflx_ch4(0,nsoilcols),wl4(1,nsoilcols),wi2(1,nsoilcols),wa,Sals1, &
      & rootss,rosdry,por,veg,0._ireals,TgrAnn, methgenmh, &
      & ddz,ddz05,wst, lammeth, h1, ls, dhw, dhw0, .true., .false., &
      & lsm, bathymwater, &
      & fplant, febul0(nsoilcols), fdiffbot(nsoilcols), ftot, fdiff_lake_surf, &
      & plant_sum,bull_sum,oxid_sum,rprod_sum, &
      & anox,gs,gsp,dt,eps1(1),sodbot,rprod_total_oldC,rprod_total_newC, &
      & ice_meth_oxid_total, &
      & h_talik,tot_ice_meth_bubbles,add_to_winter)
      qmethane(1:M+1)    = qwater(1:M+1,2)
      qmethane(M+2:M+ns) = qsoil (2:ns,nsoilcols)
    
    
      l2 = l1 + dhi 
      h2 = h1 + dhw
      ls2 = 0.
    
    else
    
    !CASE 3.2: ICE WITHOUT SNOW !
    
      ! Radiation fluxes
      Erad = shortwave*(1-albedoofice)
      forall (i=1:nbands) radflux(i) = Erad*fracbands(i)
      call RadIce%RAD_UPDATE(ddzi05(0:Mice)*l1, radflux) !(/Erad/))
    
      if (precip > 0 .and. tempair < 0) then
        flag_snow = 1
        hs1 = 2.*dzmin !0.02
        dhip = 0
      else
        dhip = precip*row0_d_roi*dt
      end if
      x = Meltpnt(0.e0_ireals,0.e0_ireals,nmeltpoint%par)
      if (Ti1(1) > x + T_phase_threshold) then
        dhw = (Ti1(1) - x - T_phase_threshold) * &
        & ci_m_roi_v(1)*l1*ddzi(1)*0.5d0/(row0_m_Lwi) + dhwtrib
        dhihigh = - dhw*row0_d_roi
        if (saltice%par == 1) then
          dhwhigh = dhwhigh * (1. + porice(1)*row0_d_roi / (1. - porice(1)) )
        endif
        dhis = 0
        Ti1(1) = x + T_phase_threshold
      else
        dhis = - Elatent/(roi*Liv)*dt
        dhw = 0.
        dhihigh = 0
      endif
      dhi = dhis + dhihigh + dhip
      dhi0 = dhi
      ice = 1; snow = 0; water = 0; deepice = 0 
    
      ! Temperature profile caluclation
      if (soilswitch%par == 1) then
        call SOIL_COND_HEAT_COEF(nsoilcols)
      endif
      ! Calculation of heat sources from heat fluxes from mutliple soil columns
      if (multsoil) call LATERHEAT(ix,iy,gs,ls, &
      & bathymwater,bathymice,bathymdice,bathymsoil, &
      & gsp,soilflux(1,ix,iy),.false.,lsh)
      call T_SOLVER(ix,iy,dnx,dny,year,month,day,hour,phi, &
      & RadWater, RadIce, SurfTemp, fetch, dt)
      if (soilswitch%par == 1) then
        call SOILFORLAKE(dt,a,b,c,d,nsoilcols)
      endif
    
      ! Salinity profile
      call S_DIFF(dt,ls,salice)
      if (saltice%par == 1) call UPDATE_ICE_SALINITY(dt,ls,wst)
      if (soilswitch%par == 1) then
        call BUBBLE_BLOCK
      endif
      gs%isoilcol = nsoilcols
      call METHANE &
      & (gas,pressure,wind10,ch4_pres_atm,zsoil,Tsoil3(1,nsoilcols),rosoil,fbbleflx_ch4_sum, &
      & fbbleflx_ch4(0,nsoilcols), wl4(1,nsoilcols),wi2(1,nsoilcols),wa,Sals1, &
      & rootss,rosdry,por,veg,0._ireals,TgrAnn, methgenmh, &
      & ddz,ddz05,wst, lammeth, h1, ls, dhw, dhw0, .true., .false., &
      & lsm, bathymwater, &
      & fplant, febul0(nsoilcols), fdiffbot(nsoilcols), ftot, fdiff_lake_surf, &
      & plant_sum,bull_sum,oxid_sum,rprod_sum, &
      & anox,gs,gsp,dt,eps1(1),sodbot,rprod_total_oldC,rprod_total_newC, &
      & ice_meth_oxid_total, &
      & h_talik,tot_ice_meth_bubbles,add_to_winter)
      qmethane(1:M+1)    = qwater(1:M+1,2)
      qmethane(M+2:M+ns) = qsoil (2:ns,nsoilcols)
       
      l2 = l1 + dhi
      h2 = h1 + dhw
      ls2 = 0.
     
    endif
    
    ENDIF if3 
    
    ! CASE 4: SNOW AND SOIL WITHOUT ICE AND WATER
        
    if4: IF (layer_case==4) THEN
      print*, 'The non-operational case: &
      &there is no water and ice layers: STOP'
      STOP
      if (flag_snow == 1) then
        ice = 0; snow = 1; water = 0; deepice = 0
    
        ! Temperature profile caluclation
        call SNOW_COND_HEAT_COEF()
        if (soilswitch%par == 1) then
          call SOIL_COND_HEAT_COEF(nsoilcols)
        endif
        call T_SOLVER(ix,iy,dnx,dny,year,month,day,hour,phi, &
        & RadWater, RadIce, SurfTemp, fetch, dt)
        if (soilswitch%par == 1) then
          call SOILFORLAKE(dt,a,b,c,d,nsoilcols)
        endif
    
        ! Salinity profile
        call S_DIFF(dt,ls,salice)
        call SNOWTEMP(ix,iy,dnx,dny,year,month,day,hour,snowmass, &
        & snowmass_init,a,b,c,d,Temp,phi,fetch,dt)
        if (soilswitch%par == 1) then
          call BUBBLE_BLOCK 
        endif
        gs%isoilcol = nsoilcols
        call METHANE &
        & (gas,pressure,wind10,ch4_pres_atm,zsoil,Tsoil3(1,nsoilcols),rosoil,fbbleflx_ch4_sum, &
        & fbbleflx_ch4(0,nsoilcols),wl4(1,nsoilcols),wi2(1,nsoilcols),wa,Sals1, &
        & rootss,rosdry,por,veg,0._ireals,TgrAnn, methgenmh, &
        & ddz,ddz05,wst, lammeth, h1, ls, dhw, dhw0, .true., .false., &
        & lsm, bathymwater, &
        & fplant, febul0(nsoilcols), fdiffbot(nsoilcols), ftot, fdiff_lake_surf, &
        & plant_sum,bull_sum,oxid_sum,rprod_sum, &
        & anox,gs,gsp,dt,eps1(1),sodbot,rprod_total_oldC,rprod_total_newC, &
        & ice_meth_oxid_total, &
        & h_talik,tot_ice_meth_bubbles,add_to_winter)
        qmethane(1:M+1)    = qwater(1:M+1,2)
        qmethane(M+2:M+ns) = qsoil (2:ns,nsoilcols)
      else
        ice = 0; snow = 0; water = 0; deepice = 0
        
        ! Temperature profile calculation
        if (soilswitch%par == 1) then
          call SOIL_COND_HEAT_COEF(nsoilcols)
        endif
        call T_SOLVER(ix,iy,dnx,dny,year,month,day,hour,phi, &
        & RadWater, RadIce, SurfTemp, fetch, dt)
    
        ! Salnity profile
        call S_DIFF(dt,ls,salice)
        if (soilswitch%par == 1) then
          call SOILFORLAKE(dt,a,b,c,d,nsoilcols)
          call BUBBLE_BLOCK 
        endif
        gs%isoilcol = nsoilcols
        call METHANE(gas,pressure,wind10,ch4_pres_atm,zsoil,Tsoil3(1,nsoilcols),rosoil,fbbleflx_ch4_sum, &
        & fbbleflx_ch4(0,nsoilcols),wl4(1,nsoilcols),wi2(1,nsoilcols),wa,Sals1, &
        & rootss,rosdry,por,veg,0._ireals,TgrAnn, methgenmh, &
        & ddz,ddz05,wst, lammeth, h1, ls, dhw, dhw0, .true., .false., &
        & lsm, bathymwater, &
        & fplant, febul0(nsoilcols), fdiffbot(nsoilcols), ftot, fdiff_lake_surf, &
        & plant_sum,bull_sum,oxid_sum,rprod_sum, &
        & anox,gs,gsp,dt,eps1(1),sodbot,rprod_total_oldC,rprod_total_newC, &
        & ice_meth_oxid_total, &
        & h_talik,tot_ice_meth_bubbles,add_to_winter)
        qmethane(1:M+1)    = qwater(1:M+1,2)
        qmethane(M+2:M+ns) = qsoil (2:ns,nsoilcols)
      endif 
    ENDIF if4
    
    
    ! Calculation of volume deficit (only if dead volume is specified), diagnostic
    if (deadvol%par > 0. .and. h2 < deadvol%par) then
      voldef = voldef + area_int(1)*(deadvol%par - h2)
      h2 = deadvol%par
    endif
       
    
    if (h2 < min_water_thick .and. ls2 /= 0 .and. l2 == 0) then
      ls2 = ls2 + h2*row0_d_roi
      if (ls2 < min_ice_thick) then 
        ls2 = 0; Tis2 = 0
      endif
      h2 = 0.
      Tw2 = 0.
      Sal2 = 0.
    endif
    
    if ((h2 < min_water_thick .and. h2 > 0) .and. l2 /= 0) then
      l2 = l2 + h2*row0_d_roi
      if (l2 < min_ice_thick) then 
        l2 = 0; Ti2 = 0
      endif
      h2 = 0.
      Tw2 = 0.
      Sal2 = 0. 
    end if
        
    if (h2 < min_water_thick .and. l2 /= 0 .and. ls2 /= 0) then
      Ti2 = Ti2*l2/(l2+ls2) + Tis2*ls2/(l2+ls2)
      l2 = l2 + h2*row0_d_roi + ls2 
      ls2 = 0.
      Tis2 = 0.
      h2 = 0 
      Tw2 = 0.
      Sal2 = 0.
    endif
       
    if (l2 < min_ice_thick .and. h2 /= 0) then
      h2 = h2 + l2*roi/row0
      if (h2 < min_water_thick) then 
        h2 = 0; Tw2 = 0; Sal2 = 0.
      endif
      l2 = 0.
      Ti2 = 0.
    end if
    
    if (h2 < min_water_thick .and. l2 == 0) then
      h2 = 0.
      Tw2 = 0.
      Sal2 = 0. 
    end if
    
    if (l2 < min_ice_thick .and. h2 == 0) then
      l2 = 0.
      Ti2 = 0.
    end if
       
    if ((hs1 < min_ice_thick .and. hs1 > 0.) .or. &
    & (hs1 > 0. .and. l2 == 0. .and. h2 /= 0.)) then
    ! h2 = h2 + (totalprecips-totalevaps-totalmelts)
      h2 = h2 + snowmass/row0 
      if (h2 < min_water_thick) then
        l2 = l2 + row0*h2/roi
        h2 = 0; Tw2 = 0; Sal2 = 0.
        if (l2 < min_ice_thick) then 
          l2 = 0; Ti2 = 0
        endif
      endif
      hs1 = 0.
      snowmass = 0.
      flag_snow = 0
      flag_snow_init = 1
    end if
    
    if (hs1==0. .and. flag_snow==1) then
      flag_snow = 0
      flag_snow_init = 1
    endif
     
    if (ls2 < min_ice_thick .and. h2 /= 0) then
      h2 = h2 + ls2*roi/row0
      if (h2 < min_water_thick) then 
        h2 = 0; Tw2 = 0; Sal2 = 0.
      endif
      ls2 = 0
      Tis2 = 0.
    endif 
    
    if (ls2 > 0 .and. h2 == 0) then
      l2 = ls2
      Ti2 = Tis2
      if (l2 < min_ice_thick) then 
        l2 = 0; Ti2 = 0
      endif
      ls2 = 0
      Tis2 = 0.
    endif
    
    if (outflpar%par == 2 .and. tribheat%par > 0) then
      print*, 'LAGREFFL not operational: STOP'
      STOP
      !call TENDCALC(dt, utend, vtend, Twtend, Saltend)
      !allocate(work1(1:M+1),work2(1:M+1))
      !work1(:) = 0.5*(u1(:) + u2(:))
      !work2(:) = 0.5*(v1(:) + v2(:))
      !call LAGREFFL(Ux_tribin(1,:),Uy_tribin(1,:), &
      !& T_tribin(1,:),Sal_tribin(1,:), &
      !& utend,vtend,Twtend,Saltend, &
      !& work1,work2,area_int,dt,M, &
      !& ueffl,veffl,Tweffl,Saleffl)
      !deallocate(work1,work2)
    endif
    
    !! Deepened temperature maximum diagnostics
    !! Output of temperature equation terms
    !if (firstcall)   then
    !!  open(1234,file='maxT.dat',status='unknown')
    !!  write(1234,*), 'nstep dT/dt -dT_{ML}/dt -ddz/dt/dzT flux1/dz -flux2/dz flux1 -flux2 &
    !!  &S1/dz -S2/dz S1 -S2 botheat z_{ML} dz T_mean  Tmax-T_{ML} locTmax'
    !  nn = 0
    !  allocate (work3(1:17)); work3 = 0.; 
    !!  allocate (work4(1:17)); work4 = 0.
    !endif
    !!write(12345,*) tau/(wind*wind*1.273)
    !!if (mod(nstep,60*6) == 0_iintegers) then
    !! Identifying the location of the heated layer
    !worklog1 = .false.
    !i = 1
    !c1:do
    !  i = i + 1
    !  !Averaging over the mixed layer
    !  vol_ = 0.
    !  do k = 1, i-1
    !    vol_ = vol_ + ddz05(k-1)*h1*area_int(k)
    !  enddo
    !  ttt = 0.
    !  do k = 1, i-1
    !    ttt = ttt + Tw2(k)*ddz05(k-1)*h1*area_int(k)
    !  enddo
    !  ttt = ttt/vol_
    !  if (Tw2(i) > ttt + 0.01 .and. z_full(i) > 1.) then
    !  !if (KT(i-1)/cw_m_row0 < min_diff*100.5 .and. Tw2(i+1) > Tw2(i) .and. z_full(i) > 1.) then
    !    !Upper boundary
    !    x = 0.5*(z_full(i-1) + z_full(i))
    !    j = i
    !    c2:do 
    !      j = j + 1
    !      if (j > M+1) exit c2
    !      if (Tw2(j) < ttt) then
    !        !Lower boundary
    !        xx = 0.5*(z_full(j) + z_full(j-1))
    !        worklog1 = .true.
    !        exit c2
    !      endif
    !    enddo c2
    !    if (worklog1) then
    !      ! Averaging over the temperature maximum layer
    !      vol_2 = 0.
    !      do k = i, j-1
    !        vol_2 = vol_2 + ddz05(k-1)*h1*area_int(k)
    !      enddo
    !      zzz = 0.
    !      do k = i, j-1
    !        zzz = zzz + Tw2(k)*ddz05(k-1)*h1*area_int(k)
    !      enddo
    !      zzz = zzz/vol_2
    !      zzz = zzz - ttt
    !    endif
    !    i2 = i
    !    j2 = j
    !    exit c1
    !  endif
    !  if (i == M+1) exit c1
    !enddo c1
    !worklog = .false.
    !i = 1
    !c3:do
    !  i = i + 1
    !  !Averaging over the mixed layer
    !  vol_ = 0.
    !  do k = 1, i-1
    !    vol_ = vol_ + ddz05(k-1)*h1*area_int(k)
    !  enddo
    !  tt = 0.
    !  do k = 1, i-1
    !    tt = tt + Tw1(k)*ddz05(k-1)*h1*area_int(k)
    !  enddo
    !  tt = tt/vol_
    !  if (Tw1(i) > tt + 0.01 .and. z_full(i) > 1.) then
    !  !if (KT(i-1)/cw_m_row0 < min_diff*100.5 .and. Tw1(i+1) > Tw1(i) .and. z_full(i) > 1.) then
    !    !Upper boundary
    !    y = 0.5*(z_full(i-1) + z_full(i))
    !    j = i
    !    c4:do 
    !      j = j + 1
    !      if (j > M+1) exit c4
    !      if (Tw1(j) < tt) then
    !        !Lower boundary
    !        yy = 0.5*(z_full(j) + z_full(j-1))
    !        worklog = .true.
    !        exit c4
    !      endif
    !    enddo c4
    !    if (worklog) then
    !      ! Averaging over the temperature maximum layer
    !      vol_ = 0.
    !      do k = i, j-1
    !        vol_ = vol_ + ddz05(k-1)*h1*area_int(k)
    !      enddo
    !      zz = 0.
    !      do k = i, j-1
    !        zz = zz + Tw1(k)*ddz05(k-1)*h1*area_int(k)
    !      enddo
    !      zz = zz/vol_
    !      zz = zz - tt
    !    endif
    !    exit c3
    !  endif
    !  if (i == M+1) exit c3
    !enddo c3
    !
    !if (worklog .and. worklog1 .and. (j-1 > i+1) .and. yy < 4.) then
    !
    !  !Initializing TM mean temperature
    !  if (.not. indTMprev) then
    !    work3(1) = zz 
    !    work3(2:12) = 0.
    !    !print*, zz
    !    !print*, Tw1(i:j-1) - tt
    !    !print*, Tw1
    !    !read*
    !    indTMprev = .true.
    !  endif
    !
    !  ! Volume change term
    !  ww1 = 0.
    !  if (vol_2 /= vol_) then
    !    !print*, i,i2,j,j2
    !    if (i2 > i) then
    !      do k = i, i2-1
    !        ww1 = ww1 - (Tw2(k) - ttt)*ddz05(k-1)*h1*area_int(k)
    !      enddo
    !    elseif (i2 < i) then
    !      do k = i2, i-1
    !        ww1 = ww1 + (Tw2(k) - ttt)*ddz05(k-1)*h1*area_int(k)
    !      enddo
    !    endif
    !    if (j2 > j) then
    !      do k = j, j2-1
    !        ww1 = ww1 + (Tw2(k) - ttt)*ddz05(k-1)*h1*area_int(k)
    !      enddo
    !    elseif (j2 < j) then
    !      do k = j2, j-1
    !        ww1 = ww1 - (Tw2(k) - ttt)*ddz05(k-1)*h1*area_int(k)
    !      enddo
    !    endif
    !  endif
    !
    !!!  ! Summing increments of temperature in the maximum
    !   if (l1 > 0.) then
    !     nn = nn + 1
    !     work3(1) = work3(1) + lamw(1)*(Tw2(2)-Tw2(1))/(ddz(1)*h1)
    !   endif
    !  work3(1) = work3(1) + (zzz - zz)
    !  work3(2) = work3(2) - (ttt - tt)
    !  work3(3) = work3(3) - (vol_2 - vol_)/(vol_)*zzz + ww1/(vol_)
    !  work3(4) = work3(4) + 1./vol_*area_half(i-1)*k_turb_T_flux(i-1)*dt
    !  work3(5) = work3(5) - 1./vol_*area_half(j-1)*k_turb_T_flux(j-1)*dt
    !  work3(6) = work3(6) + k_turb_T_flux(i-1)*dt
    !  work3(7) = work3(7) - k_turb_T_flux(j-1)*dt
    !  work3(8) = work3(8) + 1./vol_*area_half(i-1)*SR(i-1)/cw_m_row0*dt
    !  work3(9) = work3(9) - 1./vol_*area_half(j-1)*SR(j-1)/cw_m_row0*dt
    !  work3(10) = work3(10) + SR(i-1)/cw_m_row0*dt
    !  work3(11) = work3(11) - SR(j-1)/cw_m_row0*dt
    !  ww = 0.
    !  do k = i, j-1
    !    ww = ww + lsh%water(k)*area_int(k)*ddz05(k-1)
    !  enddo
    !  work3(12) = work3(12) + ww*h1/cw_m_row0/vol_*dt
    !  work3(13) = work3(13) + y
    !  work3(14) = work3(14) + yy-y
    !  work3(15) = work3(15) + zz
    !  work3(16) = work3(16) + maxval(Tw1(i:j-1))-tt
    !  work3(17) = work3(17) + (maxloc(Tw1,1) - i + 0.5)*ddz(i)*h1 !Assuming regular mesh
    !
    !  ! Time averaging
    !  work4(1:17) = work4(1:17) + work3(1:17)
    !
    !  !www = (zzz - zz)/dt + (ttt - tt)/dt + (vol_2 - vol_)/(dt*vol_)*zzz - ww1/(vol_*dt) &
    !  !& - 1./vol_*area_half(i-1)*k_turb_T_flux(i-1) &
    !  !& + 1./vol_*area_half(j-1)*k_turb_T_flux(j-1) &
    !  !& - 1./vol_*area_half(i-1)*SR(i-1)/cw_m_row0 &
    !  !& + 1./vol_*area_half(j-1)*SR(j-1)/cw_m_row0 &
    !  !& - ww*h1/cw_m_row0/vol_
    !  !if (abs(www/(zzz - zz)*dt) > 1.E-3) then
    !  !  print*, (zzz - zz)/dt, www, (vol_2 - vol_)/(dt*vol_)*zzz, - ww1/(vol_*dt) 
    !  !  read*
    !  !endif
    !
    !  if (abs(work3(1) - zzz) > 1.e-10) then
    !    print*, 'TMdiag', nstep, zz, zzz, work3(1) - zzz
    !    read*
    !  endif
    !
    !  if (mod(nstep,60*6) == 0_iintegers) then
    !    write(1234,*) nstep, (zzz - zz)/dt, - (ttt - tt)/dt, &
    !    !& - (area_half(j-1)*(xx - yy) - area_half(i-1)*(x - y))/(dt*vol_)*zz, &
    !    & - (vol_2 - vol_)/(dt*vol_)*zzz + ww1/(vol_*dt), &
    !    & + 1./vol_*area_half(i-1)*k_turb_T_flux(i-1), &
    !    & - 1./vol_*area_half(j-1)*k_turb_T_flux(j-1), &
    !    & + k_turb_T_flux(i-1), - k_turb_T_flux(j-1), &
    !    &   1./vol_*area_half(i-1)*SR(i-1)/cw_m_row0, &
    !    & - 1./vol_*area_half(j-1)*SR(j-1)/cw_m_row0, &
    !    &   SR(i-1)/cw_m_row0, - SR(j-1)/cw_m_row0, &
    !    &   ww*h1/cw_m_row0/vol_, &
    !    &   y, yy-y, zz, maxval(Tw1(i:j-1))-tt, &
    !    &   (maxloc(Tw1(i:j-1),1)-0.5)*ddz(i)*h1 !Assuming regular mesh
    !  endif 
    !
    !else
    !
    !  indTMprev = .false.
    !
    !endif
    !
    !if (step_final) then
    !!  open(12345,file='maxTav.dat',status='unknown')
    !!  write(12345,*), 'nstep dT/dt -dT_{ML}/dt -ddz/dt/dzT flux1/dz -flux2/dz flux1 -flux2 &
    !!  &S1/dz -S2/dz S1 -S2 botheat z_{ML} dz T_mean  Tmax-T_{ML} locTmax'
    !!  write(12345,*) nstep, work3(1:17)/real(nn)
    !!  write(12345,*) nstep, work3(1:17)
    !!  write(12345,*) nstep, work4(1:17)/real(nn)
    !!  !print*, 'resid = ', work3(1) - work3(2) - work3(3) - work3(4) - work3(5) - work3(8) - work3(9) - work3(12)
    !!  close(12345)
    !  print*, 'Mean under-ice heat flux towards ice is', work3(1)/real(nn), ' W/m**2' 
    !  deallocate(work3)
    !  read*
    !!   deallocate(work4)
    !endif
    !!!endif
    
    !i = maxloc(Tw2,1)
    !if (i > 1 .and. i < M+1 .and. (mod(nstep,60) == 0_iintegers) ) then
    !  write(1234,*) cw_m_row0*(Tw2(i) - Tw1(i))/dt,  &
    !  & 0.5/h1**2*( lamw(i)*(Tw2(i+1) + Tw1(i+1) - Tw2(i) - Tw1(i) )/ddz(i) - &
    !  & lamw(i-1)*( Tw2(i) + Tw1(i) - Tw2(i-1) - Tw1(i-1) )/ddz(i-1) )/ddz05(i-1), &
    !  & lsh%water(i), (SR(i) - SR(i+1))/(h1*ddz05(i-1))
    !endif
    
    !! On-screen diagnostics of TKE budget
    !i = M-40 !Level in thermocline
    !if (month == 10 .and. nn == 0) then
    !  xx = tau/row0*u1(1)
    !  yy = - H_mixed_layer*lamw0/cw_m_row0*g/row0*(row(i+1)-row(i))/(ddz(i)*h1)
    !  zz = - sum(eps1(1:i_maxN)*ddz(1:i_maxN))*h1
    !  nn = 1
    !elseif (nn > 0) then
    !  nn = nn + 1
    !  xx  = ACCUMM(nn, xx, tau/row0*u1(1))
    !  yy  = ACCUMM(nn, yy, - H_mixed_layer*lamw0/cw_m_row0*g/row0*(row(i+1)-row(i))/(ddz(i)*h1))
    !  zz  = ACCUMM(nn, zz, - sum(eps1(1:i_maxN)*ddz(1:i_maxN))*h1)
    !  !print*, xx,yy,zz
    !  !read*
    !endif
    !if (mod(nstep,100) == 0) then
    !  !i = M-40 !Level in thermocline
    !  print*, tau/row0*u1(1), -H_mixed_layer*lamw0/cw_m_row0*g/row0*(row(i+1)-row(i))/(ddz(i)*h1), - &
    !  & sum(eps1(1:i_maxN)*ddz(1:i_maxN))*h1, &
    !  & tau/row0*u1(1) - H_mixed_layer*lamw0/cw_m_row0*g/row0*(row(i+1)-row(i))/(ddz(i)*h1) - &
    !  & sum(eps1(1:i_maxN)*ddz(1:i_maxN))*h1
    !  print*, xx + yy + zz
    !endif
    
    h1    = h2
    l1    = l2
    ls1   = ls2
    Tw1   = Tw2
    Ti1   = Ti2
    Tis1  = Tis2
    Sal1  = Sal2
    Sals1 = Sals2
    qwater(:,1) = qwater(:,2)
    !qwater2(:,1,1) = qwater2(:,2,1) ! two-meth
    !qwater2(:,1,2) = qwater2(:,2,2) ! two-meth
    oxyg  (:,1) = oxyg  (:,2)
    DIC(:,1) = DIC(:,2)
    u1    = u2
    v1    = v2
    Tskin(1) = Tskin(2)
        
    ! CALCULATION OF SUMMARY FLUXES !
    totalpen = totalpen + dhwfsoil 
    totalevap = totalevap + Elatent/(row0*Lwv)*dt
    totalprecip = totalprecip + precip*dt
    totalhflux = totalhflux + hflux*dt
    totalerad = totalerad + erad*dt
    
    if (l1 == 0) tsw = Tw1(1) + 273.15
    if (l1 /=0 .and. flag_snow == 0) tsw = Ti1(1) + 273.15
    if (flag_snow == 1) tsw = T(itop) + 273.15
    
    if (init(ix,iy) == 0) then
      init(ix,iy) = 1  
    endif
    
    !VALUES AT NEXT TIME STEP (time + dt) IN CURRENT POINT (ix,iy)
    
    call UPDATE_NEXT_TIMESTEP ( &
    & ix, iy, dnx, dny, M, Mice, ns, ms, ml, nsoilcols, &
    & l1, h1, hx1, hx2, hy1, hy2, ls1, hs1, &
    & hx1t, hx2t, hy1t, hy2t, &
    & hx1ml, hx2ml, hy1ml, hy2ml, &
    & gradpx_tend, gradpy_tend, &
    & u1, v1, &
    & E1, eps1, k_turb_T_flux, &
    & Tsoil1, Sals1, wi1, wl1, &
    & Tw1, Sal1, lamw, &
    & Tskin(1), &
    & Ti1, Tis1, &
    !& ueffl, veffl, Tweffl, Saleffl, &
    & dz, T, wl, dens, &
    & qwater(1,1), qsoil, &
    & oxyg(1,1), oxygsoil, &
    & DIC(1,1), DOC, POCL, POCD, phosph, &
    & snmelt, snowmass, &
    & cdmw, &
    & time, &
    & dhwfsoil, &
    & Elatent, &
    & dhw, dhw0, &
    & dhi, dhi0, dls0, &
    & velfrict, &
    & roughness, &
    & eflux0_kinem, &
    & tot_ice_meth_bubbles, &
    & febul0, Eseiches, salice, porice, &
    
    & flag_snow, flag_snow_init, &
    & itop, &
    & nstep, i_maxN, itherm )
    
    !At the next timestep after control point output, the control point may be written again
    !if (ix == nx - nx0 + 1 .and. iy == ny - ny0 + 1 .and. &
    !&  cpwrite_done .eqv. .true.) cpwrite_done = .false.
    !Writing the control point for all lakes of the domain
    if (icp == 1_iintegers .and. ix == nx - nx0 + 1 .and. iy == ny - ny0 + 1) then
      call CONTROL_POINT_OUT(year,month,day,hour, &
      & nx,nx0,nx_max,ny,ny0,ny_max,gs,parparams,time)
    endif
    
    hw1 = hw
    xlew1 = xlew
    cdmw1 = cdmw
    surfrad1 = surfrad
    h2_out = h2
    
    !Diagnoctics
    if (dyn_pgrad%par == 5 .or. dyn_pgrad%par == 6) then !diagnostic computation of turbulence in a river scenario
      call ZIRIVMODEL(M,h1,sign(1._ireals,tauxw)*sqrt(abs(tauxw)/row0), &
      & g*tan(pi*alphax/180.),z_half,z_full,eps_ziriv,viscturb_ziriv,speed_ziriv)
    endif
    
    
    !print*,h1,l1,hs1,ls1,Tw2(1),Sal2(1),Sal2(M+1)
    !if (ix == 10 .and. iy == 10) print*, 'Lake', &
    !& 'T1=',Tw1(1),'T2=',Tw1(2),'h1=',h1,'S=',shortwave, &
    !& 'hh=',hflux,'LE=',Elatent, &
    !& 'eflux=',eflux, 'Longwave=', longwave, &
    !& 'Bal=', (shortwave*sabs + &
    !&  shortwave*(1 - sabs)*(1 - albedoofwater)*(1 - exp( - extwat*0.5*ddz(1)*h1)) + &
    !&  longwave*(1 - albedoofwater_lw) - &
    !&  surfrad - hflux - Elatent - eflux)/(cw_m_row0*ddz(1)*h1/2)*dt
    
    if (accum .eqv. .false. .and. &
    &   year  == year_accum_begin  .and. &
    &   month == month_accum_begin .and. &
    &   day   == day_accum_begin   .and. &
    &   hour  >= hour_accum_begin) then
      accum = .true.
      totmeth0 = VARMEAN(qwater(1,1),bathymwater,11_iintegers) * &
      & (h2 - dhw)*dzeta_05int(M)*mf ! Depth at previous timestep
    endif
    
    if (accum .eqv. .true. .and. &
    &   year  == year_accum_end  .and. &
    &   month == month_accum_end .and. &
    &   day   == day_accum_end   .and. &
    &   hour  >= hour_accum_end) accum = .false.
    
    if (accum) then
    ! Note: variables accumulation is implemented currently only for one-point simulations!
      call ACCUM_VAR &
      & (dt, l1, fbbleflx_ch4_sum(0), fbbleflx_ch4_sum(M+1), & 
      & fdiffbot(nsoilcols), fdiff_lake_surf, qwateroxidtot, &
      & ice_meth_oxid_total, &
      & rprod_total_newC(nsoilcols), rprod_total_oldC(nsoilcols), &
      & febultot, febulbottot, fdifftot, fdiff_lake_surftot, &
      & rprod_total_newC_integr, rprod_total_oldC_integr, &
      & methoxidwat, ice_meth_oxid, add_to_winter)
      totmethc = VARMEAN(qwater(1,2),bathymwater,11_iintegers) * &
      & h2**dzeta_05int(M)*mf
    !  metracc = metracc + qwater(M+1,2)*(dhw - dhw0) + dhw0*qwater(1,2)
    !  call ACCUM_VAR & ! two-meth
    !  & (dt, l1, febul2, fdiff2, fdiff_lake_surf2, & ! two-meth
    !  & rprod_total_newC, rprod_total_oldC, & ! two-meth
    !  & febultot2, fdifftot2, fdiff_lake_surftot2, & ! two-meth
    !  & rprod_total_newC_integr2, rprod_total_oldC_integr2) ! two-meth
    endif
    
    if (flag_print) then ! The output in ASCII files 
      if (monthly_out%par == 1) call MON_OUT(ix,iy,dnx,dny,year,month,day,hour,time,zgrid_out,ngrid_out%par)
      if (daily_out%par   == 1) call DAY_OUT(ix,iy,dnx,dny,year,month,day,hour)
      if (hourly_out%par  == 1) call HOUR_OUT(ix,iy,dnx,dny,year,month,day,hour,time)
      if (everystep%par   >  0) call EVERYSTEP_OUT(ix,iy,dnx,dny)
      if (time_series%par == 1) then
        call SERIES_OUT(ix,iy,dnx,dny,year,month,day,hour,tsw)
        allocate(work1(1:M+ns))
        ndec = -1 ! Number of decimal digits, negative meaning exponential format
        i = 1
        !Interpolating diffusivity to layers' interfaces, result is stored in work1
        !call LININTERPOL (z_half,lamsal,M,z_full,work1,M+1,flag) 
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  Tw1, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, & ! ngrid_out%par
        &  outpath, 'water_temp', i, ndec, .false.)  !, row, work1 - last optional argument!
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  Ti1, z_full_ice, Mice+1, &
        &  zgridice_out, ngridice_out%par, & !ngridsoil_out%par, &
        &  outpath, 'ice_temp', i, ndec, .false.)
        ndec = 4
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  Tsoil3(1,nsoilcols), zsoil, ns, &
        &  zgridsoil_out, ngridsoil_out%par, & !ngridsoil_out%par, &
        &  outpath, 'soil_temp', i, ndec, .false.)
        z_watersoil(1:M+1) = z_full(1:M+1)    
        do j = 2, ns
          z_watersoil(M+j) = h1 + zsoil(j)
        enddo
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  rowc, z_full, M+1, &
        &  zgrid_out, -1, &
        &  outpath, 'water_dens_layers', i, ndec, .false.)
        ndec = -1
        i = i + 2
        work1(1:M+ns) = qmethane(1:M+ns)*molm3tonM
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  work1, z_watersoil, M+ns, &
        &  zgridsoil_out, -1, &
        &  outpath, 'methane_water_soil', i, ndec, .false.)
        ndec = -1
        i = i + 2
        work1(1:M+1) = oxyg(1:M+1,1)*molm3tomgl_o2 !molm3tonM
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  work1, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'oxygen_water', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  Chl_a, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'chla', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  prodox, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'prodox', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  sod, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'sod', i, ndec, .false.)
        ndec = -1
        i = i + 2
        work1(1:M+1) = qwater(1:M+1,1)*molm3tomcM !molm3tomkgl_ch4 ! molm3tonM
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  work1, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'methane_water', i, ndec, .false.)
        if (nsoilcols > 1) then
          ndec = -1
          i = i + 2
          ! Methane production in soil columns
          work1(1:nsoilcols) = 0.5*(zsoilcols(1:nsoilcols,ix,iy) + zsoilcols(2:nsoilcols+1,ix,iy))
          call PROFILE_OUTPUT &
          & (ix, iy, dnx, dny, &
          &  year, month, day, hour, &
          &  time, dt_out%par, &
          &  rprod_total_newC, work1, nsoilcols, &
          &  work1, nsoilcols, &
          &  outpath, 'rprod_soil', i, ndec, .false.)
        endif 
        ndec = -1
        i = i + 2
        do j = 1, M+1
          work1(j) = DIC(j,1) / HC_CORR_CARBEQUIL(Tw1(j)+Kelvin0,pH) * molm3tomcM !molm3tomgl_co2 !molm3tonM
        enddo
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  work1, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'co2_water', i, ndec, .false.)
    
    
        if (carbon_model%par == 2) then
    
          ndec = -1
          i = i + 2
          work1(1:M+1) = phosph(1:M+1)*molmass_p !mg/l of phosphorus
          call PROFILE_OUTPUT &
          & (ix, iy, dnx, dny, &
          &  year, month, day, hour, &
          &  time, dt_out%par, &
          &  work1, z_full, M+1, &
          &  zgrid_out, ngrid_out%par, &
          &  outpath, 'phosph_water', i, ndec, .false.)
    
          ndec = -1
          i = i + 2
          call PROFILE_OUTPUT &
          & (ix, iy, dnx, dny, &
          &  year, month, day, hour, &
          &  time, dt_out%par, &
          &  DOC, z_full, M+1, &
          &  zgrid_out, ngrid_out%par, &
          &  outpath, 'DOC', i, ndec, .false.)
    
          ndec = -1
          i = i + 2
          call PROFILE_OUTPUT &
          & (ix, iy, dnx, dny, &
          &  year, month, day, hour, &
          &  time, dt_out%par, &
          &  POCL, z_full, M+1, &
          &  zgrid_out, ngrid_out%par, &
          &  outpath, 'POCL', i, ndec, .false.)
    
          ndec = -1
          i = i + 2
          call PROFILE_OUTPUT &
          & (ix, iy, dnx, dny, &
          &  year, month, day, hour, &
          &  time, dt_out%par, &
          &  POCD, z_full, M+1, &
          &  zgrid_out, ngrid_out%par, &
          &  outpath, 'POCD', i, ndec, .false.)
        endif
    
        ndec = -1
        i = i + 2    
        work1(1:M) = fbbleflx_ch4_sum(1:M) 
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  work1, z_half, M, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'fbblflx_ch4', i, ndec, .false.)
        ndec = -1
        i = i + 2
        work1(1:M) = fbbleflx_co2_sum(1:M)
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  work1, z_half, M, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'fbblflx_co2', i, ndec, .false.)
        ndec = -1
        i = i + 2
        work1(1:M) = fbbleflx_o2_sum(1:M)
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  work1, z_half, M, &
        &  zgrid_out, ngrid_out%par, &
        &  outpath, 'fbblflx_o2', i, ndec, .false.)
        deallocate(work1)
        ndec = 4
        i = i + 2    
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  wl1, zsoil, ns, &
        &  zgridsoil_out, ngridsoil_out%par, &
        &  outpath, 'wl_soil', i, ndec, .false.)
        ndec = 4
        i = i + 2    
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  wi1, zsoil, ns, &
        &  zgridsoil_out, ngridsoil_out%par, &
        &  outpath, 'wi_soil', i, ndec, .false.)    
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  Sal1, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'sal_water', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  lamw/cw_m_row0, z_half, M, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'lamw', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  eps1, z_half, M, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'epsilon', i, ndec, .false.)
        if (dyn_pgrad%par == 5 .or. dyn_pgrad%par == 6) then
          ndec = -1
          i = i + 2
          call PROFILE_OUTPUT &
          & (ix, iy, dnx, dny, &
          &  year, month, day, hour, &
          &  time, dt_out%par, &
          &  eps_ziriv, z_half, M, &
          &  zgrid_out, ngrid_out%par, & !ngrid_out
          &  outpath, 'epsziriv', i, ndec, .false.)
          ndec = -1
          i = i + 2
          call PROFILE_OUTPUT &
          & (ix, iy, dnx, dny, &
          &  year, month, day, hour, &
          &  time, dt_out%par, &
          &  viscturb_ziriv, z_half, M, &
          &  zgrid_out, ngrid_out%par, & !ngrid_out
          &  outpath, 'viscturbziriv', i, ndec, .false.)
        endif
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  Ri, z_half, M, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'Ri', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  trb%Rp, z_half, M, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'Rp', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  trb%Rpdens, z_half, M, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'Rpdens', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  u1, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'u', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  v1, z_full, M+1, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'v', i, ndec, .false.)
        ndec = -1
        i = i + 2
        call PROFILE_OUTPUT &
        & (ix, iy, dnx, dny, &
        &  year, month, day, hour, &
        &  time, dt_out%par, &
        &  w(1:M), z_half, M, &
        &  zgrid_out, ngrid_out%par, & !ngrid_out
        &  outpath, 'w', i, ndec, .true.)
      endif
    
      ! Output time series of scalars in selected points
      if ( rtemp%arr1(1,1) /= missing_value .and. dyn_pgrad%par == 4 ) then 
          call TEMPLOC(M,3_iintegers,1_iintegers,itherm,h1,dt_out%par,time,hx1ml,hy1ml,Tw1,gsp,gs,bathymwater,rtemp, &
        &            'temploc',firstcall)
          call TEMPLOC(M,3_iintegers,2_iintegers,itherm,h1,dt_out%par,time,hx1ml,hy1ml,qwater(1,1),gsp,gs,bathymwater,rtemp, &
        &            'ch4loc',firstcall)
          call TEMPLOC(M,3_iintegers,3_iintegers,itherm,h1,dt_out%par,time,hx1ml,hy1ml,DIC(1,1),gsp,gs,bathymwater,rtemp, &
        &            'co2loc',firstcall)
      endif
    
    endif
     
    
    if (runmode%par == 1)  then
      if (nscreen%par > 0 .and. mod(nstep,nscreen%par)==0) then
    
        write (*,'(3a25)') 'timestep', 'N of point', &
        & 'Surface temperature'
        write (*,'(2i25,f25.1)') nstep, ix, tsw
        write (*,'(5a8)') 'Year', 'Month', 'Day', 'Hour', 'Months'
        i = year 
        if (year<1000) i = year+1000
        write (*,'(3i8,2f8.2)') i, month, day, hour, time/(month_sec)
    
        !write(*,'(a)')
        !write(*,*) 'Methane generation, transport and oxidation rates'
        !write(*,*) 'Total bottom diff, Total surface diff, Total bottom ebul, Total surface ebul'
        !write(*,'(a,4(2x,e12.5))') 'Summer ', fdifftot(1), fdiff_lake_surftot(1), febulbottot(1), febultot(1)
        !write(*,'(a,4(2x,e12.5))') 'Winter ', fdifftot(2), fdiff_lake_surftot(2), febulbottot(2), febultot(2)
        !write(*,*) 'Total prod from "new" org, Total prod from "old" org, Total oxidation in water, &
        !& Total oxidation in ice (for winter)'
        !write(*,'(a,3(2x,e12.5))') 'Summer ', &
        !& rprod_total_newC_integr(1), rprod_total_oldC_integr(1), methoxidwat(1)
        !write(*,'(a,4(2x,e12.5))') 'Winter ', &
        !& rprod_total_newC_integr(2), rprod_total_oldC_integr(2), methoxidwat(2), ice_meth_oxid
        !write(*,'(a,(2x,e12.5))') 'Change of integral methane amount in water column and ice cover', &
        !& totmethc - totmeth0 + tot_ice_meth_bubbles*mf
        !write(*,'(a)')
        !write(*,*) 'Checking methane balance residuals:'   
        !write(*,'(a,1(2x,e12.5))') 'Total production in soil - total bottom flux ', &
        !& sum(rprod_total_newC_integr(1:2)) + sum(rprod_total_oldC_integr(1:2)) - &
        !& sum(febulbottot(1:2)) - sum(fdifftot(1:2))
        !write(*,'(a,1(2x,e12.5))') 'Total bottom flux - total surface flux - total oxidation - & 
        !& methane total column amount change', &
        !& sum(febulbottot(1:2)) + sum(fdifftot(1:2)) - &
        !& sum(febultot(1:2)) - sum(fdiff_lake_surftot(1:2)) - &
        !& sum(methoxidwat(1:2)) - ice_meth_oxid - &
        !& (totmethc - totmeth0 + tot_ice_meth_bubbles*mf)
    
    
        open(12345,file=outpath(1:len_trim(outpath))//'lastscrout.dat')
        write(12345,'(a)')
        write(12345,*) 'Methane generation, transport and oxidation rates'
        write(12345,*) 'Total bottom diff, Total surface diff, Total bottom ebul, Total surface ebul'
        write(12345,'(a,4(2x,e12.5))') 'Summer ', fdifftot(1), fdiff_lake_surftot(1), febulbottot(1), febultot(1)
        write(12345,'(a,4(2x,e12.5))') 'Winter ', fdifftot(2), fdiff_lake_surftot(2), febulbottot(2), febultot(2)
        write(12345,*) 'Total prod from "new" org, Total prod from "old" org, Total oxidation in water, &
        & Total oxidation in ice (for winter)'    
        write(12345,'(a,3(2x,e12.5))') 'Summer ', &
        & rprod_total_newC_integr(1), rprod_total_oldC_integr(1), methoxidwat(1)
        write(12345,'(a,4(2x,e12.5))') 'Winter ', &
        & rprod_total_newC_integr(2), rprod_total_oldC_integr(2), methoxidwat(2), ice_meth_oxid
        write(12345,'(a,(2x,e12.5))') 'Change of integral methane amount in water column and ice cover', &
        & totmethc - totmeth0 + tot_ice_meth_bubbles*mf
        write(12345,'(a)')
        write(12345,*) 'Checking methane balance residuals:'   
        write(12345,'(a,1(2x,e12.5))') 'Total production in soil - total bottom flux ', &
        & sum(rprod_total_newC_integr(1:2)) + sum(rprod_total_oldC_integr(1:2)) - &
        & sum(febulbottot(1:2)) - sum(fdifftot(1:2))
        write(12345,'(a,1(2x,e12.5))') 'Total bottom flux - total surface flux - total oxidation - & 
        & methane total column amount change', &
        & sum(febulbottot(1:2)) + sum(fdifftot(1:2)) - &
        & sum(febultot(1:2)) - sum(fdiff_lake_surftot(1:2)) - &
        & sum(methoxidwat(1:2)) - ice_meth_oxid - &
        & (totmethc - totmeth0 + tot_ice_meth_bubbles*mf)
        close(12345)
    
      endif
    endif
      
    
    !write(workchar,'(i5)') ncomp
    !workchar = '(a6,'//workchar(1:len_trim(workchar))//'(1x,f6.2))'
    !write(*,fmt = workchar) 'Timing', comptime(1:ncomp)/60. ! Converting to minutes
    !if (l1 > 0.) print*, T(itop), Ti1(1), Ti1(Mice+1)
    
    deallocate(radflux)
    
    if (firstcall) firstcall = .false.
    
    !FORMATS!
    7   format (f7.3, 4i5,37f7.3) 
    60  format (f5.2, 2e16.5, 2f8.3, e15.5, f11.5, f7.1)
    ! 61  format (i5, f6.2, 2e16.5, 2f8.3, e15.5, f11.5, f7.1)
    61  format (f6.2, f5.2, 2e16.5, 2f8.3, e15.5, f11.5, f7.1)
    62  format (f6.2, f5.2, 2f12.3, 2f8.3, f11.5, f7.1,3f12.4,2f7.2,3f7.1)
    80  format (f7.3, 10f9.2)
    90  format (f7.3, 12f9.2)   
    100 format (a5, 2a16, 2a8, a15, a11, a7) 
    
    
    contains
    SUBROUTINE BUBBLE_BLOCK
    ! The block of code invoking procedures, that calculate the bubble flux
    implicit none
    
    ! Calling bubble model
    fbbleflx_ch4_sum(0:M+1) = 0.
    fbbleflx_o2_sum (0:M+1) = 0.
    fbbleflx_co2_sum(0:M+1) = 0.
    if (ifbubble%par == 1) then
      call BUBBLE(M,M+1,ddz,ddz05,dzeta_int,qwater(:,1),Tw1,Sal1,h1,pressure, &
      & DIC(:,1),oxyg(:,1),ngasb,febul0(nsoilcols),dt, &
      & fracb0,fbbleflx_ch4(0,nsoilcols), &
      & fbbleflx_co2(0,nsoilcols),fbbleflx_o2(0,nsoilcols))
    endif 
    if (multsoil) then
      do i = 1, nsoilcols-1
        if (ifbubble%par == 1) then
          call BUBBLE(M,bathymsoil(i,ix,iy)%ibot,ddz,ddz05,dzeta_int, &
          & qwater(:,1),Tw1,Sal1,z_half(isoilcolc(i)),pressure, &
          & DIC(:,1),oxyg(:,1),ngasb,febul0(i),dt, &
          & fracb0,fbbleflx_ch4(0,i), &
          & fbbleflx_co2(0,i),fbbleflx_o2(0,i)) 
        else
          fbbleflx_ch4(1:bathymsoil(i,ix,iy)%ibot,i) = 1.; fbbleflx_ch4(bathymsoil(i,ix,iy)%ibot+1:M+1,i) = 0.
          fbbleflx_co2(1:bathymsoil(i,ix,iy)%ibot,i) = 1.; fbbleflx_co2(bathymsoil(i,ix,iy)%ibot+1:M+1,i) = 0.
          fbbleflx_o2 (1:bathymsoil(i,ix,iy)%ibot,i) = 1.; fbbleflx_o2 (bathymsoil(i,ix,iy)%ibot+1:M+1,i) = 0. 
        endif
        ! Adding bubble flux from i-th soil column to the horizontally averaged bubble flux
        call BUBBLEFLUXAVER(ix,iy,i)
        ! Adding bubble fluxes to fluxes of CH_4, CO_2 and O_2 at soil columns tops
        ! Sedimentary oxygen demand is added to CO_2 and O_2 as sources in OXYGEN_MOD module
        methsoilflux(i) =    methsoilflux(i) - febul0(i)
        co2soilflux (i) =  - febul0(i)*fracb0(2)/fracb0(1)
        o2soilflux  (i) =  - febul0(i)*fracb0(3)/fracb0(1)
      enddo
    endif
    
    END SUBROUTINE BUBBLE_BLOCK
    
    END SUBROUTINE LAKE
    
    
    END MODULE LAKE_MOD