258 params_adjoint, params_primal, scheme, user, rho)
260 type(mesh_t),
target,
intent(in) :: msh
261 type(coef_t),
target,
intent(in) :: c_Xh
262 type(gs_t),
target,
intent(inout) :: gs_Xh
263 type(json_file),
target,
intent(inout) :: params_primal, params_adjoint
264 character(len=*),
intent(in) :: scheme
265 type(user_t),
target,
intent(in) :: user
266 type(field_t),
target,
intent(in) :: rho
267 type(json_file),
pointer :: params_selected
269 character(len=LOG_SIZE) :: log_buf
271 logical :: logical_val
272 real(kind=rp) :: solver_abstol
273 integer :: integer_val
274 character(len=:),
allocatable :: solver_type, solver_precon
275 type(json_file) :: precon_params
277 this%u => neko_registry%get_field(
'u')
278 this%v => neko_registry%get_field(
'v')
279 this%w => neko_registry%get_field(
'w')
283 call json_get_or_default(params_adjoint,
'primal_name', this%primal_name, &
286 call json_get_or_default(params_adjoint,
'name', this%name, &
287 this%primal_name //
'_adj')
289 call neko_log%section(
'Adjoint scalar')
292 call json_get(params_selected,
'solver.type', solver_type)
295 'solver.preconditioner.type')
296 call json_get(params_selected,
'solver.preconditioner.type', solver_precon)
299 'solver.preconditioner')
300 call json_get(params_selected,
'solver.preconditioner', &
304 'solver.absolute_tolerance')
305 call json_get(params_selected,
'solver.absolute_tolerance', &
309 'solver.projection_space_size')
310 call json_get_or_default(params_selected, &
311 'solver.projection_space_size', &
312 this%projection_dim, 0)
315 'solver.projection_hold_steps')
316 call json_get_or_default(params_selected, &
317 'solver.projection_hold_steps', &
318 this%projection_activ_step, 5)
321 write(log_buf,
'(A, A)')
'Type : ', trim(scheme)
322 call neko_log%message(log_buf)
323 write(log_buf,
'(A, A)')
'Name : ', trim(this%name)
324 call neko_log%message(log_buf)
325 call neko_log%message(
'Ksp adjoint scalar : ('// trim(solver_type) // &
326 ', ' // trim(solver_precon) //
')')
327 write(log_buf,
'(A,ES13.6)')
' `-abs tol :', solver_abstol
328 call neko_log%message(log_buf)
331 this%dm_Xh => this%u%dof
332 this%params => params_adjoint
335 if (.not. neko_registry%field_exists(this%name))
then
336 call neko_registry%add_field(this%dm_Xh, this%name)
339 this%s_adj => neko_registry%get_field(this%name)
341 call this%s_adj_lag%init(this%s_adj, 2)
343 this%s => neko_registry%get_field(this%primal_name)
351 call this%set_material_properties(params_primal, user)
358 'variable_material_properties')
359 if (params_selected%valid_path(
'variable_material_properties'))
then
360 call neko_error(
'variable material properties no supported for adjoint')
363 write(log_buf,
'(A,L1)')
'LES : ', this%variable_material_properties
364 call neko_log%message(log_buf)
370 call this%f_Xh%init(this%dm_Xh, fld_name =
"adjoint_scalar_rhs")
373 call this%source_term%init(this%f_Xh, this%c_Xh, user, this%name)
375 call this%source_term%add(params_primal,
'source_terms')
379 'solver.max_iterations')
380 call json_get_or_default(params_selected, &
381 'solver.max_iterations', &
382 integer_val, ksp_max_iter)
385 call json_get_or_default(params_selected, &
387 logical_val, .false.)
389 solver_type, integer_val, solver_abstol, logical_val)
390 call scalar_scheme_precon_factory(this%pc, this%ksp, &
391 this%c_Xh, this%dm_Xh, this%gs_Xh, this%bcs, &
392 solver_precon, precon_params)
394 call neko_log%end_section()
543 type(time_state_t),
intent(in) :: time
544 type(field_t),
pointer :: nut
547 type(field_t),
pointer :: lambda_factor
549 call this%user_material_properties(this%name, this%material_properties, &
553 if (this%variable_material_properties .and. &
554 len(trim(this%nut_field_name)) > 0)
then
555 nut => neko_registry%get_field(this%nut_field_name)
558 call neko_scratch_registry%request_field(lambda_factor, index, .false.)
560 call field_col3(lambda_factor, this%cp, this%rho)
561 call field_col2(lambda_factor, nut)
562 call field_cmult(lambda_factor, 1.0_rp / this%pr_turb)
563 call field_add2(this%lambda, lambda_factor)
564 call neko_scratch_registry%relinquish_field(index)
571 if (neko_bcknd_device .eq. 1)
then
572 call device_memcpy(this%cp%x, this%cp%x_d, this%cp%size(), &
573 device_to_host, sync=.false.)
585 type(json_file),
intent(inout) :: params_primal
586 type(user_t),
target,
intent(in) :: user
587 character(len=LOG_SIZE) :: log_buf
589 procedure(user_material_properties_intf),
pointer :: dummy_mp_ptr
590 real(kind=rp) :: const_cp, const_lambda
592 type(time_state_t) :: time
594 dummy_mp_ptr => dummy_user_material_properties
597 call this%lambda%init(this%dm_Xh,
"lambda")
598 call this%cp%init(this%dm_Xh,
"cp")
600 call this%material_properties%init(2)
601 call this%material_properties%assign_to_field(1, this%cp)
602 call this%material_properties%assign_to_field(2, this%lambda)
604 if (.not.
associated(user%material_properties, dummy_mp_ptr))
then
606 write(log_buf,
'(A)')
"Material properties must be set in the user " // &
608 call neko_log%message(log_buf)
609 this%user_material_properties => user%material_properties
610 call user%material_properties(this%name, this%material_properties, time)
612 this%user_material_properties => dummy_user_material_properties
613 if (params_primal%valid_path(
'Pe') .and. &
614 (params_primal%valid_path(
'lambda') .or. &
615 params_primal%valid_path(
'cp')))
then
616 call neko_error(
"To set the material properties for the scalar, " // &
617 "either provide Pe OR lambda and cp in the case file.")
619 else if (params_primal%valid_path(
'Pe'))
then
620 write(log_buf,
'(A)')
'Non-dimensional scalar material properties' //&
622 call neko_log%message(log_buf, lvl = neko_log_verbose)
623 write(log_buf,
'(A)')
'Specific heat capacity will be set to 1,'
624 call neko_log%message(log_buf, lvl = neko_log_verbose)
625 write(log_buf,
'(A)')
'conductivity to 1/Pe. Assumes density is 1.'
626 call neko_log%message(log_buf, lvl = neko_log_verbose)
629 call json_get(params_primal,
'Pe', const_lambda)
630 write(log_buf,
'(A,ES13.6)')
'Pe :', const_lambda
631 call neko_log%message(log_buf)
636 const_lambda = 1.0_rp/const_lambda
639 call json_get(params_primal,
'lambda', const_lambda)
640 call json_get(params_primal,
'cp', const_cp)
645 if (
associated(user%material_properties, dummy_mp_ptr))
then
647 call field_cfill(this%lambda, const_lambda)
648 call field_cfill(this%cp, const_cp)
650 write(log_buf,
'(A,ES13.6)')
'lambda :', const_lambda
651 call neko_log%message(log_buf)
652 write(log_buf,
'(A,ES13.6)')
'cp :', const_cp
653 call neko_log%message(log_buf)
660 if (neko_bcknd_device .eq. 1)
then
661 call device_memcpy(this%cp%x, this%cp%x_d, this%cp%size(), &
662 device_to_host, sync=.false.)