16 #ifndef __H2D_OGPROJECTION_H
17 #define __H2D_OGPROJECTION_H
19 #include "../function/solution.h"
21 #include "../weakform/weakform.h"
33 template<
typename Scalar>
34 class HERMES_API OGProjection :
public Hermes::Mixins::Loggable
41 void project_global(
const Space<Scalar>* space,
42 MatrixFormVol<Scalar>* custom_projection_jacobian,
43 VectorFormVol<Scalar>* custom_projection_residual,
65 void project_global(
const Space<Scalar>* space, MeshFunction<Scalar>* source_meshfn,
66 Scalar* target_vec,
ProjNormType proj_norm = HERMES_UNSET_NORM);
69 void project_global(
const Space<Scalar>* space,
70 Solution<Scalar>* source_sln, Solution<Scalar>* target_sln,
74 void project_global(Hermes::vector<
const Space<Scalar>*> spaces, Hermes::vector<MeshFunction<Scalar>*> source_meshfns,
75 Scalar* target_vec, Hermes::vector<ProjNormType> proj_norms = Hermes::vector<ProjNormType>());
78 void project_global(Hermes::vector<
const Space<Scalar>*> spaces, Hermes::vector<Solution<Scalar>*> source_slns,
79 Scalar* target_vec, Hermes::vector<ProjNormType> proj_norms = Hermes::vector<ProjNormType>());
81 void project_global(Hermes::vector<
const Space<Scalar>*> spaces,
82 Hermes::vector<Solution<Scalar>*> source_slns, Hermes::vector<Solution<Scalar>*> target_slns,
83 Hermes::vector<ProjNormType> proj_norms = Hermes::vector<ProjNormType>(),
bool delete_old_mesh =
false);
91 void project_internal(
const Space<Scalar>* space, WeakForm<Scalar>* proj_wf, Scalar* target_vec);
99 this->projNormType = projNormType;
105 switch (projNormType)
108 return l2_projection_biform<double, Scalar>(n, wt, u_ext, u, v, e, ext);
110 return h1_projection_biform<double, Scalar>(n, wt, u_ext, u, v, e, ext);
111 case HERMES_H1_SEMINORM:
112 return h1_semi_projection_biform<double, Scalar>(n, wt, u_ext, u, v, e, ext);
113 case HERMES_HCURL_NORM:
114 return hcurl_projection_biform<double, Scalar>(n, wt, u_ext, u, v, e, ext);
115 case HERMES_HDIV_NORM:
116 return hdiv_projection_biform<double, Scalar>(n, wt, u_ext, u, v, e, ext);
118 throw Hermes::Exceptions::Exception(
"Unknown projection type");
126 switch (projNormType)
129 return l2_projection_biform<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, u, v, e, ext);
131 return h1_projection_biform<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, u, v, e, ext);
132 case HERMES_H1_SEMINORM:
133 return h1_semi_projection_biform<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, u, v, e, ext);
134 case HERMES_HCURL_NORM:
135 return hcurl_projection_biform<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, u, v, e, ext);
136 case HERMES_HDIV_NORM:
137 return hdiv_projection_biform<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, u, v, e, ext);
139 throw Hermes::Exceptions::Exception(
"Unknown projection type");
140 return Hermes::Ord();
152 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
156 SolFunctionDomain result = SolFunctionDomain(0);
157 for (
int i = 0; i < n; i++)
158 result += wt[i] * (u->
val[i] * v->
val[i] + u->dx[i] * v->dx[i] + u->
dy[i] * v->
dy[i]);
162 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
166 SolFunctionDomain result = SolFunctionDomain(0);
167 for (
int i = 0; i < n; i++)
168 result += wt[i] * (u->dx[i] * v->dx[i] + u->
dy[i] * v->
dy[i]);
172 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
176 SolFunctionDomain result = SolFunctionDomain(0);
177 for (
int i = 0; i < n; i++)
178 result += wt[i] * (u->
val[i] * v->
val[i]);
182 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
186 SolFunctionDomain result = SolFunctionDomain(0);
187 for (
int i = 0; i < n; i++) {
188 result += wt[i] * (u->
curl[i] * conj(v->
curl[i]));
189 result += wt[i] * (u->val0[i] * conj(v->val0[i]) + u->
val1[i] * conj(v->
val1[i]));
194 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
198 SolFunctionDomain result = SolFunctionDomain(0);
199 for (
int i = 0; i < n; i++) {
200 result += wt[i] * (u->
div[i] * conj(v->
div[i]));
201 result += wt[i] * (u->val0[i] * conj(v->val0[i]) + u->
val1[i] * conj(v->
val1[i]));
213 this->projNormType = projNormType;
219 switch (projNormType)
222 return l2_projection_residual<double, Scalar>(n, wt, u_ext, v, e, ext);
224 return h1_projection_residual<double, Scalar>(n, wt, u_ext, v, e, ext);
225 case HERMES_H1_SEMINORM:
226 return h1_semi_projection_residual<double, Scalar>(n, wt, u_ext, v, e, ext);
227 case HERMES_HCURL_NORM:
228 return hcurl_projection_residual<double, Scalar>(n, wt, u_ext, v, e, ext);
229 case HERMES_HDIV_NORM:
230 return hdiv_projection_residual<double, Scalar>(n, wt, u_ext, v, e, ext);
232 throw Hermes::Exceptions::Exception(
"Unknown projection type");
240 switch (projNormType)
243 return l2_projection_residual<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, v, e, ext);
245 return h1_projection_residual<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, v, e, ext);
246 case HERMES_H1_SEMINORM:
247 return h1_semi_projection_residual<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, v, e, ext);
248 case HERMES_HCURL_NORM:
249 return hcurl_projection_residual<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, v, e, ext);
250 case HERMES_HDIV_NORM:
251 return hdiv_projection_residual<Hermes::Ord, Hermes::Ord>(n, wt, u_ext, v, e, ext);
253 throw Hermes::Exceptions::Exception(
"Unknown projection type");
254 return Hermes::Ord();
266 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
270 SolFunctionDomain result = SolFunctionDomain(0);
271 for (
int i = 0; i < n; i++)
272 result += wt[i] * ((ext[0]->val[i]) * v->
val[i]
273 + (ext[0]->dx[i]) * v->dx[i]
274 + (ext[0]->
dy[i]) * v->
dy[i]);
278 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
282 SolFunctionDomain result = SolFunctionDomain(0);
283 for (
int i = 0; i < n; i++)
284 result += wt[i] * ((ext[0]->dx[i]) * v->dx[i]
285 + (ext[0]->
dy[i]) * v->
dy[i]);
289 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
293 SolFunctionDomain result = SolFunctionDomain(0);
294 for (
int i = 0; i < n; i++)
295 result += wt[i] * (ext[0]->val[i]) * v->
val[i];
299 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
303 SolFunctionDomain result = SolFunctionDomain(0);
304 for (
int i = 0; i < n; i++) {
305 result += wt[i] * (ext[0]->
curl[i]) * conj(v->
curl[i]);
306 result += wt[i] * ((ext[0]->val0[i]) * conj(v->val0[i])
307 + (ext[0]->
val1[i]) * conj(v->
val1[i]));
313 template<
typename TestFunctionDomain,
typename SolFunctionDomain>
317 SolFunctionDomain result = SolFunctionDomain(0);
318 for (
int i = 0; i < n; i++) {
319 result += wt[i] * (ext[0]->
div[i]) * conj(v->
div[i]);
320 result += wt[i] * ((ext[0]->val0[i]) * conj(v->val0[i])
321 + (ext[0]->
val1[i]) * conj(v->
val1[i]));