38 pnpn_prs_res_factory, pnpn_vel_res_factory, &
39 pnpn_prs_res_stress_factory, pnpn_vel_res_stress_factory
42 rhs_maker_ext_fctry, rhs_maker_oifs_fctry
53 use json_module,
only : json_file
75 type(
field_t) :: p_res, u_res, v_res, w_res
80 class(
ax_t),
allocatable :: ax_vel
82 class(
ax_t),
allocatable :: ax_prs
146 type(
mesh_t),
target,
intent(inout) :: msh
147 integer,
intent(inout) :: lx
148 type(json_file),
target,
intent(inout) :: params
149 type(
user_t),
target,
intent(in) :: user
151 character(len=15),
parameter :: scheme =
'Modular (Pn/Pn)'
156 call this%scheme_init(msh, lx, params, .true., .true., scheme, user)
158 if (this%variable_material_properties .eqv. .true.)
then
160 call ax_helm_factory(this%Ax_vel, full_formulation = .true.)
163 call pnpn_prs_res_stress_factory(this%prs_res)
166 call pnpn_vel_res_stress_factory(this%vel_res)
169 call ax_helm_factory(this%Ax_vel, full_formulation = .false.)
172 call pnpn_prs_res_factory(this%prs_res)
175 call pnpn_vel_res_factory(this%vel_res)
179 call ax_helm_factory(this%Ax_prs, full_formulation = .false.)
183 call rhs_maker_sumab_fctry(this%sumab)
186 call rhs_maker_ext_fctry(this%makeabf)
189 call rhs_maker_bdf_fctry(this%makebdf)
192 call rhs_maker_oifs_fctry(this%makeoifs)
195 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
196 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
198 call this%p_res%init(dm_xh,
"p_res")
199 call this%u_res%init(dm_xh,
"u_res")
200 call this%v_res%init(dm_xh,
"v_res")
201 call this%w_res%init(dm_xh,
"w_res")
202 call this%abx1%init(dm_xh,
"abx1")
203 call this%aby1%init(dm_xh,
"aby1")
204 call this%abz1%init(dm_xh,
"abz1")
205 call this%abx2%init(dm_xh,
"abx2")
206 call this%aby2%init(dm_xh,
"aby2")
207 call this%abz2%init(dm_xh,
"abz2")
208 call this%advx%init(dm_xh,
"advx")
209 call this%advy%init(dm_xh,
"advy")
210 call this%advz%init(dm_xh,
"advz")
221 call this%du%init(dm_xh,
'du')
222 call this%dv%init(dm_xh,
'dv')
223 call this%dw%init(dm_xh,
'dw')
224 call this%dp%init(dm_xh,
'dp')
229 call this%bc_prs_surface%init_base(this%c_Xh)
230 call this%bc_prs_surface%mark_zone(msh%inlet)
231 call this%bc_prs_surface%mark_zones_from_list(msh%labeled_zones,&
235 call this%bc_prs_surface%mark_zones_from_list(msh%labeled_zones,&
236 'd_vel_u', this%bc_labels)
237 call this%bc_prs_surface%mark_zones_from_list(msh%labeled_zones,&
238 'd_vel_v', this%bc_labels)
239 call this%bc_prs_surface%mark_zones_from_list(msh%labeled_zones,&
240 'd_vel_w', this%bc_labels)
241 call this%bc_prs_surface%finalize()
243 call this%bc_sym_surface%init_base(this%c_Xh)
244 call this%bc_sym_surface%mark_zone(msh%sympln)
245 call this%bc_sym_surface%mark_zones_from_list(msh%labeled_zones,&
246 'sym', this%bc_labels)
248 call this%bc_sym_surface%finalize()
250 call this%bc_vel_res_non_normal%init_base(this%c_Xh)
251 call this%bc_vel_res_non_normal%mark_zone(msh%outlet_normal)
252 call this%bc_vel_res_non_normal%mark_zones_from_list(msh%labeled_zones,&
253 'on', this%bc_labels)
254 call this%bc_vel_res_non_normal%mark_zones_from_list(msh%labeled_zones,&
257 call this%bc_vel_res_non_normal%finalize()
258 call this%bc_vel_res_non_normal%init(this%c_Xh)
260 call this%bc_field_dirichlet_p%init_base(this%c_Xh)
261 call this%bc_field_dirichlet_p%mark_zones_from_list(msh%labeled_zones, &
262 'on+dong', this%bc_labels)
263 call this%bc_field_dirichlet_p%mark_zones_from_list(msh%labeled_zones, &
264 'o+dong', this%bc_labels)
265 call this%bc_field_dirichlet_p%mark_zones_from_list(msh%labeled_zones, &
266 'd_pres', this%bc_labels)
267 call this%bc_field_dirichlet_p%finalize()
268 call this%bc_field_dirichlet_p%set_g(0.0_rp)
270 call bc_list_add(this%bclst_dp, this%bc_field_dirichlet_p)
274 call this%bc_field_dirichlet_u%init_base(this%c_Xh)
275 call this%bc_field_dirichlet_u%mark_zones_from_list( &
276 msh%labeled_zones,
'd_vel_u', this%bc_labels)
277 call this%bc_field_dirichlet_u%finalize()
278 call this%bc_field_dirichlet_u%set_g(0.0_rp)
280 call this%bc_field_dirichlet_v%init_base(this%c_Xh)
281 call this%bc_field_dirichlet_v%mark_zones_from_list(msh%labeled_zones, &
284 call this%bc_field_dirichlet_v%finalize()
285 call this%bc_field_dirichlet_v%set_g(0.0_rp)
287 call this%bc_field_dirichlet_w%init_base(this%c_Xh)
288 call this%bc_field_dirichlet_w%mark_zones_from_list(msh%labeled_zones, &
291 call this%bc_field_dirichlet_w%finalize()
292 call this%bc_field_dirichlet_w%set_g(0.0_rp)
294 call this%bc_vel_res%init_base(this%c_Xh)
295 call this%bc_vel_res%mark_zone(msh%inlet)
296 call this%bc_vel_res%mark_zone(msh%wall)
297 call this%bc_vel_res%mark_zones_from_list(msh%labeled_zones, &
299 call this%bc_vel_res%mark_zones_from_list(msh%labeled_zones, &
301 call this%bc_vel_res%finalize()
302 call this%bc_vel_res%set_g(0.0_rp)
304 call bc_list_add(this%bclst_vel_res, this%bc_vel_res)
305 call bc_list_add(this%bclst_vel_res, this%bc_vel_res_non_normal)
307 call bc_list_add(this%bclst_vel_res, this%bc_sh%symmetry)
308 call bc_list_add(this%bclst_vel_res, this%bc_wallmodel%symmetry)
313 call bc_list_add(this%bclst_du, this%bc_sh%symmetry%bc_x)
314 call bc_list_add(this%bclst_du, this%bc_wallmodel%symmetry%bc_x)
315 call bc_list_add(this%bclst_du, this%bc_vel_res_non_normal%bc_x)
317 call bc_list_add(this%bclst_du, this%bc_field_dirichlet_u)
321 call bc_list_add(this%bclst_dv, this%bc_sh%symmetry%bc_y)
322 call bc_list_add(this%bclst_dv, this%bc_wallmodel%symmetry%bc_y)
323 call bc_list_add(this%bclst_dv, this%bc_vel_res_non_normal%bc_y)
325 call bc_list_add(this%bclst_dv, this%bc_field_dirichlet_v)
329 call bc_list_add(this%bclst_dw, this%bc_sh%symmetry%bc_z)
330 call bc_list_add(this%bclst_dw, this%bc_wallmodel%symmetry%bc_z)
331 call bc_list_add(this%bclst_dw, this%bc_vel_res_non_normal%bc_z)
333 call bc_list_add(this%bclst_dw, this%bc_field_dirichlet_w)
337 if (this%variable_material_properties .and. &
338 this%vel_projection_dim .gt. 0)
then
339 call neko_error(
"Velocity projection not available for full stress &
344 call this%proj_prs%init(this%dm_Xh%size(), this%pr_projection_dim, &
345 this%pr_projection_activ_step)
347 call this%proj_u%init(this%dm_Xh%size(), this%vel_projection_dim, &
348 this%vel_projection_activ_step)
349 call this%proj_v%init(this%dm_Xh%size(), this%vel_projection_dim, &
350 this%vel_projection_activ_step)
351 call this%proj_w%init(this%dm_Xh%size(), this%vel_projection_dim, &
352 this%vel_projection_activ_step)
356 call this%chkp%add_lag(this%ulag, this%vlag, this%wlag)
362 call advection_factory(this%adv, params, this%c_Xh, &
363 this%ulag, this%vlag, this%wlag, &
366 if (params%valid_path(
'case.fluid.flow_rate_force'))
then
367 call this%vol_flow%init(this%dm_Xh, params)
374 real(kind=rp) :: dtlag(10), tlag(10)
375 type(field_t) :: u_temp, v_temp, w_temp
378 n = this%u%dof%size()
379 if (
allocated(this%chkp%previous_mesh%elements) .or. &
380 this%chkp%previous_Xh%lx .ne. this%Xh%lx)
then
381 call col2(this%u%x, this%c_Xh%mult, this%u%dof%size())
382 call col2(this%v%x, this%c_Xh%mult, this%u%dof%size())
383 call col2(this%w%x, this%c_Xh%mult, this%u%dof%size())
384 call col2(this%p%x, this%c_Xh%mult, this%u%dof%size())
385 do i = 1, this%ulag%size()
386 call col2(this%ulag%lf(i)%x, this%c_Xh%mult, this%u%dof%size())
387 call col2(this%vlag%lf(i)%x, this%c_Xh%mult, this%u%dof%size())
388 call col2(this%wlag%lf(i)%x, this%c_Xh%mult, this%u%dof%size())
392 if (neko_bcknd_device .eq. 1)
then
393 associate(u => this%u, v => this%v, w => this%w, &
394 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag,&
396 call device_memcpy(u%x, u%x_d, u%dof%size(), &
397 host_to_device, sync = .false.)
398 call device_memcpy(v%x, v%x_d, v%dof%size(), &
399 host_to_device, sync = .false.)
400 call device_memcpy(w%x, w%x_d, w%dof%size(), &
401 host_to_device, sync = .false.)
402 call device_memcpy(p%x, p%x_d, p%dof%size(), &
403 host_to_device, sync = .false.)
404 call device_memcpy(ulag%lf(1)%x, ulag%lf(1)%x_d, &
405 u%dof%size(), host_to_device, sync = .false.)
406 call device_memcpy(ulag%lf(2)%x, ulag%lf(2)%x_d, &
407 u%dof%size(), host_to_device, sync = .false.)
409 call device_memcpy(vlag%lf(1)%x, vlag%lf(1)%x_d, &
410 v%dof%size(), host_to_device, sync = .false.)
411 call device_memcpy(vlag%lf(2)%x, vlag%lf(2)%x_d, &
412 v%dof%size(), host_to_device, sync = .false.)
414 call device_memcpy(wlag%lf(1)%x, wlag%lf(1)%x_d, &
415 w%dof%size(), host_to_device, sync = .false.)
416 call device_memcpy(wlag%lf(2)%x, wlag%lf(2)%x_d, &
417 w%dof%size(), host_to_device, sync = .false.)
418 call device_memcpy(this%abx1%x, this%abx1%x_d, &
419 w%dof%size(), host_to_device, sync = .false.)
420 call device_memcpy(this%abx2%x, this%abx2%x_d, &
421 w%dof%size(), host_to_device, sync = .false.)
422 call device_memcpy(this%aby1%x, this%aby1%x_d, &
423 w%dof%size(), host_to_device, sync = .false.)
424 call device_memcpy(this%aby2%x, this%aby2%x_d, &
425 w%dof%size(), host_to_device, sync = .false.)
426 call device_memcpy(this%abz1%x, this%abz1%x_d, &
427 w%dof%size(), host_to_device, sync = .false.)
428 call device_memcpy(this%abz2%x, this%abz2%x_d, &
429 w%dof%size(), host_to_device, sync = .false.)
430 call device_memcpy(this%advx%x, this%advx%x_d, &
431 w%dof%size(), host_to_device, sync = .false.)
432 call device_memcpy(this%advy%x, this%advy%x_d, &
433 w%dof%size(), host_to_device, sync = .false.)
434 call device_memcpy(this%advz%x, this%advz%x_d, &
435 w%dof%size(), host_to_device, sync = .false.)
442 if (
allocated(this%chkp%previous_mesh%elements) &
443 .or. this%chkp%previous_Xh%lx .ne. this%Xh%lx)
then
444 call this%gs_Xh%op(this%u, gs_op_add)
445 call this%gs_Xh%op(this%v, gs_op_add)
446 call this%gs_Xh%op(this%w, gs_op_add)
447 call this%gs_Xh%op(this%p, gs_op_add)
449 do i = 1, this%ulag%size()
450 call this%gs_Xh%op(this%ulag%lf(i), gs_op_add)
451 call this%gs_Xh%op(this%vlag%lf(i), gs_op_add)
452 call this%gs_Xh%op(this%wlag%lf(i), gs_op_add)
517 call this%scheme_free()
519 call this%bc_prs_surface%free()
520 call this%bc_sym_surface%free()
521 call bc_list_free(this%bclst_vel_res)
522 call bc_list_free(this%bclst_dp)
523 call this%proj_prs%free()
524 call this%proj_u%free()
525 call this%proj_v%free()
526 call this%proj_w%free()
528 call this%p_res%free()
529 call this%u_res%free()
530 call this%v_res%free()
531 call this%w_res%free()
538 call this%abx1%free()
539 call this%aby1%free()
540 call this%abz1%free()
542 call this%abx2%free()
543 call this%aby2%free()
544 call this%abz2%free()
546 call this%advx%free()
547 call this%advy%free()
548 call this%advz%free()
550 if (
allocated(this%Ax_vel))
then
551 deallocate(this%Ax_vel)
554 if (
allocated(this%Ax_prs))
then
555 deallocate(this%Ax_prs)
558 if (
allocated(this%prs_res))
then
559 deallocate(this%prs_res)
562 if (
allocated(this%vel_res))
then
563 deallocate(this%vel_res)
566 if (
allocated(this%sumab))
then
567 deallocate(this%sumab)
570 if (
allocated(this%makeabf))
then
571 deallocate(this%makeabf)
574 if (
allocated(this%makebdf))
then
575 deallocate(this%makebdf)
578 if (
allocated(this%makeoifs))
then
579 deallocate(this%makeoifs)
582 call this%vol_flow%free()
594 real(kind=rp),
intent(inout) :: t
595 integer,
intent(inout) :: tstep
596 real(kind=rp),
intent(in) :: dt
597 type(time_scheme_controller_t),
intent(inout) :: ext_bdf
598 type(time_step_controller_t),
intent(in) :: dt_controller
602 type(ksp_monitor_t) :: ksp_results(4)
604 type(field_t),
pointer :: u_e, v_e, w_e
606 integer :: temp_indices(3)
608 if (this%freeze)
return
610 n = this%dm_Xh%size()
612 call profiler_start_region(
'Fluid', 1)
613 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
614 du => this%du, dv => this%dv, dw => this%dw, dp => this%dp, &
615 u_res => this%u_res, v_res => this%v_res, w_res => this%w_res, &
616 p_res => this%p_res, ax_vel => this%Ax_vel, ax_prs => this%Ax_prs, &
618 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
619 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag, &
620 msh => this%msh, prs_res => this%prs_res, &
621 source_term => this%source_term, vel_res => this%vel_res, &
622 sumab => this%sumab, makeoifs => this%makeoifs, &
623 makeabf => this%makeabf, makebdf => this%makebdf, &
624 vel_projection_dim => this%vel_projection_dim, &
625 pr_projection_dim => this%pr_projection_dim, &
626 rho => this%rho, mu => this%mu, oifs => this%oifs, &
627 rho_field => this%rho_field, mu_field => this%mu_field, &
628 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
629 if_variable_dt => dt_controller%if_variable_dt, &
630 dt_last_change => dt_controller%dt_last_change)
633 call this%scratch%request_field(u_e, temp_indices(1))
634 call this%scratch%request_field(v_e, temp_indices(2))
635 call this%scratch%request_field(w_e, temp_indices(3))
636 call sumab%compute_fluid(u_e, v_e, w_e, u, v, w, &
637 ulag, vlag, wlag, ext_bdf%advection_coeffs, ext_bdf%nadv)
640 call this%source_term%compute(t, tstep)
643 call bc_list_apply_vector(this%bclst_vel_neumann, f_x%x, f_y%x, f_z%x, &
644 this%dm_Xh%size(), t, tstep)
647 if (this%if_gradient_jump_penalty .eqv. .true.)
then
648 call this%gradient_jump_penalty_u%compute(u, v, w, u)
649 call this%gradient_jump_penalty_v%compute(u, v, w, v)
650 call this%gradient_jump_penalty_w%compute(u, v, w, w)
651 call this%gradient_jump_penalty_u%perform(f_x)
652 call this%gradient_jump_penalty_v%perform(f_y)
653 call this%gradient_jump_penalty_w%perform(f_z)
658 call this%adv%compute(u, v, w, &
659 this%advx, this%advy, this%advz, &
660 xh, this%c_Xh, dm_xh%size(), dt)
666 call makeabf%compute_fluid(this%abx1, this%aby1, this%abz1,&
667 this%abx2, this%aby2, this%abz2, &
668 f_x%x, f_y%x, f_z%x, &
669 rho, ext_bdf%advection_coeffs, n)
672 call makeoifs%compute_fluid(this%advx%x, this%advy%x, this%advz%x, &
673 f_x%x, f_y%x, f_z%x, &
677 call this%adv%compute(u, v, w, &
679 xh, this%c_Xh, dm_xh%size())
685 call makeabf%compute_fluid(this%abx1, this%aby1, this%abz1,&
686 this%abx2, this%aby2, this%abz2, &
687 f_x%x, f_y%x, f_z%x, &
688 rho, ext_bdf%advection_coeffs, n)
691 call makebdf%compute_fluid(ulag, vlag, wlag, f_x%x, f_y%x, f_z%x, &
692 u, v, w, c_xh%B, rho, dt, &
693 ext_bdf%diffusion_coeffs, ext_bdf%ndiff, n)
703 call this%user_field_bc_vel%update(this%user_field_bc_vel%field_list, &
704 this%user_field_bc_vel%bc_list, this%c_Xh, t, tstep,
"fluid")
706 call this%bc_apply_vel(t, tstep)
707 call this%bc_apply_prs(t, tstep)
710 call this%update_material_properties()
713 call profiler_start_region(
'Pressure_residual', 18)
714 call prs_res%compute(p, p_res,&
719 this%bc_prs_surface, this%bc_sym_surface,&
720 ax_prs, ext_bdf%diffusion_coeffs(1), dt, &
723 call gs_xh%op(p_res, gs_op_add)
724 call bc_list_apply_scalar(this%bclst_dp, p_res%x, p%dof%size(), t, tstep)
725 call profiler_end_region(
'Pressure_residual', 18)
727 call this%proj_prs%pre_solving(p_res%x, tstep, c_xh, n, dt_controller, &
730 call this%pc_prs%update()
731 call profiler_start_region(
'Pressure_solve', 3)
733 this%ksp_prs%solve(ax_prs, dp, p_res%x, n, c_xh, this%bclst_dp, gs_xh)
735 call profiler_end_region(
'Pressure_solve', 3)
737 call this%proj_prs%post_solving(dp%x, ax_prs, c_xh, &
738 this%bclst_dp, gs_xh, n, tstep, dt_controller)
740 call field_add2(p, dp, n)
743 call profiler_start_region(
'Velocity_residual', 19)
744 call vel_res%compute(ax_vel, u, v, w, &
745 u_res, v_res, w_res, &
749 mu_field, rho_field, ext_bdf%diffusion_coeffs(1), &
752 call gs_xh%op(u_res, gs_op_add)
753 call gs_xh%op(v_res, gs_op_add)
754 call gs_xh%op(w_res, gs_op_add)
756 call bc_list_apply_vector(this%bclst_vel_res,&
757 u_res%x, v_res%x, w_res%x, dm_xh%size(),&
762 if (neko_bcknd_device .eq. 1)
then
763 call this%bc_field_dirichlet_u%apply_scalar_dev(u_res%x_d, t, tstep)
764 call this%bc_field_dirichlet_v%apply_scalar_dev(v_res%x_d, t, tstep)
765 call this%bc_field_dirichlet_w%apply_scalar_dev(w_res%x_d, t, tstep)
767 call this%bc_field_dirichlet_u%apply_scalar(u_res%x, n, t, tstep)
768 call this%bc_field_dirichlet_v%apply_scalar(v_res%x, n, t, tstep)
769 call this%bc_field_dirichlet_w%apply_scalar(w_res%x, n, t, tstep)
772 call profiler_end_region(
'Velocity_residual', 19)
774 call this%proj_u%pre_solving(u_res%x, tstep, c_xh, n, dt_controller)
775 call this%proj_v%pre_solving(v_res%x, tstep, c_xh, n, dt_controller)
776 call this%proj_w%pre_solving(w_res%x, tstep, c_xh, n, dt_controller)
778 call this%pc_vel%update()
780 call profiler_start_region(
"Velocity_solve", 4)
781 ksp_results(2:4) = this%ksp_vel%solve_coupled(ax_vel, du, dv, dw, &
782 u_res%x, v_res%x, w_res%x, n, c_xh, &
783 this%bclst_du, this%bclst_dv, this%bclst_dw, gs_xh, &
784 this%ksp_vel%max_iter)
785 call profiler_end_region(
"Velocity_solve", 4)
787 call this%proj_u%post_solving(du%x, ax_vel, c_xh, &
788 this%bclst_du, gs_xh, n, tstep, dt_controller)
789 call this%proj_v%post_solving(dv%x, ax_vel, c_xh, &
790 this%bclst_dv, gs_xh, n, tstep, dt_controller)
791 call this%proj_w%post_solving(dw%x, ax_vel, c_xh, &
792 this%bclst_dw, gs_xh, n, tstep, dt_controller)
794 if (neko_bcknd_device .eq. 1)
then
795 call device_opadd2cm(u%x_d, v%x_d, w%x_d, &
796 du%x_d, dv%x_d, dw%x_d, 1.0_rp, n, msh%gdim)
798 call opadd2cm(u%x, v%x, w%x, du%x, dv%x, dw%x, 1.0_rp, n, msh%gdim)
801 if (this%forced_flow_rate)
then
802 call this%vol_flow%adjust( u, v, w, p, u_res, v_res, w_res, p_res, &
803 c_xh, gs_xh, ext_bdf, rho, mu, dt, &
804 this%bclst_dp, this%bclst_du, this%bclst_dv, &
805 this%bclst_dw, this%bclst_vel_res, ax_vel, ax_prs, this%ksp_prs, &
806 this%ksp_vel, this%pc_prs, this%pc_vel, this%ksp_prs%max_iter, &
807 this%ksp_vel%max_iter)
810 call fluid_step_info(tstep, t, dt, ksp_results)
812 call this%scratch%relinquish_field(temp_indices)
815 call profiler_end_region(
'Fluid', 1)
Copy data between host and device (or device and device)
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
Retrieves a parameter by name or throws an error.
Subroutines to add advection terms to the RHS of a transport equation.
Defines a Matrix-vector product.
Defines a boundary condition.
subroutine, public bc_list_add(bclst, bc)
Add a condition to a list of boundary conditions.
subroutine, public bc_list_apply_vector(bclst, x, y, z, n, t, tstep)
Apply a list of boundary conditions to a vector field.
subroutine, public bc_list_init(bclst, size)
Constructor for a list of boundary conditions.
subroutine, public bc_list_free(bclst)
Destructor for a list of boundary conditions.
subroutine, public bc_list_apply_scalar(bclst, x, n, t, tstep)
Apply a list of boundary conditions to a scalar field.
subroutine, public device_opadd2cm(a1_d, a2_d, a3_d, b1_d, b2_d, b3_d, c, n, gdim)
subroutine, public device_opcolv(a1_d, a2_d, a3_d, c_d, gdim, n)
Device abstraction, common interface for various accelerators.
integer, parameter, public host_to_device
Defines a dirichlet boundary condition.
Dirichlet condition applied in the facet normal direction.
subroutine, public field_add2(a, b, n)
Vector addition .
subroutine, public field_copy(a, b, n)
Copy a vector .
Auxiliary routines for fluid solvers.
subroutine, public fluid_step_info(step, t, dt, ksp_results)
Prints for prs, velx, vely, velz the following: Number of iterations, start residual,...
Modular version of the Classic Nek5000 Pn/Pn formulation for fluids.
subroutine fluid_pnpn_init(this, msh, lx, params, user, time_scheme)
subroutine fluid_pnpn_step(this, t, tstep, dt, ext_bdf, dt_controller)
Advance fluid simulation in time.
subroutine fluid_pnpn_free(this)
subroutine fluid_pnpn_restart(this, dtlag, tlag)
Defines Gather-scatter operations.
integer, parameter, public gs_op_add
Utilities for retrieving parameters from the case files.
Implements the base abstract type for Krylov solvers plus helper types.
real(kind=rp) function, public glsum(a, n)
Sum a vector of length n.
subroutine, public col2(a, b, n)
Vector multiplication .
Collection of vector field operations operating on and . Note that in general the indices and ....
subroutine, public opcolv(a1, a2, a3, c, gdim, n)
subroutine, public opadd2cm(a1, a2, a3, b1, b2, b3, c, n, gdim)
integer, parameter neko_bcknd_device
Dirichlet condition on axis aligned plane in the non normal direction.
integer, parameter, public rp
Global precision used in computations.
Defines Pressure and velocity residuals in the Pn-Pn formulation.
subroutine, public profiler_start_region(name, region_id)
Started a named (name) profiler region.
subroutine, public profiler_end_region(name, region_id)
End the most recently started profiler region.
Project x onto X, the space of old solutions and back again.
Routines to generate the right-hand sides for the convection-diffusion equation. Employs the EXT/BDF ...
Implements the source_term_t type and a wrapper source_term_wrapper_t.
Compound scheme for the advection and diffusion operators in a transport equation.
Base class for time integration schemes.
Implements type time_step_controller.
Interfaces for user interaction with NEKO.
Base abstract type for computing the advection operator.
Base type for a matrix-vector product providing .
A list of boundary conditions.
Generic Dirichlet boundary condition on .
Dirichlet condition in facet normal direction.
Base type of all fluid formulations.
Type for storing initial and final residuals in a Krylov solver.
Dirichlet condition in non normal direction of a plane.
Abstract type to compute pressure residual.
Abstract type to compute velocity residual.
Abstract type to add contributions to F from lagged BD terms.
Abstract type to sum up contributions to kth order extrapolation scheme.
Abstract type to add contributions of kth order OIFS scheme.
Abstract type to compute extrapolated velocity field for the pressure equation.
Implements the logic to compute the time coefficients for the advection and diffusion operators in a ...
Provides a tool to set time step dt.