RemappedFFTSolver Class ReferenceΒΆ

adc_cpp: pops::RemappedFFTSolver Class Reference
adc_cpp 0.3.0
Model-free C++23 core for coupled hyperbolic-elliptic systems on adaptive (AMR) meshes, with MPI and GPU (Kokkos) backends
pops::RemappedFFTSolver Class Reference

DIRECT periodic Poisson solver (spectral FFT) under MPI, presenting the SYSTEM LAYOUT, models EllipticSolver (ADC-287). More...

#include <poisson_fft_solver.hpp>

+ Collaboration diagram for pops::RemappedFFTSolver:

Public Member Functions

 RemappedFFTSolver (const Geometry &geom, const BoxArray &ba, const BCRec &=BCRec{}, std::function< bool(Real, Real)>={}, bool spectral=false)
 spectral: Laplacian symbol forwarded to PoissonFFT (false = discrete 5-point stencil, bit-identical default; true = continuous symbol -(kx^2+ky^2)).
 
MultiFabrhs ()
 
MultiFabphi ()
 
const Geometrygeom () const
 
void solve ()
 
Real residual ()
 

Detailed Description

DIRECT periodic Poisson solver (spectral FFT) under MPI, presenting the SYSTEM LAYOUT, models EllipticSolver (ADC-287).

Role: let System.set_poisson(..., "fft"|"fft_spectral") run on n_ranks() > 1 WITHOUT touching the system field solver. Unlike DistributedFFTSolver (slabs, DistributionMapping(np, np)), this solver allocates rhs()/phi() on the System's own BoxArray/DistributionMapping (the single round-robin box, DistributionMapping(1, np) -> box on one owner rank). The whole box<->slab transpose is HIDDEN inside solve(): the System path (RHS assembly via add_poisson_rhs, the phi->aux derivation loop aligned on fab(li), fill_boundary, the device_fence ordering) keeps reading rhs()/phi() on the SAME layout as the aux, so system_field_solver.hpp needs no change beyond selecting this type.

Remap mechanics (the box lives ENTIRELY on the owner rank, so this is a scatter/gather, NOT a symmetric alltoall): solve() (1) the owner packs its full Nx*Ny rhs fab into per-slab contiguous buffers (slab r = global rows [r*nyl, (r+1)*nyl), full x); (2) MPI_Scatter -> each rank gets nyl*Nx row-major rho_local; (3) every rank calls the proven PoissonFFT::solve (its internal MPI_Alltoall does the y<->x transpose); (4) MPI_Gather phi_local -> owner; (5) owner unpacks into phi's valid cells; (6) owner fill_boundary fills the periodic ghosts (a pure intra-box wrap since only the owner has a fab -> no inter-rank messages, deadlock-free) so the centered grad phi reads correct halos.

Preconditions / constraints:

  • the System box: ba.size() == 1 (the round-robin single box); rejected otherwise (collective throw);
  • geom.domain.ny() % n_ranks() == 0 (equal slabs for the internal transpose); collective throw, no deadlock since ensure_elliptic is called collectively and every rank constructs the object;
  • periodic BCs, constant coefficient (the BCRec and wall predicate are ignored; the System guards wall / variable-eps / anisotropic-eps / kappa BEFORE selecting this solver);
  • Nx, Ny powers of two for the fast radix-2 path; otherwise PoissonFFT's correct O(n^2) DFT fallback.

Conservation / gauge: the scatter/gather is a pure permutation of doubles (no FP arithmetic, exact), so the charge integral is preserved bit-exactly through the remap; PoissonFFT zeroes the k=0 mode, so phi has zero mean. The only FP difference vs the single-rank PoissonFFTSolver is PoissonFFT's internal alltoall reassociation, already characterised at machine zero by test_mpi_fft_distributed (np=1/2/4).

NOTE: STRUCTURAL change pending the ADC-273 design vote (new EllipticSolver type in the System ell_ variant, new MPI collective pattern). Behind the existing "fft"/"fft_spectral" tokens; geometric_mg stays the MPI default and the only option for walls / variable-eps / kappa.

Constructor & Destructor Documentation

◆ RemappedFFTSolver()

pops::RemappedFFTSolver::RemappedFFTSolver ( const Geometry geom,
const BoxArray ba,
const BCRec = BCRec{},
std::function< bool(Real, Real)>  = {},
bool  spectral = false 
)
inline

spectral: Laplacian symbol forwarded to PoissonFFT (false = discrete 5-point stencil, bit-identical default; true = continuous symbol -(kx^2+ky^2)).

Same constructor shape as PoissonFFTSolver (BCRec and wall predicate accepted but ignored: periodic constant coefficient).

Member Function Documentation

◆ geom()

const Geometry & pops::RemappedFFTSolver::geom ( ) const
inline

◆ phi()

MultiFab & pops::RemappedFFTSolver::phi ( )
inline

◆ residual()

Real pops::RemappedFFTSolver::residual ( )
inline
+ Here is the call graph for this function:

◆ rhs()

MultiFab & pops::RemappedFFTSolver::rhs ( )
inline

◆ solve()

void pops::RemappedFFTSolver::solve ( )
inline
+ Here is the call graph for this function:

The documentation for this class was generated from the following file: