35 use gather_scatter,
only: gs_t
36 use mean_sqr_flow,
only: mean_sqr_flow_t
37 use neko_config,
only: neko_bcknd_device
38 use checkpoint,
only: chkp_t
39 use mean_flow,
only: mean_flow_t
40 use num_types,
only: rp, i8
41 use comm,
only: neko_comm
43 use field,
only: field_t
44 use space,
only: space_t, gll
45 use dofmap,
only: dofmap_t
46 use zero_dirichlet,
only: zero_dirichlet_t
47 use krylov,
only: ksp_t, krylov_solver_factory, ksp_max_iter
48 use coefs,
only: coef_t
49 use usr_inflow,
only: usr_inflow_t, usr_inflow_eval
50 use dirichlet,
only: dirichlet_t
51 use field_dirichlet,
only: field_dirichlet_t
52 use field_dirichlet_vector,
only: field_dirichlet_vector_t
53 use jacobi,
only: jacobi_t
54 use sx_jacobi,
only: sx_jacobi_t
55 use device_jacobi,
only: device_jacobi_t
56 use hsmg,
only: hsmg_t
57 use phmg,
only: phmg_t
58 use precon,
only: pc_t, precon_factory, precon_destroy
59 use fluid_stats,
only: fluid_stats_t
61 use bc_list,
only: bc_list_t
62 use mesh,
only: mesh_t, neko_msh_max_zlbls, neko_msh_max_zlbl_len
63 use math,
only: cfill, add2s2, glsum
64 use device_math,
only: device_cfill, device_add2s2
65 use time_scheme_controller,
only: time_scheme_controller_t
66 use operators,
only: cfl
67 use logger,
only: neko_log, log_size, neko_log_verbose
68 use field_registry,
only: neko_field_registry
69 use json_utils,
only: json_get, json_get_or_default, json_extract_object, &
71 use json_module,
only: json_file, json_core, json_value
72 use scratch_registry,
only: scratch_registry_t
73 use user_intf,
only: user_t, dummy_user_material_properties, &
74 user_material_properties
75 use utils,
only: neko_error, neko_warning
76 use field_series,
only: field_series_t
77 use time_step_controller,
only: time_step_controller_t
78 use field_math,
only: field_cfill, field_add2s2
79 use wall_model_bc,
only: wall_model_bc_t
80 use shear_stress,
only: shear_stress_t
81 use field_list,
only : field_list_t
82 use gradient_jump_penalty,
only: gradient_jump_penalty_t
83 use field_math,
only: field_addcol3
85 use mpi_f08,
only: mpi_integer, mpi_sum, mpi_allreduce
86 use json_utils_ext,
only: json_key_fallback
87 use device,
only : device_event_sync, glb_cmd_event, device_to_host, &
95 character(len=:),
allocatable :: name
97 type(field_t),
pointer :: u_adj => null()
99 type(field_t),
pointer :: v_adj => null()
101 type(field_t),
pointer :: w_adj => null()
103 type(field_t),
pointer :: p_adj => null()
105 type(field_series_t) :: ulag, vlag, wlag
109 type(dofmap_t) :: dm_xh
117 type(field_t),
pointer :: f_adj_x => null()
119 type(field_t),
pointer :: f_adj_y => null()
121 type(field_t),
pointer :: f_adj_z => null()
125 class(ksp_t),
allocatable :: ksp_vel
127 class(ksp_t),
allocatable :: ksp_prs
129 class(pc_t),
allocatable :: pc_vel
131 class(pc_t),
allocatable :: pc_prs
133 integer :: vel_projection_dim
135 integer :: pr_projection_dim
137 integer :: vel_projection_activ_step
139 integer :: pr_projection_activ_step
141 logical :: strict_convergence
144 type(bc_list_t) :: bcs_prs
146 type(bc_list_t) :: bcs_vel
148 type(mesh_t),
pointer :: msh => null()
152 type(mean_flow_t) :: mean
154 type(fluid_stats_t) :: stats
156 type(mean_sqr_flow_t) :: mean_sqr
158 logical :: forced_flow_rate = .false.
160 logical :: freeze = .false.
163 character(len=:),
allocatable :: nut_field_name
165 logical :: variable_material_properties = .false.
168 integer(kind=i8) :: glb_n_points
170 integer(kind=i8) :: glb_unique_points
172 type(scratch_registry_t) :: scratch
181 type(field_list_t) :: material_properties
184 procedure(user_material_properties),
nopass,
pointer :: &
185 user_material_properties => null()
188 procedure, pass(this) :: init_base => adjoint_fluid_scheme_init_base
190 procedure, pass(this) :: scheme_free => adjoint_fluid_scheme_free
192 procedure, pass(this) :: validate => adjoint_fluid_scheme_validate
194 procedure, pass(this) :: bc_apply_vel => adjoint_fluid_scheme_bc_apply_vel
196 procedure, pass(this) :: bc_apply_prs => adjoint_fluid_scheme_bc_apply_prs
198 procedure, pass(this) :: compute_cfl => adjoint_compute_cfl
200 procedure, pass(this) :: set_material_properties => &
201 adjoint_fluid_scheme_set_material_properties
205 procedure(adjoint_fluid_scheme_free_intrf), pass(this),
deferred :: free
207 procedure(adjoint_fluid_scheme_step_intrf), pass(this),
deferred :: step
209 procedure(adjoint_fluid_scheme_restart_intrf), &
210 pass(this),
deferred :: restart
212 procedure(adjoint_fluid_scheme_setup_bcs_intrf), pass(this),
deferred :: &
215 procedure, pass(this) :: update_material_properties => &
216 adjoint_fluid_scheme_update_material_properties
218 procedure,
nopass :: solver_factory => adjoint_fluid_scheme_solver_factory
220 procedure, pass(this) :: precon_factory_ => &
221 adjoint_fluid_scheme_precon_factory
233 import time_scheme_controller_t
234 class(adjoint_fluid_scheme_t),
target,
intent(inout) :: this
235 type(mesh_t),
target,
intent(inout) :: msh
236 integer,
intent(in) :: lx
237 type(json_file),
target,
intent(inout) :: params
238 type(user_t),
target,
intent(in) :: user
239 type(time_scheme_controller_t),
target,
intent(in) :: time_scheme
245 subroutine adjoint_fluid_scheme_free_intrf(this)
247 class(adjoint_fluid_scheme_t),
intent(inout) :: this
248 end subroutine adjoint_fluid_scheme_free_intrf
253 subroutine adjoint_fluid_scheme_step_intrf(this, t, tstep, dt, ext_bdf, &
256 import time_scheme_controller_t
257 import time_step_controller_t
259 class(adjoint_fluid_scheme_t),
target,
intent(inout) :: this
260 real(kind=rp),
intent(in) :: t
261 integer,
intent(in) :: tstep
262 real(kind=rp),
intent(in) :: dt
263 type(time_scheme_controller_t),
intent(in) :: ext_bdf
264 type(time_step_controller_t),
intent(in) :: dt_controller
265 end subroutine adjoint_fluid_scheme_step_intrf
270 subroutine adjoint_fluid_scheme_restart_intrf(this, dtlag, tlag)
273 class(adjoint_fluid_scheme_t),
target,
intent(inout) :: this
274 real(kind=rp) :: dtlag(10), tlag(10)
276 end subroutine adjoint_fluid_scheme_restart_intrf
281 subroutine adjoint_fluid_scheme_setup_bcs_intrf(this, user, params)
283 class(adjoint_fluid_scheme_t),
intent(inout) :: this
284 type(user_t),
target,
intent(in) :: user
285 type(json_file),
intent(inout) :: params
286 end subroutine adjoint_fluid_scheme_setup_bcs_intrf
291 module subroutine adjoint_fluid_scheme_factory(object, type_name)
292 class(adjoint_fluid_scheme_t),
intent(inout),
allocatable :: object
293 character(len=*) :: type_name
294 end subroutine adjoint_fluid_scheme_factory
297 public :: adjoint_fluid_scheme_t, adjoint_fluid_scheme_factory
302 subroutine adjoint_fluid_scheme_init_base(this, msh, lx, params, scheme, &
304 class(adjoint_fluid_scheme_t),
target,
intent(inout) :: this
305 type(mesh_t),
target,
intent(inout) :: msh
306 integer,
intent(in) :: lx
307 character(len=*),
intent(in) :: scheme
308 type(json_file),
target,
intent(inout) :: params
309 type(user_t),
target,
intent(in) :: user
310 logical,
intent(in) :: kspv_init
311 character(len=LOG_SIZE) :: log_buf
312 real(kind=rp) :: real_val
313 logical :: logical_val
314 integer :: integer_val
315 character(len=:),
allocatable :: string_val1, string_val2
316 character(len=:),
allocatable :: json_key
317 type(json_file) :: json_subdict
325 if (msh%gdim .eq. 2)
then
326 call this%Xh%init(gll, lx, lx)
328 call this%Xh%init(gll, lx, lx, lx)
331 call this%dm_Xh%init(msh, this%Xh)
333 call this%gs_Xh%init(this%dm_Xh)
335 call this%c_Xh%init(this%gs_Xh)
338 this%scratch = scratch_registry_t(this%dm_Xh, 10, 2)
344 call neko_log%section(
'Adjoint fluid')
345 write(log_buf,
'(A, A)')
'Type : ', trim(scheme)
346 call neko_log%message(log_buf)
351 call this%set_material_properties(params, user)
354 json_key = json_key_fallback(params, &
355 'case.adjoint_fluid.velocity_solver.projection_space_size', &
356 'case.fluid.velocity_solver.projection_space_size')
357 call json_get_or_default(params, json_key, this%vel_projection_dim, 20)
358 json_key = json_key_fallback(params, &
359 'case.adjoint_fluid.pressure_solver.projection_space_size', &
360 'case.fluid.pressure_solver.projection_space_size')
361 call json_get_or_default(params, json_key, this%pr_projection_dim, 20)
363 json_key = json_key_fallback(params, &
364 'case.adjoint_fluid.velocity_solver.projection_hold_steps', &
365 'case.fluid.velocity_solver.projection_hold_steps')
366 call json_get_or_default(params, json_key, &
367 this%vel_projection_activ_step, 5)
368 json_key = json_key_fallback(params, &
369 'case.adjoint_fluid.pressure_solver.projection_hold_steps', &
370 'case.fluid.pressure_solver.projection_hold_steps')
371 call json_get_or_default(params, json_key, &
372 this%pr_projection_activ_step, 5)
374 json_key = json_key_fallback(params,
'case.adjoint_fluid.freeze', &
376 call json_get_or_default(params, json_key, this%freeze, .false.)
385 if (params%valid_path(
"case.fluid.flow_rate_force"))
then
386 call neko_error(
'Flow rate forcing not yet implemented')
387 this%forced_flow_rate = .true.
392 write(log_buf,
'(A, I1)')
'Poly order : ', lx-1
393 else if (lx .ge. 10)
then
394 write(log_buf,
'(A, I2)')
'Poly order : ', lx-1
396 write(log_buf,
'(A, I3)')
'Poly order : ', lx-1
398 call neko_log%message(log_buf)
399 this%glb_n_points = int(this%msh%glb_nelv, i8)*int(this%Xh%lxyz, i8)
400 this%glb_unique_points = int(glsum(this%c_Xh%mult, this%dm_Xh%size()), i8)
402 write(log_buf,
'(A, I0)')
'GLL points : ', this%glb_n_points
403 call neko_log%message(log_buf)
404 write(log_buf,
'(A, I0)')
'Unique pts.: ', this%glb_unique_points
405 call neko_log%message(log_buf)
407 call json_get(params,
'case.numerics.dealias', logical_val)
408 write(log_buf,
'(A, L1)')
'Dealias : ', logical_val
409 call neko_log%message(log_buf)
411 write(log_buf,
'(A, L1)')
'LES : ', this%variable_material_properties
412 call neko_log%message(log_buf)
414 call json_get_or_default(params,
'case.output_boundary', logical_val, &
416 write(log_buf,
'(A, L1)')
'Save bdry : ', logical_val
417 call neko_log%message(log_buf)
422 allocate(this%f_adj_x)
423 allocate(this%f_adj_y)
424 allocate(this%f_adj_z)
425 call this%f_adj_x%init(this%dm_Xh, fld_name =
"adjoint_rhs_x")
426 call this%f_adj_y%init(this%dm_Xh, fld_name =
"adjoint_rhs_y")
427 call this%f_adj_z%init(this%dm_Xh, fld_name =
"adjoint_rhs_z")
449 call this%source_term%init(this%f_adj_x, this%f_adj_y, this%f_adj_z, &
451 call this%source_term%add(params,
'case.adjoint_fluid.source_term')
471 call neko_log%section(
"Adjoint Velocity solver")
473 json_key = json_key_fallback(params, &
474 'case.adjoint_fluid.velocity_solver.max_iterations', &
475 'case.fluid.velocity_solver.max_iterations')
476 call json_get_or_default(params, json_key, integer_val, ksp_max_iter)
478 json_key = json_key_fallback(params, &
479 'case.adjoint_fluid.velocity_solver.type', &
480 'case.fluid.velocity_solver.type')
481 call json_get(params, json_key, string_val1)
483 json_key = json_key_fallback(params, &
484 'case.adjoint_fluid.velocity_solver.preconditioner.type', &
485 'case.fluid.velocity_solver.preconditioner.type')
486 call json_get(params, json_key, string_val2)
488 json_key = json_key_fallback(params, &
489 'case.adjoint_fluid.velocity_solver.preconditioner', &
490 'case.fluid.velocity_solver.preconditioner')
491 call json_extract_object(params, json_key, json_subdict)
493 json_key = json_key_fallback(params, &
494 'case.adjoint_fluid.velocity_solver.absolute_tolerance', &
495 'case.fluid.velocity_solver.absolute_tolerance')
496 call json_get(params, json_key, real_val)
498 json_key = json_key_fallback(params, &
499 'case.adjoint_fluid.velocity_solver.monitor', &
500 'case.fluid.velocity_solver.monitor')
501 call json_get_or_default(params, json_key, logical_val, .false.)
503 call neko_log%message(
'Type : ('// trim(string_val1) // &
504 ', ' // trim(string_val2) //
')')
506 write(log_buf,
'(A,ES13.6)')
'Abs tol :', real_val
507 call neko_log%message(log_buf)
508 call this%solver_factory(this%ksp_vel, this%dm_Xh%size(), &
509 string_val1, integer_val, real_val, logical_val)
510 call this%precon_factory_(this%pc_vel, this%ksp_vel, &
511 this%c_Xh, this%dm_Xh, this%gs_Xh, this%bcs_vel, &
512 string_val2, json_subdict)
513 call neko_log%end_section()
517 call json_get_or_default(params,
'case.fluid.strict_convergence', &
518 this%strict_convergence, .false.)
521 call neko_field_registry%add_field(this%dm_Xh,
'u_adj')
522 call neko_field_registry%add_field(this%dm_Xh,
'v_adj')
523 call neko_field_registry%add_field(this%dm_Xh,
'w_adj')
524 this%u_adj => neko_field_registry%get_field(
'u_adj')
525 this%v_adj => neko_field_registry%get_field(
'v_adj')
526 this%w_adj => neko_field_registry%get_field(
'w_adj')
529 call this%ulag%init(this%u_adj, 2)
530 call this%vlag%init(this%v_adj, 2)
531 call this%wlag%init(this%w_adj, 2)
533 call neko_log%end_section()
535 end subroutine adjoint_fluid_scheme_init_base
662 subroutine adjoint_fluid_scheme_free(this)
663 class(adjoint_fluid_scheme_t),
intent(inout) :: this
671 if (
allocated(this%ksp_vel))
then
672 call this%ksp_vel%free()
673 deallocate(this%ksp_vel)
676 if (
allocated(this%ksp_prs))
then
677 call this%ksp_prs%free()
678 deallocate(this%ksp_prs)
681 if (
allocated(this%pc_vel))
then
682 call precon_destroy(this%pc_vel)
683 deallocate(this%pc_vel)
686 if (
allocated(this%pc_prs))
then
687 call precon_destroy(this%pc_prs)
688 deallocate(this%pc_prs)
691 call this%source_term%free()
693 call this%gs_Xh%free()
695 call this%c_Xh%free()
697 call this%scratch%free()
704 call this%ulag%free()
705 call this%vlag%free()
706 call this%wlag%free()
709 if (
associated(this%f_adj_x))
then
710 call this%f_adj_x%free()
713 if (
associated(this%f_adj_y))
then
714 call this%f_adj_y%free()
717 if (
associated(this%f_adj_z))
then
718 call this%f_adj_z%free()
721 nullify(this%f_adj_x)
722 nullify(this%f_adj_y)
723 nullify(this%f_adj_z)
727 end subroutine adjoint_fluid_scheme_free
731 subroutine adjoint_fluid_scheme_validate(this)
732 class(adjoint_fluid_scheme_t),
target,
intent(inout) :: this
735 if ((.not.
associated(this%u_adj)) .or. &
736 (.not.
associated(this%v_adj)) .or. &
737 (.not.
associated(this%w_adj)) .or. &
738 (.not.
associated(this%p_adj)))
then
739 call neko_error(
'Fields are not registered')
742 if ((.not.
allocated(this%u_adj%x)) .or. &
743 (.not.
allocated(this%v_adj%x)) .or. &
744 (.not.
allocated(this%w_adj%x)) .or. &
745 (.not.
allocated(this%p_adj%x)))
then
746 call neko_error(
'Fields are not allocated')
749 if (.not.
allocated(this%ksp_vel))
then
750 call neko_error(
'No Krylov solver for velocity defined')
753 if (.not.
allocated(this%ksp_prs))
then
754 call neko_error(
'No Krylov solver for pressure defined')
760 call this%chkp%init(this%u_adj, this%v_adj, this%w_adj, this%p_adj)
762 end subroutine adjoint_fluid_scheme_validate
768 subroutine adjoint_fluid_scheme_bc_apply_vel(this, t, tstep, strong)
769 class(adjoint_fluid_scheme_t),
intent(inout) :: this
770 real(kind=rp),
intent(in) :: t
771 integer,
intent(in) :: tstep
772 logical,
intent(in) :: strong
774 call this%bcs_vel%apply_vector(&
775 this%u_adj%x, this%v_adj%x, this%w_adj%x, this%dm_Xh%size(), &
778 end subroutine adjoint_fluid_scheme_bc_apply_vel
782 subroutine adjoint_fluid_scheme_bc_apply_prs(this, t, tstep)
783 class(adjoint_fluid_scheme_t),
intent(inout) :: this
784 real(kind=rp),
intent(in) :: t
785 integer,
intent(in) :: tstep
787 call this%bcs_prs%apply(this%p_adj, t, tstep)
789 end subroutine adjoint_fluid_scheme_bc_apply_prs
793 subroutine adjoint_fluid_scheme_solver_factory(ksp, n, solver, &
794 max_iter, abstol, monitor)
795 class(ksp_t),
allocatable,
target,
intent(inout) :: ksp
796 integer,
intent(in),
value :: n
797 character(len=*),
intent(in) :: solver
798 integer,
intent(in) :: max_iter
799 real(kind=rp),
intent(in) :: abstol
800 logical,
intent(in) :: monitor
802 call krylov_solver_factory(ksp, n, solver, max_iter, abstol, &
805 end subroutine adjoint_fluid_scheme_solver_factory
808 subroutine adjoint_fluid_scheme_precon_factory(this, pc, ksp, coef, dof, gs, &
809 bclst, pctype, pcparams)
810 class(adjoint_fluid_scheme_t),
intent(inout) :: this
811 class(pc_t),
allocatable,
target,
intent(inout) :: pc
812 class(ksp_t),
target,
intent(inout) :: ksp
813 type(coef_t),
target,
intent(in) :: coef
814 type(dofmap_t),
target,
intent(in) :: dof
815 type(gs_t),
target,
intent(inout) :: gs
816 type(bc_list_t),
target,
intent(inout) :: bclst
817 character(len=*) :: pctype
818 type(json_file),
intent(inout) :: pcparams
820 call precon_factory(pc, pctype)
822 select type (pcp => pc)
824 call pcp%init(coef, dof, gs)
825 type is (sx_jacobi_t)
826 call pcp%init(coef, dof, gs)
827 type is (device_jacobi_t)
828 call pcp%init(coef, dof, gs)
830 call pcp%init(coef, bclst, pcparams)
832 call pcp%init(dof%msh, dof%Xh, coef, dof, gs, bclst)
837 end subroutine adjoint_fluid_scheme_precon_factory
856 function adjoint_compute_cfl(this, dt)
result(c)
857 class(adjoint_fluid_scheme_t),
intent(in) :: this
858 real(kind=rp),
intent(in) :: dt
861 c = cfl(dt, this%u_adj%x, this%v_adj%x, this%w_adj%x, &
862 this%Xh, this%c_Xh, this%msh%nelv, this%msh%gdim)
864 end function adjoint_compute_cfl
951 subroutine adjoint_fluid_scheme_update_material_properties(this, t, tstep)
952 class(adjoint_fluid_scheme_t),
intent(inout) :: this
953 real(kind=rp),
intent(in) :: t
954 integer,
intent(in) :: tstep
955 type(field_t),
pointer :: nut
957 call this%user_material_properties(t, tstep, this%name, &
958 this%material_properties)
960 if (len(trim(this%nut_field_name)) > 0)
then
961 nut => neko_field_registry%get_field(this%nut_field_name)
962 call field_addcol3(this%mu, nut, this%rho)
969 if (neko_bcknd_device .eq. 1)
then
970 call device_memcpy(this%rho%x, this%rho%x_d, this%rho%size(), &
971 device_to_host, sync=.false.)
972 call device_memcpy(this%mu%x, this%mu%x_d, this%mu%size(), &
973 device_to_host, sync=.false.)
975 end subroutine adjoint_fluid_scheme_update_material_properties
981 subroutine adjoint_fluid_scheme_set_material_properties(this, params, user)
982 class(adjoint_fluid_scheme_t),
intent(inout) :: this
983 type(json_file),
intent(inout) :: params
984 type(user_t),
target,
intent(in) :: user
985 character(len=LOG_SIZE) :: log_buf
987 procedure(user_material_properties),
pointer :: dummy_mp_ptr
988 real(kind=rp) :: const_mu, const_rho
991 dummy_mp_ptr => dummy_user_material_properties
993 call this%mu%init(this%dm_Xh,
"mu")
994 call this%rho%init(this%dm_Xh,
"rho")
995 call this%material_properties%init(2)
996 call this%material_properties%assign_to_field(1, this%rho)
997 call this%material_properties%assign_to_field(2, this%mu)
999 if (.not.
associated(user%material_properties, dummy_mp_ptr))
then
1001 write(log_buf,
'(A)')
"Material properties must be set in the user&
1003 call neko_log%message(log_buf)
1004 this%user_material_properties => user%material_properties
1006 call user%material_properties(0.0_rp, 0, this%name, &
1007 this%material_properties)
1010 this%user_material_properties => dummy_user_material_properties
1012 if (params%valid_path(
'case.fluid.Re') .and. &
1013 (params%valid_path(
'case.fluid.mu') .or. &
1014 params%valid_path(
'case.fluid.rho')))
then
1015 call neko_error(
"To set the material properties for the fluid, " // &
1016 "either provide Re OR mu and rho in the case file.")
1018 else if (params%valid_path(
'case.fluid.Re'))
then
1020 write(log_buf,
'(A)')
'Non-dimensional fluid material properties &
1022 call neko_log%message(log_buf, lvl = neko_log_verbose)
1023 write(log_buf,
'(A)')
'Density will be set to 1, dynamic viscosity to&
1025 call neko_log%message(log_buf, lvl = neko_log_verbose)
1028 call json_get(params,
'case.fluid.Re', const_mu)
1029 write(log_buf,
'(A)')
'Read non-dimensional material properties'
1030 call neko_log%message(log_buf)
1031 write(log_buf,
'(A,ES13.6)')
'Re :', const_mu
1032 call neko_log%message(log_buf)
1037 const_mu = 1.0_rp/const_mu
1040 call json_get(params,
'case.fluid.mu', const_mu)
1041 call json_get(params,
'case.fluid.rho', const_rho)
1047 if (
associated(user%material_properties, dummy_mp_ptr))
then
1049 call field_cfill(this%mu, const_mu)
1050 call field_cfill(this%rho, const_rho)
1053 write(log_buf,
'(A,ES13.6)')
'rho :', const_rho
1054 call neko_log%message(log_buf)
1055 write(log_buf,
'(A,ES13.6)')
'mu :', const_mu
1056 call neko_log%message(log_buf)
1063 if (neko_bcknd_device .eq. 1)
then
1064 call device_memcpy(this%rho%x, this%rho%x_d, this%rho%size(), &
1065 device_to_host, sync=.false.)
1066 call device_memcpy(this%mu%x, this%mu%x_d, this%mu%size(), &
1067 device_to_host, sync=.false.)
1069 end subroutine adjoint_fluid_scheme_set_material_properties
Abstract interface to initialize an adjoint formulation.
Implements the adjoint_source_term_t type.
Base type of all fluid formulations.
Wrapper contaning and executing the adjoint source terms.