Skip to content
Snippets Groups Projects
Commit 68a99435 authored by Georgiy Faikin's avatar Georgiy Faikin
Browse files

Update the Rothc model by new information from soil scientists

parent 71e01326
No related branches found
No related tags found
No related merge requests found
Showing
with 119 additions and 181 deletions
date,1,8,11 date,1,8,11
1974-01-01,8.9088,8.9088,8.9088 1975-01-01,8.9088,8.9088,8.9088
1983-09-15,8.595600000000001,8.873999999999999,9.013200000000001 1983-09-15,8.595600000000001,8.873999999999999,9.013200000000001
1992-09-07,8.282399999999999,8.9088,9.1176 1992-09-07,8.282399999999999,8.9088,9.1176
1998-08-02,8.0388,8.9088,9.1872 1998-08-02,8.0388,8.9088,9.1872
......
...@@ -13,18 +13,6 @@ ...@@ -13,18 +13,6 @@
0 0
0 0
0 0
115
184
262
171
165
125
0
0
0
0
0
0
84 84
167 167
224 224
......
...@@ -14,17 +14,6 @@ ...@@ -14,17 +14,6 @@
0 0
0 0
0 0
0
0
0
0
0
0
0
0
0
0
0
0.0250587 0.0250587
0.0501174 0.0501174
0.08770545 0.08770545
......
...@@ -13,18 +13,6 @@ ...@@ -13,18 +13,6 @@
0 0
0 0
0 0
0
0
0
0
0.18
0
0
0
0
0
0
0
0.0253395 0.0253395
0.050679 0.050679
0.08868825 0.08868825
......
...@@ -13,18 +13,6 @@ ...@@ -13,18 +13,6 @@
0 0
0 0
0 0
0
0
0
0
0.36
0
0
0
0
0
0
0
0.0253314 0.0253314
0.0506628 0.0506628
0.0886599 0.0886599
......
0.412552965583605
0.424120203859102
0.417746586157707
0.419412464455061
0.419073572546531
0.334889556039574
0.29103367664772
0.256135976139186
0.274615792741693
0.344031471499806
0.409927574051255
0.432412848030488
0.426525111499154 0.426525111499154
0.419310388578998 0.419310388578998
0.421111007032755 0.421111007032755
......
-7
-2.6
2.2
7.8
15.5
20.5
22
21.4
17.7
14
4
0.7
-1.1 -1.1
-2.9 -2.9
3 3
......
...@@ -10,18 +10,6 @@ ...@@ -10,18 +10,6 @@
1 1
1 1
1 1
0
0
0
0
0
0
0
0
1
1
1
1
1 1
1 1
1 1
......
...@@ -10,18 +10,6 @@ ...@@ -10,18 +10,6 @@
15 15
24 24
40 40
12
8
38
29
26
7
45
5
62
15
24
40
74 74
4 4
12 12
......
...@@ -117,7 +117,7 @@ program nonlin ...@@ -117,7 +117,7 @@ program nonlin
Flux(0) = 0. !w*Us(0)*C0 Flux(0) = 0. !w*Us(0)*C0
Flux(1) = w*Us(1)*C0*h(1)/(2.*h(1)+h(2)) !/1000. Flux(1) = -C0*w*h(1)/(2.*h(1) + h(2)) !/1000. w*Us(1)*C0*h(1)/(2.*h(1)+h(2))
do i = 2, N do i = 2, N
Cz(i) = M10(i)*C(i-2) + M11(i)*C(i-1) + M12(i)*C(i) Cz(i) = M10(i)*C(i-2) + M11(i)*C(i-1) + M12(i)*C(i)
......
...@@ -25,7 +25,7 @@ module carbon_model_to_core_arg_kit ...@@ -25,7 +25,7 @@ module carbon_model_to_core_arg_kit
integer, parameter :: year_min = 1900 !< предусмотренный диапазон лет integer, parameter :: year_min = 1900 !< предусмотренный диапазон лет
integer, parameter :: year_max = 2025 !< integer, parameter :: year_max = 2025 !<
! (44)*12 = 528 ! Для случая Rostov: 1974 - 2018 ! (44)*12 = 528 ! Для случая Rostov: 1975 - 2018
! (73)*12 = 876 ! Для случая DAO3: 1939 - 2012 ! (73)*12 = 876 ! Для случая DAO3: 1939 - 2012
! (75)*12 = 900 ! Для случая DAO4: 1937 - 2012 ! (75)*12 = 900 ! Для случая DAO4: 1937 - 2012
! (62)*12 = 744 ! Для случая TRGK: 1956 - 2018 ! (62)*12 = 744 ! Для случая TRGK: 1956 - 2018
......
...@@ -47,10 +47,10 @@ module carbon_model_rothc ...@@ -47,10 +47,10 @@ module carbon_model_rothc
! atmosphere fall ! atmosphere fall
call set_flux(fid = n_F, pid_out = n_Catm, pid_in = n_CBIO, name = '(0.46*bettar)*Rs') call set_flux(fid = n_F, pid_out = n_Catm, pid_in = n_CBIO, name = '(0.46*bettar)*Rs')
call set_mult(n_F, 'lin', x = Rs, k_ij = (0.46*bettar/100)) call set_mult(n_F, 'lin', x = Rs, k_ij = BIO_prop) ! (0.46*bettar/100)
call set_flux(fid = n_F, pid_out = n_Catm, pid_in = n_CHUM, name = '(0.54*bettar)*Rs') call set_flux(fid = n_F, pid_out = n_Catm, pid_in = n_CHUM, name = '(0.54*bettar)*Rs')
call set_mult(n_F, 'lin', x = Rs, k_ij = (0.54*bettar/100)) call set_mult(n_F, 'lin', x = Rs, k_ij = HUM_prop) ! (0.54*bettar/100)
end subroutine carbon_model_assembly end subroutine carbon_model_assembly
......
...@@ -5,7 +5,7 @@ module carbon_model_rothc_aux ...@@ -5,7 +5,7 @@ module carbon_model_rothc_aux
use environment_core, only: Tsoil, Wsoil, lambd, veg, sw, bettar use environment_core, only: Tsoil, Wsoil, lambd, veg, sw, bettar
use config, only: station_name, station_opt, carbon_model_type use config, only: station_name, station_opt, carbon_model_type
use const, only: yrs, pi, nmonth use const, only: yrs, pi, nmonth
use grid, only: date_c, i0, i1, j0, j1, ml use grid, only: date_c, i0, i1, j0, j1, ml, dt
! ---------------------------------------------- Variables ------------------------------------------------------------ ! ---------------------------------------------- Variables ------------------------------------------------------------
implicit none implicit none
...@@ -37,10 +37,18 @@ module carbon_model_rothc_aux ...@@ -37,10 +37,18 @@ module carbon_model_rothc_aux
real :: Ft, Fs, Fv !< Функции: температуры, влажности, фракции растительного покрова [dim] real :: Ft, Fs, Fv !< Функции: температуры, влажности, фракции растительного покрова [dim]
real :: fdpm !< Функция определяющая разлагаемую часть опада, [dim] real :: fdpm !< Функция определяющая разлагаемую часть опада, [dim]
! ------- Coefficients ------------ ! ------- Coefficients ------------
real, parameter :: ks(ntiles) = (/ 3.22*(1.E-7), 9.65*(1.E-9), 2.12*(1.E-8), 6.43*(1.E-10)/) real :: ks(ntiles) = (/ 3.22*(1.E-7), 9.65*(1.E-9), 2.12*(1.E-8), 6.43*(1.E-10)/)
!real :: ks(ntiles) = (/ 3.22*(1.E-6), 9.65*(1.E-9), 2.12*(1.E-8), 6.43*(1.E-9)/)
!real :: ks(ntiles) = (/ 10., 0.3, 0.66, 0.02/)
!< Скорость дыхания единицы массы каждого пула в стандартных условиях, [1-s] !< Скорость дыхания единицы массы каждого пула в стандартных условиях, [1-s]
real, parameter :: alphadr = 1.44 !< Определяет соотношение поступления опада между DPM и RPM, [dim], real, parameter :: alphadr = 1.44 !< Определяет соотношение поступления опада между DPM и RPM, [dim],
! Для деревьев, для кустарников, для натуральной травы, для СХ (/ 0.25, 0.33, 0.67, 1.44 /) ! Для деревьев, для кустарников, для натуральной травы, для СХ (/ 0.25, 0.33, 0.67, 1.44 /)
real, allocatable :: SA(:,:) ! Определяет распределение выдыхаемой части пула по остальным пулам
real, allocatable :: CO2_prop(:,:) ! Определяет распределение выдыхаемой части пула по остальным пулам
real, allocatable :: BIO_prop(:,:) ! Определяет распределение выдыхаемой части пула по остальным пулам
real, allocatable :: HUM_prop(:,:) ! Определяет распределение выдыхаемой части пула по остальным пулам
! ------ Climate variables -------- ! ------ Climate variables --------
! ------ Determined within ! ------ Determined within
real, allocatable :: s0(:,:,:) !< Оптимальная влажность почвы, [dim] real, allocatable :: s0(:,:,:) !< Оптимальная влажность почвы, [dim]
...@@ -52,17 +60,21 @@ module carbon_model_rothc_aux ...@@ -52,17 +60,21 @@ module carbon_model_rothc_aux
real :: cs ! Сумма пулов real :: cs ! Сумма пулов
! ----- The topsoil moisture deficit ------- ! ----- The topsoil moisture deficit -------
! real, allocatable :: TSMD(:,:) ! the topsoil moisture deficit real, allocatable :: TSMD(:,:) ! the topsoil moisture deficit
! real, allocatable :: rainfall(:,:) ! осадки (из внешних данных) real :: deep = 30. ! глубина слоя
! real, allocatable :: Evpar(:,:) ! Evaporation real, allocatable :: SMD(:,:) ! TSMD на актуальной глубине
! real, allocatable :: evpar_part(:,:) ! 75% from evaporation real, allocatable :: bSMD(:,:) ! Случай TSMD для голой почвы (bare soil)
! real, allocatable :: moi_bal(:,:) ! rainfall - evaporation real, allocatable :: moi_bal(:,:) ! rainfall minus evaporation
! real, allocatable :: aTSMD(:,:) ! accumulated topsoil mositure deficit real, allocatable :: aTSMD(:,:) ! accumulated topsoil mositure deficit
! real :: b ! moisture coefficient
! integer :: mncX real, allocatable :: in_rainfall(:)
! integer :: mnc = 528 ! Случай для Ростова real, allocatable :: in_Evpar(:)
! real, allocatable :: in_rainfall(:) real, allocatable :: rainfall(:,:) ! осадки (из внешних данных)
! real, allocatable :: in_Evpar(:) real, allocatable :: Evpar(:,:) ! Evaporation
real, allocatable :: evpar_part(:,:) ! 75% from evaporation
integer :: mncX
integer :: mnc = 516 ! Случай для Ростова
contains contains
subroutine carbon_model_init() subroutine carbon_model_init()
...@@ -72,26 +84,36 @@ contains ...@@ -72,26 +84,36 @@ contains
allocate(s0(i0:i1,j0:j1,ml)) allocate(s0(i0:i1,j0:j1,ml))
allocate(smin(i0:i1,j0:j1,ml)) allocate(smin(i0:i1,j0:j1,ml))
allocate(SA(i0:i1,j0:j1))
allocate(CO2_prop(i0:i1,j0:j1))
allocate(BIO_prop(i0:i1,j0:j1))
allocate(HUM_prop(i0:i1,j0:j1))
! init of TPMD ! init of TPMD
! allocate(TSMD(i0:i1,j0:j1)) allocate(TSMD(i0:i1,j0:j1))
! allocate(rainfall(i0:i1,j0:j1)) allocate(SMD(i0:i1,j0:j1))
! allocate(Evpar(i0:i1,j0:j1)) allocate(bSMD(i0:i1,j0:j1))
! allocate(evpar_part(i0:i1,j0:j1)) allocate(moi_bal(i0:i1,j0:j1))
! allocate(moi_bal(i0:i1,j0:j1)) allocate(aTSMD(i0:i1,j0:j1))
! allocate(aTSMD(i0:i1,j0:j1))
! allocate(in_rainfall(0:mnc)) allocate(in_rainfall(0:mnc))
! allocate(in_Evpar(0:mnc)) allocate(in_Evpar(0:mnc))
allocate(rainfall(i0:i1,j0:j1))
! TSMD(:,:) = -(20. + 1.3*bettar(:,:) - 0.01*bettar(:,:)**2) allocate(Evpar(i0:i1,j0:j1))
allocate(evpar_part(i0:i1,j0:j1))
! open (unit = 1, file = 'initial_value/rainfall.txt', status='unknown')
! read(1,*) in_rainfall(1:mnc) TSMD(:,:) = -(20. + 1.3*bettar(:,:) - 0.01*bettar(:,:)**2)
! close (1) SMD(:,:) = TSMD(:,:)/23.*deep
! open (unit = 1, file = 'initial_value/Evpar.txt', status='unknown') bSMD(:,:) = SMD(:,:)/1.8
! read(1,*) in_Evpar(1:mnc)
! close (1) open (unit = 1, file = 'initial_value/rainfall.txt', status='unknown')
read(1,*) in_rainfall(1:mnc)
! mncX = 1 close (1)
open (unit = 1, file = 'initial_value/Evpar.txt', status='unknown')
read(1,*) in_Evpar(1:mnc)
close (1)
mncX = 1
! main init part of Rothc ! main init part of Rothc
do i = 1, ml do i = 1, ml
...@@ -101,6 +123,16 @@ contains ...@@ -101,6 +123,16 @@ contains
fdpm = alphadr/(1 + alphadr) fdpm = alphadr/(1 + alphadr)
SA = 0.
CO2_prop = 0.
BIO_prop = 0.
HUM_prop = 0.
SA(:,:) = 1.67*(1.85 + 1.6*exp(-0.0786*bettar(:,:)))
CO2_prop(:,:) = SA(:,:)/(SA(:,:) + 1.)
BIO_prop(:,:) = 0.46/(SA(:,:) + 1.)
HUM_prop(:,:) = 0.54/(SA(:,:) + 1.)
end subroutine end subroutine
...@@ -117,37 +149,21 @@ contains ...@@ -117,37 +149,21 @@ contains
integer, intent(in) :: ii, jj integer, intent(in) :: ii, jj
! ---- TPMD_calc_at_cell ---- ! ---- TPMD_calc_at_cell ----
! rainfall(ii,jj) = in_rainfall(mncX) rainfall(ii,jj) = in_rainfall(mncX)
! Evpar(ii,jj) = in_Evpar(mncX) Evpar(ii,jj) = in_Evpar(mncX)
! !rainfall(ii,jj) = 48.2
! !Evpar(ii,jj) = 81.8
! evpar_part(ii,jj) = 0.75*Evpar(ii,jj)
! moi_bal(ii,jj) = rainfall(ii,jj) - evpar_part(ii,jj)
! if (moi_bal(ii,jj) < 0. .or. aTSMD(ii,jj) < 0.) then
! aTSMD(ii,jj) = moi_bal(ii,jj) + aTSMD(ii,jj)
! if (aTSMD(ii,jj) < TSMD(ii,jj)) aTSMD(ii,jj) = TSMD(ii,jj)
! if (aTSMD(ii,jj) > 0.) aTSMD(ii,jj) = 0.
! end if
! if (aTSMD(ii,jj) > 0.444*TSMD(ii,jj)) then
! b = 1.0
! else
! b = 0.2 + (1.0 - 0.2)*(TSMD(ii,jj) - aTSMD(ii,jj))/(TSMD(ii,jj) - 0.444*TSMD(ii,jj))
! end if
! mncX = mncX + 1
! --------------
! main part of rothc_calc_at_cell
! Tsoil(ii,jj,1) = 10.2 evpar_part(ii,jj) = 0.75*Evpar(ii,jj)
! Wsoil(ii,jj,1) = 0.355704637 moi_bal(ii,jj) = rainfall(ii,jj) - evpar_part(ii,jj)
if (veg(ii,jj) == 1) then
aTSMD(ii,jj) = max(SMD(ii,jj), min(0.,aTSMD(ii,jj) + moi_bal(ii,jj)))
else
aTSMD(ii,jj) = max(min(bSMD(ii,jj),aTSMD(ii,jj)),min(0.,aTSMD(ii,jj) + moi_bal(ii,jj)))
end if
! if (Tsoil(ii,jj,1) <= 0.) then ! Если влажность зануляется при отрицательной температуре mncX = mncX + 1
! Wsoil(ii,jj,1) = 0. ! --------------
! s0(ii,jj,1) = 0. ! main part of rothc_calc_at_cell
! end if
if (Wsoil(ii,jj,1) >= s0(ii,jj,1)) then if (Wsoil(ii,jj,1) >= s0(ii,jj,1)) then
Fs = 1. - 0.8*(Wsoil(ii,jj,1) - s0(ii,jj,1)) Fs = 1. - 0.8*(Wsoil(ii,jj,1) - s0(ii,jj,1))
...@@ -157,20 +173,37 @@ contains ...@@ -157,20 +173,37 @@ contains
Fs = 0.2 Fs = 0.2
end if end if
! Fs = b
if (Tsoil(ii,jj,1) >= -18.27) then if (aTSMD(ii,jj) > 0.444*SMD(ii,jj)) then
Fs = 1.
else
Fs = 0.2 + (1. - 0.2)*(SMD(ii,jj) - aTSMD(ii,jj))/(SMD(ii,jj) - 0.444*SMD(ii,jj))
end if
if (Tsoil(ii,jj,1) >= -5.) then
Ft = 47.91/(1. + exp(106.06/(Tsoil(ii,jj,1) + 18.27))) Ft = 47.91/(1. + exp(106.06/(Tsoil(ii,jj,1) + 18.27)))
else else
Ft = 0 Ft = 0
end if end if
Fv = 0.6 + 0.4*(1. - veg(ii,jj)) Fv = 0.6 + 0.4*(1. - veg(ii,jj))
RDPM = Ft*Fv*Fs*ks(1)*CDPM(ii,jj,1) RDPM = CDPM(ii,jj,1)*(1. - exp(-Ft*Fv*Fs*ks(1)*dt))/dt
RRPM = Ft*Fv*Fs*ks(2)*CRPM(ii,jj,1) RRPM = CRPM(ii,jj,1)*(1. - exp(-Ft*Fv*Fs*ks(2)*dt))/dt
RBIO = Ft*Fv*Fs*ks(3)*CBIO(ii,jj,1) RBIO = CBIO(ii,jj,1)*(1. - exp(-Ft*Fv*Fs*ks(3)*dt))/dt
RHUM = Ft*Fv*Fs*ks(4)*CHUM(ii,jj,1) RHUM = CHUM(ii,jj,1)*(1. - exp(-Ft*Fv*Fs*ks(4)*dt))/dt
!RDPM = CDPM(ii,jj,1)*Ft*Fv*Fs*ks(1)
!RRPM = CRPM(ii,jj,1)*Ft*Fv*Fs*ks(2)
!RBIO = CBIO(ii,jj,1)*Ft*Fv*Fs*ks(3)
!RHUM = CHUM(ii,jj,1)*Ft*Fv*Fs*ks(4)
print*, 'RDPM:', RDPM
print*, 'RRPM:', RRPM
print*, 'RBIO:', RBIO
print*, 'RHUM:', RHUM
Rs = RDPM + RRPM + RBIO + RHUM Rs = RDPM + RRPM + RBIO + RHUM
......
...@@ -48,7 +48,7 @@ module carbon_model_socs ...@@ -48,7 +48,7 @@ module carbon_model_socs
call set_flux(fid = n_F, pid_out = n_Csoil2, pid_in = n_Csoil1, name = 'destabilization') call set_flux(fid = n_F, pid_out = n_Csoil2, pid_in = n_Csoil1, name = 'destabilization')
call set_mult(n_F, 'lin', x_ijn = C2) call set_mult(n_F, 'lin', x_ijn = C2)
call set_mult(n_F, 'lin', x = kd) call set_mult(n_F, 'lin', x_ij = kd)
call set_flux(fid = n_F, pid_out = n_Csoil1, pid_in = n_Csoil2, name = 'mineralization') call set_flux(fid = n_F, pid_out = n_Csoil1, pid_in = n_Csoil2, name = 'mineralization')
call set_mult(n_F, 'lin', x_ijn = C2, k = -1./Cm, y0 = 1.) call set_mult(n_F, 'lin', x_ijn = C2, k = -1./Cm, y0 = 1.)
......
...@@ -24,7 +24,7 @@ module environment_data_station ...@@ -24,7 +24,7 @@ module environment_data_station
integer :: opt_n !< Номер способа подачи удобрения integer :: opt_n !< Номер способа подачи удобрения
integer :: station_n ! DAO4 DAO3 TRGK VLDR ROST !< Номер станции наблюдения за климатом integer :: station_n ! DAO4 DAO3 TRGK VLDR ROST !< Номер станции наблюдения за климатом
! 1 2 3 4 5 ! 1 2 3 4 5
integer :: mnclot_fst(station_max) = (/1937,1939,1956,1968,1974/) !< Даты начала сбора данных по климату, в рамках станции integer :: mnclot_fst(station_max) = (/1937,1939,1956,1968,1975/) !< Даты начала сбора данных по климату, в рамках станции
integer :: mnclot_lst(station_max) = (/2012,2012,2018,2018,2018/) !< Даты конца сбора данных по климату, в рамках станции integer :: mnclot_lst(station_max) = (/2012,2012,2018,2018,2018/) !< Даты конца сбора данных по климату, в рамках станции
! --------------------------------------------------------------------------------------------------------------------- ! ---------------------------------------------------------------------------------------------------------------------
! ------ Determined externally ------ ! ------ Determined externally ------
...@@ -38,7 +38,7 @@ module environment_data_station ...@@ -38,7 +38,7 @@ module environment_data_station
! 2.62 ! 2.62
! ---- For Rothc ---- ! ---- For Rothc ----
real(kind = 16) :: sw_in (station_max) = (/0.120, 0.120, 0.120, 0.120, 0.146/) real(kind = 16) :: sw_in (station_max) = (/0.120, 0.120, 0.120, 0.120, 0.146/)
real(kind = 16) :: bettar_in(station_max) = (/25., 25., 7., 8., 41./) real(kind = 16) :: bettar_in(station_max) = (/25., 25., 7., 8., 44./)
! ---- For SOCs ---- ! ---- For SOCs ----
real :: kd_in (station_max,opt_max) real :: kd_in (station_max,opt_max)
! opt = 1 2 3 4 ! opt = 1 2 3 4
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
! ----------------------------------------------------------------- ! -----------------------------------------------------------------
!> Углеродная модель: !> Углеродная модель:
carbon_model_type = 'socs' carbon_model_type = 'rothc'
! !
! 'inmcm' - модель inmcm [1,2] ! 'inmcm' - модель inmcm [1,2]
! 'socs' - модель SOCS [3] ! 'socs' - модель SOCS [3]
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
! 'TRGK' - Данные Торжок ! 'TRGK' - Данные Торжок
! !
!> Тип подачи удобрения: !> Тип подачи удобрения:
station_opt = '3' station_opt = '1'
! '1' - контрольный случай, без дополнительных удобрений ! '1' - контрольный случай, без дополнительных удобрений
! '2' - 2 способ подачи удобрений ! '2' - 2 способ подачи удобрений
! '3' - 3 способ подачи удобрений ! '3' - 3 способ подачи удобрений
...@@ -104,8 +104,8 @@ ...@@ -104,8 +104,8 @@
datetime_init_mode = 'manual' datetime_init_mode = 'manual'
! !
! 'auto' - получить из входного файла (для lsm_offline) ! 'auto' - получить из входного файла (для lsm_offline)
! 'manual' - задать вручную [yyyy-mm-dd hh:mm:ss] 1937 1939 1956 1968 1974 ! 'manual' - задать вручную [yyyy-mm-dd hh:mm:ss] 1937 1939 1956 1968 1975
datetime_init = '1974-01-01 00:00:00' datetime_init = '1975-01-01 00:00:00'
!> Продолжительность расчета: !> Продолжительность расчета:
ntime_mode = 'datetime_last' ntime_mode = 'datetime_last'
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment