PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
VEM_PCC_PerformanceAnalysis.hpp
Go to the documentation of this file.
1// _LICENSE_HEADER_
2//
3// Copyright (C) 2019 - 2025.
4// Terms register on the GPL-3.0 license.
5//
6// This file can be redistributed and/or modified under the license terms.
7//
8// See top level LICENSE file for more details.
9//
10// This file can be used citing references in CITATION.cff file.
11
12#ifndef __VEM_PCC_PerformanceAnalysis_HPP
13#define __VEM_PCC_PerformanceAnalysis_HPP
14
15#include "Eigen/Eigen"
16#include <vector>
17
18#include "LAPACK_utilities.hpp"
19#include "VEM_PCC_Utilities.hpp"
20
21namespace Polydim
22{
23namespace VEM
24{
25namespace PCC
26{
28{
29 double PiNablaConditioning = -1.0;
30 double Pi0km1Conditioning = -1.0;
31 double Pi0kConditioning = -1.0;
32 double ErrorPiNabla = -1.0;
33 double ErrorPi0km1 = -1.0;
34 double ErrorPi0k = -1.0;
35 std::vector<double> ErrorPi0km1Grad;
36 double StabNorm = -1.0;
37 double ErrorStabilization = -1.0;
38 double ErrorHCD = -1.0;
39 double ErrorGBD = -1.0;
40 std::vector<double> ErrorHED;
41};
42
44{
45 template <typename VEM_Monomials_Type, typename VEM_Monomials_Data_Type, typename VEM_LocalSpace_Type, typename VEM_LocalSpaceData_Type>
46 VEM_PCC_PerformanceAnalysis_Data Compute(const VEM_Monomials_Type &vem_monomials,
47 const VEM_Monomials_Data_Type &vem_monomials_data,
48 const VEM_LocalSpace_Type &vem_local_space,
49 const VEM_LocalSpaceData_Type &vem_local_space_data) const
50 {
52
53 const double invDiameter = 1.0 / vem_local_space_data.Diameter;
54
55 const Eigen::MatrixXd &piNabla = vem_local_space_data.PiNabla;
56 const Eigen::MatrixXd &pi0km1 = vem_local_space_data.Pi0km1;
57 const Eigen::MatrixXd &pi0k = vem_local_space_data.Pi0k;
58
62
63 const Eigen::MatrixXd identity = Eigen::MatrixXd::Identity(vem_local_space_data.NumProjectorBasisFunctions,
64 vem_local_space_data.NumProjectorBasisFunctions);
65
66 const unsigned int Nkm1 = pi0km1.rows();
67 const unsigned int Nk = piNabla.rows();
68
69 result.ErrorPiNabla = (piNabla * vem_local_space_data.Dmatrix - identity).norm() / identity.norm();
70 result.ErrorPi0km1 = (pi0km1 * vem_local_space_data.Dmatrix.leftCols(Nkm1) - identity.topLeftCorner(Nkm1, Nkm1)).norm() /
71 identity.topLeftCorner(Nkm1, Nkm1).norm();
72
73 result.ErrorPi0k = (pi0k * vem_local_space_data.Dmatrix - identity).norm() / identity.norm();
74
75 result.ErrorPi0km1Grad.resize(vem_local_space_data.Pi0km1Der.size());
76 for (unsigned int d = 0; d < vem_local_space_data.Pi0km1Der.size(); ++d)
77 {
78 const Eigen::MatrixXd &piDerkm1 = vem_local_space_data.Pi0km1Der[d];
79 const Eigen::MatrixXd derMatrix =
80 invDiameter * (vem_local_space_data.Qmatrix *
81 vem_monomials.DerivativeMatrix(vem_monomials_data, d).topLeftCorner(Nk, Nkm1) *
82 vem_local_space_data.QmatrixInv.topLeftCorner(Nkm1, Nkm1))
83 .transpose();
84 double relErrDenominator = (Nkm1 > 1) ? derMatrix.norm() : 1.0;
85 result.ErrorPi0km1Grad[d] = (piDerkm1 * vem_local_space_data.Dmatrix - derMatrix).norm() / relErrDenominator;
86 }
87
88 const Eigen::MatrixXd StabMatrix =
89 vem_local_space.ComputeDofiDofiStabilizationMatrix(vem_local_space_data, ProjectionTypes::PiNabla);
90
91 const Eigen::MatrixXd &stabilizationMatrix = StabMatrix;
92 result.StabNorm = StabMatrix.norm();
93 result.ErrorStabilization = (stabilizationMatrix * vem_local_space_data.Dmatrix).norm();
94
95 if (vem_local_space_data.Hmatrix.size() > 0 && vem_local_space_data.Cmatrix.size() > 0)
96 result.ErrorHCD =
97 (vem_local_space_data.Hmatrix - vem_local_space_data.Cmatrix * vem_local_space_data.Dmatrix).norm() /
98 vem_local_space_data.Hmatrix.norm();
99 if (vem_local_space_data.Gmatrix.size() > 0 && vem_local_space_data.Bmatrix.size() > 0)
100 result.ErrorGBD =
101 (vem_local_space_data.Gmatrix - vem_local_space_data.Bmatrix * vem_local_space_data.Dmatrix).norm() /
102 vem_local_space_data.Gmatrix.norm();
103
104 result.ErrorHED.resize(vem_local_space_data.Pi0km1Der.size(), -1.0);
105 for (unsigned int d = 0; d < vem_local_space_data.Pi0km1Der.size(); d++)
106 {
107 const Eigen::MatrixXd derMatrix =
108 invDiameter *
109 vem_monomials.DerivativeMatrix(vem_monomials_data, d).topLeftCorner(Nk, vem_local_space_data.Nkm1) *
110 vem_local_space_data.Hmatrix.topLeftCorner(vem_local_space_data.Nkm1, vem_local_space_data.Nkm1);
111
112 result.ErrorHED[d] =
113 (derMatrix.transpose() - vem_local_space_data.Ematrix[d] * vem_local_space_data.Dmatrix).norm() /
114 derMatrix.norm();
115 }
116
117 return result;
118 }
119};
120
121} // namespace PCC
122} // namespace VEM
123} // namespace Polydim
124
125#endif
double cond(const Eigen::VectorXd &s)
Compute condition number in norm 2 given singular values.
Definition LAPACK_utilities.hpp:38
void svd(Eigen::MatrixXd A, Eigen::MatrixXd &V, Eigen::VectorXd &S)
Given A = U * S * V' returns only S and V'.
Definition LAPACK_utilities.cpp:166
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition VEM_PCC_PerformanceAnalysis.hpp:28
double ErrorStabilization
|S * Dofs|
Definition VEM_PCC_PerformanceAnalysis.hpp:37
std::vector< double > ErrorPi0km1Grad
Error of Pi0km1Grad, size geometric dimension.
Definition VEM_PCC_PerformanceAnalysis.hpp:35
double ErrorHCD
|H - CD|
Definition VEM_PCC_PerformanceAnalysis.hpp:38
double ErrorPiNabla
|piNabla * Dofs - I|
Definition VEM_PCC_PerformanceAnalysis.hpp:32
std::vector< double > ErrorHED
|H - ED|
Definition VEM_PCC_PerformanceAnalysis.hpp:40
double ErrorGBD
|G - BD|
Definition VEM_PCC_PerformanceAnalysis.hpp:39
double PiNablaConditioning
conditioning of piNabla
Definition VEM_PCC_PerformanceAnalysis.hpp:29
double ErrorPi0k
|pi0k * Dofs - I|
Definition VEM_PCC_PerformanceAnalysis.hpp:34
double Pi0kConditioning
conditioning of pi0k
Definition VEM_PCC_PerformanceAnalysis.hpp:31
double Pi0km1Conditioning
conditioning of pi0km1
Definition VEM_PCC_PerformanceAnalysis.hpp:30
double ErrorPi0km1
|pi0km1 * Dofs.leftCols(Nkm1) - I.topLeftCorner(Nkm1, Nkm1)|
Definition VEM_PCC_PerformanceAnalysis.hpp:33
double StabNorm
Norm of S.
Definition VEM_PCC_PerformanceAnalysis.hpp:36
Definition VEM_PCC_PerformanceAnalysis.hpp:44
VEM_PCC_PerformanceAnalysis_Data Compute(const VEM_Monomials_Type &vem_monomials, const VEM_Monomials_Data_Type &vem_monomials_data, const VEM_LocalSpace_Type &vem_local_space, const VEM_LocalSpaceData_Type &vem_local_space_data) const
Definition VEM_PCC_PerformanceAnalysis.hpp:46