NeoFOAM
WIP Prototype of a modern OpenFOAM core
Loading...
Searching...
No Matches
backwardEuler.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2//
3// SPDX-FileCopyrightText: 2023 NeoFOAM authors
4
5#pragma once
6
12
13#if NF_WITH_GINKGO
15#endif
16
18{
19
20template<typename SolutionFieldType>
22 public TimeIntegratorBase<SolutionFieldType>::template Register<
23 BackwardEuler<SolutionFieldType>>
24{
25
26public:
27
28 using ValueType = typename SolutionFieldType::FieldValueType;
29 using Base =
31
32 BackwardEuler(const Dictionary& schemeDict, const Dictionary& solutionDict)
33 : Base(schemeDict, solutionDict)
34 {}
35
36 static std::string name() { return "backwardEuler"; }
37
38 static std::string doc() { return "first order time integration method"; }
39
40 static std::string schema() { return "none"; }
41
42 void solve(
44 SolutionFieldType& solutionField,
45 [[maybe_unused]] scalar t,
46 scalar dt
47 ) override
48 {
49 auto source = eqn.explicitOperation(solutionField.size());
50 SolutionFieldType& oldSolutionField =
52
53 // solutionField.internalField() = oldSolutionField.internalField() - source * dt;
54 // solutionField.correctBoundaryConditions();
55 // solve sparse matrix system
56 using ValueType = typename SolutionFieldType::ElementType;
57 auto ls = eqn.implicitOperation();
58 auto values = ls.matrix().values();
59 eqn.implicitOperation(ls, t, dt);
60 auto ginkgoLs = NeoFOAM::dsl::ginkgoMatrix(ls, solutionField);
61
62
63 NeoFOAM::la::ginkgo::BiCGStab<ValueType> solver(solutionField.exec(), this->solutionDict_);
64 solver.solve(ginkgoLs, solutionField.internalField());
65
66 // check if executor is GPU
67 if (std::holds_alternative<NeoFOAM::GPUExecutor>(eqn.exec()))
68 {
69 Kokkos::fence();
70 }
71 oldSolutionField.internalField() = solutionField.internalField();
72 };
73
74 std::unique_ptr<TimeIntegratorBase<SolutionFieldType>> clone() const override
75 {
76 return std::make_unique<BackwardEuler>(*this);
77 }
78};
79
80
81} // namespace NeoFOAM
A class representing a dictionary that stores key-value pairs.
const Executor & exec() const
la::LinearSystem< ValueType, localIdx > implicitOperation()
Field< ValueType > explicitOperation(size_t nCells)
std::span< ValueType > values()
Get a span to the values array.
CSRMatrix< ValueType, IndexType > & matrix()
void solve(dsl::Expression< ValueType > &eqn, SolutionFieldType &solutionField, scalar t, scalar dt) override
TimeIntegratorBase< SolutionFieldType >::template Register< BackwardEuler< SolutionFieldType > > Base
BackwardEuler(const Dictionary &schemeDict, const Dictionary &solutionDict)
std::unique_ptr< TimeIntegratorBase< SolutionFieldType > > clone() const override
typename SolutionFieldType::FieldValueType ValueType
A template class for registering derived classes with a base class.
NeoFOAM::la::LinearSystem< typename FieldType::ElementType, int > ginkgoMatrix(NeoFOAM::la::LinearSystem< typename FieldType::ElementType, localIdx > &ls, FieldType &solution)
Definition solver.hpp:26
FieldType & oldTime(FieldType &field)
Retrieves the old time field of a given field.
float scalar
Definition scalar.hpp:14