Skip to content
Snippets Groups Projects
Commit 78979f42 authored by Sumbel Shangareeva's avatar Sumbel Shangareeva
Browse files

minor refactoring

parent 9c4aee7d
No related branches found
No related tags found
No related merge requests found
...@@ -65,14 +65,15 @@ gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_SOCS_aux.f90 ...@@ -65,14 +65,15 @@ gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_SOCS_aux.f90
gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_SOCS.f90 -o bin/carbon_model_SOCS.o -Jbin gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_SOCS.f90 -o bin/carbon_model_SOCS.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_ROTHC_aux.f90 -o bin/carbon_model_ROTHC_aux.o -Jbin gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_ROTHC_aux.f90 -o bin/carbon_model_ROTHC_aux.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_ROTHC.f90 -o bin/carbon_model_ROTHC.o -Jbin gfortran $keys_compile -c source/carbon/carbon_models/carbon_model_ROTHC.f90 -o bin/carbon_model_ROTHC.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_obs_operator.f90 -o bin/carbon_obs_operator.o -Jbin gfortran $keys_compile -c source/optimization/optimization_variables.f90 -o bin/optimization_variables.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_adjoint.f90 -o bin/carbon_adjoint.o -Jbin gfortran $keys_compile -c source/optimization/carbon_obs_operator.f90 -o bin/carbon_obs_operator.o -Jbin
gfortran $keys_compile -c source/optimization/carbon_adjoint.f90 -o bin/carbon_adjoint.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_solver.f90 -o bin/carbon_solver.o -Jbin gfortran $keys_compile -c source/carbon/carbon_solver.f90 -o bin/carbon_solver.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_postprocessing.f90 -o bin/carbon_postprocessing.o -Jbin gfortran $keys_compile -c source/carbon/carbon_postprocessing.f90 -o bin/carbon_postprocessing.o -Jbin
gfortran $keys_compile -c source/carbon/carbon.f90 -o bin/carbon.o -Jbin gfortran $keys_compile -c source/carbon/carbon.f90 -o bin/carbon.o -Jbin
#gfortran $keys_compile -c source/main.f90 -o bin/main.o -Jbin #gfortran $keys_compile -c source/main.f90 -o bin/main.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_run.f90 -o bin/carbon_run.o -Jbin gfortran $keys_compile -c source/model_run.f90 -o bin/model_run.o -Jbin
gfortran $keys_compile -c source/carbon/carbon_optimize.f90 -o bin/carbon_optimize.o -Jbin gfortran $keys_compile -c source/optimization/carbon_optimize.f90 -o bin/carbon_optimize.o -Jbin
gfortran $keys_compile -c source/main_4d_var.f90 -o bin/main_4d_var.o -Jbin gfortran $keys_compile -c source/main_4d_var.f90 -o bin/main_4d_var.o -Jbin
gfortran -o run.exe bin/*.o $keys_compile $keys_linking gfortran -o run.exe bin/*.o $keys_compile $keys_linking
......
...@@ -8,18 +8,25 @@ program main ...@@ -8,18 +8,25 @@ program main
& dlon, dlat, dlon_nc, dlat_nc, dt_nc, date_fst, date_lst, ncell_tot, ncell_mask & dlon, dlat, dlon_nc, dlat_nc, dt_nc, date_fst, date_lst, ncell_tot, ncell_mask
use carbon_obs_operator, only: obs_operator_init use carbon_obs_operator, only: obs_operator_init
use carbon_optimize, only: fourd_var, nparam use carbon_optimize, only: fourd_var
use model_run, only: run_model
use optimization_variables, only: nparam, opt_pool_num, theta_b, theta_opt, B_inv, R_inv
implicit none implicit none
integer, parameter :: opt_pool_num(nparam) = [3, 4] !< id of pools to optimize
real, parameter :: theta_b(nparam) = [ 0., 6. ] !< a priori parameters
real, parameter :: B_inv(nparam,nparam) = reshape([1.0,0.0,0.0,0.1],[nparam,nparam]) !< error covariance of a priori
real, allocatable :: cost_hist(:) real, allocatable :: cost_hist(:)
real :: theta_opt(nparam) !< optimal parameters
call config_init() call config_init()
nparam = 2
allocate(opt_pool_num(nparam), theta_b(nparam), theta_opt(nparam), B_inv(nparam, nparam))
opt_pool_num = [3, 4] !< id of pools to optimize
theta_b = [ 0., 6. ] !< a priori parameters
B_inv = reshape([1.0,0.0,0.0,0.1],[nparam,nparam]) !< error covariance of a priori
R_inv = 1.0/0.1
call grid_init() call grid_init()
call obs_operator_init() call obs_operator_init()
...@@ -46,10 +53,8 @@ program main ...@@ -46,10 +53,8 @@ program main
! 4D-Var ! 4D-Var
! --------------------------------------------------------------------------------- ! ---------------------------------------------------------------------------------
call fourd_var(theta_b, B_inv, opt_pool_num, & call fourd_var(n_iter = 100, lr = 2.5, tol = 1.0e-4, cost_hist = cost_hist)
n_iter = 100, lr = 2.5, tol = 1.0e-4, &
theta_opt = theta_opt, cost_hist = cost_hist)
write(*,'("Оптимальные IC: ",2F12.6)') theta_opt write(*,'("Оптимальные IC: ",2F12.6)') theta_opt
end program main end program main
module carbon_run module model_run
use environment, only : environment_calc_at_timestep, & use environment, only : environment_calc_at_timestep, &
& environment_calc_at_cell, & & environment_calc_at_cell, &
...@@ -9,9 +9,9 @@ module carbon_run ...@@ -9,9 +9,9 @@ module carbon_run
& carbon_postprocessing & carbon_postprocessing
use grid, only : i0, i1, j0, j1, ntime, ii, jj, tt, nn, mask, date_c, date_fst ,dt use grid, only : i0, i1, j0, j1, ntime, ii, jj, tt, nn, mask, date_c, date_fst ,dt
use carbon_adjoint, only : adjoint_run, & use carbon_adjoint, only : adjoint_run, &
& adjoint_postprocessing, J_right_side, J_right_side_t & adjoint_postprocessing
use carbon_core, only : ntile, tile_weight, nflux, flux, npool use carbon_core, only : ntile, tile_weight, nflux, flux, npool
use carbon_obs_operator, only : record_direct use optimization_variables, only: J_right_side, J_right_side_t, record_direct
implicit none implicit none
...@@ -74,4 +74,4 @@ module carbon_run ...@@ -74,4 +74,4 @@ module carbon_run
end subroutine run_model end subroutine run_model
end module carbon_run end module model_run
\ No newline at end of file \ No newline at end of file
...@@ -2,13 +2,9 @@ module carbon_adjoint ...@@ -2,13 +2,9 @@ module carbon_adjoint
use grid, only: i0, i1, j0, j1, dt, ntime, date_fst use grid, only: i0, i1, j0, j1, dt, ntime, date_fst
use carbon_core, only: ntile, npool use carbon_core, only: ntile, npool
use carbon_obs_operator, only: calc_forcing use carbon_obs_operator, only: calc_forcing
use optimization_variables, only: adj, J_right_side, J_right_side_t
implicit none implicit none
real, allocatable :: adj(:,:,:,:,:) !< C^*
real, allocatable :: J_right_side(:,:,:,:,:,:) !< dF/dC(t)
real, allocatable :: J_right_side_t(:,:,:,:,:) !< dF/dC
contains contains
subroutine adjoint_init() subroutine adjoint_init()
...@@ -53,9 +49,4 @@ contains ...@@ -53,9 +49,4 @@ contains
end subroutine adjoint_postprocessing end subroutine adjoint_postprocessing
subroutine adjoint_deallocate()
deallocate(J_right_side, J_right_side_t, adj)
end subroutine adjoint_deallocate
end module carbon_adjoint end module carbon_adjoint
\ No newline at end of file
...@@ -4,13 +4,9 @@ module carbon_obs_operator ...@@ -4,13 +4,9 @@ module carbon_obs_operator
use carbon_core, only: npool, ntile, pool use carbon_core, only: npool, ntile, pool
use const, only: yrs, day2sec use const, only: yrs, day2sec
use config, only: station_name use config, only: station_name
use optimization_variables, only: nobs, obs_val, obs_idx, state_ts, R_inv, opt_pool_num
integer :: nobs
real, parameter :: R_inv = 1.0/0.1
integer, allocatable :: obs_idx(:)
real, allocatable :: obs_val(:)
real, allocatable :: state_ts(:,:,:,:,:)
contains contains
...@@ -52,17 +48,21 @@ contains ...@@ -52,17 +48,21 @@ contains
integer, intent(in) :: nn integer, intent(in) :: nn
integer, intent(in) :: t integer, intent(in) :: t
integer :: m integer :: m, k
real:: forcing(npool) real:: forcing(npool)
real :: residual real :: residual, residual1
forcing = 0. forcing = 0.
residual = 0. residual = 0.
do m = 1, nobs do m = 1, nobs
if (obs_idx(m) == t-1) then if (obs_idx(m) == t-1) then
residual = (state_ts(3,ii,jj,nn,t-1) + state_ts(4,ii,jj,nn,t-1) - obs_val(m))/yrs do k = 1, size(opt_pool_num)
forcing(3) = residual * R_inv residual = residual + state_ts(opt_pool_num(k),ii,jj,nn,t-1)
forcing(4) = residual * R_inv end do
residual = (residual - obs_val(m))/yrs
do k = 1, size(opt_pool_num)
forcing(opt_pool_num(k)) = residual * R_inv
end do
end if end if
end do end do
end function calc_forcing end function calc_forcing
...@@ -72,12 +72,17 @@ contains ...@@ -72,12 +72,17 @@ contains
use grid, only : i0,i1,j0,j1 use grid, only : i0,i1,j0,j1
real, intent(inout) :: cost_o real, intent(inout) :: cost_o
real :: model_obs_diff real :: model_obs_diff, model_obs_diff1
integer :: k integer :: k, m
cost_o = 0.0 cost_o = 0.0
do k = 1, nobs do k = 1, nobs
model_obs_diff = (state_ts(3,i0,j0,1,obs_idx(k)) + state_ts(4,i0,j0,1,obs_idx(k)) - obs_val(k)) model_obs_diff = 0.
do m = 1, size(opt_pool_num)
model_obs_diff = model_obs_diff + state_ts(opt_pool_num(m),i0,j0,1,obs_idx(k))
end do
model_obs_diff = model_obs_diff - obs_val(k)
cost_o = cost_o + 0.5*(model_obs_diff)**2 * R_inv cost_o = cost_o + 0.5*(model_obs_diff)**2 * R_inv
end do end do
...@@ -108,25 +113,4 @@ contains ...@@ -108,25 +113,4 @@ contains
jdn = d + (153*(m + 12*a -3)+2)/5 + 365*b + b/4 - b/100 + b/400 - 32045 jdn = d + (153*(m + 12*a -3)+2)/5 + 365*b + b/4 - b/100 + b/400 - 32045
end subroutine ymd_to_jdn end subroutine ymd_to_jdn
subroutine record_direct(t)
integer, intent(in) :: t
integer :: p, ii, jj, nn
do p = 1, npool
do jj = j0, j1
do ii = i0, i1
do nn = 1, ntile
state_ts(p,ii,jj,nn,t) = pool(p)%val(ii,jj,nn)
end do
end do
end do
end do
end subroutine record_direct
subroutine carbon_obs_operator_deallocate()
deallocate(state_ts)
end subroutine carbon_obs_operator_deallocate
end module carbon_obs_operator end module carbon_obs_operator
\ No newline at end of file
module carbon_optimize module carbon_optimize
use carbon_core, only : pool, ntile, npool use carbon_core, only : pool, ntile, npool
use carbon_run, only : run_model use model_run, only : run_model
use carbon_adjoint, only : adjoint_init, adj, J_right_side, adjoint_deallocate use carbon_adjoint, only : adjoint_init
use environment, only : environment_init use environment, only : environment_init
use carbon, only : carbon_init, carbon_deallocate use carbon, only : carbon_init, carbon_deallocate
use carbon_obs_operator, only: carbon_obs_operator_deallocate, state_ts, observation_operator use carbon_obs_operator, only: observation_operator
use optimization_variables, only: nparam, adj, J_right_side, state_ts, theta_b, B_inv, &
opt_pool_num, theta_opt, optimization_variables_deallocate
implicit none implicit none
private private
public :: fourd_var public :: fourd_var
public :: nparam
integer, parameter :: nparam = 2
real, parameter :: eps = 1.0e-12 real, parameter :: eps = 1.0e-12
contains contains
subroutine fourd_var(theta_b, B_inv, opt_pool_num, & subroutine fourd_var(n_iter, lr, tol, cost_hist)
n_iter, lr, tol, &
theta_opt, cost_hist)
use grid, only : i0,i1,j0,j1, ntime use grid, only : i0,i1,j0,j1, ntime
real, intent(in) :: theta_b(nparam) !< a priori parameters
real, intent(in) :: B_inv(nparam,nparam) !< error covariance of a priori
integer, intent(in) :: n_iter !< number of iterations of opt algo integer, intent(in) :: n_iter !< number of iterations of opt algo
real, intent(in) :: lr, tol !< learning rate for Adagrad real, intent(in) :: lr, tol !< learning rate for Adagrad
real, intent(out) :: theta_opt(nparam) !< optimal parameters
real, allocatable, intent(out) :: cost_hist(:) real, allocatable, intent(out) :: cost_hist(:)
integer :: k, it integer :: k, it
integer :: opt_pool_num(nparam)
real :: theta(nparam), theta_new(nparam) real :: theta(nparam), theta_new(nparam)
real :: cache(nparam), grad(nparam) real :: cache(nparam), grad(nparam)
real :: cost, cost_prev, diff real :: cost, cost_prev, diff
...@@ -129,8 +124,7 @@ subroutine deallocation() ...@@ -129,8 +124,7 @@ subroutine deallocation()
call carbon_deallocate() call carbon_deallocate()
call carbon_model_to_core_deallocate() call carbon_model_to_core_deallocate()
call adjoint_deallocate() call optimization_variables_deallocate()
call carbon_obs_operator_deallocate()
end subroutine deallocation end subroutine deallocation
......
module optimization_variables
integer :: nparam
real, allocatable :: adj(:,:,:,:,:) !< C^*
real, allocatable :: J_right_side(:,:,:,:,:,:) !< dF/dC(t)
real, allocatable :: J_right_side_t(:,:,:,:,:) !< dF/dC
integer :: nobs
real :: R_inv
integer, allocatable :: obs_idx(:)
real, allocatable :: obs_val(:)
real, allocatable :: state_ts(:,:,:,:,:)
real, allocatable :: B_inv(:,:)
real, allocatable :: theta_b(:)
integer, allocatable :: opt_pool_num(:)
real, allocatable :: theta_opt(:)
contains
subroutine record_direct(t)
use carbon_core, only: pool, npool, ntile
use grid, only: i0, i1, j0, j1
integer, intent(in) :: t
integer :: p, ii, jj, nn
do p = 1, npool
do jj = j0, j1
do ii = i0, i1
do nn = 1, ntile
state_ts(p,ii,jj,nn,t) = pool(p)%val(ii,jj,nn)
end do
end do
end do
end do
end subroutine record_direct
subroutine optimization_variables_deallocate()
deallocate(J_right_side, J_right_side_t, adj, state_ts)
end subroutine optimization_variables_deallocate
end module optimization_variables
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment