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

Universalization of the approach to climate data from station

parent 4b692cc2
No related branches found
No related tags found
No related merge requests found
...@@ -28,6 +28,7 @@ model_data_paths = [ ...@@ -28,6 +28,7 @@ model_data_paths = [
f'results/{station}_1.txt', f'results/{station}_1.txt',
f'results/{station}_2.txt', f'results/{station}_2.txt',
f'results/{station}_3.txt' f'results/{station}_3.txt'
#f'results/{station}_4.txt'
] ]
#if enviromental == station #if enviromental == station
obs_data_path = f'data/obs_data_{station}.csv' obs_data_path = f'data/obs_data_{station}.csv'
......
...@@ -7,7 +7,7 @@ module carbon_model_to_core_arg_kit ...@@ -7,7 +7,7 @@ module carbon_model_to_core_arg_kit
! --------------------------------------------------------------------------------- ! ---------------------------------------------------------------------------------
use carbon_core, only : arg_kit_type, narg_default use carbon_core, only : arg_kit_type, narg_default
use grid, only: date_c, date_fst, date_lst,first_date,last_date
implicit none implicit none
private private
...@@ -18,14 +18,18 @@ module carbon_model_to_core_arg_kit ...@@ -18,14 +18,18 @@ module carbon_model_to_core_arg_kit
! параметры ! параметры
! --------------------------------------------------------------------------------- ! ---------------------------------------------------------------------------------
integer :: fix1, fix2
integer, parameter :: nmonth = 12 integer, parameter :: nmonth = 12
integer, parameter :: year_min = 1974 !< предусмотренный диапазон лет integer, parameter :: year_min = 1974 !< предусмотренный диапазон лет
integer, parameter :: year_max = 2017 !< integer, parameter :: year_max = 2018 !<
! (43+1)*12 = 528 ! Для случая Rostov: 1974 - 2017
! (72+1)*12 = 876 ! Для случая DAO3: 1939 - 2011 ! (44)*12 = 528 ! Для случая Rostov: 1974 - 2018
! (74+1)*12 = 900 ! Для случая DAO4: 1937 - 2011 ! (73)*12 = 876 ! Для случая DAO3: 1939 - 2012
! (61+1)*12 = 744 ! Для случая TRGK: 1956 - 2017 ! (75)*12 = 900 ! Для случая DAO4: 1937 - 2012
! (49+1)*12 = 600 ! Для случая VLDMR: 1968 - 2017 ! (62)*12 = 744 ! Для случая TRGK: 1956 - 2018
! (50)*12 = 600 ! Для случая VLDMR: 1968 - 2018
contains contains
...@@ -52,6 +56,7 @@ contains ...@@ -52,6 +56,7 @@ contains
real, optional, intent(in), target :: x_year(year_min:year_max) real, optional, intent(in), target :: x_year(year_min:year_max)
integer :: n integer :: n
integer :: mnc !< Количество месяцев в расчете
do n = 1, narg_default do n = 1, narg_default
allocate(arg_kit(n)%arg1) allocate(arg_kit(n)%arg1)
......
...@@ -6,8 +6,8 @@ module carbon_model_inmcm_aux ...@@ -6,8 +6,8 @@ module carbon_model_inmcm_aux
use const, only : pi, yrs use const, only : pi, yrs
use environment_model_inmcm, only : nv2 use environment_model_inmcm, only : nv2
use environment_core, only : Tsoil, Temp, Wsoil use environment_core, only : Tsoil, Temp, Wsoil
use carbon_model_to_core_arg_kit, only : year_min, year_max, nmonth use carbon_model_to_core_arg_kit, only : nmonth
use grid, only : dt use grid, only: date_c, date_fst, date_lst, dt
implicit none implicit none
...@@ -15,13 +15,16 @@ module carbon_model_inmcm_aux ...@@ -15,13 +15,16 @@ module carbon_model_inmcm_aux
! Интерфейс ! Интерфейс
! ------------------------------------------------------------------------------------------------------------------- ! -------------------------------------------------------------------------------------------------------------------
! ------- Station of observation ------ ! ------- Station of observation ------
character(len=10) :: station = 'Rostov' !< Станция наблюдения за климатом !!! Нужно указать название !!! character(len=10) :: station = 'Rostov' !< Станция наблюдения за климатом ! Нужно указать название
character(len=2) :: opt = '1' !< Имя варианта подачи удобрения !!! Нужно указать номер !!! character(len=2) :: opt = '1' !< Имя варианта подачи удобрения ! Нужно указать номер
! ------- Serve value ------- ! ------- Serve value -------
integer, parameter :: mnc = (year_max - year_min + 1)*nmonth !Как часть параметров для задания климатических данных 528 !876! integer :: mnc !< Колличество месяцев в расчете
!< Колличество месяцев в расчете integer :: mncX = 0 !< Номер месяца с начала работы программы !Как часть параметров для шага по времени
integer :: k !< Номер месяца с начала работы программы !Как часть параметров для шага по времени integer :: mnclot_fst(5) = (/1937,1939,1956,1968,1974/) !Как часть параметров для задания климатических данных
integer :: mnclot_lst(5) = (/2012,2012,2018,2018,2018/) !Как часть параметров для задания климатических данных
!DAO4 DAO3 VLDR TRGK ROST
integer :: station_n ! 1 2 3 4 5 !Как часть параметров для задания климатических данных
! ------------------------------------------------------------------------------------------------------------------- ! -------------------------------------------------------------------------------------------------------------------
! Main part of INMCM ! Main part of INMCM
...@@ -42,7 +45,7 @@ module carbon_model_inmcm_aux ...@@ -42,7 +45,7 @@ module carbon_model_inmcm_aux
real, parameter :: tmin_soil = 0. !< эквивалент label='fst' real, parameter :: tmin_soil = 0. !< эквивалент label='fst'
real, parameter :: t_ref = 25. !< референсная температура для величин типа rmf25, kc25 и тд [C] real, parameter :: t_ref = 25. !< референсная температура для величин типа rmf25, kc25 и тд [C]
real, parameter :: t_ref_soil = 10. !< референсная температура для величин типа Ts [C] real, parameter :: t_ref_soil = 10. !< референсная температура для величин типа Ts [C]
real, parameter :: hint = 200. !< Depth above which the total (rswa) and average (rsw) soil moisture is calculated,! в модели изначально 200. real, parameter :: hint = 100. !< Depth above which the total (rswa) and average (rsw) soil moisture is calculated,! в модели изначально 200.
real, parameter :: cv81b = 50. !< Decomposition time, [year] real, parameter :: cv81b = 50. !< Decomposition time, [year]
! ---- Landuse ---- ! ---- Landuse ----
...@@ -60,10 +63,10 @@ module carbon_model_inmcm_aux ...@@ -60,10 +63,10 @@ module carbon_model_inmcm_aux
real, target :: rsw(nv2) !, btran(nv2) real, target :: rsw(nv2) !, btran(nv2)
! ------ Climate variables -------- ! ------ Climate variables --------
real :: in_temp(0:mnc) !< Поступление извне данных cредней температуры почвы в месяц, [Celsius] real, allocatable :: in_temp(:) !< Поступление извне данных cредней температуры почвы в месяц, [Celsius]
real :: in_wsoil(0:mnc) !< Поступление извне данных влажности почвы, [dim] real, allocatable :: in_wsoil(:) !< Поступление извне данных влажности почвы, [dim]
! ------ Litterfall -------- ! ------ Litterfall --------
real :: in_lambd(0:mnc) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year] real, allocatable :: in_lambd(:) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year]
real :: lambd !< Поступление углерода в почву в интервал времени dt, [kg/m**3 / year / dt](lambdac) real :: lambd !< Поступление углерода в почву в интервал времени dt, [kg/m**3 / year / dt](lambdac)
contains contains
...@@ -86,6 +89,11 @@ contains ...@@ -86,6 +89,11 @@ contains
allocate(ers_weight(i0:i1,j0:j1,nv2)) allocate(ers_weight(i0:i1,j0:j1,nv2))
! ---- Part of enviromental carbon_model_init() ---- ! ---- Part of enviromental carbon_model_init() ----
mnc = (date_lst%y - date_fst%y)*nmonth + (date_lst%m - date_fst%m)
allocate(in_temp(0:mnc))
allocate(in_wsoil(0:mnc))
allocate(in_lambd(0:mnc))
open (unit = 1, file = 'initial_value/'//trim(station)//'_Temp.txt', status='unknown') open (unit = 1, file = 'initial_value/'//trim(station)//'_Temp.txt', status='unknown')
read(1,*) in_temp(1:mnc) read(1,*) in_temp(1:mnc)
close (1) close (1)
...@@ -100,17 +108,36 @@ contains ...@@ -100,17 +108,36 @@ contains
!in_lambd(1:mnc) = 0.1428*12 / yrs !in_lambd(1:mnc) = 0.1428*12 / yrs
in_lambd = in_lambd/dt in_lambd = in_lambd/dt
select case (station)
case('Rostov')
station_n = 5
case('DAO3', 'DAO4')
if (station == 'DAO3') then
station_n = 2
else
station_n = 1
end if
case('VLDMR')
station_n = 3
case('TRGK')
station_n = 4
case default
stop "check failed : unknown station name"
end select
! ---- Part of timesteps init ---- ! ---- Part of timesteps init ----
! @todo учесть шаг по времени 1 час ! @todo учесть шаг по времени 1 час
if (dt == 86400) then ! Для шага по времени день: if (dt == 86400) then ! Для шага по времени день:
k = 0 mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m - date_fst%m
in_temp(0) = in_temp(1) in_temp(0) = in_temp(1)
in_wsoil(0) = in_wsoil(1) in_wsoil(0) = in_wsoil(1)
in_lambd(0) = in_lambd(1) in_lambd(0) = in_lambd(1)
else ! Для шага по времени месяц: else ! Для шага по времени месяц:
k = 1 mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m
end if end if
print*, 'mncX', mncX
! ---- Part of inmcm carbon_model_init() ---- ! ---- Part of inmcm carbon_model_init() ----
! ---- Variables from INMCM ---- ! ---- Variables from INMCM ----
...@@ -158,9 +185,6 @@ contains ...@@ -158,9 +185,6 @@ contains
conversion_defor_global_to_regional = 1. conversion_defor_global_to_regional = 1.
endif endif
print*, 'csoil_global(:,:,12):', csoil_global(j0,i0,12)
print*, 'conversion_defor_global_to_regional:', conversion_defor_global_to_regional
deallocate(cveg_global) deallocate(cveg_global)
deallocate(csoil_global) deallocate(csoil_global)
...@@ -216,27 +240,29 @@ contains ...@@ -216,27 +240,29 @@ contains
i = date_c%m ! Номер месяца i = date_c%m ! Номер месяца
j = date_c%d ! Номер дня месяца j = date_c%d ! Номер дня месяца
N(i) = date_c%days(i) ! Количество дней в месяце N(i) = date_c%days(i) ! Количество дней в месяце
!k ! номер месяца с начала работы программы !mncX ! номер месяца с начала работы программы
if (dt == 86400) then ! Для шага по времени день: if (dt == 86400) then ! Для шага по времени день:
Temp(ii,jj) = in_temp(k)*sin(pi*(j-1)/(N(i)-1)) + in_temp(k+1)*(1-sin(pi*(j-1)/(N(i)-1))) Temp(ii,jj) = in_temp(mncX)*sin(pi*(j-1)/(N(i)-1)) + in_temp(mncX+1)*(1-sin(pi*(j-1)/(N(i)-1)))
Wsoil(ii,jj,:) = in_wsoil(k)*sin(pi*(j-1)/(N(i)-1)) + in_wsoil(k+1)*(1-sin(pi*(j-1)/(N(i)-1))) Wsoil(ii,jj,:) = in_wsoil(mncX)*sin(pi*(j-1)/(N(i)-1)) + in_wsoil(mncX+1)*(1-sin(pi*(j-1)/(N(i)-1)))
lambd = in_lambd(k)/(N(i)) lambd = in_lambd(mncX)/(N(i))
if (j == (N(i)/2)) k = k+1 if (j == (N(i)/2)) mncX = mncX + 1
else ! Для шага по времени месяц: else ! Для шага по времени месяц:
Temp(ii,jj) = in_temp(k) Temp(ii,jj) = in_temp(mncX)
Wsoil(ii,jj,:) = in_wsoil(k) Wsoil(ii,jj,:) = in_wsoil(mncX)
lambd = in_lambd(k) lambd = in_lambd(mncX)
!if (k == mnc) k = 0 !if (mncX == mnc) mncX = 0
k = k+1 mncX = mncX+1
end if end if
Tsoil(ii,jj,:) = Temp(ii,jj) ! температура почвы равна температуре воздуха Tsoil(ii,jj,:) = Temp(ii,jj) ! температура почвы равна температуре воздуха
!print*, 'area(ii,jj):', area(ii,jj) !print*, 'Fmicr:', Fmicr(:,:,12)
!print*, 'Csoil(ii,jj,12): ', Csoil(ii,jj,12) !print*, 'Fmicrb: ', Fmicrb(:,:,12)
!print*, 'soer(12): ', soer(12) !print*, 'Flit: ', Flit(:,:,12)
!print*, 'ers_weight', ers_weight !print*, 'Fers', Fers(:,:,12)
!write(333,*) date_c%timestamp, Fmicr(:,:,12), Fmicrb(:,:,12), Flit(:,:,12), Fers(:,:,12)
!write(334,*) date_c%timestamp, rsw(12), Temp(ii,jj), Csoil(:,:,12)
end subroutine end subroutine
......
...@@ -10,14 +10,17 @@ implicit none ...@@ -10,14 +10,17 @@ implicit none
! ------------------------------------------------------------------------------------------------------------------- ! -------------------------------------------------------------------------------------------------------------------
! ------- Station of observation ------ ! ------- Station of observation ------
character(len=10) :: station = 'Rostov' !< Станция наблюдения за климатом ! Нужно указать название character(len=10) :: station = 'Rostov' !< Станция наблюдения за климатом ! Нужно указать название
character(len=2) :: opt = '3' !< Имя варианта подачи удобрения ! Нужно указать номер character(len=2) :: opt = '1' !< Имя варианта подачи удобрения ! Нужно указать номер
! ------- Serve value ------- ! ------- Serve value -------
integer, parameter :: mnc = (year_max - year_min + 1)*nmonth !Как часть параметров для задания климатических данных integer :: mnc !< Колличество месяцев в расчете
!< Колличество месяцев в расчете integer :: mncX = 0 !< Номер месяца с начала работы программы !Как часть параметров для шага по времени
integer :: k !< Номер месяца с начала работы программы !Как часть параметров для шага по времени integer :: mnclot_fst(5) = (/1937,1939,1956,1968,1974/) !Как часть параметров для задания климатических данных
integer :: mnclot_lst(5) = (/2012,2012,2018,2018,2018/) !Как часть параметров для задания климатических данных
!DAO4 DAO3 VLDR TRGK ROST
integer :: station_n ! 1 2 3 4 5 !Как часть параметров для задания климатических данных
! ------------------------------------------------------------------------------------------------------------------- ! -------------------------------------------------------------------------------------------------------------------
! Main part of rothc ! Main part of RoTHC
! ------- Pools ------- ! ------- Pools -------
real, dimension(:,:,:), pointer :: Catm !< атмосфера real, dimension(:,:,:), pointer :: Catm !< атмосфера
...@@ -57,17 +60,18 @@ implicit none ...@@ -57,17 +60,18 @@ implicit none
real :: s0 !< Оптимальная влажность почвы, [dim] real :: s0 !< Оптимальная влажность почвы, [dim]
real :: smin !< Переменные для функций, [dim] real :: smin !< Переменные для функций, [dim]
! ------ Determined externally ! ------ Determined externally
real :: in_temp(0:mnc) !< Поступление извне данных cредней температуры воздуха в месяц, [Celsius] real, allocatable :: in_temp(:) !< Поступление извне данных cредней температуры воздуха в месяц, [Celsius]
real :: Temp !< Средняя температура воздуха в интервал времени dt, [Celsius] real :: Temp !< Средняя температура воздуха в интервал времени dt, [Celsius]
real :: Tsoil !< Средняя температура почвы в интервал времени dt, [Celsius] real :: Tsoil !< Средняя температура почвы в интервал времени dt, [Celsius]
real :: in_veg(0:mnc) !< Поступление извне данных средней концентрации растений в месяц, [%] real, allocatable :: in_veg(:) !< Поступление извне данных средней концентрации растений в месяц, [%]
real :: veg !< Средняя концентрация растений в интервал времени dt, [%] real :: veg !< Средняя концентрация растений в интервал времени dt, [%]
real :: in_wsoil(0:mnc) !< Поступление извне данных влажности почвы, [dim] real, allocatable :: in_wsoil(:) !< Поступление извне данных влажности почвы, [dim]
real :: Wsoil !< Влажность почвы в интервал времени dt, [dim] real :: Wsoil !< Влажность почвы в интервал времени dt, [dim]
real :: sw !< Влажность увядания DAO: 0.120 Rostov: 0.146 real :: sw !< Влажность увядания DAO: 0.120 Rostov: 0.146
! ------ Litterfall -------- ! ------ Litterfall --------
real :: in_lambd(0:mnc) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year] real, allocatable :: in_lambd(:) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year]
real :: lambd !< Поступление углерода в почву в интервал времени dt (lambdac) real :: lambd !< Поступление углерода в почву в интервал времени dt (lambdac)
contains contains
subroutine carbon_model_init() subroutine carbon_model_init()
...@@ -79,6 +83,12 @@ contains ...@@ -79,6 +83,12 @@ contains
fdpm = alphadr/(1 + alphadr) fdpm = alphadr/(1 + alphadr)
! ---- Part of enviromental carbon_model_init() ---- ! ---- Part of enviromental carbon_model_init() ----
mnc = (date_lst%y - date_fst%y)*nmonth + (date_lst%m - date_fst%m)
allocate(in_temp(0:mnc))
allocate(in_veg(0:mnc))
allocate(in_wsoil(0:mnc))
allocate(in_lambd(0:mnc))
open (unit = 1, file = 'initial_value/'//trim(station)//'_Temp.txt', status='unknown') open (unit = 1, file = 'initial_value/'//trim(station)//'_Temp.txt', status='unknown')
read(1,*) in_temp(1:mnc) read(1,*) in_temp(1:mnc)
close (1) close (1)
...@@ -99,15 +109,23 @@ contains ...@@ -99,15 +109,23 @@ contains
case('Rostov') case('Rostov')
sw = 0.146 sw = 0.146
bettar = 0.41 bettar = 0.41
station_n = 5
case('DAO3', 'DAO4') case('DAO3', 'DAO4')
sw = 0.120 sw = 0.120
bettar = 0.25 bettar = 0.25
if (station == 'DAO3') then
station_n = 2
else
station_n = 1
end if
case('VLDMR') case('VLDMR')
sw = 0.120 sw = 0.120
bettar = 0.08 bettar = 0.08
station_n = 3
case('TRGK') case('TRGK')
sw = 0.120 sw = 0.120
bettar = 0.07 bettar = 0.07
station_n = 4
case default case default
stop "check failed : unknown station name" stop "check failed : unknown station name"
end select end select
...@@ -117,13 +135,13 @@ contains ...@@ -117,13 +135,13 @@ contains
! ---- Part of timesteps init ---- ! ---- Part of timesteps init ----
! @todo учесть шаг по времени 1 час ! @todo учесть шаг по времени 1 час
if (dt == 86400) then ! Для шага по времени день: if (dt == 86400) then ! Для шага по времени день:
k = 0 mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m - date_fst%m
in_temp(0) = in_temp(1) in_temp(0) = in_temp(1)
in_veg(0) = in_veg(1) in_veg(0) = in_veg(1)
in_wsoil(0) = in_wsoil(1) in_wsoil(0) = in_wsoil(1)
in_lambd(0) = in_lambd(1) in_lambd(0) = in_lambd(1)
else ! Для шага по времени месяц: else ! Для шага по времени месяц:
k = 1 mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m
end if end if
end subroutine end subroutine
...@@ -147,21 +165,21 @@ contains ...@@ -147,21 +165,21 @@ contains
i = date_c%m ! Номер месяца i = date_c%m ! Номер месяца
j = date_c%d ! Номер дня месяца j = date_c%d ! Номер дня месяца
N(i) = date_c%days(i) ! Количество дней в месяце N(i) = date_c%days(i) ! Количество дней в месяце
!k ! Номер месяца с начала работы программы !mncX ! Номер месяца с начала работы программы
! ------------- ! -------------
if (dt == 86400) then ! Для шага по времени день: if (dt == 86400) then ! Для шага по времени день:
Temp = in_temp(k)*sin(pi*(j-1)/(N(i)-1)) + in_temp(k+1)*(1-sin(pi*(j-1)/(N(i)-1))) Temp = in_temp(mncX)*sin(pi*(j-1)/(N(i)-1)) + in_temp(mncX+1)*(1-sin(pi*(j-1)/(N(i)-1)))
Wsoil = in_wsoil(k)*sin(pi*(j-1)/(N(i)-1)) + in_wsoil(k+1)*(1-sin(pi*(j-1)/(N(i)-1))) Wsoil = in_wsoil(mncX)*sin(pi*(j-1)/(N(i)-1)) + in_wsoil(mncX+1)*(1-sin(pi*(j-1)/(N(i)-1)))
veg = in_veg(k) veg = in_veg(mncX)
lambd = in_lambd(k)/N(i) lambd = in_lambd(mncX)/N(i)
if (j == (N(i)/2)) k = k+1 if (j == (N(i)/2)) mncX = mncX + 1
else ! Для шага по времени месяц: else ! Для шага по времени месяц:
Temp = in_temp(k) Temp = in_temp(mncX)
Wsoil = in_wsoil(k) Wsoil = in_wsoil(mncX)
veg = in_veg(k) veg = in_veg(mncX)
lambd = in_lambd(k) lambd = in_lambd(mncX)
k = k+1 mncX = mncX + 1
end if end if
Tsoil = Temp ! температура почвы равна температуре воздуха Tsoil = Temp ! температура почвы равна температуре воздуха
...@@ -189,8 +207,10 @@ contains ...@@ -189,8 +207,10 @@ contains
Rs = RDPM + RRPM + RBIO + RHUM Rs = RDPM + RRPM + RBIO + RHUM
!print*, 'date_fst, ', date_fst%y print*, 'Temp, ', Temp
!print*, 'date_lst, ', date_lst%y print*, 'Wsoil, ', Wsoil
print*, 'veg, ', veg
print*, 'lambd, ', lambd
!print*, 'timestamp_fst, ', timestamp_fst !print*, 'timestamp_fst, ', timestamp_fst
!print*, 'important thing 4, ', Temp(k) !print*, 'important thing 4, ', Temp(k)
......
...@@ -9,12 +9,15 @@ implicit none ...@@ -9,12 +9,15 @@ implicit none
! ------------------------------------------------------------------------------------------------------------------- ! -------------------------------------------------------------------------------------------------------------------
! ------- Station of observation ------ ! ------- Station of observation ------
character(len=10) :: station = 'Rostov' !< Станция наблюдения за климатом ! Нужно указать название character(len=10) :: station = 'Rostov' !< Станция наблюдения за климатом ! Нужно указать название
character(len=2) :: opt = '3' !< Имя варианта подачи удобрения ! Нужно указать номер character(len=2) :: opt = '1' !< Имя варианта подачи удобрения ! Нужно указать номер
! ------- Serve value ------- ! ------- Serve value -------
integer, parameter :: mnc = (year_max - year_min + 1)*nmonth !Как часть параметров для задания климатических данных integer :: mnc !< Колличество месяцев в расчете
!< Колличество месяцев в расчете integer :: mncX = 0 !< Номер месяца с начала работы программы !Как часть параметров для шага по времени
integer :: k !< Номер месяца с начала работы программы !Как часть параметров для шага по времени integer :: mnclot_fst(5) = (/1937,1939,1956,1968,1974/) !Как часть параметров для задания климатических данных
integer :: mnclot_lst(5) = (/2012,2012,2018,2018,2018/) !Как часть параметров для задания климатических данных
!DAO4 DAO3 VLDR TRGK ROST
integer :: station_n ! 1 2 3 4 5 !Как часть параметров для задания климатических данных
! ------------------------------------------------------------------------------------------------------------------- ! -------------------------------------------------------------------------------------------------------------------
! Main part of SOCS ! Main part of SOCS
...@@ -28,25 +31,31 @@ implicit none ...@@ -28,25 +31,31 @@ implicit none
real, dimension(:,:,:), pointer :: F_litterfall !< Между растением и почвой1 (отмирание и опад) real, dimension(:,:,:), pointer :: F_litterfall !< Между растением и почвой1 (отмирание и опад)
real, dimension(:,:,:), pointer :: F_mineralization !< Между почвой1 и почвой2 (минерализация) real, dimension(:,:,:), pointer :: F_mineralization !< Между почвой1 и почвой2 (минерализация)
real, dimension(:,:,:), pointer :: F_destabilization !< Между почвой2 и почвой1 (дестабилизация?) real, dimension(:,:,:), pointer :: F_destabilization !< Между почвой2 и почвой1 (дестабилизация?)
! ------- Serve value -------
integer, parameter :: ntiles = 2 !< В данном случае, номер пула
! ------- Coefficients ------------ ! ------- Coefficients ------------
real :: rare = 0.45 !< Доля углерода переходящего в пул защищенного C1 real :: rare = 0.45 !< Доля углерода переходящего в пул защищенного C1
real :: Cm = 12. !< Max кол-во органического углерода которое может быть защищено в почве real :: Cm = 12. !< Max кол-во органического углерода которое может быть защищено в почве
real :: kirk = 7.5/yrs !< Коэф. скорости разложения C1 !(ntiles) = (/ 7.5/yrs, 4./yrs /) real :: kirk = 4./yrs !< Коэф. скорости разложения C1
real :: kd !< Коэф. перехода углерода из C2 в C1, десорбация, разрушение агрегатов real :: kd !< Коэф. перехода углерода из C2 в C1, десорбация, разрушение агрегатов
! ------ Litterfall -------- ! ------ Litterfall --------
real :: in_lambd(0:mnc) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year] real, allocatable :: in_lambd(:) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year]
real :: lambd !< Поступление углерода в почву в интервал времени dt (lambdac) real :: lambd !< Поступление углерода в почву в интервал времени dt (lambdac)
contains contains
subroutine carbon_model_init() subroutine carbon_model_init()
! ---- Part of enviromental carbon_model_init() ---- ! ---- Part of enviromental carbon_model_init() ----
mnc = (date_lst%y - date_fst%y)*nmonth + (date_lst%m - date_fst%m)
allocate(in_lambd(0:mnc))
open (unit = 1, file = 'initial_value/'//trim(station)//'_'//trim(opt)//'.txt', status='unknown') open (unit = 1, file = 'initial_value/'//trim(station)//'_'//trim(opt)//'.txt', status='unknown')
read(1,*) in_lambd(1:mnc) read(1,*) in_lambd(1:mnc)
close (1) close (1)
select case (station) select case (station)
case('Rostov') case('Rostov')
station_n = 5
select case (opt) select case (opt)
case ('1') case ('1')
kd = 0.012/yrs kd = 0.012/yrs
...@@ -58,6 +67,11 @@ contains ...@@ -58,6 +67,11 @@ contains
stop "check failed : unknown opt name" stop "check failed : unknown opt name"
end select end select
case('DAO3', 'DAO4') case('DAO3', 'DAO4')
if (station == 'DAO3') then
station_n = 2
else
station_n = 1
end if
select case (opt) select case (opt)
case ('1') case ('1')
kd = 0.03/yrs kd = 0.03/yrs
...@@ -83,10 +97,10 @@ contains ...@@ -83,10 +97,10 @@ contains
! ---- Part of timesteps init ---- ! ---- Part of timesteps init ----
! @todo учесть шаг по времени 1 час ! @todo учесть шаг по времени 1 час
if (dt == 86400) then ! Для шага по времени день: if (dt == 86400) then ! Для шага по времени день:
k = 0 mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m - date_fst%m
in_lambd(0) = in_lambd(1) in_lambd(0) = in_lambd(1)
else ! Для шага по времени месяц: else ! Для шага по времени месяц:
k = 1 mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m
end if end if
end subroutine end subroutine
...@@ -108,17 +122,22 @@ contains ...@@ -108,17 +122,22 @@ contains
i = date_c%m ! Номер месяца i = date_c%m ! Номер месяца
j = date_c%d ! Номер дня месяца j = date_c%d ! Номер дня месяца
N(i) = date_c%days(i) ! Количество дней в месяце N(i) = date_c%days(i) ! Количество дней в месяце
!k ! Номер месяца с начала работы программы !mncX ! Номер месяца с начала работы программы
! ------------- ! -------------
if (dt == 86400) then ! Для шага по времени день: if (dt == 86400) then ! Для шага по времени день:
lambd = in_lambd(k)/N(i) lambd = in_lambd(mncX)/N(i)
if (j == (N(i)/2)) k = k+1 if (j == (N(i)/2)) mncX = mncX + 1
else ! Для шага по времени месяц: else ! Для шага по времени месяц:
lambd = in_lambd(k) lambd = in_lambd(mncX)
k = k+1 mncX = mncX + 1
end if end if
!print*, 'date_fst%y, ', date_fst%y
!print*, 'mnclot_fst(station_n), ', mnclot_fst(station_n)
!print*, 'date_lst%m, ', date_lst%m
!print*, 'station_n, ', station_n
end subroutine end subroutine
......
...@@ -19,7 +19,9 @@ module environment_model_inmcm ...@@ -19,7 +19,9 @@ module environment_model_inmcm
integer, parameter :: nv2 = 13 ! временное локальное предписанное значение integer, parameter :: nv2 = 13 ! временное локальное предписанное значение
integer, parameter :: ns2 = 9 integer, parameter :: ns2 = 9
real, parameter :: rhodry(ml) = 1.2 !< плотность сухой почвы, г/см3 real, parameter :: rhodry(ml) = 2.62 !< плотность сухой почвы, г/см3
! 1.0 DAO
! 2.62 Rostov
real :: g2gw_to_cmw(ml) !< г/г воды в см воды в слоях почвы real :: g2gw_to_cmw(ml) !< г/г воды в см воды в слоях почвы
real :: sncr = 0.4 real :: sncr = 0.4
......
...@@ -53,6 +53,7 @@ module grid ...@@ -53,6 +53,7 @@ module grid
integer :: dt_nc integer :: dt_nc
real(8) :: jday0_nc real(8) :: jday0_nc
type(date_type) :: date_c, date_fst, date_lst type(date_type) :: date_c, date_fst, date_lst
integer :: last_date, first_date
! текущие индексы в циклах: ! текущие индексы в циклах:
integer :: tt integer :: tt
...@@ -375,7 +376,6 @@ contains ...@@ -375,7 +376,6 @@ contains
integer :: ncid, dimid, varid integer :: ncid, dimid, varid
real(8), allocatable :: work1r8(:) real(8), allocatable :: work1r8(:)
select case(environment_data_type) select case(environment_data_type)
case('lsm_offline') case('lsm_offline')
...@@ -433,6 +433,9 @@ contains ...@@ -433,6 +433,9 @@ contains
date_c = date_fst date_c = date_fst
first_date = date_fst%y
last_date = date_lst%y
end subroutine end subroutine
......
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
!> Дата и время на момент старта: !> Дата и время на момент старта:
datetime_init_mode = 'manual' !auto datetime_init_mode = 'manual' !auto
! !
! 'manual' - задать вручную [yyyy-mm-dd hh:mm:ss] 1937 1939 1974 1968 1956 ! 'manual' - задать вручную [yyyy-mm-dd hh:mm:ss] 1937 1939 1956 1968 1974
datetime_init = '1974-01-01 00:00:00' datetime_init = '1974-01-01 00:00:00'
! (для lsm_offline) 'auto' - получить из входного файла ! (для lsm_offline) 'auto' - получить из входного файла
...@@ -96,9 +96,9 @@ ...@@ -96,9 +96,9 @@
ntime_mode = 'datetime_last' ntime_mode = 'datetime_last'
! !
! 'ntime' - указанное число шагов ! 'ntime' - указанное число шагов
ntime = 1000 !10000!2000000 ntime = 1000
! 'datetime_last' - до достижения указанной даты 2011 2017 2974 ! 'datetime_last' - до достижения указанной даты 2012 2018 2975
datetime_last = '2017-01-01 00:00:00' datetime_last = '2018-01-01 00:00:00'
! (для lsm_offline) 'auto' - до конца входного файла ! (для lsm_offline) 'auto' - до конца входного файла
! продвинутые настройки ! продвинутые настройки
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment