Directory: | ./ |
---|---|
File: | FiniteElement/basisFunction.hpp |
Date: | 2024-04-14 07:32:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 13 | 15 | 86.7% |
Branches: | 6 | 12 | 50.0% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // ______ ______ _ _ _____ ______ | ||
2 | // | ____| ____| | (_)/ ____| | ____| | ||
3 | // | |__ | |__ | | _| (___ ___| |__ | ||
4 | // | __| | __| | | | |\___ \ / __| __| | ||
5 | // | | | |____| |____| |____) | (__| |____ | ||
6 | // |_| |______|______|_|_____/ \___|______| | ||
7 | // Finite Elements for Life Sciences and Engineering | ||
8 | // | ||
9 | // License: LGL2.1 License | ||
10 | // FELiScE default license: LICENSE in root folder | ||
11 | // | ||
12 | // Main authors: J-F. Gerbeau | ||
13 | // | ||
14 | |||
15 | #ifndef BASISFUNCTION_H | ||
16 | #define BASISFUNCTION_H | ||
17 | |||
18 | // System includes | ||
19 | #include <string> | ||
20 | #include <cassert> | ||
21 | |||
22 | // External includes | ||
23 | |||
24 | // Project includes | ||
25 | #include "Core/felisce.hpp" | ||
26 | |||
27 | namespace felisce | ||
28 | { | ||
29 | /*! | ||
30 | \class BasisFunction | ||
31 | \authors J-F. Gerbeau | ||
32 | \brief Class implementing the basis functions | ||
33 | */ | ||
34 | |||
35 | class BasisFunction { | ||
36 | protected: | ||
37 | std::string m_name; | ||
38 | const int m_size; //!< number of basis functions | ||
39 | const int m_numCoor; //!< number of coordinates used by the functions | ||
40 | const int m_dim; //!< dimension of the result (in general 1) | ||
41 | const FunctionXYZ* m_phi; //!< pointer on the basis functions | ||
42 | const FunctionXYZ* m_dPhi; //!< pointer on the derivatives of the basis functions | ||
43 | const FunctionXYZ* m_d2Phi; //!< pointer on the second derivatives of the basis functions | ||
44 | public: | ||
45 | BasisFunction(const std::string& name,int size,int numCoor,const FunctionXYZ* phi, const FunctionXYZ* dPhi,const FunctionXYZ* d2Phi); | ||
46 | BasisFunction(const std::string& name,int size,int numCoor,int dim,const FunctionXYZ* phi,const FunctionXYZ* dPhi,const FunctionXYZ* d2Phi); | ||
47 | ✗ | inline const std::string& name() const { | |
48 | ✗ | return m_name; | |
49 | } | ||
50 | 10437281 | inline int size() const { | |
51 | 10437281 | return m_size; | |
52 | } | ||
53 | 12972 | inline int numCoor() const { | |
54 | 12972 | return m_numCoor; | |
55 | } | ||
56 | void print(int verbose,std::ostream& c=std::cout) const; | ||
57 | //! return the value of the i-th basis function on point (x,y,z) | ||
58 | 63065697 | inline double phi( int i, const Point& pt) const { | |
59 | 63065697 | return m_phi[ i ] (pt); | |
60 | } | ||
61 | // \todo : change x,y,z by Point in the following functions : | ||
62 | 10336095 | inline double phi( const int i, const double x, const double y, const double z ) const { | |
63 |
2/4✓ Branch 0 taken 10336095 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10336095 times.
|
10336095 | FEL_ASSERT(m_dim == 1 && i < m_size); |
64 |
1/2✓ Branch 2 taken 10336095 times.
✗ Branch 3 not taken.
|
10336095 | return m_phi[ i ] ( Point(x, y, z) ); |
65 | } | ||
66 | inline double phi( const int i, const double x, const double y, const double z, const int idim) const { | ||
67 | FEL_ASSERT(idim < m_dim && i < m_size); | ||
68 | return m_phi[ m_dim*idim + i ] ( Point(x, y, z) ); | ||
69 | } | ||
70 | //! return the value of the icoor-th derivative of the i-th basis function on point (x,y,z) | ||
71 | inline double dPhi( const int i, const int icoor, const double x, const double y, const double z ) const { | ||
72 | FEL_ASSERT(m_dim == 1); | ||
73 | FEL_ASSERT( i < m_size && icoor < m_numCoor ); | ||
74 | return m_dPhi[ i * m_numCoor + icoor ] ( Point(x, y, z) ); | ||
75 | } | ||
76 | 37829574 | inline double dPhi( const int i, const int icoor, const Point& pt) const { | |
77 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 37829574 times.
|
37829574 | FEL_ASSERT(m_dim == 1); |
78 |
2/4✓ Branch 0 taken 37829574 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 37829574 times.
|
37829574 | FEL_ASSERT( i < m_size && icoor < m_numCoor ); |
79 | 37829574 | return m_dPhi[ i * m_numCoor + icoor ] (pt); | |
80 | } | ||
81 | //! return the value of the (icoor,jcoor)-th second derivative of the i-th basis function on point (x,y,z) | ||
82 | inline double d2Phi( const int i, const int icoor, const int jcoor, const double x, const double y, const double z ) const { | ||
83 | FEL_ASSERT(m_dim == 1); | ||
84 | FEL_ASSERT( i < m_size && icoor < m_numCoor && jcoor < m_numCoor ); | ||
85 | return m_d2Phi[ ( i * m_numCoor + icoor ) * m_numCoor + jcoor ] ( Point(x, y, z) ); | ||
86 | } | ||
87 | inline double divPhi(const int i, const Point& pt) { | ||
88 | (void) pt; | ||
89 | (void) i; | ||
90 | FEL_ASSERT(m_dim == m_numCoor && i<m_size); | ||
91 | return 0.; // TODO ! | ||
92 | } | ||
93 | |||
94 | }; | ||
95 | |||
96 | //============================================================================================= | ||
97 | |||
98 | extern const BasisFunction basisFunctionNULL; | ||
99 | extern const BasisFunction basisFunction0d; | ||
100 | extern const BasisFunction basisFunction1dP1; | ||
101 | extern const BasisFunction basisFunction1dP1b; | ||
102 | extern const BasisFunction basisFunction1dP2; | ||
103 | extern const BasisFunction basisFunction1dP3H; | ||
104 | extern const BasisFunction basisFunction2dP1; | ||
105 | extern const BasisFunction basisFunction2dP1b; | ||
106 | extern const BasisFunction basisFunction2dP2; | ||
107 | extern const BasisFunction basisFunction2dQ1; | ||
108 | extern const BasisFunction basisFunction2dP1xP2; | ||
109 | extern const BasisFunction basisFunction2dQ1b; | ||
110 | extern const BasisFunction basisFunction2dQ2; | ||
111 | extern const BasisFunction basisFunction2dQ2c; | ||
112 | extern const BasisFunction basisFunction3dP1; | ||
113 | extern const BasisFunction basisFunction3dP1b; | ||
114 | extern const BasisFunction basisFunction3dP2; | ||
115 | extern const BasisFunction basisFunction3dQ1; | ||
116 | extern const BasisFunction basisFunction3dQ1b; | ||
117 | extern const BasisFunction basisFunction3dQ2; | ||
118 | extern const BasisFunction basisFunction3dQ2c; | ||
119 | extern const BasisFunction basisFunction3dR1; // prism | ||
120 | extern const BasisFunction basisFunction3dP1xP2; // prism | ||
121 | extern const BasisFunction basisFunction3dR2; | ||
122 | extern const BasisFunction basisFunction3dRT0Tetra; | ||
123 | |||
124 | } | ||
125 | |||
126 | #endif | ||
127 |