38 use num_types,
only: rp
41 use mesh,
only: mesh_t
42 use space,
only: space_t
43 use gather_scatter,
only: gs_t
44 use time_scheme_controller,
only: time_scheme_controller_t
45 use time_step_controller,
only: time_step_controller_t
46 use json_module,
only: json_file
47 use json_utils,
only: json_get, json_get_or_default, json_extract_item
48 use field,
only: field_t
49 use field_series,
only: field_series_t
50 use scalar_aux,
only : scalar_step_info
51 use krylov,
only : ksp_monitor_t
52 use registry,
only: neko_registry
53 use checkpoint,
only: chkp_t
54 use krylov,
only: ksp_t
55 use logger,
only: neko_log, log_size, neko_log_verbose
56 use user_intf,
only: user_t
57 use utils,
only: neko_error
58 use coefs,
only : coef_t
59 use time_state,
only : time_state_t
68 class(ksp_t),
allocatable :: shared_ksp
73 procedure,
private :: adjoint_scalars_init_single
75 procedure :: step => adjoint_scalars_step
77 procedure :: restart => adjoint_scalars_restart
79 procedure :: validate => adjoint_scalars_validate
81 procedure :: free => adjoint_scalars_free
105 msh, coef, gs, params_adjoint, params_primal, &
106 numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
108 integer,
intent(in) :: n_adjoint_scalars, n_primal_scalars
109 type(mesh_t),
target,
intent(in) :: msh
110 type(coef_t),
target,
intent(in) :: coef
111 type(gs_t),
target,
intent(inout) :: gs
112 type(json_file),
target,
intent(inout) :: params_adjoint, params_primal
113 type(json_file),
target,
intent(inout) :: numerics_params
114 type(user_t),
target,
intent(in) :: user
115 type(field_series_t),
target,
intent(in) :: ulag, vlag, wlag
116 type(time_scheme_controller_t),
target,
intent(in) :: time_scheme
117 TYPE(field_t),
TARGET,
INTENT(IN) :: rho
118 type(chkp_t),
target,
intent(inout) :: chkp
119 type(json_file) :: json_subdict_adjoint, json_subdict_primal
121 character(len=:),
allocatable :: field_name
122 character(len=256),
allocatable :: field_names(:)
123 character(len=:),
allocatable :: primal_name, trial_primal_name
124 logical :: found_primal
126 if (n_adjoint_scalars .gt. n_primal_scalars)
then
127 call neko_error(
"More adjoint scalars than forward scalars")
138 allocate(field_names(n_adjoint_scalars))
141 if (n_adjoint_scalars > 1)
then
142 do i = 1, n_adjoint_scalars
144 call json_extract_item(params_adjoint,
"", i, json_subdict_adjoint)
147 if (json_subdict_adjoint%valid_path(
'name'))
then
148 call json_get(json_subdict_adjoint,
'name', field_name)
154 if (len_trim(field_name) == 0)
then
155 write(field_name,
'(A,I0,A)')
's_', i,
'_adj'
158 field_names(i) = trim(field_name)
163 if (trim(field_names(i)) == trim(field_names(j)))
then
164 write(field_name,
'(A,I0)') trim(field_names(i))//
'_', j
165 field_names(i) = trim(field_name)
174 do i = 1, n_adjoint_scalars
175 call json_extract_item(params_adjoint,
"", i, json_subdict_adjoint)
178 if (n_adjoint_scalars > 1)
then
179 call json_subdict_adjoint%add(
'name', trim(field_names(i)))
181 call json_subdict_adjoint%add(
'name',
's_adj')
188 call json_get_or_default(params_adjoint,
'primal_name', primal_name,
's')
190 found_primal = .false.
191 do j = 1, n_primal_scalars
193 call json_extract_item(params_primal,
"", j, json_subdict_primal)
196 if (json_subdict_primal%valid_path(
'name'))
then
197 call json_get(json_subdict_primal,
'name', trial_primal_name)
198 if (trim(trial_primal_name) == trim(primal_name))
then
199 found_primal = .true.
205 if (.not. found_primal)
then
206 call neko_error(
'Could not find corresponding primal scalar name')
209 call json_subdict_adjoint%add(
'primal_name', primal_name)
212 call this%adjoint_scalar_fields(i)%init(msh, coef, gs, &
213 json_subdict_adjoint, json_subdict_primal, numerics_params, &
214 user, chkp, ulag, vlag, wlag, time_scheme, rho)
234 subroutine adjoint_scalars_init_single(this, msh, coef, gs, params_adjoint, &
235 params_primal, numerics_params, user, chkp, ulag, vlag, wlag, &
238 type(mesh_t),
target,
intent(in) :: msh
239 type(coef_t),
target,
intent(in) :: coef
240 type(gs_t),
target,
intent(inout) :: gs
241 type(json_file),
target,
intent(inout) :: params_adjoint
242 type(json_file),
target,
intent(inout) :: params_primal
243 type(json_file),
target,
intent(inout) :: numerics_params
244 type(user_t),
target,
intent(in) :: user
245 type(chkp_t),
target,
intent(inout) :: chkp
246 type(field_series_t),
target,
intent(in) :: ulag, vlag, wlag
247 type(time_scheme_controller_t),
target,
intent(in) :: time_scheme
248 TYPE(field_t),
TARGET,
INTENT(IN) :: rho
254 call params_adjoint%add(
'name',
's_adj')
255 call params_adjoint%add(
'primal_name',
's')
261 call this%adjoint_scalar_fields(1)%init(msh, coef, gs, params_adjoint, &
262 params_primal, numerics_params, user, chkp, ulag, vlag, wlag, &
264 end subroutine adjoint_scalars_init_single
267 subroutine adjoint_scalars_step(this, time, ext_bdf, dt_controller)
269 type(time_state_t),
intent(in) :: time
270 type(time_scheme_controller_t),
intent(inout) :: ext_bdf
271 type(time_step_controller_t),
intent(inout) :: dt_controller
272 type(ksp_monitor_t),
dimension(size(this%adjoint_scalar_fields)) :: ksp_results
274 logical :: all_frozen
279 do i = 1,
size(this%adjoint_scalar_fields)
280 all_frozen = all_frozen .and. this%adjoint_scalar_fields(i)%freeze
281 call this%adjoint_scalar_fields(i)%step(time, ext_bdf, dt_controller, &
285 if (.not. all_frozen)
then
286 call ksp_results(i)%print_header()
289 do i = 1,
size(this%adjoint_scalar_fields)
290 if (this%adjoint_scalar_fields(i)%freeze) cycle
291 call scalar_step_info(time, ksp_results(i))
293 end subroutine adjoint_scalars_step
296 subroutine adjoint_scalars_restart(this, chkp)
298 type(chkp_t),
intent(inout) :: chkp
301 do i = 1,
size(this%adjoint_scalar_fields)
302 call this%adjoint_scalar_fields(i)%restart(chkp)
304 end subroutine adjoint_scalars_restart
307 subroutine adjoint_scalars_validate(this)
311 do i = 1,
size(this%adjoint_scalar_fields)
312 call this%adjoint_scalar_fields(i)%s_adj_lag%set(&
313 this%adjoint_scalar_fields(i)%s_adj)
314 call this%adjoint_scalar_fields(i)%validate()
316 end subroutine adjoint_scalars_validate
319 subroutine adjoint_scalars_free(this)
324 if (
allocated(this%adjoint_scalar_fields))
then
325 do i = 1,
size(this%adjoint_scalar_fields)
326 call this%adjoint_scalar_fields(i)%free()
328 deallocate(this%adjoint_scalar_fields)
330 end subroutine adjoint_scalars_free
Contains the adjoint_scalar_pnpn_t type.
Contains the adjoint_scalar_scheme_t type.
Contains the adjoint_scalars_t type that manages multiple scalar fields.
subroutine adjoint_scalars_init(this, n_adjoint_scalars, n_primal_scalars, msh, coef, gs, params_adjoint, params_primal, numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
Constructor.
Base type for a scalar advection-diffusion solver.
Type to manage multiple adjoint scalar transport equations.