89 character(len=:),
allocatable :: name
91 character(len=:),
allocatable :: primal_name
93 type(field_t),
pointer :: u
95 type(field_t),
pointer :: v
97 type(field_t),
pointer :: w
99 type(field_t),
pointer :: s
101 type(field_t),
pointer :: s_adj
103 type(field_series_t) :: s_adj_lag
105 type(space_t),
pointer :: xh
107 type(dofmap_t),
pointer :: dm_xh
109 type(gs_t),
pointer :: gs_xh
111 type(coef_t),
pointer :: c_xh
113 type(field_t),
pointer :: f_xh => null()
115 type(scalar_source_term_t) :: source_term
117 class(ksp_t),
allocatable :: ksp
119 integer :: ksp_maxiter
121 integer :: projection_dim
123 integer :: projection_activ_step
125 class(pc_t),
allocatable :: pc
127 type(bc_list_t) :: bcs
129 type(json_file),
pointer :: params
131 type(mesh_t),
pointer :: msh => null()
133 type(chkp_t),
pointer :: chkp => null()
135 character(len=:),
allocatable :: nut_field_name
137 type(field_t),
pointer :: rho => null()
139 type(field_t) :: lambda
143 real(kind=rp) :: pr_turb
145 type(field_list_t) :: material_properties
147 logical :: variable_material_properties = .false.
149 type(field_t) :: abx1, abx2
150 procedure(user_material_properties),
nopass,
pointer :: &
151 user_material_properties => null()
154 procedure, pass(this) :: scheme_init => adjoint_scalar_scheme_init
156 procedure, pass(this) :: scheme_free => adjoint_scalar_scheme_free
158 procedure, pass(this) :: validate => adjoint_scalar_scheme_validate
160 procedure, pass(this) :: set_material_properties => &
161 adjoint_scalar_scheme_set_material_properties
163 procedure, pass(this) :: update_material_properties => &
164 adjoint_scalar_scheme_update_material_properties
252 subroutine adjoint_scalar_scheme_init(this, msh, c_Xh, gs_Xh, &
253 params_adjoint, params_primal, scheme, user, rho)
255 type(mesh_t),
target,
intent(in) :: msh
256 type(coef_t),
target,
intent(in) :: c_Xh
257 type(gs_t),
target,
intent(inout) :: gs_Xh
258 type(json_file),
target,
intent(inout) :: params_primal, params_adjoint
259 character(len=*),
intent(in) :: scheme
260 type(user_t),
target,
intent(in) :: user
261 type(field_t),
target,
intent(in) :: rho
262 type(json_file),
pointer :: params_selected
264 character(len=LOG_SIZE) :: log_buf
266 logical :: logical_val
267 real(kind=rp) :: solver_abstol
268 integer :: integer_val
269 character(len=:),
allocatable :: solver_type, solver_precon
270 type(json_file) :: precon_params
272 this%u => neko_field_registry%get_field(
'u')
273 this%v => neko_field_registry%get_field(
'v')
274 this%w => neko_field_registry%get_field(
'w')
278 call json_get(params_adjoint,
'primal_name', this%primal_name)
280 call json_get_or_default(params_adjoint,
'name', this%name, &
283 call neko_log%section(
'Adjoint scalar')
286 call json_get(params_selected,
'solver.type', solver_type)
289 'solver.preconditioner.type')
290 call json_get(params_selected,
'solver.preconditioner.type', solver_precon)
293 'solver.preconditioner')
294 call json_extract_object(params_selected,
'solver.preconditioner', &
298 'solver.absolute_tolerance')
299 call json_get(params_selected,
'solver.absolute_tolerance', &
303 'solver.projection_space_size')
304 call json_get_or_default(params_selected, &
305 'solver.projection_space_size', &
306 this%projection_dim, 0)
309 'solver.projection_hold_steps')
310 call json_get_or_default(params_selected, &
311 'solver.projection_hold_steps', &
312 this%projection_activ_step, 5)
315 write(log_buf,
'(A, A)')
'Type : ', trim(scheme)
316 call neko_log%message(log_buf)
317 write(log_buf,
'(A, A)')
'Name : ', trim(this%name)
318 call neko_log%message(log_buf)
319 call neko_log%message(
'Ksp adjoint scalar : ('// trim(solver_type) // &
320 ', ' // trim(solver_precon) //
')')
321 write(log_buf,
'(A,ES13.6)')
' `-abs tol :', solver_abstol
322 call neko_log%message(log_buf)
325 this%dm_Xh => this%u%dof
326 this%params => params_adjoint
329 if (.not. neko_field_registry%field_exists(this%name))
then
330 call neko_field_registry%add_field(this%dm_Xh, this%name)
333 this%s_adj => neko_field_registry%get_field(this%name)
335 call this%s_adj_lag%init(this%s_adj, 2)
337 this%s => neko_field_registry%get_field(this%primal_name)
345 call this%set_material_properties(params_primal, user)
352 'variable_material_properties')
353 if (params_selected%valid_path(
'variable_material_properties'))
then
354 call neko_error(
'variable material properties no supported for adjoint')
357 write(log_buf,
'(A,L1)')
'LES : ', this%variable_material_properties
358 call neko_log%message(log_buf)
364 call this%f_Xh%init(this%dm_Xh, fld_name =
"adjoint_scalar_rhs")
367 call this%source_term%init(this%f_Xh, this%c_Xh, user, this%name)
369 call this%source_term%add(params_primal,
'source_terms')
373 'solver.max_iterations')
374 call json_get_or_default(params_selected, &
375 'solver.max_iterations', &
376 integer_val, ksp_max_iter)
379 call json_get_or_default(params_selected, &
381 logical_val, .false.)
382 call adjoint_scalar_scheme_solver_factory(this%ksp, this%dm_Xh%size(), &
383 solver_type, integer_val, solver_abstol, logical_val)
384 call scalar_scheme_precon_factory(this%pc, this%ksp, &
385 this%c_Xh, this%dm_Xh, this%gs_Xh, this%bcs, &
386 solver_precon, precon_params)
388 call neko_log%end_section()
516 subroutine adjoint_scalar_scheme_update_material_properties(t, tstep, this)
518 real(kind=rp),
intent(in) :: t
519 integer,
intent(in) :: tstep
520 type(field_t),
pointer :: nut
523 type(field_t),
pointer :: lambda_factor
525 call this%user_material_properties(t, tstep, this%name, &
526 this%material_properties)
529 if (this%variable_material_properties .and. &
530 len(trim(this%nut_field_name)) > 0)
then
531 nut => neko_field_registry%get_field(this%nut_field_name)
534 call neko_scratch_registry%request_field(lambda_factor, index)
536 call field_col3(lambda_factor, this%cp, this%rho)
537 call field_col2(lambda_factor, nut)
538 call field_cmult(lambda_factor, 1.0_rp / this%pr_turb)
539 call field_add2(this%lambda, lambda_factor)
540 call neko_scratch_registry%relinquish_field(index)
547 if (neko_bcknd_device .eq. 1)
then
548 call device_memcpy(this%cp%x, this%cp%x_d, this%cp%size(), &
549 device_to_host, sync=.false.)
558 subroutine adjoint_scalar_scheme_set_material_properties(this, &
561 type(json_file),
intent(inout) :: params_primal
562 type(user_t),
target,
intent(in) :: user
563 character(len=LOG_SIZE) :: log_buf
565 procedure(user_material_properties),
pointer :: dummy_mp_ptr
566 real(kind=rp) :: const_cp, const_lambda
568 dummy_mp_ptr => dummy_user_material_properties
571 call this%lambda%init(this%dm_Xh,
"lambda")
572 call this%cp%init(this%dm_Xh,
"cp")
574 call this%material_properties%init(2)
575 call this%material_properties%assign_to_field(1, this%cp)
576 call this%material_properties%assign_to_field(2, this%lambda)
578 if (.not.
associated(user%material_properties, dummy_mp_ptr))
then
580 write(log_buf,
'(A)')
"Material properties must be set in the user " // &
582 call neko_log%message(log_buf)
583 this%user_material_properties => user%material_properties
584 call user%material_properties(0.0_rp, 0, this%name, &
585 this%material_properties)
587 this%user_material_properties => dummy_user_material_properties
588 if (params_primal%valid_path(
'Pe') .and. &
589 (params_primal%valid_path(
'lambda') .or. &
590 params_primal%valid_path(
'cp')))
then
591 call neko_error(
"To set the material properties for the scalar, " // &
592 "either provide Pe OR lambda and cp in the case file.")
594 else if (params_primal%valid_path(
'Pe'))
then
595 write(log_buf,
'(A)')
'Non-dimensional scalar material properties' //&
597 call neko_log%message(log_buf, lvl = neko_log_verbose)
598 write(log_buf,
'(A)')
'Specific heat capacity will be set to 1,'
599 call neko_log%message(log_buf, lvl = neko_log_verbose)
600 write(log_buf,
'(A)')
'conductivity to 1/Pe. Assumes density is 1.'
601 call neko_log%message(log_buf, lvl = neko_log_verbose)
604 call json_get(params_primal,
'Pe', const_lambda)
605 write(log_buf,
'(A,ES13.6)')
'Pe :', const_lambda
606 call neko_log%message(log_buf)
611 const_lambda = 1.0_rp/const_lambda
614 call json_get(params_primal,
'lambda', const_lambda)
615 call json_get(params_primal,
'cp', const_cp)
620 if (
associated(user%material_properties, dummy_mp_ptr))
then
622 call field_cfill(this%lambda, const_lambda)
623 call field_cfill(this%cp, const_cp)
625 write(log_buf,
'(A,ES13.6)')
'lambda :', const_lambda
626 call neko_log%message(log_buf)
627 write(log_buf,
'(A,ES13.6)')
'cp :', const_cp
628 call neko_log%message(log_buf)
635 if (neko_bcknd_device .eq. 1)
then
636 call device_memcpy(this%cp%x, this%cp%x_d, this%cp%size(), &
637 device_to_host, sync=.false.)