25template<
typename ValueType,
typename IndexType = localIdx>
36 : psi_(psi), expr_(expr), fvSchemes_(fvSchemes), fvSolution_(fvSolution),
39 *sparsityPattern_.get()
42 expr_.build(fvSchemes_);
47 : psi_(ls.psi_), expr_(ls.expr_), fvSchemes_(ls.fvSchemes_), fvSolution_(ls.fvSolution_),
48 ls_(ls.ls_), sparsityPattern_(ls.sparsityPattern_) {};
55 if (!sparsityPattern_)
57 NF_THROW(std::string(
"fvcc:LinearSystem:sparsityPattern: sparsityPattern is null"));
59 return *sparsityPattern_;
69 if (!sparsityPattern_)
71 NF_THROW(
"fvcc:LinearSystem:sparsityPattern: sparsityPattern is null");
73 return *sparsityPattern_;
81 auto vol = psi_.mesh().cellVolumes().view();
82 auto expSource = expr_.explicitOperation(psi_.mesh().nCells());
83 expr_.explicitOperation(expSource, t, dt);
84 auto expSourceView = expSource.view();
85 fill(ls_.rhs(), zero<ValueType>());
86 fill(ls_.matrix().values(), zero<ValueType>());
87 expr_.implicitOperation(ls_);
89 expr_.implicitOperation(ls_, t, dt);
90 auto rhs = ls_.rhs().view();
95 KOKKOS_LAMBDA(
const localIdx i) { rhs[i] -= expSourceView[i] * vol[i]; }
101 if (expr_.temporalOperators().size() == 0 && expr_.spatialOperators().size() == 0)
106 if (expr_.temporalOperators().size() > 0)
117 auto vol = psi_.mesh().cellVolumes().view();
118 auto expSource = expr_.explicitOperation(psi_.mesh().nCells());
119 auto expSourceSpan = expSource.view();
121 ls_ = expr_.implicitOperation();
122 auto rhs = ls_.rhs().view();
127 KOKKOS_LAMBDA(
const localIdx i) { rhs[i] -= expSourceSpan[i] * vol[i]; }
136 if (expr_.temporalOperators().size() == 0 && expr_.spatialOperators().size() == 0)
140 if (expr_.temporalOperators().size() > 0)
151 auto exec = psi_.exec();
153 solver.solve(ls_, psi_.internalVector());
161 const auto diagOffset = sparsityPattern_->diagOffset().view();
162 const auto rowPtrs = ls_.matrix().rowPtrs().view();
163 auto rhs = ls_.rhs().view();
164 auto values = ls_.matrix().values().view();
167 {refCell, refCell + 1},
168 KOKKOS_LAMBDA(
const std::size_t refCelli) {
169 auto diagIdx = rowPtrs[refCelli] + diagOffset[refCelli];
170 auto diagValue = values[diagIdx];
171 rhs[refCelli] += diagValue * refValue;
172 values[diagIdx] += diagValue;
183 std::shared_ptr<SparsityPattern> sparsityPattern_;
187template<
typename ValueType,
typename IndexType = localIdx>
188VolumeField<ValueType>
200 auto [result, b, x] =
202 const auto [values, colIdxs, rowPtrs] = expr.
linearSystem().view();
207 KOKKOS_LAMBDA(
const std::size_t rowi) {
208 IndexType rowStart = rowPtrs[rowi];
209 IndexType rowEnd = rowPtrs[rowi + 1];
211 for (IndexType coli = rowStart; coli < rowEnd; coli++)
213 sum += values[coli] * x[colIdxs[coli]];
215 result[rowi] = sum - b[rowi];
A class representing a dictionary that stores key-value pairs.
const UnstructuredMesh & mesh() const
Returns a const reference to the unstructured mesh object.
const BoundaryData< ValueType > & boundaryData() const
Returns a const reference to the boundary field.
const Executor & exec() const
Returns a const reference to the executor object.
const Vector< ValueType > & internalVector() const
Returns a const reference to the internal field.
const SparsityPattern & sparsityPattern() const
const Executor & exec() const
const la::LinearSystem< ValueType, IndexType > & linearSystem() const
void solve(scalar, scalar)
const VolumeField< ValueType > & getVector() const
la::LinearSystem< ValueType, IndexType > & linearSystem()
Expression(dsl::Expression< ValueType > expr, VolumeField< ValueType > &psi, const Dictionary &fvSchemes, const Dictionary &fvSolution)
VolumeField< ValueType > & getVector()
Expression(const Expression &ls)
void assemble(scalar t, scalar dt)
void setReference(const IndexType refCell, ValueType refValue)
SparsityPattern & sparsityPattern()
Represents a volume field in a finite volume method.
std::vector< VolumeBoundary< ValueType > > boundaryConditions() const
A class representing a linear system of equations.
#define NF_THROW(message)
Macro for throwing a NeoNException with the specified error message.
#define NF_ERROR_EXIT(message)
Macro for printing an error message and aborting the program.
VolumeField< ValueType > operator&(const Expression< ValueType, IndexType > expr, const VolumeField< ValueType > &psi)
void parallelFor(const Executor &exec, std::pair< localIdx, localIdx > range, Kernel kernel, std::string name="parallelFor")
void fill(Vector< ValueType > &a, const std::type_identity_t< ValueType > value, std::pair< localIdx, localIdx > range={0, 0})
Fill the field with a scalar value using a specific executor.
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
auto spans(Args &... fields)