240 subroutine fluid_pnpn_init(this, msh, lx, params, user, chkp)
241 class(fluid_pnpn_t),
target,
intent(inout) :: this
242 type(
mesh_t),
target,
intent(inout) :: msh
243 integer,
intent(in) :: lx
244 type(json_file),
target,
intent(inout) :: params
245 type(
user_t),
target,
intent(in) :: user
246 type(
chkp_t),
target,
intent(inout) :: chkp
247 character(len=15),
parameter :: scheme =
'Modular (Pn/Pn)'
249 class(
bc_t),
pointer :: bc_i, vel_bc
250 real(kind=
rp) :: abs_tol
251 character(len=LOG_SIZE) :: log_buf
252 integer :: ierr, integer_val, solver_maxiter
253 character(len=:),
allocatable :: solver_type, precon_type
254 logical :: monitor, found
256 type(json_file) :: numerics_params
261 call this%init_base(msh, lx, params, scheme, user, .true.)
272 call json_get(params,
'case.numerics.time_order', integer_val)
273 allocate(this%ext_bdf)
274 call this%ext_bdf%init(integer_val)
276 if (this%variable_material_properties .eqv. .true.)
then
278 call ax_helm_factory(this%Ax_vel, full_formulation = .true.)
281 call pnpn_prs_res_stress_factory(this%prs_res)
284 call pnpn_vel_res_stress_factory(this%vel_res)
287 call ax_helm_factory(this%Ax_vel, full_formulation = .false.)
290 call pnpn_prs_res_factory(this%prs_res)
293 call pnpn_vel_res_factory(this%vel_res)
297 call ax_helm_factory(this%Ax_prs, full_formulation = .false.)
301 call rhs_maker_sumab_fctry(this%sumab)
304 call rhs_maker_ext_fctry(this%makeabf)
307 call rhs_maker_bdf_fctry(this%makebdf)
310 call rhs_maker_oifs_fctry(this%makeoifs)
313 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
314 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
316 call this%p_res%init(dm_xh,
"p_res")
317 call this%u_res%init(dm_xh,
"u_res")
318 call this%v_res%init(dm_xh,
"v_res")
319 call this%w_res%init(dm_xh,
"w_res")
320 call this%abx1%init(dm_xh,
"abx1")
321 call this%aby1%init(dm_xh,
"aby1")
322 call this%abz1%init(dm_xh,
"abz1")
323 call this%abx2%init(dm_xh,
"abx2")
324 call this%aby2%init(dm_xh,
"aby2")
325 call this%abz2%init(dm_xh,
"abz2")
326 call this%advx%init(dm_xh,
"advx")
327 call this%advy%init(dm_xh,
"advy")
328 call this%advz%init(dm_xh,
"advz")
331 call this%du%init(this%dm_Xh,
'du')
332 call this%dv%init(this%dm_Xh,
'dv')
333 call this%dw%init(this%dm_Xh,
'dw')
334 call this%dp%init(this%dm_Xh,
'dp')
337 call this%setup_bcs(user, params)
341 if (found)
call this%write_boundary_conditions()
343 call this%proj_prs%init(this%dm_Xh%size(), this%pr_projection_dim, &
344 this%pr_projection_activ_step)
346 call this%proj_vel%init(this%dm_Xh%size(), this%vel_projection_dim, &
347 this%vel_projection_activ_step)
353 if (params%valid_path(
'case.fluid.flow_rate_force'))
then
354 call this%vol_flow%init(this%dm_Xh, params)
358 call neko_log%section(
"Pressure solver")
361 'case.fluid.pressure_solver.max_iterations', &
363 call json_get(params,
'case.fluid.pressure_solver.type', solver_type)
364 call json_get(params,
'case.fluid.pressure_solver.preconditioner', &
366 call json_get(params,
'case.fluid.pressure_solver.absolute_tolerance', &
370 call neko_log%message(
'Type : ('// trim(solver_type) // &
371 ', ' // trim(precon_type) //
')')
372 write(log_buf,
'(A,ES13.6)')
'Abs tol :', abs_tol
375 call this%solver_factory(this%ksp_prs, this%dm_Xh%size(), &
376 solver_type, solver_maxiter, abs_tol, monitor)
377 call this%precon_factory_(this%pc_prs, this%ksp_prs, &
378 this%c_Xh, this%dm_Xh, this%gs_Xh, this%bcs_prs, precon_type)
382 call advection_factory(this%adv, numerics_params, this%c_Xh, &
383 this%ulag, this%vlag, this%wlag, &
384 chkp%dtlag, chkp%tlag, this%ext_bdf, &
390 call this%chkp%init(this%u, this%v, this%w, this%p)
392 this%chkp%abx1 => this%abx1
393 this%chkp%abx2 => this%abx2
394 this%chkp%aby1 => this%aby1
395 this%chkp%aby2 => this%aby2
396 this%chkp%abz1 => this%abz1
397 this%chkp%abz2 => this%abz2
398 call this%chkp%add_lag(this%ulag, this%vlag, this%wlag)
404 subroutine fluid_pnpn_restart(this, chkp)
405 class(fluid_pnpn_t),
target,
intent(inout) :: this
406 type(chkp_t),
intent(inout) :: chkp
407 real(kind=rp) :: dtlag(10), tlag(10)
408 type(field_t) :: u_temp, v_temp, w_temp
414 n = this%u%dof%size()
415 if (
allocated(chkp%previous_mesh%elements) .or. &
416 chkp%previous_Xh%lx .ne. this%Xh%lx)
then
417 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
418 c_xh => this%c_Xh, ulag => this%ulag, vlag => this%vlag, &
420 do concurrent(j = 1:n)
421 u%x(j,1,1,1) = u%x(j,1,1,1) * c_xh%mult(j,1,1,1)
422 v%x(j,1,1,1) = v%x(j,1,1,1) * c_xh%mult(j,1,1,1)
423 w%x(j,1,1,1) = w%x(j,1,1,1) * c_xh%mult(j,1,1,1)
424 p%x(j,1,1,1) = p%x(j,1,1,1) * c_xh%mult(j,1,1,1)
426 do i = 1, this%ulag%size()
427 do concurrent(j = 1:n)
428 ulag%lf(i)%x(j,1,1,1) = ulag%lf(i)%x(j,1,1,1) &
430 vlag%lf(i)%x(j,1,1,1) = vlag%lf(i)%x(j,1,1,1) &
432 wlag%lf(i)%x(j,1,1,1) = wlag%lf(i)%x(j,1,1,1) &
439 if (neko_bcknd_device .eq. 1)
then
440 associate(u => this%u, v => this%v, w => this%w, &
441 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag,&
443 call device_memcpy(u%x, u%x_d, u%dof%size(), &
444 host_to_device, sync = .false.)
445 call device_memcpy(v%x, v%x_d, v%dof%size(), &
446 host_to_device, sync = .false.)
447 call device_memcpy(w%x, w%x_d, w%dof%size(), &
448 host_to_device, sync = .false.)
449 call device_memcpy(p%x, p%x_d, p%dof%size(), &
450 host_to_device, sync = .false.)
451 call device_memcpy(ulag%lf(1)%x, ulag%lf(1)%x_d, &
452 u%dof%size(), host_to_device, sync = .false.)
453 call device_memcpy(ulag%lf(2)%x, ulag%lf(2)%x_d, &
454 u%dof%size(), host_to_device, sync = .false.)
456 call device_memcpy(vlag%lf(1)%x, vlag%lf(1)%x_d, &
457 v%dof%size(), host_to_device, sync = .false.)
458 call device_memcpy(vlag%lf(2)%x, vlag%lf(2)%x_d, &
459 v%dof%size(), host_to_device, sync = .false.)
461 call device_memcpy(wlag%lf(1)%x, wlag%lf(1)%x_d, &
462 w%dof%size(), host_to_device, sync = .false.)
463 call device_memcpy(wlag%lf(2)%x, wlag%lf(2)%x_d, &
464 w%dof%size(), host_to_device, sync = .false.)
465 call device_memcpy(this%abx1%x, this%abx1%x_d, &
466 w%dof%size(), host_to_device, sync = .false.)
467 call device_memcpy(this%abx2%x, this%abx2%x_d, &
468 w%dof%size(), host_to_device, sync = .false.)
469 call device_memcpy(this%aby1%x, this%aby1%x_d, &
470 w%dof%size(), host_to_device, sync = .false.)
471 call device_memcpy(this%aby2%x, this%aby2%x_d, &
472 w%dof%size(), host_to_device, sync = .false.)
473 call device_memcpy(this%abz1%x, this%abz1%x_d, &
474 w%dof%size(), host_to_device, sync = .false.)
475 call device_memcpy(this%abz2%x, this%abz2%x_d, &
476 w%dof%size(), host_to_device, sync = .false.)
477 call device_memcpy(this%advx%x, this%advx%x_d, &
478 w%dof%size(), host_to_device, sync = .false.)
479 call device_memcpy(this%advy%x, this%advy%x_d, &
480 w%dof%size(), host_to_device, sync = .false.)
481 call device_memcpy(this%advz%x, this%advz%x_d, &
482 w%dof%size(), host_to_device, sync = .false.)
489 if (
allocated(chkp%previous_mesh%elements) &
490 .or. chkp%previous_Xh%lx .ne. this%Xh%lx)
then
491 call this%gs_Xh%op(this%u, gs_op_add)
492 call this%gs_Xh%op(this%v, gs_op_add)
493 call this%gs_Xh%op(this%w, gs_op_add)
494 call this%gs_Xh%op(this%p, gs_op_add)
496 do i = 1, this%ulag%size()
497 call this%gs_Xh%op(this%ulag%lf(i), gs_op_add)
498 call this%gs_Xh%op(this%vlag%lf(i), gs_op_add)
499 call this%gs_Xh%op(this%wlag%lf(i), gs_op_add)
586 subroutine fluid_pnpn_step(this, t, tstep, dt, ext_bdf, dt_controller)
587 class(fluid_pnpn_t),
target,
intent(inout) :: this
588 real(kind=rp),
intent(in) :: t
589 integer,
intent(in) :: tstep
590 real(kind=rp),
intent(in) :: dt
591 type(time_scheme_controller_t),
intent(in) :: ext_bdf
592 type(time_step_controller_t),
intent(in) :: dt_controller
596 type(ksp_monitor_t) :: ksp_results(4)
598 type(file_t) :: dump_file
599 class(bc_t),
pointer :: bc_i
600 type(non_normal_t),
pointer :: bc_j
602 if (this%freeze)
return
604 n = this%dm_Xh%size()
606 call profiler_start_region(
'Fluid', 1)
607 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
608 u_e => this%u_e, v_e => this%v_e, w_e => this%w_e, &
609 du => this%du, dv => this%dv, dw => this%dw, dp => this%dp, &
610 u_res => this%u_res, v_res => this%v_res, w_res => this%w_res, &
611 p_res => this%p_res, ax_vel => this%Ax_vel, ax_prs => this%Ax_prs, &
613 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
614 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag, &
615 msh => this%msh, prs_res => this%prs_res, &
616 source_term => this%source_term, vel_res => this%vel_res, &
617 sumab => this%sumab, makeoifs => this%makeoifs, &
618 makeabf => this%makeabf, makebdf => this%makebdf, &
619 vel_projection_dim => this%vel_projection_dim, &
620 pr_projection_dim => this%pr_projection_dim, &
621 rho => this%rho, mu => this%mu, oifs => this%oifs, &
622 rho_field => this%rho_field, mu_field => this%mu_field, &
623 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
624 if_variable_dt => dt_controller%if_variable_dt, &
625 dt_last_change => dt_controller%dt_last_change, &
626 event => glb_cmd_event)
629 call sumab%compute_fluid(u_e, v_e, w_e, u, v, w, &
630 ulag, vlag, wlag, ext_bdf%advection_coeffs, ext_bdf%nadv)
633 call this%source_term%compute(t, tstep)
636 call this%bcs_vel%apply_vector(f_x%x, f_y%x, f_z%x, &
637 this%dm_Xh%size(), t, tstep, strong = .false.)
640 if (this%if_gradient_jump_penalty .eqv. .true.)
then
641 call this%gradient_jump_penalty_u%compute(u, v, w, u)
642 call this%gradient_jump_penalty_v%compute(u, v, w, v)
643 call this%gradient_jump_penalty_w%compute(u, v, w, w)
644 call this%gradient_jump_penalty_u%perform(f_x)
645 call this%gradient_jump_penalty_v%perform(f_y)
646 call this%gradient_jump_penalty_w%perform(f_z)
651 call this%adv%compute(u, v, w, &
652 this%advx, this%advy, this%advz, &
653 xh, this%c_Xh, dm_xh%size(), dt)
659 call makeabf%compute_fluid(this%abx1, this%aby1, this%abz1,&
660 this%abx2, this%aby2, this%abz2, &
661 f_x%x, f_y%x, f_z%x, &
662 rho, ext_bdf%advection_coeffs, n)
665 call makeoifs%compute_fluid(this%advx%x, this%advy%x, this%advz%x, &
666 f_x%x, f_y%x, f_z%x, &
670 call this%adv%compute(u, v, w, &
672 xh, this%c_Xh, dm_xh%size())
678 call makeabf%compute_fluid(this%abx1, this%aby1, this%abz1,&
679 this%abx2, this%aby2, this%abz2, &
680 f_x%x, f_y%x, f_z%x, &
681 rho, ext_bdf%advection_coeffs, n)
684 call makebdf%compute_fluid(ulag, vlag, wlag, f_x%x, f_y%x, f_z%x, &
685 u, v, w, c_xh%B, rho, dt, &
686 ext_bdf%diffusion_coeffs, ext_bdf%ndiff, n)
693 call this%bc_apply_vel(t, tstep, strong = .true.)
694 call this%bc_apply_prs(t, tstep)
697 call this%update_material_properties()
700 call profiler_start_region(
'Pressure_residual', 18)
702 call prs_res%compute(p, p_res,&
707 this%bc_prs_surface, this%bc_sym_surface,&
708 ax_prs, ext_bdf%diffusion_coeffs(1), dt, &
709 mu_field, rho_field, event)
712 if (.not. this%prs_dirichlet)
call ortho(p_res%x, this%glb_n_points, n)
714 call gs_xh%op(p_res, gs_op_add, event)
715 call device_event_sync(event)
718 call this%bclst_dp%apply_scalar(p_res%x, p%dof%size(), t, tstep)
721 call profiler_end_region(
'Pressure_residual', 18)
724 call this%proj_prs%pre_solving(p_res%x, tstep, c_xh, n, dt_controller, &
727 call this%pc_prs%update()
729 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)
736 call profiler_end_region(
'Pressure_solve', 3)
738 call this%proj_prs%post_solving(dp%x, ax_prs, c_xh, &
739 this%bclst_dp, gs_xh, n, tstep, dt_controller)
742 call field_add2(p, dp, n)
743 if (.not. this%prs_dirichlet)
call ortho(p%x, this%glb_n_points, n)
746 call profiler_start_region(
'Velocity_residual', 19)
747 call vel_res%compute(ax_vel, u, v, w, &
748 u_res, v_res, w_res, &
752 mu_field, rho_field, ext_bdf%diffusion_coeffs(1), &
755 call gs_xh%op(u_res, gs_op_add, event)
756 call device_event_sync(event)
757 call gs_xh%op(v_res, gs_op_add, event)
758 call device_event_sync(event)
759 call gs_xh%op(w_res, gs_op_add, event)
760 call device_event_sync(event)
763 call this%bclst_vel_res%apply(u_res, v_res, w_res, t, tstep)
766 call profiler_end_region(
'Velocity_residual', 19)
768 call this%proj_vel%pre_solving(u_res%x, v_res%x, w_res%x, &
769 tstep, c_xh, n, dt_controller,
'Velocity')
771 call this%pc_vel%update()
773 call profiler_start_region(
"Velocity_solve", 4)
774 ksp_results(2:4) = this%ksp_vel%solve_coupled(ax_vel, du, dv, dw, &
775 u_res%x, v_res%x, w_res%x, n, c_xh, &
776 this%bclst_du, this%bclst_dv, this%bclst_dw, gs_xh, &
777 this%ksp_vel%max_iter)
778 call profiler_end_region(
"Velocity_solve", 4)
780 call this%proj_vel%post_solving(du%x, dv%x, dw%x, ax_vel, c_xh, &
781 this%bclst_du, this%bclst_dv, this%bclst_dw, gs_xh, n, tstep, &
784 if (neko_bcknd_device .eq. 1)
then
785 call device_opadd2cm(u%x_d, v%x_d, w%x_d, &
786 du%x_d, dv%x_d, dw%x_d, 1.0_rp, n, msh%gdim)
788 call opadd2cm(u%x, v%x, w%x, du%x, dv%x, dw%x, 1.0_rp, n, msh%gdim)
791 if (this%forced_flow_rate)
then
792 call this%vol_flow%adjust( u, v, w, p, u_res, v_res, w_res, p_res, &
793 c_xh, gs_xh, ext_bdf, rho, mu, dt, &
794 this%bclst_dp, this%bclst_du, this%bclst_dv, &
795 this%bclst_dw, this%bclst_vel_res, ax_vel, ax_prs, this%ksp_prs, &
796 this%ksp_vel, this%pc_prs, this%pc_vel, this%ksp_prs%max_iter, &
797 this%ksp_vel%max_iter)
800 call fluid_step_info(tstep, t, dt, ksp_results, this%strict_convergence)
803 call profiler_end_region(
'Fluid', 1)
808 subroutine fluid_pnpn_setup_bcs(this, user, params)
809 class(fluid_pnpn_t),
intent(inout) :: this
810 type(user_t),
target,
intent(in) :: user
811 type(json_file),
intent(inout) :: params
812 integer :: i, n_bcs, zone_index, j, zone_size, global_zone_size, ierr
813 class(bc_t),
pointer :: bc_i
814 type(json_core) :: core
815 type(json_value),
pointer :: bc_object
816 type(json_file) :: bc_subdict
819 logical,
allocatable :: marked_zones(:)
820 integer,
allocatable :: zone_indices(:)
823 call this%bclst_vel_res%init()
824 call this%bclst_du%init()
825 call this%bclst_dv%init()
826 call this%bclst_dw%init()
827 call this%bclst_dp%init()
829 call this%bc_vel_res%init_from_components(this%c_Xh)
830 call this%bc_du%init_from_components(this%c_Xh)
831 call this%bc_dv%init_from_components(this%c_Xh)
832 call this%bc_dw%init_from_components(this%c_Xh)
833 call this%bc_dp%init_from_components(this%c_Xh)
836 call this%bc_prs_surface%init_from_components(this%c_Xh)
837 call this%bc_sym_surface%init_from_components(this%c_Xh)
840 if (params%valid_path(
'case.fluid.boundary_conditions'))
then
841 call params%info(
'case.fluid.boundary_conditions', n_children = n_bcs)
842 call params%get_core(core)
843 call params%get(
'case.fluid.boundary_conditions', bc_object, found)
848 call this%bcs_vel%init(n_bcs)
850 allocate(marked_zones(
size(this%msh%labeled_zones)))
851 marked_zones = .false.
855 call json_extract_item(core, bc_object, i, bc_subdict)
857 call json_get(bc_subdict,
"zone_indices", zone_indices)
862 do j = 1,
size(zone_indices)
863 zone_size = this%msh%labeled_zones(zone_indices(j))%size
864 call mpi_allreduce(zone_size, global_zone_size, 1, &
865 mpi_integer, mpi_max, neko_comm, ierr)
867 if (global_zone_size .eq. 0)
then
868 write(error_unit,
'(A, A, I0, A, A, I0, A)')
"*** ERROR ***: ",&
869 "Zone index ", zone_indices(j), &
870 " is invalid as this zone has 0 size, meaning it ", &
871 "is not in the mesh. Check fluid boundary condition ", &
876 if (marked_zones(zone_indices(j)) .eqv. .true.)
then
877 write(error_unit,
'(A, A, I0, A, A, A, A)')
"*** ERROR ***: ", &
878 "Zone with index ", zone_indices(j), &
879 " has already been assigned a boundary condition. ", &
880 "Please check your boundary_conditions entry for the ", &
881 "fluid and make sure that each zone index appears only ", &
882 "in a single boundary condition."
885 marked_zones(zone_indices(j)) = .true.
890 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
894 if (
associated(bc_i))
then
908 call this%bclst_vel_res%append(bc_i)
909 call this%bc_du%mark_facets(bc_i%bc_x%marked_facet)
910 call this%bc_dv%mark_facets(bc_i%bc_y%marked_facet)
911 call this%bc_dw%mark_facets(bc_i%bc_z%marked_facet)
913 call this%bcs_vel%append(bc_i)
915 call this%bc_sym_surface%mark_facets(bc_i%marked_facet)
916 type is (non_normal_t)
919 call this%bclst_vel_res%append(bc_i)
920 call this%bc_du%mark_facets(bc_i%bc_x%marked_facet)
921 call this%bc_dv%mark_facets(bc_i%bc_y%marked_facet)
922 call this%bc_dw%mark_facets(bc_i%bc_z%marked_facet)
923 type is (shear_stress_t)
925 call this%bclst_vel_res%append(bc_i%symmetry)
926 call this%bclst_du%append(bc_i%symmetry%bc_x)
927 call this%bclst_dv%append(bc_i%symmetry%bc_y)
928 call this%bclst_dw%append(bc_i%symmetry%bc_z)
930 call this%bcs_vel%append(bc_i)
931 type is (wall_model_bc_t)
933 call this%bclst_vel_res%append(bc_i%symmetry)
934 call this%bclst_du%append(bc_i%symmetry%bc_x)
935 call this%bclst_dv%append(bc_i%symmetry%bc_y)
936 call this%bclst_dw%append(bc_i%symmetry%bc_z)
938 call this%bcs_vel%append(bc_i)
945 if (bc_i%strong .eqv. .true.)
then
946 call this%bc_vel_res%mark_facets(bc_i%marked_facet)
947 call this%bc_du%mark_facets(bc_i%marked_facet)
948 call this%bc_dv%mark_facets(bc_i%marked_facet)
949 call this%bc_dw%mark_facets(bc_i%marked_facet)
951 call this%bc_prs_surface%mark_facets(bc_i%marked_facet)
954 call this%bcs_vel%append(bc_i)
960 do i = 1,
size(this%msh%labeled_zones)
961 if ((this%msh%labeled_zones(i)%size .gt. 0) .and. &
962 (marked_zones(i) .eqv. .false.))
then
963 write(error_unit,
'(A, A, I0)')
"*** ERROR ***: ", &
964 "No fluid boundary condition assigned to zone ", i
972 call this%bcs_prs%init(n_bcs)
976 call json_extract_item(core, bc_object, i, bc_subdict)
978 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
982 if (
associated(bc_i))
then
983 call this%bcs_prs%append(bc_i)
986 if (bc_i%strong .eqv. .true.)
then
987 call this%bc_dp%mark_facets(bc_i%marked_facet)
995 do i = 1,
size(this%msh%labeled_zones)
996 if (this%msh%labeled_zones(i)%size .gt. 0)
then
997 call neko_error(
"No boundary_conditions entry in the case file!")
1003 call this%bc_prs_surface%finalize()
1004 call this%bc_sym_surface%finalize()
1006 call this%bc_vel_res%finalize()
1007 call this%bc_du%finalize()
1008 call this%bc_dv%finalize()
1009 call this%bc_dw%finalize()
1010 call this%bc_dp%finalize()
1012 call this%bclst_vel_res%append(this%bc_vel_res)
1013 call this%bclst_du%append(this%bc_du)
1014 call this%bclst_dv%append(this%bc_dv)
1015 call this%bclst_dw%append(this%bc_dw)
1016 call this%bclst_dp%append(this%bc_dp)
1019 this%prs_dirichlet = .not. this%bclst_dp%is_empty()
1020 call mpi_allreduce(mpi_in_place, this%prs_dirichlet, 1, &
1021 mpi_logical, mpi_lor, neko_comm)
1026 subroutine fluid_pnpn_write_boundary_conditions(this)
1033 class(fluid_pnpn_t),
target,
intent(inout) :: this
1034 type(dirichlet_t) :: bdry_mask
1035 type(field_t),
pointer :: bdry_field
1036 type(file_t) :: bdry_file
1037 integer :: temp_index, i
1038 class(bc_t),
pointer :: bci
1039 character(len=LOG_SIZE) :: log_buf
1041 call neko_log%section(
"Fluid boundary conditions")
1042 write(log_buf,
'(A)')
'Marking using integer keys in bdry0.f00000'
1043 call neko_log%message(log_buf)
1044 write(log_buf,
'(A)')
'Condition-value pairs: '
1045 call neko_log%message(log_buf)
1046 write(log_buf,
'(A)')
' no_slip = 1'
1047 call neko_log%message(log_buf)
1048 write(log_buf,
'(A)')
' velocity_value = 2'
1049 call neko_log%message(log_buf)
1050 write(log_buf,
'(A)')
' outflow, normal_outflow (+dong) = 3'
1051 call neko_log%message(log_buf)
1052 write(log_buf,
'(A)')
' symmetry = 4'
1053 call neko_log%message(log_buf)
1054 write(log_buf,
'(A)')
' user_velocity_pointwise = 5'
1055 call neko_log%message(log_buf)
1056 write(log_buf,
'(A)')
' periodic = 6'
1057 call neko_log%message(log_buf)
1058 write(log_buf,
'(A)')
' user_velocity = 7'
1059 call neko_log%message(log_buf)
1060 write(log_buf,
'(A)')
' user_pressure = 8'
1061 call neko_log%message(log_buf)
1062 write(log_buf,
'(A)')
' shear_stress = 9'
1063 call neko_log%message(log_buf)
1064 write(log_buf,
'(A)')
' wall_modelling = 10'
1065 call neko_log%message(log_buf)
1066 write(log_buf,
'(A)')
' blasius_profile = 11'
1067 call neko_log%message(log_buf)
1068 call neko_log%end_section()
1070 call this%scratch%request_field(bdry_field, temp_index)
1075 call bdry_mask%init_from_components(this%c_Xh, 6.0_rp)
1076 call bdry_mask%mark_zone(this%msh%periodic)
1077 call bdry_mask%finalize()
1078 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1079 call bdry_mask%free()
1081 do i = 1, this%bcs_prs%size()
1082 bci => this%bcs_prs%get(i)
1083 select type (
bc => bci)
1084 type is (zero_dirichlet_t)
1085 call bdry_mask%init_from_components(this%c_Xh, 3.0_rp)
1086 call bdry_mask%mark_facets(bci%marked_facet)
1087 call bdry_mask%finalize()
1088 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1089 call bdry_mask%free()
1091 call bdry_mask%init_from_components(this%c_Xh, 3.0_rp)
1092 call bdry_mask%mark_facets(bci%marked_facet)
1093 call bdry_mask%finalize()
1094 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1095 call bdry_mask%free()
1097 call bdry_mask%init_from_components(this%c_Xh, 8.0_rp)
1098 call bdry_mask%mark_facets(bci%marked_facet)
1099 call bdry_mask%finalize()
1100 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1101 call bdry_mask%free()
1105 do i = 1, this%bcs_vel%size()
1106 bci => this%bcs_vel%get(i)
1107 select type (
bc => bci)
1108 type is (zero_dirichlet_t)
1109 call bdry_mask%init_from_components(this%c_Xh, 1.0_rp)
1110 call bdry_mask%mark_facets(bci%marked_facet)
1111 call bdry_mask%finalize()
1112 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1113 call bdry_mask%free()
1115 call bdry_mask%init_from_components(this%c_Xh, 2.0_rp)
1116 call bdry_mask%mark_facets(bci%marked_facet)
1117 call bdry_mask%finalize()
1118 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1119 call bdry_mask%free()
1120 type is (symmetry_t)
1121 call bdry_mask%init_from_components(this%c_Xh, 4.0_rp)
1122 call bdry_mask%mark_facets(bci%marked_facet)
1123 call bdry_mask%finalize()
1124 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1125 call bdry_mask%free()
1127 call bdry_mask%init_from_components(this%c_Xh, 5.0_rp)
1128 call bdry_mask%mark_facets(bci%marked_facet)
1129 call bdry_mask%finalize()
1130 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1131 call bdry_mask%free()
1133 call bdry_mask%init_from_components(this%c_Xh, 7.0_rp)
1134 call bdry_mask%mark_facets(bci%marked_facet)
1135 call bdry_mask%finalize()
1136 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1137 call bdry_mask%free()
1138 type is (shear_stress_t)
1139 call bdry_mask%init_from_components(this%c_Xh, 9.0_rp)
1140 call bdry_mask%mark_facets(bci%marked_facet)
1141 call bdry_mask%finalize()
1142 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1143 call bdry_mask%free()
1144 type is (wall_model_bc_t)
1145 call bdry_mask%init_from_components(this%c_Xh, 10.0_rp)
1146 call bdry_mask%mark_facets(bci%marked_facet)
1147 call bdry_mask%finalize()
1148 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1149 call bdry_mask%free()
1151 call bdry_mask%init_from_components(this%c_Xh, 11.0_rp)
1152 call bdry_mask%mark_facets(bci%marked_facet)
1153 call bdry_mask%finalize()
1154 call bdry_mask%apply_scalar(bdry_field%x, this%dm_Xh%size())
1155 call bdry_mask%free()
1160 bdry_file = file_t(
'bdry.fld')
1161 call bdry_file%write(bdry_field)
1163 call this%scratch%relinquish_field(temp_index)