245 subroutine fluid_pnpn_init(this, msh, lx, params, user, chkp)
246 class(fluid_pnpn_t),
target,
intent(inout) :: this
247 type(
mesh_t),
target,
intent(inout) :: msh
248 integer,
intent(in) :: lx
249 type(json_file),
target,
intent(inout) :: params
250 type(
user_t),
target,
intent(in) :: user
251 type(
chkp_t),
target,
intent(inout) :: chkp
252 character(len=15),
parameter :: scheme =
'Modular (Pn/Pn)'
254 class(
bc_t),
pointer :: bc_i, vel_bc
255 real(kind=
rp) :: abs_tol
256 character(len=LOG_SIZE) :: log_buf
257 integer :: ierr, integer_val, solver_maxiter
258 character(len=:),
allocatable :: solver_type, precon_type
259 logical :: monitor, found
261 type(json_file) :: numerics_params, precon_params
266 call this%init_base(msh, lx, params, scheme,
user, .true.)
277 call json_get(params,
'case.numerics.time_order', integer_val)
278 allocate(this%ext_bdf)
279 call this%ext_bdf%init(integer_val)
282 this%full_stress_formulation, .false.)
286 if (this%full_stress_formulation .eqv. .true.)
then
288 call ax_helm_factory(this%Ax_vel, full_formulation = .true.)
291 call pnpn_prs_res_stress_factory(this%prs_res)
294 call pnpn_vel_res_stress_factory(this%vel_res)
297 call ax_helm_factory(this%Ax_vel, full_formulation = .false.)
300 call pnpn_prs_res_factory(this%prs_res)
303 call pnpn_vel_res_factory(this%vel_res)
308 if (params%valid_path(
'case.fluid.nut_field'))
then
309 if (this%full_stress_formulation .eqv. .false.)
then
310 call neko_error(
"You need to set full_stress_formulation to " // &
311 "true for the fluid to have a spatially varying " // &
314 call json_get(params,
'case.fluid.nut_field', this%nut_field_name)
316 this%nut_field_name =
""
320 call ax_helm_factory(this%Ax_prs, full_formulation = .false.)
324 call rhs_maker_sumab_fctry(this%sumab)
327 call rhs_maker_ext_fctry(this%makeabf)
330 call rhs_maker_bdf_fctry(this%makebdf)
333 call rhs_maker_oifs_fctry(this%makeoifs)
336 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
337 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
339 call this%p_res%init(dm_xh,
"p_res")
340 call this%u_res%init(dm_xh,
"u_res")
341 call this%v_res%init(dm_xh,
"v_res")
342 call this%w_res%init(dm_xh,
"w_res")
343 call this%abx1%init(dm_xh,
"abx1")
344 call this%aby1%init(dm_xh,
"aby1")
345 call this%abz1%init(dm_xh,
"abz1")
346 call this%abx2%init(dm_xh,
"abx2")
347 call this%aby2%init(dm_xh,
"aby2")
348 call this%abz2%init(dm_xh,
"abz2")
349 call this%advx%init(dm_xh,
"advx")
350 call this%advy%init(dm_xh,
"advy")
351 call this%advz%init(dm_xh,
"advz")
354 call this%du%init(this%dm_Xh,
'du')
355 call this%dv%init(this%dm_Xh,
'dv')
356 call this%dw%init(this%dm_Xh,
'dw')
357 call this%dp%init(this%dm_Xh,
'dp')
360 call this%setup_bcs(
user, params)
364 if (found)
call this%write_boundary_conditions()
366 call this%proj_prs%init(this%dm_Xh%size(), this%pr_projection_dim, &
367 this%pr_projection_activ_step)
369 call this%proj_vel%init(this%dm_Xh%size(), this%vel_projection_dim, &
370 this%vel_projection_activ_step)
376 if (params%valid_path(
'case.fluid.flow_rate_force'))
then
377 call this%vol_flow%init(this%dm_Xh, params)
381 call neko_log%section(
"Pressure solver")
384 'case.fluid.pressure_solver.max_iterations', &
386 call json_get(params,
'case.fluid.pressure_solver.type', solver_type)
387 call json_get(params,
'case.fluid.pressure_solver.preconditioner.type', &
390 'case.fluid.pressure_solver.preconditioner', precon_params)
391 call json_get(params,
'case.fluid.pressure_solver.absolute_tolerance', &
395 call neko_log%message(
'Type : ('// trim(solver_type) // &
396 ', ' // trim(precon_type) //
')')
397 write(log_buf,
'(A,ES13.6)')
'Abs tol :', abs_tol
400 call this%solver_factory(this%ksp_prs, this%dm_Xh%size(), &
401 solver_type, solver_maxiter, abs_tol, monitor)
402 call this%precon_factory_(this%pc_prs, this%ksp_prs, &
403 this%c_Xh, this%dm_Xh, this%gs_Xh, this%bcs_prs, &
404 precon_type, precon_params)
409 call json_get(params,
'case.numerics', numerics_params)
410 call advection_factory(this%adv, numerics_params, this%c_Xh, &
411 this%ulag, this%vlag, this%wlag, &
412 chkp%dtlag, chkp%tlag, this%ext_bdf, &
418 call this%chkp%init(this%u, this%v, this%w, this%p)
420 this%chkp%abx1 => this%abx1
421 this%chkp%abx2 => this%abx2
422 this%chkp%aby1 => this%aby1
423 this%chkp%aby2 => this%aby2
424 this%chkp%abz1 => this%abz1
425 this%chkp%abz2 => this%abz2
426 call this%chkp%add_lag(this%ulag, this%vlag, this%wlag)
434 subroutine fluid_pnpn_restart(this, chkp)
435 class(fluid_pnpn_t),
target,
intent(inout) :: this
436 type(chkp_t),
intent(inout) :: chkp
437 real(kind=rp) :: dtlag(10), tlag(10)
438 type(field_t) :: u_temp, v_temp, w_temp
444 n = this%u%dof%size()
445 if (
allocated(chkp%previous_mesh%elements) .or. &
446 chkp%previous_Xh%lx .ne. this%Xh%lx)
then
447 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
448 c_xh => this%c_Xh, ulag => this%ulag, vlag => this%vlag, &
450 do concurrent(j = 1:n)
451 u%x(j,1,1,1) = u%x(j,1,1,1) * c_xh%mult(j,1,1,1)
452 v%x(j,1,1,1) = v%x(j,1,1,1) * c_xh%mult(j,1,1,1)
453 w%x(j,1,1,1) = w%x(j,1,1,1) * c_xh%mult(j,1,1,1)
454 p%x(j,1,1,1) = p%x(j,1,1,1) * c_xh%mult(j,1,1,1)
456 do i = 1, this%ulag%size()
457 do concurrent(j = 1:n)
458 ulag%lf(i)%x(j,1,1,1) = ulag%lf(i)%x(j,1,1,1) &
460 vlag%lf(i)%x(j,1,1,1) = vlag%lf(i)%x(j,1,1,1) &
462 wlag%lf(i)%x(j,1,1,1) = wlag%lf(i)%x(j,1,1,1) &
469 if (neko_bcknd_device .eq. 1)
then
470 associate(u => this%u, v => this%v, w => this%w, &
471 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag,&
473 call device_memcpy(u%x, u%x_d, u%dof%size(), &
474 host_to_device, sync = .false.)
475 call device_memcpy(v%x, v%x_d, v%dof%size(), &
476 host_to_device, sync = .false.)
477 call device_memcpy(w%x, w%x_d, w%dof%size(), &
478 host_to_device, sync = .false.)
479 call device_memcpy(p%x, p%x_d, p%dof%size(), &
480 host_to_device, sync = .false.)
481 call device_memcpy(ulag%lf(1)%x, ulag%lf(1)%x_d, &
482 u%dof%size(), host_to_device, sync = .false.)
483 call device_memcpy(ulag%lf(2)%x, ulag%lf(2)%x_d, &
484 u%dof%size(), host_to_device, sync = .false.)
486 call device_memcpy(vlag%lf(1)%x, vlag%lf(1)%x_d, &
487 v%dof%size(), host_to_device, sync = .false.)
488 call device_memcpy(vlag%lf(2)%x, vlag%lf(2)%x_d, &
489 v%dof%size(), host_to_device, sync = .false.)
491 call device_memcpy(wlag%lf(1)%x, wlag%lf(1)%x_d, &
492 w%dof%size(), host_to_device, sync = .false.)
493 call device_memcpy(wlag%lf(2)%x, wlag%lf(2)%x_d, &
494 w%dof%size(), host_to_device, sync = .false.)
495 call device_memcpy(this%abx1%x, this%abx1%x_d, &
496 w%dof%size(), host_to_device, sync = .false.)
497 call device_memcpy(this%abx2%x, this%abx2%x_d, &
498 w%dof%size(), host_to_device, sync = .false.)
499 call device_memcpy(this%aby1%x, this%aby1%x_d, &
500 w%dof%size(), host_to_device, sync = .false.)
501 call device_memcpy(this%aby2%x, this%aby2%x_d, &
502 w%dof%size(), host_to_device, sync = .false.)
503 call device_memcpy(this%abz1%x, this%abz1%x_d, &
504 w%dof%size(), host_to_device, sync = .false.)
505 call device_memcpy(this%abz2%x, this%abz2%x_d, &
506 w%dof%size(), host_to_device, sync = .false.)
507 call device_memcpy(this%advx%x, this%advx%x_d, &
508 w%dof%size(), host_to_device, sync = .false.)
509 call device_memcpy(this%advy%x, this%advy%x_d, &
510 w%dof%size(), host_to_device, sync = .false.)
511 call device_memcpy(this%advz%x, this%advz%x_d, &
512 w%dof%size(), host_to_device, sync = .false.)
519 if (
allocated(chkp%previous_mesh%elements) &
520 .or. chkp%previous_Xh%lx .ne. this%Xh%lx)
then
522 call rotate_cyc(this%u%x, this%v%x, this%w%x, 1, this%c_Xh)
523 call this%gs_Xh%op(this%u, gs_op_add)
524 call this%gs_Xh%op(this%v, gs_op_add)
525 call this%gs_Xh%op(this%w, gs_op_add)
526 call this%gs_Xh%op(this%p, gs_op_add)
527 call rotate_cyc(this%u%x, this%v%x, this%w%x, 0, this%c_Xh)
529 do i = 1, this%ulag%size()
530 call rotate_cyc(this%ulag%lf(i)%x, this%vlag%lf(i)%x, this%wlag%lf(i)%x, 1, this%c_Xh)
531 call this%gs_Xh%op(this%ulag%lf(i), gs_op_add)
532 call this%gs_Xh%op(this%vlag%lf(i), gs_op_add)
533 call this%gs_Xh%op(this%wlag%lf(i), gs_op_add)
534 call rotate_cyc(this%ulag%lf(i)%x, this%vlag%lf(i)%x, this%wlag%lf(i)%x, 0, this%c_Xh)
637 subroutine fluid_pnpn_step(this, time, dt_controller)
638 class(fluid_pnpn_t),
target,
intent(inout) :: this
639 type(time_state_t),
intent(in) :: time
640 type(time_step_controller_t),
intent(in) :: dt_controller
644 type(ksp_monitor_t) :: ksp_results(4)
646 type(file_t) :: dump_file
647 class(bc_t),
pointer :: bc_i
648 type(non_normal_t),
pointer :: bc_j
650 if (this%freeze)
return
652 n = this%dm_Xh%size()
654 call profiler_start_region(
'Fluid', 1)
655 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
656 u_e => this%u_e, v_e => this%v_e, w_e => this%w_e, &
657 du => this%du, dv => this%dv, dw => this%dw, dp => this%dp, &
658 u_res => this%u_res, v_res => this%v_res, w_res => this%w_res, &
659 p_res => this%p_res, ax_vel => this%Ax_vel, ax_prs => this%Ax_prs, &
661 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
662 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag, &
663 msh => this%msh, prs_res => this%prs_res, &
664 source_term => this%source_term, vel_res => this%vel_res, &
665 sumab => this%sumab, makeoifs => this%makeoifs, &
666 makeabf => this%makeabf, makebdf => this%makebdf, &
667 vel_projection_dim => this%vel_projection_dim, &
668 pr_projection_dim => this%pr_projection_dim, &
670 rho => this%rho, mu_tot => this%mu_tot, &
671 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
672 t => time%t, tstep => time%tstep, dt => time%dt, &
673 ext_bdf => this%ext_bdf, event => glb_cmd_event)
676 call sumab%compute_fluid(u_e, v_e, w_e, u, v, w, &
677 ulag, vlag, wlag, ext_bdf%advection_coeffs, ext_bdf%nadv)
680 call this%source_term%compute(time)
683 call this%bcs_vel%apply_vector(f_x%x, f_y%x, f_z%x, &
684 this%dm_Xh%size(), time, strong = .false.)
688 call this%adv%compute(u, v, w, &
689 this%advx, this%advy, this%advz, &
690 xh, this%c_Xh, dm_xh%size(), dt)
697 call makeabf%compute_fluid(this%abx1, this%aby1, this%abz1,&
698 this%abx2, this%aby2, this%abz2, &
699 f_x%x, f_y%x, f_z%x, &
700 rho%x(1,1,1,1), ext_bdf%advection_coeffs, n)
703 call makeoifs%compute_fluid(this%advx%x, this%advy%x, this%advz%x, &
704 f_x%x, f_y%x, f_z%x, &
705 rho%x(1,1,1,1), dt, n)
708 call this%adv%compute(u, v, w, &
710 xh, this%c_Xh, dm_xh%size())
716 call makeabf%compute_fluid(this%abx1, this%aby1, this%abz1,&
717 this%abx2, this%aby2, this%abz2, &
718 f_x%x, f_y%x, f_z%x, &
719 rho%x(1,1,1,1), ext_bdf%advection_coeffs, n)
722 call makebdf%compute_fluid(ulag, vlag, wlag, f_x%x, f_y%x, f_z%x, &
723 u, v, w, c_xh%B, rho%x(1,1,1,1), dt, &
724 ext_bdf%diffusion_coeffs, ext_bdf%ndiff, n)
731 call this%bc_apply_vel(time, strong = .true.)
732 call this%bc_apply_prs(time)
735 call this%update_material_properties(time)
738 call profiler_start_region(
'Pressure_residual', 18)
740 call prs_res%compute(p, p_res,&
745 this%bc_prs_surface, this%bc_sym_surface,&
746 ax_prs, ext_bdf%diffusion_coeffs(1), dt, &
750 if (.not. this%prs_dirichlet)
call ortho(p_res%x, this%glb_n_points, n)
752 call gs_xh%op(p_res, gs_op_add, event)
753 call device_event_sync(event)
756 call this%bclst_dp%apply_scalar(p_res%x, p%dof%size(), time)
759 call profiler_end_region(
'Pressure_residual', 18)
762 call this%proj_prs%pre_solving(p_res%x, tstep, c_xh, n, dt_controller, &
765 call this%pc_prs%update()
767 call profiler_start_region(
'Pressure_solve', 3)
771 this%ksp_prs%solve(ax_prs, dp, p_res%x, n, c_xh, &
772 this%bclst_dp, gs_xh)
773 ksp_results(1)%name =
'Pressure'
776 call profiler_end_region(
'Pressure_solve', 3)
778 call this%proj_prs%post_solving(dp%x, ax_prs, c_xh, &
779 this%bclst_dp, gs_xh, n, tstep, dt_controller)
782 call field_add2(p, dp, n)
783 if (.not. this%prs_dirichlet)
call ortho(p%x, this%glb_n_points, n)
786 call profiler_start_region(
'Velocity_residual', 19)
787 call vel_res%compute(ax_vel, u, v, w, &
788 u_res, v_res, w_res, &
792 mu_tot, rho, ext_bdf%diffusion_coeffs(1), &
795 call rotate_cyc(u_res%x, v_res%x, w_res%x, 1, c_xh)
796 call gs_xh%op(u_res, gs_op_add, event)
797 call device_event_sync(event)
798 call gs_xh%op(v_res, gs_op_add, event)
799 call device_event_sync(event)
800 call gs_xh%op(w_res, gs_op_add, event)
801 call device_event_sync(event)
802 call rotate_cyc(u_res%x, v_res%x, w_res%x, 0, c_xh)
805 call this%bclst_vel_res%apply(u_res, v_res, w_res, time)
808 call profiler_end_region(
'Velocity_residual', 19)
810 call this%proj_vel%pre_solving(u_res%x, v_res%x, w_res%x, &
811 tstep, c_xh, n, dt_controller,
'Velocity')
813 call this%pc_vel%update()
815 call profiler_start_region(
"Velocity_solve", 4)
816 ksp_results(2:4) = this%ksp_vel%solve_coupled(ax_vel, du, dv, dw, &
817 u_res%x, v_res%x, w_res%x, n, c_xh, &
818 this%bclst_du, this%bclst_dv, this%bclst_dw, gs_xh, &
819 this%ksp_vel%max_iter)
820 call profiler_end_region(
"Velocity_solve", 4)
821 if (this%full_stress_formulation)
then
822 ksp_results(2)%name =
'Momentum'
824 ksp_results(2)%name =
'X-Velocity'
825 ksp_results(3)%name =
'Y-Velocity'
826 ksp_results(4)%name =
'Z-Velocity'
829 call this%proj_vel%post_solving(du%x, dv%x, dw%x, ax_vel, c_xh, &
830 this%bclst_du, this%bclst_dv, this%bclst_dw, gs_xh, n, tstep, &
833 if (neko_bcknd_device .eq. 1)
then
834 call device_opadd2cm(u%x_d, v%x_d, w%x_d, &
835 du%x_d, dv%x_d, dw%x_d, 1.0_rp, n, msh%gdim)
837 call opadd2cm(u%x, v%x, w%x, du%x, dv%x, dw%x, 1.0_rp, n, msh%gdim)
840 if (this%forced_flow_rate)
then
842 call this%vol_flow%adjust( u, v, w, p, u_res, v_res, w_res, p_res, &
843 c_xh, gs_xh, ext_bdf, rho%x(1,1,1,1), mu_tot, &
844 dt, this%bclst_dp, this%bclst_du, this%bclst_dv, &
845 this%bclst_dw, this%bclst_vel_res, ax_vel, ax_prs, this%ksp_prs, &
846 this%ksp_vel, this%pc_prs, this%pc_vel, this%ksp_prs%max_iter, &
847 this%ksp_vel%max_iter)
850 call fluid_step_info(time, ksp_results, &
851 this%full_stress_formulation, this%strict_convergence, &
852 this%allow_stabilization)
855 call profiler_end_region(
'Fluid', 1)
860 subroutine fluid_pnpn_setup_bcs(this, user, params)
861 class(fluid_pnpn_t),
target,
intent(inout) :: this
862 type(user_t),
target,
intent(in) :: user
863 type(json_file),
intent(inout) :: params
864 integer :: i, n_bcs, zone_index, j, zone_size, global_zone_size, ierr
865 class(bc_t),
pointer :: bc_i
866 type(json_core) :: core
867 type(json_value),
pointer :: bc_object
868 type(json_file) :: bc_subdict
871 logical,
allocatable :: marked_zones(:)
872 integer,
allocatable :: zone_indices(:)
875 call this%bclst_vel_res%init()
876 call this%bclst_du%init()
877 call this%bclst_dv%init()
878 call this%bclst_dw%init()
879 call this%bclst_dp%init()
881 call this%bc_vel_res%init_from_components(this%c_Xh)
882 call this%bc_du%init_from_components(this%c_Xh)
883 call this%bc_dv%init_from_components(this%c_Xh)
884 call this%bc_dw%init_from_components(this%c_Xh)
885 call this%bc_dp%init_from_components(this%c_Xh)
888 call this%bc_prs_surface%init_from_components(this%c_Xh)
889 call this%bc_sym_surface%init_from_components(this%c_Xh)
892 if (params%valid_path(
'case.fluid.boundary_conditions'))
then
893 call params%info(
'case.fluid.boundary_conditions', n_children = n_bcs)
894 call params%get_core(core)
895 call params%get(
'case.fluid.boundary_conditions', bc_object, found)
900 call this%bcs_vel%init(n_bcs)
902 allocate(marked_zones(
size(this%msh%labeled_zones)))
903 marked_zones = .false.
907 call json_extract_item(core, bc_object, i, bc_subdict)
909 call json_get(bc_subdict,
"zone_indices", zone_indices)
914 do j = 1,
size(zone_indices)
915 zone_size = this%msh%labeled_zones(zone_indices(j))%size
916 call mpi_allreduce(zone_size, global_zone_size, 1, &
917 mpi_integer, mpi_max, neko_comm, ierr)
919 if (global_zone_size .eq. 0)
then
920 write(error_unit,
'(A, A, I0, A, A, I0, A)')
"*** ERROR ***: ",&
921 "Zone index ", zone_indices(j), &
922 " is invalid as this zone has 0 size, meaning it ", &
923 "is not in the mesh. Check fluid boundary condition ", &
928 if (marked_zones(zone_indices(j)) .eqv. .true.)
then
929 write(error_unit,
'(A, A, I0, A, A, A, A)')
"*** ERROR ***: ", &
930 "Zone with index ", zone_indices(j), &
931 " has already been assigned a boundary condition. ", &
932 "Please check your boundary_conditions entry for the ", &
933 "fluid and make sure that each zone index appears only ", &
934 "in a single boundary condition."
937 marked_zones(zone_indices(j)) = .true.
942 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh,
user)
946 if (
associated(bc_i))
then
960 call this%bclst_vel_res%append(bc_i)
961 call this%bc_du%mark_facets(bc_i%bc_x%marked_facet)
962 call this%bc_dv%mark_facets(bc_i%bc_y%marked_facet)
963 call this%bc_dw%mark_facets(bc_i%bc_z%marked_facet)
965 call this%bcs_vel%append(bc_i)
967 call this%bc_sym_surface%mark_facets(bc_i%marked_facet)
968 type is (non_normal_t)
971 call this%bclst_vel_res%append(bc_i)
972 call this%bc_du%mark_facets(bc_i%bc_x%marked_facet)
973 call this%bc_dv%mark_facets(bc_i%bc_y%marked_facet)
974 call this%bc_dw%mark_facets(bc_i%bc_z%marked_facet)
975 type is (shear_stress_t)
977 call this%bclst_vel_res%append(bc_i%symmetry)
978 call this%bclst_du%append(bc_i%symmetry%bc_x)
979 call this%bclst_dv%append(bc_i%symmetry%bc_y)
980 call this%bclst_dw%append(bc_i%symmetry%bc_z)
982 call this%bcs_vel%append(bc_i)
983 type is (wall_model_bc_t)
985 call this%bclst_vel_res%append(bc_i%symmetry)
986 call this%bclst_du%append(bc_i%symmetry%bc_x)
987 call this%bclst_dv%append(bc_i%symmetry%bc_y)
988 call this%bclst_dw%append(bc_i%symmetry%bc_z)
990 call this%bcs_vel%append(bc_i)
997 if (bc_i%strong .eqv. .true.)
then
998 call this%bc_vel_res%mark_facets(bc_i%marked_facet)
999 call this%bc_du%mark_facets(bc_i%marked_facet)
1000 call this%bc_dv%mark_facets(bc_i%marked_facet)
1001 call this%bc_dw%mark_facets(bc_i%marked_facet)
1003 call this%bc_prs_surface%mark_facets(bc_i%marked_facet)
1006 call this%bcs_vel%append(bc_i)
1012 do i = 1,
size(this%msh%labeled_zones)
1013 if ((this%msh%labeled_zones(i)%size .gt. 0) .and. &
1014 (marked_zones(i) .eqv. .false.))
then
1015 write(error_unit,
'(A, A, I0)')
"*** ERROR ***: ", &
1016 "No fluid boundary condition assigned to zone ", i
1024 call this%bcs_prs%init(n_bcs)
1028 call json_extract_item(core, bc_object, i, bc_subdict)
1030 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh,
user)
1034 if (
associated(bc_i))
then
1035 call this%bcs_prs%append(bc_i)
1038 if (bc_i%strong .eqv. .true.)
then
1039 call this%bc_dp%mark_facets(bc_i%marked_facet)
1047 do i = 1,
size(this%msh%labeled_zones)
1048 if (this%msh%labeled_zones(i)%size .gt. 0)
then
1049 call neko_error(
"No boundary_conditions entry in the case file!")
1055 call this%bcs_vel%init()
1056 call this%bcs_prs%init()
1060 call this%bc_prs_surface%finalize()
1061 call this%bc_sym_surface%finalize()
1063 call this%bc_vel_res%finalize()
1064 call this%bc_du%finalize()
1065 call this%bc_dv%finalize()
1066 call this%bc_dw%finalize()
1067 call this%bc_dp%finalize()
1069 call this%bclst_vel_res%append(this%bc_vel_res)
1070 call this%bclst_du%append(this%bc_du)
1071 call this%bclst_dv%append(this%bc_dv)
1072 call this%bclst_dw%append(this%bc_dw)
1073 call this%bclst_dp%append(this%bc_dp)
1076 this%prs_dirichlet = .not. this%bclst_dp%is_empty()
1077 call mpi_allreduce(mpi_in_place, this%prs_dirichlet, 1, &
1078 mpi_logical, mpi_lor, neko_comm)
1083 subroutine fluid_pnpn_write_boundary_conditions(this)
1089 class(fluid_pnpn_t),
target,
intent(inout) :: this
1090 type(dirichlet_t) :: bdry_mask
1091 type(field_t),
pointer :: bdry_field
1092 type(file_t) :: bdry_file
1093 integer :: temp_index, i
1094 class(bc_t),
pointer :: bci
1095 character(len=LOG_SIZE) :: log_buf
1097 call neko_log%section(
"Fluid boundary conditions")
1098 write(log_buf,
'(A)')
'Marking using integer keys in bdry0.f00000'
1099 call neko_log%message(log_buf)
1100 write(log_buf,
'(A)')
'Condition-value pairs: '
1101 call neko_log%message(log_buf)
1102 write(log_buf,
'(A)')
' no_slip = 1'
1103 call neko_log%message(log_buf)
1104 write(log_buf,
'(A)')
' velocity_value = 2'
1105 call neko_log%message(log_buf)
1106 write(log_buf,
'(A)')
' outflow, normal_outflow (+dong) = 3'
1107 call neko_log%message(log_buf)
1108 write(log_buf,
'(A)')
' symmetry = 4'
1109 call neko_log%message(log_buf)
1110 write(log_buf,
'(A)')
' periodic = 6'
1111 call neko_log%message(log_buf)
1112 write(log_buf,
'(A)')
' user_velocity = 7'
1113 call neko_log%message(log_buf)
1114 write(log_buf,
'(A)')
' user_pressure = 8'
1115 call neko_log%message(log_buf)
1116 write(log_buf,
'(A)')
' shear_stress = 9'
1117 call neko_log%message(log_buf)
1118 write(log_buf,
'(A)')
' wall_modelling = 10'
1119 call neko_log%message(log_buf)
1120 write(log_buf,
'(A)')
' blasius_profile = 11'
1121 call neko_log%message(log_buf)
1122 call neko_log%end_section()
1124 call neko_scratch_registry%request_field(bdry_field, temp_index, .true.)
1128 call bdry_mask%init_from_components(this%c_Xh, 6.0_rp)
1129 call bdry_mask%mark_zone(this%msh%periodic)
1130 call bdry_mask%finalize()
1131 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1132 call bdry_mask%free()
1134 do i = 1, this%bcs_prs%size()
1135 bci => this%bcs_prs%get(i)
1136 select type (
bc => bci)
1137 type is (zero_dirichlet_t)
1138 call bdry_mask%init_from_components(this%c_Xh, 3.0_rp)
1139 call bdry_mask%mark_facets(bci%marked_facet)
1140 call bdry_mask%finalize()
1141 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1142 call bdry_mask%free()
1144 call bdry_mask%init_from_components(this%c_Xh, 3.0_rp)
1145 call bdry_mask%mark_facets(bci%marked_facet)
1146 call bdry_mask%finalize()
1147 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1148 call bdry_mask%free()
1150 call bdry_mask%init_from_components(this%c_Xh, 8.0_rp)
1151 call bdry_mask%mark_facets(bci%marked_facet)
1152 call bdry_mask%finalize()
1153 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1154 call bdry_mask%free()
1158 do i = 1, this%bcs_vel%size()
1159 bci => this%bcs_vel%get(i)
1160 select type (
bc => bci)
1161 type is (zero_dirichlet_t)
1162 call bdry_mask%init_from_components(this%c_Xh, 1.0_rp)
1163 call bdry_mask%mark_facets(bci%marked_facet)
1164 call bdry_mask%finalize()
1165 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1166 call bdry_mask%free()
1168 call bdry_mask%init_from_components(this%c_Xh, 2.0_rp)
1169 call bdry_mask%mark_facets(bci%marked_facet)
1170 call bdry_mask%finalize()
1171 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1172 call bdry_mask%free()
1173 type is (symmetry_t)
1174 call bdry_mask%init_from_components(this%c_Xh, 4.0_rp)
1175 call bdry_mask%mark_facets(bci%marked_facet)
1176 call bdry_mask%finalize()
1177 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1178 call bdry_mask%free()
1180 call bdry_mask%init_from_components(this%c_Xh, 7.0_rp)
1181 call bdry_mask%mark_facets(bci%marked_facet)
1182 call bdry_mask%finalize()
1183 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1184 call bdry_mask%free()
1185 type is (shear_stress_t)
1186 call bdry_mask%init_from_components(this%c_Xh, 9.0_rp)
1187 call bdry_mask%mark_facets(bci%marked_facet)
1188 call bdry_mask%finalize()
1189 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1190 call bdry_mask%free()
1191 type is (wall_model_bc_t)
1192 call bdry_mask%init_from_components(this%c_Xh, 10.0_rp)
1193 call bdry_mask%mark_facets(bci%marked_facet)
1194 call bdry_mask%finalize()
1195 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1196 call bdry_mask%free()
1198 call bdry_mask%init_from_components(this%c_Xh, 11.0_rp)
1199 call bdry_mask%mark_facets(bci%marked_facet)
1200 call bdry_mask%finalize()
1201 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1202 call bdry_mask%free()
1207 call bdry_file%init(
'bdry.fld')
1208 call bdry_file%write(bdry_field)
1210 call neko_scratch_registry%relinquish_field(temp_index)