LoAdSG
PDE.h
1//
2// Created by to35jepo on 9/19/23.
3//
4
5#ifndef RUN_PDE_H
6#define RUN_PDE_H
7
8
9#include "../sgrid/sparseGrid.h"
10#include "../MatrixVectorMultiplication/MatrixVectorHomogen.h"
11#include "../MatrixVectorMultiplication/RHS.h"
12#include "../stencils/Stencil.h"
13
14
15
16class PDE_Poisson_InHomRHS{
17public:
18 PDE_Poisson_InHomRHS(AdaptiveSparseGrid& n_grid, AdaptiveSparseGrid& d_grid, MatrixVectorHomogen& matrix_):neumann_grid(n_grid),dirichlet_grid(d_grid), f_dirichlet(d_grid), prew(d_grid),matrix(matrix_),dirichlet(d_grid){};
19 void SetUp(VectorSparseG& f_neumann, VectorSparseG& g_neumann);
20
21 VectorSparseG& getRHS(){
22 return f_dirichlet;
23 }
24private:
25 AdaptiveSparseGrid& neumann_grid;
26 AdaptiveSparseGrid& dirichlet_grid;
27 VectorSparseG f_dirichlet;
28 VectorSparseG prew;
29 MatrixVectorHomogen& matrix;
30 VectorSparseG dirichlet;
31};
32
33/*
34double var_coeff2( const std::array<double, DimensionSparseGrid>& x )
35{
36 double val = 1.0;
37 for(size_t d= 0;d<DimensionSparseGrid; d++ ){
38 double t = x.at(d);
39 val *= (1.0-(t*t));
40 }
41
42 return val;
43
44}
45*/
46
47
48class PDE_Helmholtz_VariableCoeff{
49public:
50 PDE_Helmholtz_VariableCoeff(AdaptiveSparseGrid& n_grid, AdaptiveSparseGrid& d_grid, MatrixVectorHomogen& matrix_):neumann_grid(n_grid),dirichlet_grid(d_grid), f_dirichlet(d_grid), prew(d_grid),matrix(matrix_),dirichlet(d_grid){};
65 void SetUp(VectorSparseG& f_neumann, VectorSparseG& g_neumann) {
66
67 CalcHierarchicalBasis(f_neumann);
68
69
70 for (unsigned long i = 0; i < neumann_grid.getMaximalOccupiedSecondTable(); i++) {
71 if (neumann_grid.getActiveTable()[i]) {
72 IndexDimension I = neumann_grid.getIndexOfTable(i);
73 Depth T(I);
74 if((T>>0)){
75 f_dirichlet.setValue(I,f_neumann.getValue(i));
76 f_neumann.setValue(i, 0.0);
77 }
78 }
79 }
80
81
82
83
84 CalcNodalBasis(f_dirichlet);
85 calcPrewByNodal(prew,f_dirichlet);
86 //MassStencil stencil1;
87 HelmHoltz stencil1(*f_dirichlet.getSparseGrid());
88
89 f_dirichlet=0.0;
90 matrix.multiplication(prew,f_dirichlet,stencil1);
91
92
93 InHomoBoundaryRHSHierarchical test_hier(dirichlet_grid);
94 test_hier.multiply_mass(f_neumann, dirichlet);
95
96 f_dirichlet=f_dirichlet+dirichlet;
97
98 CalcHierarchicalBasisForRHS(g_neumann);
99 dirichlet = 0.0;
100 test_hier.multiply(g_neumann,dirichlet);
101
102 f_dirichlet=f_dirichlet-dirichlet;
103
104 dirichlet=0.0;
105
106 test_hier.multiply_mass_coeff(g_neumann,dirichlet);
107
108
109
110
111 f_dirichlet = f_dirichlet-dirichlet;
112
113
114
115 }
116
117
118 VectorSparseG& getRHS(){
119 return f_dirichlet;
120 }
121private:
122 AdaptiveSparseGrid& neumann_grid;
123 AdaptiveSparseGrid& dirichlet_grid;
124 VectorSparseG f_dirichlet;
125 VectorSparseG prew;
126 MatrixVectorHomogen& matrix;
127 VectorSparseG dirichlet;
128};
129
130
131
132class PDE_Helmholtz_VariableCoeff_interface{
133public:
134 PDE_Helmholtz_VariableCoeff_interface(AdaptiveSparseGrid& n_grid, AdaptiveSparseGrid& d_grid, MatrixVectorHomogen& matrix_):neumann_grid(n_grid),dirichlet_grid(d_grid), f_dirichlet(d_grid), prew(d_grid),matrix(matrix_),dirichlet(d_grid){};
149 template<class F>
150 void SetUp(VectorSparseG& f_neumann, VectorSparseG& g_neumann,const F& f) {
151
152 CalcHierarchicalBasis(f_neumann);
153
154
155 for (unsigned long i = 0; i < neumann_grid.getMaximalOccupiedSecondTable(); i++) {
156 if (neumann_grid.getActiveTable()[i]) {
157 IndexDimension I = neumann_grid.getIndexOfTable(i);
158 Depth T(I);
159 if((T>>0)){
160 f_dirichlet.setValue(I,f_neumann.getValue(i));
161 f_neumann.setValue(i, 0.0);
162 }
163 }
164 }
165
166
167
168
169 CalcNodalBasis(f_dirichlet);
170 calcPrewByNodal(prew,f_dirichlet);
171 //MassStencil stencil1;
172 HelmHoltz stencil1(f_dirichlet.getSparseGrid());
173
174
175 f_dirichlet=0.0;
176 matrix.multiplication(prew,f_dirichlet,stencil1);
177
178
179 InHomoBoundaryRHSHierarchical test_hier(dirichlet_grid);
180 test_hier.multiply_mass(f_neumann, dirichlet);
181
182 f_dirichlet=f_dirichlet+dirichlet;
183
184 CalcHierarchicalBasisForRHS(g_neumann);
185 dirichlet = 0.0;
186 test_hier.multiply(g_neumann,dirichlet);
187
188 f_dirichlet=f_dirichlet-dirichlet;
189
190
191
192 dirichlet=0.0;
193 test_hier.multiply_mass_coeff_interface(g_neumann,dirichlet,f);
194
195
196
197 f_dirichlet = f_dirichlet-dirichlet;
198
199
200 }
201
202
203 VectorSparseG& getRHS(){
204 return f_dirichlet;
205 }
206private:
207 AdaptiveSparseGrid& neumann_grid;
208 AdaptiveSparseGrid& dirichlet_grid;
209 VectorSparseG f_dirichlet;
210 VectorSparseG prew;
211 MatrixVectorHomogen& matrix;
212 VectorSparseG dirichlet;
213};
214#endif //RUN_PDE_H
Definition sparseGrid.h:277
Definition MatrixVectorHomogen.h:32