40template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
41double errorFrobRel(GeometricField<Type, PatchField, GeoMesh>& field1,
42 GeometricField<Type, PatchField, GeoMesh>& field2, List<label>* labels)
45 autoPtr<GeometricField<Type, PatchField, GeoMesh >> errField;
46 autoPtr<GeometricField<Type, PatchField, GeoMesh >> field1_S;
47 autoPtr<GeometricField<Type, PatchField, GeoMesh >> field2_S;
48 autoPtr<fvMeshSubset> submesh;
52 submesh = autoPtr<fvMeshSubset>(
new fvMeshSubset(field1.mesh()));
54 submesh->setCellSubset(* labels);
56 submesh->setLargeCellSubset(* labels);
58 GeometricField<Type, PatchField, GeoMesh> field1tmp(submesh->interpolate(
60 GeometricField<Type, PatchField, GeoMesh> field2tmp(submesh->interpolate(
62 field1_S = autoPtr<GeometricField<Type, PatchField, GeoMesh >>
63 (
new GeometricField<Type, PatchField, GeoMesh>(field1tmp.clone()));
64 field2_S = autoPtr<GeometricField<Type, PatchField, GeoMesh >>
65 (
new GeometricField<Type, PatchField, GeoMesh>(field2tmp.clone()));
69 field1_S = autoPtr<GeometricField<Type, PatchField, GeoMesh >>
70 (
new GeometricField<Type, PatchField, GeoMesh>(field1));
71 field2_S = autoPtr<GeometricField<Type, PatchField, GeoMesh >>
72 (
new GeometricField<Type, PatchField, GeoMesh>(field2));
75 errField = autoPtr<GeometricField<Type, PatchField, GeoMesh >>
76 (
new GeometricField<Type, PatchField, GeoMesh>(field1_S() - field2_S()));
91template double errorFrobRel(GeometricField<scalar, fvPatchField, volMesh>&
93 GeometricField<scalar, fvPatchField, volMesh>& field2, List<label>* labels);
94template double errorFrobRel(GeometricField<vector, fvPatchField, volMesh>&
96 GeometricField<vector, fvPatchField, volMesh>& field2, List<label>* labels);
98template double errorFrobRel(GeometricField<scalar, fvsPatchField, surfaceMesh>
101 GeometricField<scalar, fvsPatchField, surfaceMesh>& field2,
102 List<label>* labels);
107 GeometricField<T, fvPatchField, volMesh>& field2, List<label>* labels)
110 autoPtr<GeometricField<T, fvPatchField, volMesh >> errField;
111 autoPtr<GeometricField<T, fvPatchField, volMesh >> field1_S;
112 autoPtr<GeometricField<T, fvPatchField, volMesh >> field2_S;
113 autoPtr<fvMeshSubset> submesh;
117 submesh = autoPtr<fvMeshSubset>(
new fvMeshSubset(field1.mesh()));
119 submesh->setCellSubset(* labels);
121 submesh->setLargeCellSubset(* labels);
123 GeometricField<T, fvPatchField, volMesh> field1tmp(submesh->interpolate(
125 GeometricField<T, fvPatchField, volMesh> field2tmp(submesh->interpolate(
127 field1_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
128 (
new GeometricField<T, fvPatchField, volMesh>(field1tmp.clone()));
129 field2_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
130 (
new GeometricField<T, fvPatchField, volMesh>(field2tmp.clone()));
134 field1_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
135 (
new GeometricField<T, fvPatchField, volMesh>(field1));
136 field2_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
137 (
new GeometricField<T, fvPatchField, volMesh>(field2));
140 errField = autoPtr<GeometricField<T, fvPatchField, volMesh >>
141 (
new GeometricField<T, fvPatchField, volMesh>(field1_S() - field2_S()));
143 if (LinfNorm(field1_S()) <= 1e-6)
149 err = LinfNorm(errField()) / LinfNorm(field1_S());
156template double errorLinfRel(GeometricField<scalar, fvPatchField, volMesh>&
158 GeometricField<scalar, fvPatchField, volMesh>& field2, List<label>* labels);
159template double errorLinfRel(GeometricField<vector, fvPatchField, volMesh>&
161 GeometricField<vector, fvPatchField, volMesh>& field2, List<label>* labels);
164double errorL2Abs(GeometricField<vector, fvPatchField, volMesh>& field1,
165 GeometricField<vector, fvPatchField, volMesh>& field2, volScalarField& Volumes)
168 volScalarField diffFields2 = (((field1 - field2) & (field1 - field2)) *
170 double err = Foam::sqrt(gSum(diffFields2));
175double errorL2Abs(GeometricField<scalar, fvPatchField, volMesh>& field1,
176 GeometricField<scalar, fvPatchField, volMesh>& field2, volScalarField& Volumes)
179 volScalarField diffFields2 = (((field1 - field2) * (field1 - field2)) *
181 double err = Foam::sqrt(gSum(diffFields2));
186double errorL2Abs(GeometricField<T, fvPatchField, volMesh>& field1,
187 GeometricField<T, fvPatchField, volMesh>& field2, List<label>* labels)
189 autoPtr<GeometricField<T, fvPatchField, volMesh >> errField;
190 autoPtr<GeometricField<T, fvPatchField, volMesh >> field1_S;
191 autoPtr<GeometricField<T, fvPatchField, volMesh >> field2_S;
192 autoPtr<fvMeshSubset> submesh;
196 submesh = autoPtr<fvMeshSubset>(
new fvMeshSubset(field1.mesh()));
198 submesh->setCellSubset(* labels);
200 submesh->setLargeCellSubset(* labels);
202 GeometricField<T, fvPatchField, volMesh> field1tmp(submesh->interpolate(
204 GeometricField<T, fvPatchField, volMesh> field2tmp(submesh->interpolate(
206 field1_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
207 (
new GeometricField<T, fvPatchField, volMesh>(field1tmp.clone()));
208 field2_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
209 (
new GeometricField<T, fvPatchField, volMesh>(field2tmp.clone()));
213 field1_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
214 (
new GeometricField<T, fvPatchField, volMesh>(field1));
215 field2_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
216 (
new GeometricField<T, fvPatchField, volMesh>(field2));
219 errField = autoPtr<GeometricField<T, fvPatchField, volMesh >>
220 (
new GeometricField<T, fvPatchField, volMesh>(field1_S() - field2_S()));
221 double err =
L2Norm(errField());
225template double errorL2Abs(GeometricField<scalar, fvPatchField, volMesh>&
227 GeometricField<scalar, fvPatchField, volMesh>& field2, List<label>* labels);
228template double errorL2Abs(GeometricField<vector, fvPatchField, volMesh>&
230 GeometricField<vector, fvPatchField, volMesh>& field2, List<label>* labels);
233template<
class T,
template<
class>
class PatchField,
class GeoMesh>
234Eigen::MatrixXd
errorFrobRel(PtrList<GeometricField<T, PatchField, GeoMesh >>&
236 PtrList<GeometricField<T, PatchField, GeoMesh >>& fields2, List<label>* labels)
240 if (fields1.size() != fields2.size())
242 Info <<
"The two fields do not have the same size, code will abort" << endl;
246 err.resize(fields1.size(), 1);
248 for (label k = 0; k < fields1.size(); k++)
250 err(k, 0) =
errorFrobRel(fields1[k], fields2[k], labels);
251 Info <<
" Error is " << err[k] << endl;
258 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields1,
259 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields2,
260 List<label>* labels);
262 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields1,
263 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields2,
264 List<label>* labels);
266 PtrList<GeometricField<scalar, fvsPatchField, surfaceMesh >>& fields1,
267 PtrList<GeometricField<scalar, fvsPatchField, surfaceMesh >>& fields2,
268 List<label>* labels);
272Eigen::MatrixXd errorL2Abs(
273 PtrList<GeometricField<T, fvPatchField, volMesh >>& fields1,
274 PtrList<GeometricField<T, fvPatchField, volMesh >>& fields2,
275 PtrList<volScalarField>& Volumes)
277 M_Assert(fields1.size() == fields2.size(),
278 "The two fields do not have the same size, code will abort");
279 M_Assert(fields1.size() == Volumes.size(),
280 "The volumes field and the two solution fields do not have the same size, code will abort");
282 err.resize(fields1.size(), 1);
284 for (label k = 0; k < fields1.size(); k++)
286 err(k, 0) = errorL2Abs(fields1[k], fields2[k], Volumes[k]);
287 Info <<
" Error is " << err[k] << endl;
293template Eigen::MatrixXd errorL2Abs(
294 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields1,
295 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields2,
296 PtrList<volScalarField>& Volumes);
297template Eigen::MatrixXd errorL2Abs(
298 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields1,
299 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields2,
300 PtrList<volScalarField>& Volumes);
303Eigen::MatrixXd errorL2Abs(PtrList<GeometricField<T, fvPatchField, volMesh >>&
305 PtrList<GeometricField<T, fvPatchField, volMesh >>& fields2,
310 if (fields1.size() != fields2.size())
312 Info <<
"The two fields do not have the same size, code will abort" << endl;
316 err.resize(fields1.size(), 1);
318 for (label k = 0; k < fields1.size(); k++)
320 err(k, 0) = errorL2Abs(fields1[k], fields2[k], labels);
321 Info <<
" Error is " << err[k] << endl;
327template Eigen::MatrixXd errorL2Abs(
328 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields1,
329 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields2,
330 List<label>* labels);
331template Eigen::MatrixXd errorL2Abs(
332 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields1,
333 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields2,
334 List<label>* labels);
337double errorL2Rel(GeometricField<T, fvPatchField, volMesh>& field1,
338 GeometricField<T, fvPatchField, volMesh>& field2, List<label>* labels)
341 autoPtr<GeometricField<T, fvPatchField, volMesh >> errField;
342 autoPtr<GeometricField<T, fvPatchField, volMesh >> field1_S;
343 autoPtr<GeometricField<T, fvPatchField, volMesh >> field2_S;
344 autoPtr<fvMeshSubset> submesh;
348 submesh = autoPtr<fvMeshSubset>(
new fvMeshSubset(field1.mesh()));
350 submesh->setCellSubset(* labels);
352 submesh->setLargeCellSubset(* labels);
354 GeometricField<T, fvPatchField, volMesh> field1tmp(submesh->interpolate(
356 GeometricField<T, fvPatchField, volMesh> field2tmp(submesh->interpolate(
358 field1_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
359 (
new GeometricField<T, fvPatchField, volMesh>(field1tmp.clone()));
360 field2_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
361 (
new GeometricField<T, fvPatchField, volMesh>(field2tmp.clone()));
365 field1_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
366 (
new GeometricField<T, fvPatchField, volMesh>(field1));
367 field2_S = autoPtr<GeometricField<T, fvPatchField, volMesh >>
368 (
new GeometricField<T, fvPatchField, volMesh>(field2));
371 errField = autoPtr<GeometricField<T, fvPatchField, volMesh >>
372 (
new GeometricField<T, fvPatchField, volMesh>(field1_S() - field2_S()));
374 if (
L2Norm(field1) <= 1e-6)
387template double errorL2Rel(GeometricField<scalar, fvPatchField, volMesh>&
389 GeometricField<scalar, fvPatchField, volMesh>& field2, List<label>* labels);
390template double errorL2Rel(GeometricField<vector, fvPatchField, volMesh>&
392 GeometricField<vector, fvPatchField, volMesh>& field2, List<label>* labels);
395Eigen::MatrixXd
errorL2Rel(PtrList<GeometricField<T, fvPatchField, volMesh >>&
396 fields1, PtrList<GeometricField<T, fvPatchField, volMesh >>& fields2,
401 if (fields1.size() != fields2.size())
403 Info <<
"The two fields do not have the same size, code will abort" << endl;
407 err.resize(fields1.size(), 1);
409 for (label k = 0; k < fields1.size(); k++)
411 err(k, 0) =
errorL2Rel(fields1[k], fields2[k], labels);
412 Info <<
" Error is " << err[k] << endl;
419 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields1,
420 PtrList<GeometricField<scalar, fvPatchField, volMesh >>& fields2,
421 List<label>* labels);
423 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields1,
424 PtrList<GeometricField<vector, fvPatchField, volMesh >>& fields2,
425 List<label>* labels);
Header file of the ITHACAerror file.
Namespace to implement some useful assign operation of OF fields.
double errorLinfRel(GeometricField< T, fvPatchField, volMesh > &field1, GeometricField< T, fvPatchField, volMesh > &field2, List< label > *labels)
Computes the relative error between two geometric Fields in Linf norm.
double errorL2Rel(GeometricField< T, fvPatchField, volMesh > &field1, GeometricField< T, fvPatchField, volMesh > &field2, List< label > *labels)
Computes the relative error between two geometric Fields in L2 norm.
double frobNorm(GeometricField< Type, PatchField, GeoMesh > &field)
Evaluate the Frobenius norm of a field.
double errorFrobRel(GeometricField< Type, PatchField, GeoMesh > &field1, GeometricField< Type, PatchField, GeoMesh > &field2, List< label > *labels)
Computes the relative error between two Fields in the Frobenius norm.
double L2Norm(const T v)
Compute the L2 norm of v.