|
flow 1.3.0
Kokkos cut-cell IBM incompressible Navier-Stokes solver + pnm pore extraction
|
#include <scalar_mg.hpp>
Classes | |
| struct | Inputs |
Everything build reads from the scalar operator and the geometry record. More... | |
| struct | Level |
Public Types | |
| using | Fill = std::function< void(CCField)> |
Public Member Functions | |
| void | setMetric (const double w[3], const double hp[3]) |
| Per-axis metric (VelocityMG::setMetric): w_a = 1/h_a'^2 and h_a'. Call before init. | |
| void | setPeriodic (const bool per[3]) |
| Periodicity per axis (the flow's domain faces); a non-periodic axis' ghosts are pinned. | |
| void | setLevel0Wrap (bool on) |
Declare that the injected level-0 fill is the single-rank periodic wrap of ALL three axes (Solver::fillGhosts: fillAxis on x, y, z, regardless of the domain bc), so the level-0 passes may read the wrapped neighbours directly instead of filling first (WO-9b, wrapReads). | |
| void | init (int nx, int ny, int nz, Fill fill0) |
| Single-rank level table (VelocityMG::init's rule, no depth cap). | |
| int | levels () const |
| int | levelsUsed () const |
Levels the last build set up for the V-cycle (1: level 0 alone, the transient rule). | |
| const Level & | level (int L) const |
| std::vector< C3 > | levelRatios () const |
| The per-level coarsening ratios (the level table; equal to VelocityMG's on the same grid). | |
| void | build (const Inputs &in) |
| Rebuild the surrogate on every level from the current operator (the level table is kept). | |
| void | apply (CCField z, CCField r) |
| z = M^-1 r: one V-cycle on the surrogate (level 0 alone: 2 + 2 sweeps) from z = 0. | |
| void | applyTwo (CCField zf, CCField zs, CCField rf, CCField rs) |
| The two-field z = M^-1 r (WO-7): one V-cycle on the coupled surrogate from z = 0 (level 0 alone: 2 + 2 two-field sweeps). | |
| void | applySurrogateTwo (CCField yf, CCField ys, CCField xf, CCField xs) |
| y = S x for the two-field surrogate on level 0 (exchanges x first): y_f = S_ff x_f - W x_s, y_s = S_ss x_s - W x_f. | |
| void | applySurrogate (CCField y, CCField x) |
| y = S x on level 0 (exchanges x first). For the contraction instrument and tests. | |
| std::vector< double > | contraction (int iters, CCField e, CCField t, CCField z) |
| Power estimate of the V-cycle's error contraction rho(I - M^-1 S) on the current surrogate (§11 G-iter): e <- e - M^-1 S e from a deterministic pseudo-random start on the unknowns (a function of the GLOBAL index, so decomposition-independent), mean-free when singular. | |
| void | vcycle (int L) |
| void | vcycleTwo (int L) |
| The two-field V-cycle (WO-7): vcycle's structure on both phases — the same sweeps (the 2x2 block update), restrictAvg / trilinear prolongAdd per phase with its own pins, the mean over BOTH phases' unknowns removed when singular (the null vector is constant in psi). | |
| void | restrictZeroX (Level &cs, Level &lv, CCField crhs, CCField fres, CCField cx) |
| The coarse rhs = restrictAvg of the fine residual, and the coarse iterate x = 0. | |
| void | sweepColor (int L, int rb) |
One colour of red-black Gauss-Seidel on level L: rb = 0 red (global (gx+gy+gz) even), 1 black. | |
| void | sweep (int L, bool fwd) |
| One full red-black sweep: R -> B forward, B -> R backward. | |
| void | fill (int L, CCField f) |
| Ghost exchange of a level-L field: level 0 the solver's own; coarse levels the per-level halo (or the single-rank periodic wrap), then 0 on the ghosts beyond a non-periodic global face. | |
| int | wrapReads (int L) const |
| WO-9b, the fused periodic-wrap reads (flow's A3): the axes (bit a) a level-L pass may read across the block face through the wrapped inner index instead of a filled ghost, or -1 when it must fill first. | |
| int | wrapSmooth (int L) const |
| A red-black pass reads the wrapped neighbour safely only when it has the OTHER colour (so it still holds what the fill would have copied before the pass): every inner dimension even. | |
| bool | touches (const Level &lv, int f) const |
Does this rank's block on level lv touch global face f (0..5 = -x,+x,-y,+y,-z,+z)? | |
| C3 | chooseRatio (const bool canA[3], C3 cf) const |
| void | allocate (Level &v, int L) |
| CCConst | unkOf (int L) const |
| CCConst | unkSOf (int L) const |
| void | allocateSolid (Level &v, int L) |
| WO-7: the solid-phase arrays of level L (and W on coarse levels), on the first two-field build. | |
| double | countUnknownS (int L) const |
| void | removeMeanTwo (int L, CCField f, CCField s) |
| f, s -= their joint mean over both phases' unknown cells of level L (the singular two-field problem: the null vector is constant in psi on both phases). | |
| void | buildLevel0SolidFaces (const Inputs &in) |
| WO-7, level 0: the solid faces AF_a(i) = -(w_a P_a(i)) from the operator's guarded products — the expression of sco::solidBands' AW/AS/AB, so the face form is the band form. | |
| void | buildCoarseSolid (const Inputs &in, int L) |
| WO-7: the coarse solid phase of level L (after assembleCoarse, which gathered W): pins = max of the children's solid flags; faces = coarsenOpenAvg of the products, w_a(L) times; mass = restrictAvg; AC_s = m + faces + W on solid unknowns; identity rows and W = 0 elsewhere. | |
| void | zeroNonPeriodicGhosts (Level &lv, CCField f) |
| void | allSum (double *v, int k) const |
| double | countUnknown (int L) const |
| void | removeMean (int L, CCField f) |
| f -= its mean over the unknown cells of level L (CutcellMG::removeMean's form, unweighted). | |
| double | norm2 (CCField f) const |
| void | buildLevel0Faces (const Inputs &in) |
| Level-0 faces: AF_a(i) = -(Lam w_a a_a(i)) when cells i - st_a and i are both unknowns — the same expression as sco::buildBands' AW/AS/AB, so the face-form sweep is bitwise the band sweep. | |
| bool | buildCutLists (const Inputs &in) |
Per coarse level L the overlay rows (cut cells) under each coarse inner cell, in increasing level-0 linear index — the (dz, dy, dx) order in which the wall gather of assembleCoarse visited the descendants — as a CSR over the coarse inner cells (WO-9b). | |
| bool | wallKeep (const Inputs &in) |
| The gathered coarse wall terms W (and the conjugate W_c) of the last build are reused when their inputs are unchanged BY CONTENT (WO-9b; the caching ruling D-WO3-3 deferred to WO-9): the same cut lists, the same level-0 unknown flags (view), the same two-phase mode and level count, and every per-facet cw (and cc) bitwise equal to the snapshot taken when they were gathered. | |
| void | buildPlane0 (const Inputs &in, int f) |
| Level-0 Dirichlet boundary plane of face f: <Lam a_bf> = Lam a_bf on unknown boundary cells (sco::dirichletFaceFold's aperture), indexed (j1, j2) over the inner tangential cells. | |
| void | buildCoarse (const Inputs &in, int L) |
| void | coarsenAdvection (const Inputs &in, int L) |
| A2: Qp/Qm of level L from level L - 1 — level 1 from the guarded positive parts of the level-0 flux, deeper levels from the finer level's Q — by coarsenOpenAvgCell's sum and division in its fixed order, then one multiplication by 1/r_a (r_a the ratio on the face's normal axis): Q = sum_sub max(+-phi, 0) V / V_L. | |
| void | assembleBands (int L) |
| A2: the coarse bands from the face form (assembleCoarse) and Q. | |
| void | coarsenPlane (int L, int f) |
| void | assembleCoarse (const Inputs &in, int L) |
| Coarse face form + diagonal: AF_a = -w_a(L) <Lam a> over the full extent; on unknown inner cells AC = m + the six face terms + W (the level-0 facet average) + the Dirichlet folds; pinned cells are identity rows. | |
Static Public Member Functions | |
| static bool | can (int d) |
| static void | tangents (int a, int &t1, int &t2) |
Static Public Attributes | |
| static constexpr int | G0 = 2 |
| level 0: the scalar's own block | |
| static constexpr int | GC = 1 |
| coarse levels | |
| static constexpr double | kFullTableKappa = 25.0 |
| The transient level rule (design §5.2, Amendment A3 + ruling D-WO9-3): kappa_A = 1 + 4 dt' D' sum_a w_a below this uses level 0 alone (2 + 2 sweeps), at or above it the full table; steady always the full table. | |
| static constexpr int | kMaxLevels = 64 |
| no depth cap in practice (the full table) | |
| static constexpr int | kPre = 2 |
| static constexpr int | kPost = 2 |
| static constexpr int | kBottom = 16 |
| static constexpr double | kAspectTheta = 2.0 |
Definition at line 577 of file scalar_mg.hpp.
| using peclet::flow::ScalarMG::Fill = std::function<void(CCField)> |
Definition at line 590 of file scalar_mg.hpp.
Per-axis metric (VelocityMG::setMetric): w_a = 1/h_a'^2 and h_a'. Call before init.
Definition at line 625 of file scalar_mg.hpp.
Periodicity per axis (the flow's domain faces); a non-periodic axis' ghosts are pinned.
Definition at line 633 of file scalar_mg.hpp.
Declare that the injected level-0 fill is the single-rank periodic wrap of ALL three axes (Solver::fillGhosts: fillAxis on x, y, z, regardless of the domain bc), so the level-0 passes may read the wrapped neighbours directly instead of filling first (WO-9b, wrapReads).
Definition at line 641 of file scalar_mg.hpp.
Single-rank level table (VelocityMG::init's rule, no depth cap).
Definition at line 644 of file scalar_mg.hpp.
References allocate(), can(), chooseRatio(), G0, GC, and kMaxLevels.
|
inline |
Definition at line 734 of file scalar_mg.hpp.
|
inline |
Levels the last build set up for the V-cycle (1: level 0 alone, the transient rule).
Definition at line 736 of file scalar_mg.hpp.
Definition at line 737 of file scalar_mg.hpp.
|
inline |
The per-level coarsening ratios (the level table; equal to VelocityMG's on the same grid).
Definition at line 739 of file scalar_mg.hpp.
Rebuild the surrogate on every level from the current operator (the level table is kept).
Definition at line 782 of file scalar_mg.hpp.
References buildCoarse(), buildCutLists(), buildLevel0Faces(), buildLevel0SolidFaces(), buildPlane0(), countUnknown(), countUnknownS(), touches(), and wallKeep().
z = M^-1 r: one V-cycle on the surrogate (level 0 alone: 2 + 2 sweeps) from z = 0.
r must be 0 on the cells that are not unknowns (the Krylov's identity rows guarantee it); in the singular case it must already be mean-free (the caller projects, and removes z's mean after).
Definition at line 824 of file scalar_mg.hpp.
References sweepColor(), and vcycle().
Referenced by contraction().
The two-field z = M^-1 r (WO-7): one V-cycle on the coupled surrogate from z = 0 (level 0 alone: 2 + 2 two-field sweeps).
r must be 0 on each phase's non-unknown cells; in the singular case mean-free over both phases' unknowns.
Definition at line 846 of file scalar_mg.hpp.
References sweepColor(), and vcycleTwo().
|
inline |
y = S x for the two-field surrogate on level 0 (exchanges x first): y_f = S_ff x_f - W x_s, y_s = S_ss x_s - W x_f.
For tests.
Definition at line 870 of file scalar_mg.hpp.
References AC, peclet::flow::smg::bandOff(), peclet::flow::ccFor3(), peclet::flow::smg::faceOff(), and fill().
y = S x on level 0 (exchanges x first). For the contraction instrument and tests.
Definition at line 896 of file scalar_mg.hpp.
References AC, peclet::flow::applyCutcellOp(), peclet::flow::ccFor3(), peclet::flow::cutcellApplyFaceCell(), and fill().
Referenced by contraction().
|
inline |
Power estimate of the V-cycle's error contraction rho(I - M^-1 S) on the current surrogate (§11 G-iter): e <- e - M^-1 S e from a deterministic pseudo-random start on the unknowns (a function of the GLOBAL index, so decomposition-independent), mean-free when singular.
Returns the per-iteration ratios ||e_k|| / ||e_{k-1}|| (2-norm over the unknowns).
Definition at line 921 of file scalar_mg.hpp.
References apply(), applySurrogate(), peclet::flow::ccFor3(), norm2(), removeMean(), peclet::flow::C3::x, peclet::flow::C3::y, and peclet::flow::C3::z.
|
inline |
Definition at line 973 of file scalar_mg.hpp.
References fill(), kBottom, kPost, kPre, peclet::flow::prolongAdd(), removeMean(), peclet::flow::smg::residualBand(), peclet::flow::smg::residualFace(), restrictZeroX(), sweep(), unkOf(), vcycle(), wrapReads(), and peclet::flow::smg::zeroPinned().
|
inline |
The two-field V-cycle (WO-7): vcycle's structure on both phases — the same sweeps (the 2x2 block update), restrictAvg / trilinear prolongAdd per phase with its own pins, the mean over BOTH phases' unknowns removed when singular (the null vector is constant in psi).
Definition at line 1011 of file scalar_mg.hpp.
References fill(), kBottom, kPost, kPre, peclet::flow::prolongAdd(), removeMeanTwo(), restrictZeroX(), sweep(), unkOf(), unkSOf(), vcycleTwo(), wrapReads(), and peclet::flow::smg::zeroPinned().
Referenced by applyTwo(), and vcycleTwo().
|
inline |
The coarse rhs = restrictAvg of the fine residual, and the coarse iterate x = 0.
Single rank (WO-9b; flow's A5): in ONE kernel over the coarse inner cells (restrictAvgZeroX) — the coarse ghosts are not zeroed, and need not be: every pass fills before reading them or reads the periodic wrap instead, and a non-periodic ghost of x is 0 already (zero-initialized, and fill only ever writes 0 there). Distributed: the plain restriction and the full zero fill.
Definition at line 1061 of file scalar_mg.hpp.
References peclet::flow::restrictAvg(), and peclet::flow::restrictAvgZeroX().
Referenced by vcycle(), and vcycleTwo().
|
inline |
One colour of red-black Gauss-Seidel on level L: rb = 0 red (global (gx+gy+gz) even), 1 black.
The kernel's colour counts the ghost offset (lx = gx + g on every axis), hence + 3g.
Definition at line 1072 of file scalar_mg.hpp.
References fill(), peclet::flow::smg::sweepColorBand(), peclet::flow::smg::sweepColorFace(), unkOf(), and wrapSmooth().
Referenced by apply(), applyTwo(), and sweep().
One full red-black sweep: R -> B forward, B -> R backward.
Definition at line 1104 of file scalar_mg.hpp.
References sweepColor().
Referenced by vcycle(), and vcycleTwo().
Ghost exchange of a level-L field: level 0 the solver's own; coarse levels the per-level halo (or the single-rank periodic wrap), then 0 on the ghosts beyond a non-periodic global face.
Definition at line 1111 of file scalar_mg.hpp.
References peclet::flow::smg::fillShell(), and zeroNonPeriodicGhosts().
Referenced by applySurrogate(), applySurrogateTwo(), buildCoarse(), buildCoarseSolid(), coarsenAdvection(), sweepColor(), vcycle(), and vcycleTwo().
|
inline |
WO-9b, the fused periodic-wrap reads (flow's A3): the axes (bit a) a level-L pass may read across the block face through the wrapped inner index instead of a filled ghost, or -1 when it must fill first.
Single rank only. Coarse levels: the periodic axes (a non-periodic ghost of x is 0 — zeroed with x before its level's cycle and only ever rewritten to 0 by fill — which the pass reads in place). Level 0: all three axes when the injected fill is the single-rank periodic wrap of every axis (setLevel0Wrap), else -1. A read-only pass (residual) needs nothing more.
Definition at line 1134 of file scalar_mg.hpp.
Referenced by vcycle(), vcycleTwo(), and wrapSmooth().
|
inline |
A red-black pass reads the wrapped neighbour safely only when it has the OTHER colour (so it still holds what the fill would have copied before the pass): every inner dimension even.
Definition at line 1149 of file scalar_mg.hpp.
References wrapReads().
Referenced by sweepColor().
Does this rank's block on level lv touch global face f (0..5 = -x,+x,-y,+y,-z,+z)?
Definition at line 1157 of file scalar_mg.hpp.
Referenced by assembleCoarse(), build(), buildCoarse(), buildCoarseSolid(), coarsenAdvection(), and zeroNonPeriodicGhosts().
Definition at line 1169 of file scalar_mg.hpp.
Referenced by init().
Definition at line 1170 of file scalar_mg.hpp.
References kAspectTheta, and peclet::flow::CutcellMG::mgChooseRatio().
Referenced by init().
Definition at line 1176 of file scalar_mg.hpp.
Referenced by init().
|
inline |
Definition at line 1198 of file scalar_mg.hpp.
Referenced by countUnknown(), removeMean(), removeMeanTwo(), sweepColor(), vcycle(), and vcycleTwo().
|
inline |
Definition at line 1199 of file scalar_mg.hpp.
Referenced by countUnknownS(), removeMeanTwo(), and vcycleTwo().
WO-7: the solid-phase arrays of level L (and W on coarse levels), on the first two-field build.
Definition at line 1203 of file scalar_mg.hpp.
Referenced by buildCoarse(), and buildLevel0SolidFaces().
|
inline |
Definition at line 1223 of file scalar_mg.hpp.
References allSum(), peclet::flow::ccReduce3(), and unkSOf().
Referenced by build(), and buildCoarseSolid().
f, s -= their joint mean over both phases' unknown cells of level L (the singular two-field problem: the null vector is constant in psi on both phases).
Definition at line 1242 of file scalar_mg.hpp.
References allSum(), peclet::flow::ccFor3(), peclet::flow::ccReduce3(), mean(), unkOf(), and unkSOf().
Referenced by vcycleTwo().
WO-7, level 0: the solid faces AF_a(i) = -(w_a P_a(i)) from the operator's guarded products — the expression of sco::solidBands' AW/AS/AB, so the face form is the band form.
Definition at line 1273 of file scalar_mg.hpp.
References allocateSolid(), and peclet::flow::ccFor3().
Referenced by build().
WO-7: the coarse solid phase of level L (after assembleCoarse, which gathered W): pins = max of the children's solid flags; faces = coarsenOpenAvg of the products, w_a(L) times; mass = restrictAvg; AC_s = m + faces + W on solid unknowns; identity rows and W = 0 elsewhere.
Definition at line 1292 of file scalar_mg.hpp.
References AC, peclet::flow::ccFor3(), peclet::flow::coarsenOpenAvgCell(), countUnknownS(), fill(), peclet::flow::restrictAvg(), peclet::flow::smg::restrictMax(), touches(), and peclet::flow::smg::zeroPlanes().
Referenced by buildCoarse().
Definition at line 1354 of file scalar_mg.hpp.
References touches(), and peclet::flow::smg::zeroPlanes().
Referenced by fill().
Definition at line 1367 of file scalar_mg.hpp.
Referenced by countUnknown(), countUnknownS(), norm2(), removeMean(), and removeMeanTwo().
|
inline |
Definition at line 1379 of file scalar_mg.hpp.
References allSum(), peclet::flow::ccReduce3(), and unkOf().
Referenced by build(), and buildCoarse().
f -= its mean over the unknown cells of level L (CutcellMG::removeMean's form, unweighted).
Definition at line 1396 of file scalar_mg.hpp.
References allSum(), peclet::flow::ccFor3(), peclet::flow::ccReduce3(), mean(), and unkOf().
Referenced by contraction(), and vcycle().
Definition at line 1422 of file scalar_mg.hpp.
References allSum(), and peclet::flow::ccReduce3().
Referenced by contraction().
Level-0 faces: AF_a(i) = -(Lam w_a a_a(i)) when cells i - st_a and i are both unknowns — the same expression as sco::buildBands' AW/AS/AB, so the face-form sweep is bitwise the band sweep.
Written over the full extent (index 0 of each axis: 0).
Definition at line 1442 of file scalar_mg.hpp.
References peclet::flow::ccFor3().
Referenced by build().
Per coarse level L the overlay rows (cut cells) under each coarse inner cell, in increasing level-0 linear index — the (dz, dy, dx) order in which the wall gather of assembleCoarse visited the descendants — as a CSR over the coarse inner cells (WO-9b).
The gather then visits only the cut descendants, in the same order: the same additions, bitwise, at O(cut cells) per level instead of O(N0) (the former loop over every descendant ran one serial thread per coarse cell: 30 ms per advance on the GPU at 128^3, most of it on the deepest levels). Geometry only: built once per facet overlay (its cutCell view and count), on the host. Returns whether it (re)built them.
Definition at line 1470 of file scalar_mg.hpp.
Referenced by build().
The gathered coarse wall terms W (and the conjugate W_c) of the last build are reused when their inputs are unchanged BY CONTENT (WO-9b; the caching ruling D-WO3-3 deferred to WO-9): the same cut lists, the same level-0 unknown flags (view), the same two-phase mode and level count, and every per-facet cw (and cc) bitwise equal to the snapshot taken when they were gathered.
W is a pure function of those, so the reuse is bitwise; under advection only the mass changes from step to step, and the gather — O(cut cells) per level, serial per coarse cell — then runs only when a wall setting or dt-independent table actually changes. One reduction per build.
Definition at line 1534 of file scalar_mg.hpp.
References same().
Referenced by build().
Level-0 Dirichlet boundary plane of face f: <Lam a_bf> = Lam a_bf on unknown boundary cells (sco::dirichletFaceFold's aperture), indexed (j1, j2) over the inner tangential cells.
Definition at line 1576 of file scalar_mg.hpp.
References tangents().
Referenced by build().
Definition at line 1603 of file scalar_mg.hpp.
Referenced by assembleCoarse(), buildPlane0(), and coarsenPlane().
Definition at line 1608 of file scalar_mg.hpp.
References allocateSolid(), assembleBands(), assembleCoarse(), buildCoarseSolid(), peclet::flow::ccFor3(), coarsenAdvection(), peclet::flow::coarsenOpenAvgCell(), coarsenPlane(), countUnknown(), fill(), peclet::flow::restrictAvg(), peclet::flow::restrictAvgCell(), peclet::flow::smg::restrictMax(), touches(), and peclet::flow::smg::zeroPlanes().
Referenced by build().
A2: Qp/Qm of level L from level L - 1 — level 1 from the guarded positive parts of the level-0 flux, deeper levels from the finer level's Q — by coarsenOpenAvgCell's sum and division in its fixed order, then one multiplication by 1/r_a (r_a the ratio on the face's normal axis): Q = sum_sub max(+-phi, 0) V / V_L.
Then the ghosts (exchange / wrap, 0 beyond a non-periodic global face) and the low-face plane of every non-periodic axis zeroed, as the face products are.
Definition at line 1692 of file scalar_mg.hpp.
References peclet::flow::ccFor3(), peclet::flow::coarsenOpenAvgCell(), fill(), touches(), and peclet::flow::smg::zeroPlanes().
Referenced by buildCoarse().
|
inline |
A2: the coarse bands from the face form (assembleCoarse) and Q.
Unknown inner cells: AC += ((Qm_x(i) + Qp_x(i+e_x)) + (Qm_y(i) + Qp_y(i+e_y))) + (Qm_z(i) + Qp_z(i+e_z)), AW = AFX(i) - Qp_x(i), AE = AFX(i+e_x) - Qm_x(i+e_x) (y, z alike); pinned rows stay identity rows (AC = 1, bands 0).
Definition at line 1753 of file scalar_mg.hpp.
References AC, and peclet::flow::ccFor3().
Referenced by buildCoarse().
|
inline |
Coarse face form + diagonal: AF_a = -w_a(L) <Lam a> over the full extent; on unknown inner cells AC = m + the six face terms + W (the level-0 facet average) + the Dirichlet folds; pinned cells are identity rows.
Definition at line 1823 of file scalar_mg.hpp.
References AC, peclet::flow::ccFor3(), tangents(), and touches().
Referenced by buildCoarse().
|
staticconstexpr |
|
staticconstexpr |
The transient level rule (design §5.2, Amendment A3 + ruling D-WO9-3): kappa_A = 1 + 4 dt' D' sum_a w_a below this uses level 0 alone (2 + 2 sweeps), at or above it the full table; steady always the full table.
Measured (D-WO9-2, 128^3 bed, koren, host OpenMP 2 threads, per advance, level 0 vs full): kappa 7: 1.05-1.24 vs 1.93 s; 13: 1.23 vs 1.69 s (10/9 vs 9 iterations); 25: 1.35-1.55 vs 1.86-2.04 s (10-12 vs 9-10); 49: tie (15 vs 10 iterations); 97: 2.5 vs 2.05 s (21 vs 12). D-WO9-3 relaxed G-iter's COLD first step to <= 12 (warm steps stay <= 10; level 0 at kappa 13 takes 11 cold, 9 warm), so the switch moves to 25, the largest measured kappa at which level 0 is measurably cheaper (at 49 the two tie). Was 13 (D-WO9-2).
Definition at line 589 of file scalar_mg.hpp.
Referenced by peclet::flow::Solver< Grid >::scalarCutAssembleSolve().
|
staticconstexpr |
no depth cap in practice (the full table)
Definition at line 1166 of file scalar_mg.hpp.
Referenced by init().
|
staticconstexpr |
Definition at line 1167 of file scalar_mg.hpp.
Referenced by vcycle(), and vcycleTwo().
|
static |
Definition at line 1167 of file scalar_mg.hpp.
Referenced by vcycle(), and vcycleTwo().
|
static |
Definition at line 1167 of file scalar_mg.hpp.
Referenced by vcycle(), and vcycleTwo().
Definition at line 1174 of file scalar_mg.hpp.
Referenced by chooseRatio().