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

Add new environmenmt data type: environment_data_station; SOCs approved

parent 93949062
No related branches found
No related tags found
No related merge requests found
Showing
with 503 additions and 159 deletions
......@@ -48,6 +48,7 @@ gfortran $keys_compile -c source/datetime.f90 -o bin/datetime.o -Jbin
gfortran $keys_compile -c source/grid.f90 -o bin/grid.o -Jbin
gfortran $keys_compile -c source/environment/environment_core.f90 -o bin/environment_core.o -Jbin
gfortran $keys_compile -c source/environment/environment_data_generator.f90 -o bin/environment_data_generator.o -Jbin
gfortran $keys_compile -c source/environment/environment_data_station.f90 -o bin/environment_data_station.o -Jbin
gfortran $keys_compile -c source/environment/environment_data_lsm_offline.f90 -o bin/environment_data_lsm_offline.o -Jbin
gfortran $keys_compile -c source/environment/environment_model_INMCM.f90 -o bin/environment_model_INMCM.o -Jbin
gfortran $keys_compile -c source/environment/environment.f90 -o bin/environment.o -Jbin
......
program nonlin
implicit none
integer, parameter :: N = 11 ! количество элементов сетки
integer, parameter :: a = 12 ! коэффициент сгущения сетки
real :: x(N) ! Значение аргумента, аналог x(i-1/2) в статье
real :: E(N) ! интерполяция
real :: h(N) ! Шаг сетки
real :: Cor(2:N-1) ! Оригинальное значение поступающей функции
real :: Cr1(N) ! Среднее значение функции (функция разбивается на небольшие интервалы)
real :: M10(2:N-1), M10p1(2:N-1), M10p2(2:N-1)
real :: M11(2:N-1), M11p1(2:N-1), M11p2(2:N-1)
real :: M12(2:N-1), M12p1(2:N-1), M12p2(2:N-1)
real :: M00p1(N-1), M00p2(N-1), M00(N-1)
real :: M01p1(N-1), M01p2(N-1), M01(N-1)
real :: M02p1(N-1), M02p2(N-1), M02(N-1)
real :: CL(2:N-1), CR(1:N-2) ! Реконструкция слева и справа
real :: InCor
integer :: i !< count
! ---- initial value ----
do i = 2, N-1
Cor(i) = 0.003 + 0.001*i
end do
! ---- вычисление аргумента сетки, шага по сетке ----
E = (/0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1./)
do i = 1, N
!E(i) = (i - 1.)/(N - 1.)*1.0
x(i) = ((1 + a)**E(i) - 1.)/a
end do
h(1) = x(1)
do i = 2, N
h(i) = x(i) - x(i-1)
end do
! ---- Вычисление среднего значения поступающей на вход функции Cor(x,t) в ячейке с номером i, ----
!! На выход Cr1(N-1)
do i = 2, N-1
InCor = InCor + Cor(i)*0.5*(x(i+1)-x(i-1)) !Функция Cor(i) интегрируется в пределах x(i-1) и x(i)
end do
h(1) = 0.01
do i = 1, N
Cr1(i) = 1./h(i)*InCor
end do
! ---- Вычисление коэффициентов при значениях среднего значения функции C(x,t)
do i = 2, N-1
M10p1(i) = -h(i)*h(i+1)
M10p2(i) = (h(i) + h(i-1))*(h(i) + h(i-1) + h(i+1))
M10(i) = M10p1(i)/M10p2(i)
M11p1(i) = h(i+1)*(3*h(i)**2 + 3*h(i)*h(i-1) + 2*h(i)*h(i+1) + h(i-1)**2 + h(i-1)*h(i+1))
M11p2(i) = (h(i)**2 + h(i)*h(i-1) + 2*h(i)*h(i+1) + h(i-1)*h(i+1) + h(i+1)**2)*(h(i) + h(i-1))
M11(i) = M11p1(i)/M11p2(i)
M12p1(i) = h(i)*(h(i) + h(i-1))
M12p2(i) = h(i)**2 + h(i)*h(i-1) + 2*h(i)*h(i+1) + h(i-1)*h(i+1) + h(i+1)**2
M12(i) = M12p1(i)/M12p2(i)
end do
do i = 1, N-2
M00p1(i) = h(i+1)*(h(i+1) + h(i+2))
M00p2(i) = (h(i) + h(i+1) + h(i+2))*(h(i) + h(i+1))
M00(i) = M00p1(i)/M00p2(i)
M01p1(i) = h(i)*(h(i+1) + h(i+2))/((h(i) + h(i+1))*h(i+2))
M01p2(i) = h(i)*(h(i+1))**2/(h(i+2)*(h(i) + h(i+1) + h(i+2))*(h(i+1) + h(i+2)))
M01(i) = M01p1(i) + M01p2(i)
M02p1(i) = h(i)*h(i+1)
M02p2(i) = (h(i) + h(i+1) + h(i+2))*(h(i+1) + h(i+2))
M02(i) = M02p1(i)/M02p2(i)
end do
! ---- Реконструкция ----
do i = 2, N-1
CL(i) = M10(i)*Cr1(i-1) + M11(i)*Cr1(i) + M12(i)*Cr1(i+1) ! Слева
end do
do i = 1, N-2
CR(i) = M00(i)*Cr1(i) + M01(i)*Cr1(i+1) + M02(i)*Cr1(i+2) ! Справа
end do
print*, 'CL', CL
print*, 'CR', CR
print*, 'Cr1:', Cr1
print*, 'x:', x
print*, 'h:', h
print*, 'InCor:', InCor
end program nonlin
!MODULE MUSCL_MOD
!часть с use
! implicit none !некоторые переменные
!contains
! !> Function action_1 - implements MINMOD limiter after Roe (1986)
! FUNCTION action_1(a,b)
! implicit none
! real, intent(in) :: a, b
! real :: action_1
! action_1 = 0.5*(sign(1.,a) + sign(1.,b))*min(abs(a),abs(b))
! END FUNCTION action_1
!SUBROUTINE Non_lineare_grid(N,array)
!integer, intent(in) :: N !< Number of grid cells
!real, intent(in ) :: array(1:N) !< Grid variable to be interpolated
! do i = 1, N-1
! fun(i) = call(f, x(i)) !!!!
! call integral(x(i-1), x(i),n,intgr)
! srdzn(i) = intgr(i)/h(i)
! end do
!
! intgr = h(i)*(sum(fun) - (fun(0) + fun(n))/2 )
!
!
! function integral(x0,xn,n,f, intgr)
!
! implicit none
! integer, intent(in) :: n
! real, intent(in) :: x0, xn, f
! real :: hop, x(0:n), intgr
!
! hop = (xn - x0)/n
! x(0) = x0
! x(n) = xn
!
! do i = 1, N-1
! x(i) = x(i - 1) + hop
! fun(i) = call(f, x(i)) !!!!
! end do
!
! intgr = hop*(sum(fun) - (fun(0) + fun(n))/2 )
!
! end function integral
!END SUBROUTINE Non_lineare_grid
!END MODULE MUSCL_MOD
\ No newline at end of file
......@@ -22,7 +22,7 @@ module carbon_model_to_core_arg_kit
integer, parameter :: nmonth = 12
integer, parameter :: year_min = 1974 !< предусмотренный диапазон лет
integer, parameter :: year_min = 1956 !< предусмотренный диапазон лет
integer, parameter :: year_max = 2018 !<
! (44)*12 = 528 ! Для случая Rostov: 1974 - 2018
......
......@@ -136,8 +136,6 @@ contains
mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m
end if
print*, 'mncX', mncX
! ---- Part of inmcm carbon_model_init() ----
! ---- Variables from INMCM ----
......@@ -221,6 +219,7 @@ contains
do jj = j0, j1
do n = 1, nv2
ers_weight(ii,jj,n) = Csoil(ii,jj,n) * soer(n) / sc8
print*, area(ii,jj), sc8, ers_weight(ii,jj,n)
end do
end do
end do
......@@ -232,7 +231,7 @@ contains
subroutine carbon_model_calc_at_cell(ii,jj)
! ---- Part of environmental_calc_at_cell(ii,jj) ----
use grid, only: date_c
use grid, only: date_c, area
integer, intent(in) :: ii, jj
integer i, N(12), j !< count
......@@ -262,7 +261,7 @@ contains
!print*, 'Flit: ', Flit(:,:,12)
!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
......
......@@ -25,14 +25,14 @@ module carbon_model_socs
call set_pool(pid = n_Catm, name = 'catm')
call set_pool(pid = n_Cveg, name = 'cveg')
call set_pool(pid = n_Csoil1, name = 'csoil1',initial_value = 0.178176, alias = C1)
call set_pool(pid = n_Csoil2, name = 'csoil2',initial_value = 8.730624, alias = C2)
call set_pool(pid = n_Csoil1, name = 'csoil1',initial_value = 0.060028, alias = C1) !0.056761
call set_pool(pid = n_Csoil2, name = 'csoil2',initial_value = 2.941372, alias = C2) !2.78124
call set_flux(fid = n_F, pid_out = n_Cveg, pid_in = n_Csoil1, name = 'litterfall')
call set_mult(n_F, 'lin', x = lambd)
call set_mult(n_F, 'lin', x_ij = lambd)
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, k = kd)
call set_mult(n_F, 'lin', x_ijn = C2, k_ij = kd)
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.)
......
module carbon_model_socs_aux
use carbon_model_to_core_arg_kit, only : year_min, year_max, nmonth
use environment_core, only: kd, lambd
use const, only : yrs
use grid, only: date_c, date_fst, date_lst, dt
use grid, only: date_c
use config, only : station_name, station_opt
! ---------------------------------------------- Environmental factors ------------------------------------------------
implicit none
! Интерфейс
! -------------------------------------------------------------------------------------------------------------------
! ------- Station of observation ------
character(len=10) :: station = 'Rostov' !< Станция наблюдения за климатом ! Нужно указать название
character(len=2) :: opt = '1' !< Имя варианта подачи удобрения ! Нужно указать номер
! ------- Serve value -------
integer :: mnc !< Колличество месяцев в расчете
integer :: mncX = 0 !< Номер месяца с начала работы программы !Как часть параметров для шага по времени
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
! ------- Pools -------
real, dimension(:,:,:), pointer :: Catm !< атмосфера
......@@ -37,71 +24,12 @@ implicit none
real :: rare = 0.45 !< Доля углерода переходящего в пул защищенного C1
real :: Cm = 12. !< Max кол-во органического углерода которое может быть защищено в почве
real :: kirk = 4./yrs !< Коэф. скорости разложения C1
real :: kd !< Коэф. перехода углерода из C2 в C1, десорбация, разрушение агрегатов
! ------ Litterfall --------
real, allocatable :: in_lambd(:) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year]
real :: lambd !< Поступление углерода в почву в интервал времени dt (lambdac)
!real :: kd !< Коэф. перехода углерода из C2 в C1, десорбация, разрушение агрегатов
contains
subroutine 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')
read(1,*) in_lambd(1:mnc)
close (1)
select case (station)
case('Rostov')
station_n = 5
select case (opt)
case ('1')
kd = 0.012/yrs
case ('2')
kd = 0.007/yrs
case ('3')
kd = 0.007/yrs
case default
stop "check failed : unknown opt name"
end select
case('DAO3', 'DAO4')
if (station == 'DAO3') then
station_n = 2
else
station_n = 1
end if
select case (opt)
case ('1')
kd = 0.03/yrs
case ('2')
kd = 0.03/yrs
case ('3')
kd = 0.035/yrs
case ('4')
kd = 0.03/yrs
case default
stop "check failed : unknown opt name"
end select
case('VLDMR')
stop "check failed : can't work with this station name"
case('TRGK')
stop "check failed : can't work with this station name"
case default
stop "check failed : unknown station name"
end select
in_lambd = in_lambd/dt
! ---- Part of timesteps init ----
! @todo учесть шаг по времени 1 час
if (dt == 86400) then ! Для шага по времени день:
mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m - date_fst%m
in_lambd(0) = in_lambd(1)
else ! Для шага по времени месяц:
mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m
end if
end subroutine
......@@ -116,27 +44,6 @@ contains
integer, intent(in) :: ii, jj
! ---- Part of environmental_calc_at_cell(ii,jj) ----
integer i, N(12),j !< count
! ------------- Переменные для распределения значений по всему временному интервалу
i = date_c%m ! Номер месяца
j = date_c%d ! Номер дня месяца
N(i) = date_c%days(i) ! Количество дней в месяце
!mncX ! Номер месяца с начала работы программы
! -------------
if (dt == 86400) then ! Для шага по времени день:
lambd = in_lambd(mncX)/N(i)
if (j == (N(i)/2)) mncX = mncX + 1
else ! Для шага по времени месяц:
lambd = in_lambd(mncX)
mncX = mncX + 1
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
......@@ -148,12 +55,11 @@ contains
end subroutine
subroutine carbon_model_postprocessing()
use grid, only : date_c
open(unit=500, file='results/'//trim(station)//'_'//trim(opt)//'.txt', status='unknown')
open(unit=500, file='results/'//trim(station_name)//'_'//trim(station_opt)//'.txt', status='unknown')
write(500,*) date_c%timestamp,';',C1(:,:,1),';',C2(:,:,1)
end subroutine
......
......@@ -6,11 +6,17 @@ module config
public
private :: config_check
! конфигурация
character(len_default) :: carbon_model_type
! входные данные
character(len_default) :: environment_data_type
character(len_default) :: lsm_datafile
character(len_default) :: lsm_dataformat
character(len_default) :: station_name
character(len_default) :: station_opt
! пространственная сетка
character(len_default) :: spatial_grid_mode
real :: spatial_grid_res(2)
character(len_default) :: spatial_sample_mode
......@@ -18,6 +24,7 @@ module config
integer :: ich
real :: point(2)
real :: polygon(4)
! продолжительность расчета
character(len_default) :: dt_mode
integer :: dt
character(len_default) :: datetime_init_mode
......@@ -26,6 +33,7 @@ module config
integer :: ntime
character(len_default) :: datetime_last
integer :: UTC = 0
! продвинутые настройки
logical :: if_datafile_read_at_first
logical :: if_out_yearly
logical :: if_standard_print
......@@ -34,11 +42,15 @@ module config
integer :: nv_singlecolumn
character(len_default) :: environment_model_type
namelist /config_namelist/ &
& carbon_model_type, &
& environment_data_type, &
& lsm_datafile, &
& lsm_dataformat, &
&station_name, & !Добавил
&station_opt, & !Добавил
& spatial_grid_mode, &
& spatial_grid_res, &
& spatial_sample_mode, &
......@@ -136,13 +148,27 @@ module config
end select
select case(environment_data_type)
case('none', 'generator', 'lsm_offline')
case('none', 'generator', 'lsm_offline', 'station')
case('lsm_online')
stop "check failed : environment_data_type == 'lsm_online' is not supported yet"
case default
stop "check failed : unknown environment_data_type"
end select
select case(station_name)
case('Rostov', 'DAO3','DAO4', 'VLDMR', 'TRGK')
case default
stop "check failed : unknown station name"
end select
select case(station_opt)
case('1', '2','3', '4')
case default
stop "check failed : unknown station_opt"
end select
select case(lsm_dataformat)
case('inmcm')
case('era5')
......@@ -190,6 +216,15 @@ module config
! тест на сочетания настроек
! -----------------------------------------------------------------------------
if (carbon_model_type == 'socs' .and. environment_data_type == 'station' &
& .and. (station_name == 'VLDMR' .or. station_name == 'TRGK' )) then
stop "check failed : this carbon_model_type can't work with this station name"
endif
if ((station_name == 'Rostov' .or. station_name == 'VLDMR' .or. station_name == 'TRGK' ) .and. station_opt == '4') then
stop "check failed : this station name can't work with this station_opt"
endif
if (carbon_model_type == 'inmcm' .and. environment_data_type == 'none') then
stop "check failed : carbon_model_type == 'inmcm' requires environment_data_type /= 'none'"
endif
......
......@@ -23,6 +23,7 @@ module const
real, parameter :: r_earth = 6371000. !< радиус Земли, м
real, parameter :: rho_w = 1. !< плотность воды [г/см3]
real, parameter :: deg2rad = pi/180.
integer, parameter :: nmonth = 12 !< количество месяцев в году
! технические константы:
integer, parameter :: miss_v = -999 !< значение по умолчанию
......
......@@ -16,6 +16,13 @@ module environment
& environment_model_calc_at_timestep_inmcm => environment_model_calc_at_timestep, &
& environment_model_calc_at_cell_inmcm => environment_model_calc_at_cell, &
& environment_model_calc_at_tile_inmcm => environment_model_calc_at_tile
use environment_data_station, only : environment_data_init_station => environment_data_init, &
& environment_data_calc_at_timestep_station => environment_data_calc_at_timestep, &
& environment_data_calc_at_cell_station => environment_data_calc_at_cell, &
& environment_data_calc_at_tile_station => environment_data_calc_at_tile
use config, only : environment_data_type, &
& environment_model_type
......@@ -50,7 +57,6 @@ module environment
procedure(interface_calc_at_cell), pointer :: environment_model_calc_at_cell
procedure(interface_calc_at_tile), pointer :: environment_model_calc_at_tile
contains
......@@ -72,8 +78,15 @@ contains
environment_data_calc_at_timestep => environment_data_calc_at_timestep_lsm_offline
environment_data_calc_at_cell => environment_data_calc_at_cell_lsm_offline
environment_data_calc_at_tile => environment_data_calc_at_tile_lsm_offline
case('station')
environment_data_init => environment_data_init_station
environment_data_calc_at_timestep => environment_data_calc_at_timestep_station
environment_data_calc_at_cell => environment_data_calc_at_cell_station
environment_data_calc_at_tile => environment_data_calc_at_tile_station
end select
select case(environment_model_type)
case('inmcm')
select case(environment_data_type)
......
......@@ -8,6 +8,7 @@ module environment_core
private
public :: Temp, e, Rswd, Rlwd, p, pr, Wind, Tsrf, Tgr, snow, ra, Tsoil, Wsoil, Isoil
public :: sw, bettar, veg, kd, lambd
public :: environment_core_init
! переменные
......@@ -28,6 +29,11 @@ module environment_core
real, allocatable, dimension(:,:,:), target :: Wsoil !< Mass water content at soil on depth levels, [g/g]
real, allocatable, dimension(:,:,:), target :: Isoil !< Mass ice content at soil on depth levels, [g/g]
real, allocatable, dimension(:,:), target :: sw !< Влажность увядания
real, allocatable, dimension(:,:), target :: bettar !< Fraction of soil respiration, [%] from 0 to 1
real, allocatable, dimension(:,:), target :: veg !< Средняя концентрация растений в интервал времени dt, [%]
real, allocatable, dimension(:,:), target :: kd !< Коэф. перехода углерода из C2 в C1, десорбация, разрушение агрегатов
real, allocatable, dimension(:,:), target :: lambd !< Поступление углерода в почву в интервал времени dt (lambdac)
contains
......@@ -55,6 +61,18 @@ contains
allocate(Wsoil(i0:i1,j0:j1,ml))
allocate(Isoil(i0:i1,j0:j1,ml))
allocate(sw(i0:i1,j0:j1))
allocate(bettar(i0:i1,j0:j1))
allocate(veg(i0:i1,j0:j1))
allocate(kd(i0:i1,j0:j1))
allocate(lambd(i0:i1,j0:j1))
sw = miss_v
bettar = miss_v
veg = miss_v
kd = miss_v
lambd = miss_v
Temp = miss_v
e = miss_v
Rswd = miss_v
......
......@@ -46,6 +46,7 @@ contains
pr(i,j) = 0. !< precipitation
ra(i,j) = 20. !< aerodynamical resistance
snow(i,j) = 0.
! veg(i,j) = 0.7
! ---
Tsrf(i,j) = 20. + 8.*cos(w_day*(hour-12.5)) !< temperature of surface
Tgr(i,j) = Tsrf(i,j)
......
module environment_data_station
! интерфейс
! ---------------------------------------------------------------------------------
use environment_core, only : Temp, e, Rlwd, Rswd, p, pr, Wind, ra, Tsrf, Tsoil, Wsoil, Isoil, snow, Tgr, &
& sw,bettar,kd,veg,lambd
use grid, only: date_c, date_fst, date_lst, dt, i0, i1, j0, j1
use config, only : station_name, station_opt
use const, only : yrs, nmonth, pi
implicit none
private
public :: environment_data_init
public :: environment_data_calc_at_timestep
public :: environment_data_calc_at_cell
public :: environment_data_calc_at_tile
! -------------------------------------------------------------------------------------------------------------------
! ------- Serve value -------
integer :: mnc !< Количество месяцев в расчете
integer :: mncX = 0 !< Номер месяца с начала работы программы !Как часть параметров для шага по времени
integer, parameter :: station_max = 5 !< Максимальное число станций
integer :: opt_n !< Номер способа подачи удобрения
integer, parameter :: opt_max = 4 !< Максимальное количество способов подачи удобрения
! DAO4 DAO3 TRGK VLDR ROST
integer :: station_n ! 1 2 3 4 5 !< Номер станции наблюдения за климатом
integer :: mnclot_fst(station_max) = (/1937,1939,1956,1968,1974/) !< Даты начала сбора данных по климату в рамках станции
integer :: mnclot_lst(station_max) = (/2012,2012,2018,2018,2018/) !< Даты конца сбора данных по климату в рамках станции
! -------------------------------------------------------------------------------------------------------------------
! real :: Temp !< Средняя температура воздуха в интервал времени dt, [Celsius]
! real :: Tsoil !< Средняя температура почвы в интервал времени dt, [Celsius]
! real :: Wsoil !< Влажность почвы в интервал времени dt, [dim]
! ------ Determined externally
real, allocatable :: in_temp(:) !< Поступление извне данных cредней температуры воздуха в месяц, [Celsius]
real, allocatable :: in_veg(:) !< Поступление извне данных средней концентрации растений в месяц, [%]
real, allocatable :: in_wsoil(:) !< Поступление извне данных влажности почвы, [dim]
real, allocatable :: in_lambd(:) !< Поступление извне данных по поступлению углерода в почву, [kg/m**3 / year]
! station = DAO4 DAO3 TRGK VLDR ROST
real :: sw_in(station_max) = (/0.120, 0.120, 0.120, 0.120, 0.146/)
real :: bettar_in(station_max) = (/0.25, 0.25, 0.07, 0.08, 0.41/)
real :: kd_in(station_max,opt_max)
! opt = 1 2 3 4
data kd_in(01,:) /0.03, 0.03, 0.035, 0.03/
data kd_in(02,:) /0.03, 0.03, 0.035, 0.03/
data kd_in(03,:) /0., 0., 0., 0./
data kd_in(04,:) /0., 0., 0., 0./
data kd_in(05,:) /0.012, 0.007, 0.007, 0./
contains
! внешние процедуры
! ---------------------------------------------------------------------------------
subroutine environment_data_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))
allocate(in_temp(0:mnc))
allocate(in_veg(0:mnc))
allocate(in_wsoil(0:mnc))
print*, mnc, station_name
kd_in = kd_in/yrs
read(station_opt,*) opt_n
select case (station_name)
case('Rostov')
station_n = 5
case('DAO3')
station_n = 2
case('DAO4')
station_n = 1
case('VLDMR')
station_n = 4
case('TRGK')
station_n = 3
end select
open (unit = 1, file = 'initial_value/'//trim(station_name)//'_'//trim(station_opt)//'.txt', status='unknown')
read(1,*) in_lambd(1:mnc)
close (1)
open (unit = 1, file = 'initial_value/'//trim(station_name)//'_Temp.txt', status='unknown')
read(1,*) in_temp(1:mnc)
close (1)
open (unit = 1, file = 'initial_value/'//trim(station_name)//'_MOI.txt', status='unknown')
read(1,*) in_wsoil(1:mnc)
close (1)
open (unit = 1, file = 'initial_value/'//trim(station_name)//'_Veg.txt', status='unknown')
read(1,*) in_veg(1:mnc)
close (1)
in_lambd = in_lambd/dt
sw(:,:) = sw_in(station_n)
bettar(:,:) = bettar_in(station_n)
kd(:,:) = kd_in(station_n, opt_n)
! ---- Part of timesteps init ----
! @todo учесть шаг по времени 1 час
if (dt == 86400) then ! Для шага по времени день:
mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m - date_fst%m
in_temp(0) = in_temp(1)
in_veg(0) = in_veg(1)
in_wsoil(0) = in_wsoil(1)
in_lambd(0) = in_lambd(1)
else ! Для шага по времени месяц:
mncX = (date_fst%y - mnclot_fst(station_n))*nmonth + date_lst%m
end if
! Набор переменных которые должны быть, но не данны через качественные внешние данные
p(:,:) = 980. !< pressure
Rlwd(:,:) = 350. !< longwave radiation
pr(:,:) = 0. !< precipitation
ra(:,:) = 20. !< aerodynamical resistance
snow(:,:) = 0. !< snow cover
Isoil(:,:,:) = 0. !< part of ice in the soil
end subroutine
subroutine environment_data_calc_at_timestep()
! ---------------------------------------
use const, only : w_day, miss_v
use grid, only : z, ms, ml
integer nom,nod, N(12)
integer :: i, j !< count
real :: hour
! ------------- Переменные для распределения значений по всему временному интервалу
nom = date_c%m ! Номер месяца
nod = date_c%d ! Номер дня месяца
N(nom) = date_c%days(nom) ! Количество дней в месяце
!mncX ! Номер месяца с начала работы программы
! -------------
if (dt == 86400) then ! Для шага по времени день:
Temp(:,:) = in_temp(mncX)*sin(pi*(nod-1)/(N(nom)-1)) + in_temp(mncX+1)*(1-sin(pi*(nod-1)/(N(nom)-1)))
Wsoil(:,:,:) = in_wsoil(mncX)*sin(pi*(nod-1)/(N(nom)-1)) + in_wsoil(mncX+1)*(1-sin(pi*(nod-1)/(N(nom)-1)))
veg(:,:) = in_veg(mncX)
lambd(:,:) = in_lambd(mncX)/N(nom)
if (nod == (N(nom)/2)) mncX = mncX + 1
else ! Для шага по времени месяц:
Temp(:,:) = in_temp(mncX)
Wsoil(:,:,:) = in_wsoil(mncX)
veg(:,:) = in_veg(mncX)
lambd(:,:) = in_lambd(mncX)
mncX = mncX + 1
end if
do i = 1, ml
Tsoil(:,:,i) = Temp(:,:) ! температура почвы равна температуре воздуха
end do
hour = date_c%h
! Набор переменных которые должны быть, но не данны через качественные внешние данные
do i = i0, i1
do j = j0, j1
Wind(i,j) = 2 + 1.*cos(w_day*(hour-13)) !< wind
e(i,j) = 15. + 2.*cos(2*w_day*(hour-7)) !< humidity
Rswd(i,j) = max(0.,800.*cos(w_day*(hour-12))) !< shortwave radiation
! ---
Tsrf(i,j) = 20. + 8.*cos(w_day*(hour-12.5)) !< temperature of surface
Tgr(i,j) = Tsrf(i,j)
end do
end do
end subroutine
subroutine environment_data_calc_at_cell(ii,jj)
integer, intent(in) :: ii, jj
end subroutine
subroutine environment_data_calc_at_tile(ii,jj,nn)
! ---------------------------------------
integer, intent(in) :: ii, jj, nn
end subroutine
end module
......@@ -198,16 +198,20 @@ contains
deallocate(work1i)
close(1)
call special_soilpar_read(path_inmcm_data//'soil_par_average.nc', 'theta_s', sPORu, fill_v = 0.4)
call special_soilpar_read(path_inmcm_data//'CH_par_average.nc', 'psi_s', sPSIMAXu, fill_v = -17.)
call special_soilpar_read(path_inmcm_data//'CH_par_average.nc', 'lambda', sBHu, fill_v = 0.15)
! call special_soilpar_read(path_inmcm_data//'soil_par_average.nc', 'theta_s', sPORu, fill_v = 0.4)
! call special_soilpar_read(path_inmcm_data//'CH_par_average.nc', 'psi_s', sPSIMAXu, fill_v = -17.)
! call special_soilpar_read(path_inmcm_data//'CH_par_average.nc', 'lambda', sBHu, fill_v = 0.15)
sPORu = 0.4
sPSIMAXu = -17.
sBHu = 0.15
sBHu(:,:) = 1./sBHu(:,:)
allocate(MCD15A2H_LAI(720,360,nv2,12))
call nc_errhand( nf90_open(path_inmcm_data//'mcd15a2h_to_inmcm.nc', nf90_nowrite, ncid) )
call nc_errhand( nf90_inq_varid(ncid, 'lai', varid) )
call nc_errhand( nf90_get_var(ncid, varid, MCD15A2H_LAI(:,:,:,:), (/1,1,1,1/), (/720,360,nv2,12/)) )
call nc_errhand( nf90_close(ncid) )
! call nc_errhand( nf90_open(path_inmcm_data//'mcd15a2h_to_inmcm.nc', nf90_nowrite, ncid) )
! call nc_errhand( nf90_inq_varid(ncid, 'lai', varid) )
! call nc_errhand( nf90_get_var(ncid, varid, MCD15A2H_LAI(:,:,:,:), (/1,1,1,1/), (/720,360,nv2,12/)) )
! call nc_errhand( nf90_close(ncid) )
MCD15A2H_LAI = 2.
if (nv_singlecolumn /= miss_v) then
vegg_nv1(:,:,:) = 0.
......
......@@ -14,7 +14,7 @@
!> Углеродная модель:
carbon_model_type = 'socs'
!
! 'inmcm' - модель INMCM [1,2]
! 'inmcm' - модель inmcm [1,2]
! 'socs' - модель SOCS [3]
! 'rothc' - модель ROTHC
! 'other' - шаблон
......@@ -23,13 +23,28 @@
! -----------------------------------------------------------------
!> Входные данные об окружающей среде:
environment_data_type = 'generator'
environment_data_type = 'station'
!
! 'none' - не требуются
! 'generator' - генерация суточных синусоид
! 'station' - выбор готовых данных, со станций наблюдения
! 'lsm_offline' - netcdf-файл с выходными данными модели деятельного слоя
! 'lsm_online' - онлайн-каплинг с моделью деятельного слоя (@todo пока не поддерживается)
! дополнительно для environment_data_type = 'station':
station_name = 'DAO4'
! 'Rostov' - Станция ФАНЦ
! 'DAO3' - Станция в Долгопрудном 1
! 'DAO4' - Станция в Долгопрудном 2
! 'VLDMR' - Данные Владимир
! 'TRGK' - Данные Торжок
station_opt = '4'
! '1' - контрольный случай, без дополнительных удобрений
! '2' - 2 способ подачи удобрений
! '3' - 3 способ подачи удобрений
! '4' - 4 способ подачи удобрений
! дополнительно для environment_data_type = 'lsm_offline':
!> Путь к файлу:
......@@ -64,8 +79,8 @@
ich = 46967 ! Федоровское, 05x05
! 'point' - ячейка по координатам [lon, lat]
! point(:) = 32.75, 56.25 ! Федоровское
point(:) = 39.888735, 47.364103 ! ФАНЦ (Ростов)
! point(:) = 37.535197, 55.942416 ! ДАОС (Долгопрудный)
! point(:) = 39.888735, 47.364103 ! ФАНЦ (Ростов)
point(:) = 37.535197, 55.942416 ! ДАОС (Долгопрудный)
! 'polygon' - область по координатам [lon_west, lon_east, lat_south, lat_north]
polygon(:) = 26.25, 69.75, 50.75, 69.75 ! лесная зона ЕТР
! (для lsm_offline) 'all' - вся область nectdf-файла
......@@ -88,7 +103,7 @@
datetime_init_mode = 'manual' !auto
!
! 'manual' - задать вручную [yyyy-mm-dd hh:mm:ss] 1937 1939 1956 1968 1974
datetime_init = '1974-01-01 00:00:00'
datetime_init = '1937-01-01 00:00:00'
! (для lsm_offline) 'auto' - получить из входного файла
......@@ -98,7 +113,7 @@
! 'ntime' - указанное число шагов
ntime = 1000
! 'datetime_last' - до достижения указанной даты 2012 2018 2975
datetime_last = '2018-01-01 00:00:00'
datetime_last = '2012-01-01 00:00:00'
! (для lsm_offline) 'auto' - до конца входного файла
! продвинутые настройки
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment