|
MFC
Exascale flow solver
|
Ghost-node immersed boundary method: locates ghost/image points, computes interpolation coefficients, and corrects the flow state. More...
Functions/Subroutines | |
| impure subroutine, public | s_initialize_ibm_module () |
| Allocates memory for the variables in the IBM module. | |
| impure subroutine, public | s_ibm_setup () |
| Initializes the values of various IBM variables, such as ghost points and image points. | |
| subroutine, private | s_compute_ghost_point_pressure (gp, gp_patch_id, rho, pres_ip, pres_gp) |
| Pressure correction for a moving IB, accounting for the acceleration of the boundary surface. Clamped both ways: the linearization it comes from holds only while the correction is order one, and an unbounded one drives the ghost state to vacuum. | |
| subroutine, private | s_compute_ghost_point_velocity (gp, gp_patch_id, radial_vector, vel_ip, pres_ip, vel_gp) |
| subroutine, public | s_ibm_correct_state (q_cons_vf, q_prim_vf, pb_in, mv_in) |
| Update the conservative variables at the ghost points. | |
| impure subroutine, public | s_report_ibm_surface |
| One line at the end of a run if the reacting surface ever failed to solve. Silence means every ghost point on every step reached the surface-balance tolerance, i.e. the surface chemistry was actually applied everywhere it was asked for. | |
| impure subroutine, private | s_compute_image_points () |
| Compute the image points for each ghost point. | |
| subroutine, private | s_find_num_ghost_points (num_gps_out) |
| Count the number of ghost points for memory allocation. | |
| subroutine, private | s_find_ghost_points () |
| Locate all ghost points in the domain. | |
| subroutine, private | s_compute_interpolation_coeffs () |
| Compute the interpolation coefficients for image points. | |
| subroutine, private | s_interpolate_image_point (q_prim_vf, gp, alpha_rho_ip, alpha_ip, pres_ip, vel_ip, c_ip, r_ip, v_ip, pb_ip, mv_ip, nmom_ip, pb_in, mv_in, presb_ip, massv_ip, ys_ip) |
| Interpolate primitive variables to a ghost point's image point using bilinear or trilinear interpolation. | |
| impure subroutine | s_update_mib (num_ibs) |
| Resets the current indexes of immersed boundaries and replaces them after updating the position of each moving immersed boundary. | |
| pure real(wp) function | f_log_cosh (x) |
| log(cosh(x)) without overflow for large |x| | |
| subroutine | s_prescribed_kinematics (i, t) |
| Prescribed kinematics for patch i at time t: hinged flapping (kin_model = 1) or the Eldredge pitch ramp (kin_model = 2). Flapping rolls phi about the lab x axis through the hinge and pitches theta about the body spanwise (y) axis through it; the ramp holds phi at zero and drives theta alone. Both compose as R = Rx(phi) Ry(theta) (MFC's angle convention) and set the angles, centroid, velocity and lab-frame angular velocity; nothing is integrated, so restarts are exact. | |
| subroutine | s_compute_ib_forces (q_prim_vf, fluid_pp) |
| Compute pressure and viscous forces and torques on immersed bodies via volume integration. | |
| subroutine | s_compute_centroid_offset (gid, ib_marker) |
| Computes the center of mass for IB patch types where we are unable to determine their center of mass analytically. These patches include things like NACA airfoils and STL models Move a moving airfoil/STL patch's centroid to its centre of mass, keeping the difference in centroid_offset. Collective: every rank calls it for every global id, contributing zeros for patches it does not hold. | |
| pure logical function | f_needs_centroid_offset (patch) |
| A moving airfoil or STL (geometries 4, 5, 11, 12) moves its centroid to the centre of mass and keeps a centroid_offset. | |
| impure subroutine | s_restore_centroid_offsets (t_init) |
| On restart, replace the re-measured centroid offsets with the ones the run was using (restart_data/ib_offset_<step>.dat, written with each checkpoint), and re-place kinematics-driven bodies about them. No file: the measured offsets stand. | |
| subroutine | s_compute_moment_of_inertia (patch, axis, moment) |
| Computes the moment of inertia for an immersed boundary. | |
| subroutine | s_wrap_periodic_ibs () |
| Wrap immersed boundary positions across periodic domain boundaries. | |
| impure subroutine | s_setup_ib_force_comm () |
| Builds the ascending list of distinct neighborhood ranks used by s_communicate_ib_forces and allocates its buffers once. The ascending order is the fixed order in which an owner adds its neighbors' contributions. | |
| integer function | f_ib_nbr_slot (rank) |
| Position of rank in ib_nbrs. | |
| subroutine | s_communicate_ib_forces (forces, torques) |
| Reduces forces and torques so every rank holding an IB ends with bit-identical values. Each IB has one owner, the rank whose subdomain holds its centroid (patch_ibowner_rank, stamped at handoff). Phase 1: each rank sends its nonzero partials to the owner, which adds them to its own partial in ascending source-rank order once all have arrived. Phase 2: each owner sends its totals to every neighborhood rank, which overwrite their partials. One nonblocking message per neighbor per phase. | |
| subroutine | s_handoff_ib_ownership () |
| Swaps ownership of IBs and passes ownership of IBs to neighbor processors. | |
| impure subroutine | s_check_every_patch_marked () |
| Abort if any namelist immersed boundary marks no cell anywhere. The owning rank is chosen by the patch centroid, so an STL placed with model_translate while its centroid is left elsewhere is handed to ranks that do not hold it, and it vanishes silently. Cloud particles are skipped: a particle's centroid is its body, so it cannot vanish this way. | |
| impure subroutine, public | s_finalize_ibm_module () |
| Finalize the IBM module. | |
| subroutine | s_surface_species_residual (pres, t_s, d, ys_ip, ys_s, w_species, r_species, omega_s, mdot_s) |
| Species flux residual at a heterogeneous reacting surface. | |
| subroutine | s_surface_energy_residual (pres, t_ip, t_s, d, ys_s, r_energy) |
| Surface energy residual: gas-side conduction balances heterogeneous reaction heat. Radiation and solid-side conduction are omitted. | |
| subroutine | s_surface_residual (pres, t_ip, t_s, d, ys_ip, ys_s, w_species, k_bath, solve_temperature, flux_scale, energy_scale, r, r_species, omega_s, mdot_s) |
| Assemble the Newton residual for Ns species, with temperature appended only when it is solved. k_bath selects which species balance the sum constraint displaces; see s_solve_surface for why it must be the most abundant one. | |
| subroutine | s_blend_ghost_state (t_ip, t_s, ys_ip, ys_s, t_g, ys_g) |
| Ghost state for an immersed surface, from the image-point state and the surface state. | |
| subroutine | s_pick_bath_species (ys_s, k_bath) |
| Index of the most abundant species, i.e. the balance the sum constraint displaces. | |
| subroutine | s_solve_surface (pres, t_ip, t_wall, d, ys_ip, w_species, thermal_bc, ys_s, t_s, mdot_s, converged) |
| Newton solve for a reacting surface. thermal_bc=0: zero-normal-gradient T; 1: prescribed T; 2: energy balance. | |
| subroutine | s_solve_surface_linear_system (a, b, x, nsolve, success) |
| Small dense linear solve with partial pivoting for the local surface Newton system. | |
Variables | |
| integer | n_surface_not_converged = 0 |
| Ghost points at which the reacting-surface Newton solve did not reach its tolerance, so the point fell back to a chemically inert wall (keeping a prescribed Twall). Counted because that fallback is otherwise indistinguishable from a surface mechanism that simply does nothing, and a run can look converged while the surface chemistry never engaged. | |
| integer | n_surface_ill_posed = 0 |
| Ghost points whose levelset distance was not positive, leaving the surface gradient (X_IP - X_s)/d undefined. Separate from the counter above because this is a grid/geometry degeneracy, not a kinetics failure. | |
| type(integer_field), public | ib_markers |
| type(integer_field) | corrected_gps |
| 1 at ghost points whose image point reaches the fluid, 0 elsewhere. Ghost points with a buried image point average over these neighbors, and never over each other. | |
| type(ghost_point), dimension(:), allocatable | ghost_points |
| integer | num_gps |
| Number of ghost points. | |
| logical | moving_immersed_boundary_flag |
| logical | centroid_offsets_active = .false. |
| some patch is a moving airfoil or STL, which carries a centroid_offset | |
| integer, parameter, private | ib_rec_len = 7 |
| gbl_patch_id, force(1:3), torque(1:3) | |
| integer, private | n_ib_nbrs = 0 |
| integer, dimension(:), allocatable, private | ib_nbrs |
| integer, dimension(:), allocatable, private | ib_send_counts |
| integer, dimension(:), allocatable, private | ib_reqs |
| integer, dimension(:,:), allocatable, private | ib_stats |
| real(wp), dimension(:,:), allocatable, private | ib_send_bufs |
| real(wp), dimension(:,:), allocatable, private | ib_recv_bufs |
Ghost-node immersed boundary method: locates ghost/image points, computes interpolation coefficients, and corrects the flow state.
| integer function m_ibm::f_ib_nbr_slot | ( | integer, intent(in) | rank | ) |
Position of rank in ib_nbrs.
Definition at line 3430 of file m_ibm.fpp.f90.
log(cosh(x)) without overflow for large |x|
Definition at line 2711 of file m_ibm.fpp.f90.
| pure logical function m_ibm::f_needs_centroid_offset | ( | type(ib_patch_parameters), intent(in) | patch | ) |
A moving airfoil or STL (geometries 4, 5, 11, 12) moves its centroid to the centre of mass and keeps a centroid_offset.
Definition at line 3140 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_blend_ghost_state | ( | real(wp), intent(in) | t_ip, |
| real(wp), intent(in) | t_s, | ||
| real(wp), dimension(num_species), intent(in) | ys_ip, | ||
| real(wp), dimension(num_species), intent(in) | ys_s, | ||
| real(wp), intent(out) | t_g, | ||
| real(wp), dimension(num_species), intent(out) | ys_g ) |
Ghost state for an immersed surface, from the image-point state and the surface state.
The natural closure is the linear mirror phi_g = 2*phi_s - phi_IP, which is what makes the midpoint of the ghost/image pair reproduce the surface value. Its -1 coefficient on phi_IP is unconditional, though, so it drives strictly positive quantities negative whenever the surface value sits far below the image-point value: a cold wall in hot gas gives a negative ghost temperature and hence a negative ghost density, and a species the surface consumes faster than half the free-stream value gives a negative mass fraction. Rather than clamp the result – which would break sum(Y) = 1 and hide the excursion – the ghost state is the largest convex blend of the mirror back toward the surface value that stays physical:
phi_g(theta) = phi_s + theta*(phi_s - phi_IP), theta in [0, 1]
theta = 1 is the full second-order mirror; theta = 0 is the first-order Dirichlet ghost phi_g = phi_s, which is Gibou et al. (JCP 176:205, 2002) Eq. 17 and is what they likewise fall back to where the linear form is ill-behaved. One theta is shared by every species, so since both endpoints satisfy sum(Y) = 1, so does every blend between them – exactly, with no renormalization. Temperature gets its own theta: nothing couples it to the composition, and sharing would let a trace radical the surface consumes to ~1e-9 (O and OH at a burning carbon wall) drag the thermal mirror down with it, turning a 2100 K ghost into 1205 K over a species whose own excursion was 1e-9. The cost of limiting is small: the mirror already delivers only first-order wall flux (Ezra et al., Int. J. Heat Mass Transfer, 2025), and a boundary closure one order below the interior scheme retains the interior convergence rate (Gustafsson, Math. Comp. 29:396, 1975).
This bounds the ghost state; it does not make the boundary strictly conservative. Baskaya et al. (Computers & Fluids 270:106134, 2024) trace the same cold-wall, large-gradient regime in ablation to ghost-cell mass conservation error that surfaces as spurious blowing, and resolve it only by moving to a flux-based cut-cell boundary – a different discretization from this one, not a tuning of it.
Definition at line 4172 of file m_ibm.fpp.f90.
| impure subroutine m_ibm::s_check_every_patch_marked |
Abort if any namelist immersed boundary marks no cell anywhere. The owning rank is chosen by the patch centroid, so an STL placed with model_translate while its centroid is left elsewhere is handed to ranks that do not hold it, and it vanishes silently. Cloud particles are skipped: a particle's centroid is its body, so it cannot vanish this way.
Definition at line 3765 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_communicate_ib_forces | ( | real(wp), dimension(num_ibs, 3), intent(inout) | forces, |
| real(wp), dimension(num_ibs, 3), intent(inout) | torques ) |
Reduces forces and torques so every rank holding an IB ends with bit-identical values. Each IB has one owner, the rank whose subdomain holds its centroid (patch_ibowner_rank, stamped at handoff). Phase 1: each rank sends its nonzero partials to the owner, which adds them to its own partial in ascending source-rank order once all have arrived. Phase 2: each owner sends its totals to every neighborhood rank, which overwrite their partials. One nonblocking message per neighbor per phase.
Definition at line 3446 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_compute_centroid_offset | ( | integer, intent(in) | gid, |
| integer, intent(in) | ib_marker ) |
Computes the center of mass for IB patch types where we are unable to determine their center of mass analytically. These patches include things like NACA airfoils and STL models Move a moving airfoil/STL patch's centroid to its centre of mass, keeping the difference in centroid_offset. Collective: every rank calls it for every global id, contributing zeros for patches it does not hold.
| [in] | gid | global patch id |
| [in] | ib_marker | local index on this rank; <= 0 if not held |
Definition at line 3075 of file m_ibm.fpp.f90.
|
private |
Pressure correction for a moving IB, accounting for the acceleration of the boundary surface. Clamped both ways: the linearization it comes from holds only while the correction is order one, and an unbounded one drives the ghost state to vacuum.
Definition at line 1007 of file m_ibm.fpp.f90.
|
private |
| subroutine m_ibm::s_compute_ib_forces | ( | type(scalar_field), dimension(1:sys_size), intent(in) | q_prim_vf, |
| type(physical_parameters), dimension(1:num_fluids), intent(in) | fluid_pp ) |
Compute pressure and viscous forces and torques on immersed bodies via volume integration.
Definition at line 2824 of file m_ibm.fpp.f90.
|
private |
Compute the image points for each ghost point.
Definition at line 1820 of file m_ibm.fpp.f90.
|
private |
Compute the interpolation coefficients for image points.
Definition at line 2228 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_compute_moment_of_inertia | ( | type(ib_patch_parameters), intent(in) | patch, |
| real(wp), dimension(3), intent(in) | axis, | ||
| real(wp), intent(out) | moment ) |
Computes the moment of inertia for an immersed boundary.
Definition at line 3180 of file m_ibm.fpp.f90.
| impure subroutine, public m_ibm::s_finalize_ibm_module |
Finalize the IBM module.
Definition at line 3796 of file m_ibm.fpp.f90.
|
private |
Locate all ghost points in the domain.
Definition at line 2054 of file m_ibm.fpp.f90.
|
private |
Count the number of ghost points for memory allocation.
Definition at line 1965 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_handoff_ib_ownership |
Swaps ownership of IBs and passes ownership of IBs to neighbor processors.
Definition at line 3549 of file m_ibm.fpp.f90.
| subroutine, public m_ibm::s_ibm_correct_state | ( | type(scalar_field), dimension(sys_size), intent(inout) | q_cons_vf, |
| type(scalar_field), dimension(sys_size), intent(inout) | q_prim_vf, | ||
| real(stp), dimension(idwbuff(1)%beg:,idwbuff(2)%beg:,idwbuff(3)%beg:,1:,1:), intent(inout) | pb_in, | ||
| real(stp), dimension(idwbuff(1)%beg:,idwbuff(2)%beg:,idwbuff(3)%beg:,1:,1:), intent(inout) | mv_in ) |
Update the conservative variables at the ghost points.
| [in,out] | q_cons_vf | Primitive Variables |
| [in,out] | q_prim_vf | Primitive Variables |
Definition at line 1113 of file m_ibm.fpp.f90.
| impure subroutine, public m_ibm::s_ibm_setup |
Initializes the values of various IBM variables, such as ghost points and image points.
Definition at line 750 of file m_ibm.fpp.f90.
| impure subroutine, public m_ibm::s_initialize_ibm_module |
Allocates memory for the variables in the IBM module.
Definition at line 477 of file m_ibm.fpp.f90.
|
private |
Interpolate primitive variables to a ghost point's image point using bilinear or trilinear interpolation.
| [in] | q_prim_vf | Primitive Variables |
| [in,out] | ys_ip | Interpolated species mass fractions (chemistry) |
Definition at line 2359 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_pick_bath_species | ( | real(wp), dimension(num_species), intent(in) | ys_s, |
| integer, intent(out) | k_bath ) |
Index of the most abundant species, i.e. the balance the sum constraint displaces.
Closing sum(Y) = 1 by dropping one species' flux balance is standard (Surface CHEMKIN), but the dropped species absorbs the roundoff of every other balance, so it must be the bath gas. Dropping a fixed index instead – the last species in the mechanism – lands that error on whatever the mechanism happens to list last, which for the reduced GRI mechanism shipped with the reacting-surface example is H2O2, a trace radical whose own surface balance then goes unenforced. Cantera's solveSP re-scans for the largest species each iteration (evalSurfLarge) for this reason.
Definition at line 4229 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_prescribed_kinematics | ( | integer, intent(in) | i, |
| real(wp), intent(in) | t ) |
Prescribed kinematics for patch i at time t: hinged flapping (kin_model = 1) or the Eldredge pitch ramp (kin_model = 2). Flapping rolls phi about the lab x axis through the hinge and pitches theta about the body spanwise (y) axis through it; the ramp holds phi at zero and drives theta alone. Both compose as R = Rx(phi) Ry(theta) (MFC's angle convention) and set the angles, centroid, velocity and lab-frame angular velocity; nothing is integrated, so restarts are exact.
Definition at line 2739 of file m_ibm.fpp.f90.
| impure subroutine, public m_ibm::s_report_ibm_surface |
One line at the end of a run if the reacting surface ever failed to solve. Silence means every ghost point on every step reached the surface-balance tolerance, i.e. the surface chemistry was actually applied everywhere it was asked for.
Definition at line 1795 of file m_ibm.fpp.f90.
| impure subroutine m_ibm::s_restore_centroid_offsets | ( | real(wp), intent(in) | t_init | ) |
On restart, replace the re-measured centroid offsets with the ones the run was using (restart_data/ib_offset_<step>.dat, written with each checkpoint), and re-place kinematics-driven bodies about them. No file: the measured offsets stand.
Definition at line 3150 of file m_ibm.fpp.f90.
| impure subroutine m_ibm::s_setup_ib_force_comm |
Builds the ascending list of distinct neighborhood ranks used by s_communicate_ib_forces and allocates its buffers once. The ascending order is the fixed order in which an owner adds its neighbors' contributions.
Definition at line 3388 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_solve_surface | ( | real(wp), intent(in) | pres, |
| real(wp), intent(in) | t_ip, | ||
| real(wp), intent(in) | t_wall, | ||
| real(wp), intent(in) | d, | ||
| real(wp), dimension(num_species), intent(in) | ys_ip, | ||
| real(wp), dimension(num_species), intent(in) | w_species, | ||
| integer, intent(in) | thermal_bc, | ||
| real(wp), dimension(num_species), intent(out) | ys_s, | ||
| real(wp), intent(out) | t_s, | ||
| real(wp), intent(out) | mdot_s, | ||
| logical, intent(out) | converged ) |
Newton solve for a reacting surface. thermal_bc=0: zero-normal-gradient T; 1: prescribed T; 2: energy balance.
Definition at line 4260 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_solve_surface_linear_system | ( | real(wp), dimension(num_species + 1, num_species + 1), intent(inout) | a, |
| real(wp), dimension(num_species + 1), intent(inout) | b, | ||
| real(wp), dimension(num_species + 1), intent(out) | x, | ||
| integer, intent(in) | nsolve, | ||
| logical, intent(out) | success ) |
Small dense linear solve with partial pivoting for the local surface Newton system.
Definition at line 4428 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_surface_energy_residual | ( | real(wp), intent(in) | pres, |
| real(wp), intent(in) | t_ip, | ||
| real(wp), intent(in) | t_s, | ||
| real(wp), intent(in) | d, | ||
| real(wp), dimension(num_species), intent(in) | ys_s, | ||
| real(wp), intent(out) | r_energy ) |
Surface energy residual: gas-side conduction balances heterogeneous reaction heat. Radiation and solid-side conduction are omitted.
Definition at line 4067 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_surface_residual | ( | real(wp), intent(in) | pres, |
| real(wp), intent(in) | t_ip, | ||
| real(wp), intent(in) | t_s, | ||
| real(wp), intent(in) | d, | ||
| real(wp), dimension(num_species), intent(in) | ys_ip, | ||
| real(wp), dimension(num_species), intent(in) | ys_s, | ||
| real(wp), dimension(num_species), intent(in) | w_species, | ||
| integer, intent(in) | k_bath, | ||
| logical, intent(in) | solve_temperature, | ||
| real(wp), intent(in) | flux_scale, | ||
| real(wp), intent(in) | energy_scale, | ||
| real(wp), dimension(num_species + 1), intent(out) | r, | ||
| real(wp), dimension(num_species), intent(out) | r_species, | ||
| real(wp), dimension(num_species), intent(out) | omega_s, | ||
| real(wp), intent(out) | mdot_s ) |
Assemble the Newton residual for Ns species, with temperature appended only when it is solved. k_bath selects which species balance the sum constraint displaces; see s_solve_surface for why it must be the most abundant one.
Definition at line 4103 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_surface_species_residual | ( | real(wp), intent(in) | pres, |
| real(wp), intent(in) | t_s, | ||
| real(wp), intent(in) | d, | ||
| real(wp), dimension(num_species), intent(in) | ys_ip, | ||
| real(wp), dimension(num_species), intent(in) | ys_s, | ||
| real(wp), dimension(num_species), intent(in) | w_species, | ||
| real(wp), dimension(num_species), intent(out) | r_species, | ||
| real(wp), dimension(num_species), intent(out) | omega_s, | ||
| real(wp), intent(out) | mdot_s ) |
Species flux residual at a heterogeneous reacting surface.
Definition at line 4008 of file m_ibm.fpp.f90.
| impure subroutine m_ibm::s_update_mib | ( | integer, intent(in) | num_ibs | ) |
Resets the current indexes of immersed boundaries and replaces them after updating the position of each moving immersed boundary.
Definition at line 2577 of file m_ibm.fpp.f90.
| subroutine m_ibm::s_wrap_periodic_ibs |
Wrap immersed boundary positions across periodic domain boundaries.
Definition at line 3269 of file m_ibm.fpp.f90.
| logical m_ibm::centroid_offsets_active = .false. |
some patch is a moving airfoil or STL, which carries a centroid_offset
Definition at line 465 of file m_ibm.fpp.f90.
| type(integer_field) m_ibm::corrected_gps |
1 at ghost points whose image point reaches the fluid, 0 elsewhere. Ghost points with a buried image point average over these neighbors, and never over each other.
Definition at line 408 of file m_ibm.fpp.f90.
| type(ghost_point), dimension(:), allocatable m_ibm::ghost_points |
Definition at line 422 of file m_ibm.fpp.f90.
| type(integer_field), public m_ibm::ib_markers |
Definition at line 392 of file m_ibm.fpp.f90.
|
private |
Definition at line 470 of file m_ibm.fpp.f90.
|
private |
gbl_patch_id, force(1:3), torque(1:3)
Definition at line 468 of file m_ibm.fpp.f90.
|
private |
Definition at line 471 of file m_ibm.fpp.f90.
|
private |
Definition at line 470 of file m_ibm.fpp.f90.
|
private |
Definition at line 471 of file m_ibm.fpp.f90.
|
private |
Definition at line 470 of file m_ibm.fpp.f90.
|
private |
Definition at line 470 of file m_ibm.fpp.f90.
| logical m_ibm::moving_immersed_boundary_flag |
Definition at line 464 of file m_ibm.fpp.f90.
|
private |
Definition at line 469 of file m_ibm.fpp.f90.
| integer m_ibm::n_surface_ill_posed = 0 |
Ghost points whose levelset distance was not positive, leaving the surface gradient (X_IP - X_s)/d undefined. Separate from the counter above because this is a grid/geometry degeneracy, not a kinetics failure.
Definition at line 391 of file m_ibm.fpp.f90.
| integer m_ibm::n_surface_not_converged = 0 |
Ghost points at which the reacting-surface Newton solve did not reach its tolerance, so the point fell back to a chemically inert wall (keeping a prescribed Twall). Counted because that fallback is otherwise indistinguishable from a surface mechanism that simply does nothing, and a run can look converged while the surface chemistry never engaged.
Definition at line 387 of file m_ibm.fpp.f90.
| integer m_ibm::num_gps |
Number of ghost points.
Definition at line 436 of file m_ibm.fpp.f90.