-
Notifications
You must be signed in to change notification settings - Fork 9
/
remhos_ho.hpp
83 lines (64 loc) · 2.32 KB
/
remhos_ho.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
// the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
// reserved. See files LICENSE and NOTICE for details.
//
// This file is part of CEED, a collection of benchmarks, miniapps, software
// libraries and APIs for efficient high-order finite element and spectral
// element discretizations for exascale applications. For more information and
// source code availability see http://github.com/ceed.
//
// The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
// a collaborative effort of two U.S. Department of Energy organizations (Office
// of Science and the National Nuclear Security Administration) responsible for
// the planning and preparation of a capable exascale ecosystem, including
// software, applications, hardware, advanced system engineering and early
// testbed platforms, in support of the nation's exascale computing imperative.
#ifndef MFEM_REMHOS_HO
#define MFEM_REMHOS_HO
#include "mfem.hpp"
namespace mfem
{
// High-Order Solver.
// Conserve mass / provide high-order convergence / may violate the bounds.
class HOSolver
{
protected:
ParFiniteElementSpace &pfes;
public:
HOSolver(ParFiniteElementSpace &space) : pfes(space) { }
virtual ~HOSolver() { }
virtual void CalcHOSolution(const Vector &u, Vector &du) const = 0;
};
class CGHOSolver : public HOSolver
{
protected:
ParBilinearForm &M, &K;
public:
CGHOSolver(ParFiniteElementSpace &space,
ParBilinearForm &Mbf, ParBilinearForm &Kbf);
virtual void CalcHOSolution(const Vector &u, Vector &du) const;
};
class LocalInverseHOSolver : public HOSolver
{
protected:
ParBilinearForm &M, &K;
public:
LocalInverseHOSolver(ParFiniteElementSpace &space,
ParBilinearForm &Mbf, ParBilinearForm &Kbf);
virtual void CalcHOSolution(const Vector &u, Vector &du) const;
};
class Assembly;
class NeumannHOSolver : public HOSolver
{
protected:
const ParBilinearForm &M, &K;
const Vector &M_lumped;
Assembly &assembly;
public:
NeumannHOSolver(ParFiniteElementSpace &space,
ParBilinearForm &Mbf, ParBilinearForm &Kbf, Vector &Mlump,
Assembly &a);
virtual void CalcHOSolution(const Vector &u, Vector &du) const;
};
} // namespace mfem
#endif // MFEM_REMHOS_HO