Select Git revision
Forked from
Victor Stepanenko / LAKE
Source project has a limited visibility.
-
Victor Stepanenko authored
Methane equation in water is now can be solved with sediments deactivated, assuming diffusive flux is given at the bottom and ebullition flux is zero
Victor Stepanenko authoredMethane equation in water is now can be solved with sediments deactivated, assuming diffusive flux is given at the bottom and ebullition flux is zero
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