31 using Pair = std::array<double, 2>;
32 using Block = std::array<double, 4>;
42 std::vector<kernels::FaceFlux>
faces;
127 static bool residual(
const Problem& p,
const std::vector<Pair>& trial,
double dt,
128 std::vector<Pair>& output,
129 std::vector<kernels::FaceFlux>* faces =
nullptr);
154 static bool linearize(
const Problem& p,
const std::vector<Pair>& trial,
double dt,
155 double difference_step, Linearization& out);
173 static bool solveBlocks(
const Linearization& l,
const std::vector<Pair>& rhs,
174 std::vector<Pair>& output,
double& relative_residual,
175 BlockDiagnostics* diagnostics =
nullptr);
195 static LinearResult
solveLinear(
const Linearization& l,
const std::vector<Pair>& rhs,
196 const LinearControls&
controls, std::vector<Pair>& output);
221 Result
solve(
const Problem& p,
double dt,
const Controls&
controls, Endpoint& output);
Single-source scalar kernels for the explicit FV 1D network solver.
Native GMRES iteration for finite-volume linear systems.
SoA storage for the 1D finite-volume network mesh and its state.
Definition ImplicitReachSolver.hpp:29
static LinearResult solveLinear(const Linearization &l, const std::vector< Pair > &rhs, const LinearControls &controls, std::vector< Pair > &output)
Solve the original scaled reach system with structured elimination or fixed right-preconditioned GMRE...
Definition ImplicitReachSolver.cpp:419
Result solve(const Problem &p, double dt, const Controls &controls, Endpoint &output)
Solve one supported implicit reach timestep with bounded Newton/backtracking.
Definition ImplicitReachSolver.cpp:585
Status
Definition ImplicitReachSolver.hpp:75
@ LinearFailure
Definition ImplicitReachSolver.hpp:79
@ LineSearchFailed
Definition ImplicitReachSolver.hpp:80
@ NonFinite
Definition ImplicitReachSolver.hpp:78
@ IterationLimit
Definition ImplicitReachSolver.hpp:81
@ InvalidInput
Definition ImplicitReachSolver.hpp:77
@ Converged
Definition ImplicitReachSolver.hpp:76
static bool linearize(const Problem &p, const std::vector< Pair > &trial, double dt, double difference_step, Linearization &out)
Build the scaled local block-tridiagonal finite-difference Jacobian.
Definition ImplicitReachSolver.cpp:280
std::array< double, 2 > Pair
Definition ImplicitReachSolver.hpp:31
Preconditioner
Definition ImplicitReachSolver.hpp:45
@ BlockLine
Definition ImplicitReachSolver.hpp:45
@ BlockJacobi
Definition ImplicitReachSolver.hpp:45
LinearMethod
Definition ImplicitReachSolver.hpp:44
@ GmresOnly
Definition ImplicitReachSolver.hpp:44
@ StructuredOnly
Definition ImplicitReachSolver.hpp:44
@ StructuredThenGmres
Definition ImplicitReachSolver.hpp:44
static bool solveBlocks(const Linearization &l, const std::vector< Pair > &rhs, std::vector< Pair > &output, double &relative_residual, BlockDiagnostics *diagnostics=nullptr)
Solve the scaled block-tridiagonal system with native two-by-two Thomas elimination.
Definition ImplicitReachSolver.cpp:349
std::array< double, 4 > Block
Definition ImplicitReachSolver.hpp:32
static bool residual(const Problem &p, const std::vector< Pair > &trial, double dt, std::vector< Pair > &output, std::vector< kernels::FaceFlux > *faces=nullptr)
Evaluate backward-Euler integrated volume and momentum residuals.
Definition ImplicitReachSolver.cpp:253
Definition Controls.cpp:47
Definition AcceptedWaterVolumes.hpp:8
Definition ImplicitReachSolver.hpp:46
double minimum_pivot_ratio
Definition ImplicitReachSolver.hpp:49
int failed_block
Definition ImplicitReachSolver.hpp:47
Definition ImplicitReachSolver.hpp:66
double difference_step
Definition ImplicitReachSolver.hpp:72
double relative_momentum
Definition ImplicitReachSolver.hpp:69
double absolute_momentum
Definition ImplicitReachSolver.hpp:69
double absolute_volume
Definition ImplicitReachSolver.hpp:68
int max_backtracks
Definition ImplicitReachSolver.hpp:67
int max_newton
Definition ImplicitReachSolver.hpp:67
LinearControls linear
Definition ImplicitReachSolver.hpp:73
double relative_volume
Definition ImplicitReachSolver.hpp:68
Definition ImplicitReachSolver.hpp:40
std::vector< double > depth
Definition ImplicitReachSolver.hpp:41
std::vector< kernels::FaceFlux > faces
Definition ImplicitReachSolver.hpp:42
std::vector< double > discharge
Definition ImplicitReachSolver.hpp:41
std::vector< double > area
Definition ImplicitReachSolver.hpp:41
Definition ImplicitReachSolver.hpp:51
Preconditioner preconditioner
Definition ImplicitReachSolver.hpp:53
LinearMethod method
Definition ImplicitReachSolver.hpp:52
NativeGmres::Controls gmres
Definition ImplicitReachSolver.hpp:54
Definition ImplicitReachSolver.hpp:56
NativeGmres::Result gmres
Definition ImplicitReachSolver.hpp:63
BlockDiagnostics direct
Definition ImplicitReachSolver.hpp:62
double maximum_preconditioner_shift
Definition ImplicitReachSolver.hpp:60
bool converged
Definition ImplicitReachSolver.hpp:57
std::size_t wrapper_bytes
Definition ImplicitReachSolver.hpp:61
int shifted_preconditioner_blocks
Definition ImplicitReachSolver.hpp:59
bool used_gmres
Definition ImplicitReachSolver.hpp:57
double relative_residual
Definition ImplicitReachSolver.hpp:64
int identity_preconditioner_blocks
Definition ImplicitReachSolver.hpp:58
bool fallback
Definition ImplicitReachSolver.hpp:57
Definition ImplicitReachSolver.hpp:98
std::vector< Block > diagonal
Definition ImplicitReachSolver.hpp:99
std::vector< Block > lower
Definition ImplicitReachSolver.hpp:99
Pair column_scale
Definition ImplicitReachSolver.hpp:101
std::vector< Pair > residual
Definition ImplicitReachSolver.hpp:100
std::vector< Block > upper
Definition ImplicitReachSolver.hpp:99
std::vector< Pair > row_scale
Definition ImplicitReachSolver.hpp:100
Definition ImplicitReachSolver.hpp:33
std::vector< double > old_discharge
Definition ImplicitReachSolver.hpp:35
std::vector< double > old_area
Definition ImplicitReachSolver.hpp:35
double right_depth
Definition ImplicitReachSolver.hpp:37
const NetworkMeshData * mesh
Definition ImplicitReachSolver.hpp:34
double upper_depth
Definition ImplicitReachSolver.hpp:38
double left_depth
Definition ImplicitReachSolver.hpp:37
double lower_depth
Definition ImplicitReachSolver.hpp:38
Definition ImplicitReachSolver.hpp:83
int gmres_solves
Definition ImplicitReachSolver.hpp:89
int linear_fallbacks
Definition ImplicitReachSolver.hpp:89
double scaled_residual
Definition ImplicitReachSolver.hpp:86
double linear_relative_residual
Definition ImplicitReachSolver.hpp:88
bool converged() const
Report whether the nonlinear reach residual passed every physical budget.
Definition ImplicitReachSolver.hpp:96
int gmres_iterations
Definition ImplicitReachSolver.hpp:89
int backtracks
Definition ImplicitReachSolver.hpp:85
int newton_iterations
Definition ImplicitReachSolver.hpp:85
std::size_t max_gmres_workspace_bytes
Definition ImplicitReachSolver.hpp:90
double max_momentum_residual
Definition ImplicitReachSolver.hpp:87
LinearResult last_linear
Definition ImplicitReachSolver.hpp:91
Status status
Definition ImplicitReachSolver.hpp:84
double max_volume_residual
Definition ImplicitReachSolver.hpp:87
Definition NativeGmres.hpp:28
Definition NativeGmres.hpp:45
SoA mesh geometry and topology for the FV network solver.
Definition NetworkMeshData.hpp:123