v0.16.0
Loading...
Searching...
No Matches
Hdiv.hpp
Go to the documentation of this file.
1/** \file Hdiv.hpp
2
3 \brief Implementation of H-curl base function.
4
5 Based on Hierarchic Finite Element Bases on Unstructured Tetrahedral
6 Meshes, by Mark Ainsworth and Joe Coyle
7 Shape functions for MBTRI/MBTET and HCurl space
8
9*/
10
11#ifndef __HDIV_HPP__
12#define __HDIV_HPP__
13
14namespace MoFEM {
15
16/** \brief Broken base Ainsworth subentries order change hooks.
17 *
18 * Hooks enabling change of DOFs numbers/polynomial order on subentries, when
19 * base on element is constructed.
20 *
21 * Note that this functionality is global, that all functions are static.
22 *
23 **/
25 static boost::function<int(int)> broken_nbfacetri_edge_hdiv;
26 static boost::function<int(int)> broken_nbfacetri_face_hdiv;
27 static boost::function<int(int)> broken_nbvolumetet_edge_hdiv;
28 static boost::function<int(int)> broken_nbvolumetet_face_hdiv;
29 static boost::function<int(int)> broken_nbvolumetet_volume_hdiv;
30};
31
32/** \brief Compile-time options for Ainsworth H(div) basis variants.
33 */
35 /** \brief Auxiliary edge coordinate used in Ainsworth H(div) functions.
36 */
37 enum class EdgeCoordinate {
38 PAPER, ///< xi_oi = lambda_i - lambda_o, as in \cite NME:NME847.
39 ENDPOINT_I, ///< 2*lambda_i - 1, rank-repaired variant.
40 ENDPOINT_O ///< 1 - 2*lambda_o, rank-repaired variant.
41 };
42
43 /** \brief Selected edge coordinate variant.
44 *
45 * The literal Ainsworth-Coyle \cite NME:NME847 Table IV coordinate gives a
46 * symbolic linear dependence in the l=1 face-edge block. The endpoint
47 * variants agree with the paper coordinate on the edge itself and avoid that
48 * dependence, but change the extension into the face and volume.
49 */
51};
52
53/**
54 * \brief Hdiv base functions, Edge-based face functions by Ainsworth \cite
55 * NME:NME847
56 * @param faces_nodes Face nodes on tetrahedral
57 * @param p Approximation order on faces
58 * @param N Shape functions
59 * @param diffN Derivatives of shape functions
60 * @param phi_f_e Base functions (returned)
61 * @param diff_phi_f_e Derivatives of base functions (returned)
62 * @param gdim Number of integration pts
63 * @param base_polynomials base function (Legendre/Lobbatto-Gauss)
64 * @return error code
65 */
67 int *faces_nodes, int *p, double *N, double *diffN, double *phi_f_e[4][3],
68 double *diff_phi_f_e[4][3], int gdim,
69 PetscErrorCode (*base_polynomials)(int p, double s, double *diff_s,
70 double *L, double *diffL,
71 const int dim));
72
73/**
74 * \brief Hdiv base functions, Edge-based face functions by Ainsworth \cite
75 * NME:NME847
76 * @param faces_nodes Face nodes on face
77 * @param p Approximation order on faces
78 * @param N Shape functions
79 * @param diffN Derivatives of shape functions
80 * @param phi_f_e Base functions (returned)
81 * @param diff_phi_f_e Derivatives of base functions (returned)
82 * @param gdim Number of integration pts
83 * @param base_polynomials base function (Legendre/Lobbatto-Gauss)
84 * @param nb Number of nodes on entity (4 if tet, 3 if triangle)
85 * @return error code
86 */
88 int *faces_nodes, int p, double *N, double *diffN, double *phi_f_e[3],
89 double *diff_phi_f_e[3], int gdim, int nb,
90 PetscErrorCode (*base_polynomials)(int p, double s, double *diff_s,
91 double *L, double *diffL,
92 const int dim));
93
94/**
95 * \brief Face bubble functions by Ainsworth \cite NME:NME847
96 * @param faces_nodes Face nodes on tetrahedral
97 * @param p Approx. order on faces
98 * @param N Shape function
99 * @param diffN Derivatives of shape functions
100 * @param phi_f Base functions
101 * @param diff_phi_f Derivatives of base functions
102 * @param gdim Number of integration pts
103 * @param base_polynomials Base function (Legendre/Lobbatto-Gauss)
104 * @return error code
105 */
107 int *faces_nodes, int *p, double *N, double *diffN, double *phi_f[],
108 double *diff_phi_f[], int gdim,
109 PetscErrorCode (*base_polynomials)(int p, double s, double *diff_s,
110 double *L, double *diffL,
111 const int dim));
112
113/**
114 * \brief Face bubble functions by Ainsworth \cite NME:NME847
115 * @param faces_nodes Face nodes on face
116 * @param p Approx. order on face
117 * @param N Shape function
118 * @param diffN Derivatives of shape functions
119 * @param phi_f Base functions
120 * @param diff_phi_f Derivatives of base functions
121 * @param gdim Number of integration pts
122 * @param nb Number of nodes on entity (4 if tet, 3 if triangle)
123 * @param base_polynomials Base function (Legendre/Lobbatto-Gauss)
124 * @return error code
125 */
127 int *faces_nodes, int p, double *N, double *diffN, double *phi_f,
128 double *diff_phi_f, int gdim, int nb,
129 PetscErrorCode (*base_polynomials)(int p, double s, double *diff_s,
130 double *L, double *diffL,
131 const int dim));
132
133/**
134 * \brief Hdiv base function, Edge-based interior (volume) functions by
135 * Ainsworth \cite NME:NME847
136 * @param p volume approx. order
137 * @param N shape functions
138 * @param diffN derivatives of shape functions
139 * @param phi_v_e base functions (return)
140 * @param diff_phi_v_e derivatives of base functions (returned)
141 * @param gdim number of integration points
142 * @param base_polynomials base function (Legendre/Lobbatto-Gauss)
143 * @return error code
144 */
146 int p, double *N, double *diffN, double *phi_v_e[6],
147 double *diff_phi_v_e[6], int gdim,
148 PetscErrorCode (*base_polynomials)(int p, double s, double *diff_s,
149 double *L, double *diffL,
150 const int dim));
151
152/** Hdiv Face-based interior functions by Ainsworth \cite NME:NME847
153 * @param p Approximation order on face
154 * @param N Shape functions on face
155 * @param diffN Derivatives of shape functions of face
156 * @param phi_v_f Base functions (returned)
157 * @param diff_phi_v_f Derivatives of base functions (returned)
158 * @param gdim Number of integration points
159 * @param base_polynomials Base function (Legendre/Lobbatto-Gauss)
160 * @return Error code
161 */
163 int p, double *N, double *diffN, double *phi_v_f[], double *diff_phi_v_f[],
164 int gdim,
165 PetscErrorCode (*base_polynomials)(int p, double s, double *diff_s,
166 double *L, double *diffL,
167 const int dim));
168
169/**
170 * \brief Interior bubble functions by Ainsworth \cite NME:NME847
171 * @param p Volume order
172 * @param N Shape functions
173 * @param diffN Derivatives of shape functions
174 * @param phi_v Base functions
175 * @param diff_phi_v Derivatives of shape functions
176 * @param gdim Number of integration points
177 * @param base_polynomials Base function (Legendre/Lobbatto-Gauss)
178 * @return Error code
179 */
181 int p, double *N, double *diffN, double *phi_v, double *diff_phi_v,
182 int gdim,
183 PetscErrorCode (*base_polynomials)(int p, double s, double *diff_s,
184 double *L, double *diffL,
185 const int dim));
186
187/**
188 * \brirf HDiv base finuctions on triangle by Demkowicz \cite
189 * fuentes2015orientation
190 *
191 * @param faces_nodes Nodes on face
192 * @param p Approx. order
193 * @param N Shape functions
194 * @param diffN Derivatives of shape functions
195 * @param phi_f Returned base functions on face
196 * @param diff_phi_f Returned derivatives of base functions on face
197 * @param gdim Number of integration points
198 * @param nb nb is 4 for face on tetrahedral and 3 for face
199 * @return error code
200 */
202 double *N, double *diffN,
203 double *phi_f,
204 double *diff_phi_f, int gdim,
205 int nb);
206
207/**
208 * \brirf HDiv base finuctions in tetrahedral interior by Demkowicz \cite
209 * fuentes2015orientation
210 *
211 * @param p Approximation order
212 * @param N Shape functions
213 * @param diffN Derivatives of base functions
214 * @param p_face Max order on faces
215 * @param phi_f Precalculated face base functions
216 * @param diff_phi_f Precalculated derivatives of face base functions
217 * @param phi_v Returned base functions in volume
218 * @param diff_phi_v Returned derivatives of base functions in volume
219 * @param gdim Number of integration points
220 * @return error code
221 */
222MoFEMErrorCode Hdiv_Demkowicz_Interior_MBTET(int p, double *N, double *diffN,
223 int p_face[], double *phi_f[4],
224 double *diff_phi_f[4],
225 double *phi_v, double *diff_phi_v,
226 int gdim);
227
228} // namespace MoFEM
229
230#endif // __HDIV_HPP__
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
MoFEMErrorCode Hdiv_Ainsworth_FaceBubbleShapeFunctions(int *faces_nodes, int *p, double *N, double *diffN, double *phi_f[], double *diff_phi_f[], int gdim, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face bubble functions by Ainsworth .
Definition Hdiv.cpp:201
MoFEMErrorCode Hdiv_Demkowicz_Face_MBTET_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f, double *diff_phi_f, int gdim, int nb)
Definition Hdiv.cpp:683
MoFEMErrorCode Hdiv_Ainsworth_EdgeFaceShapeFunctions_MBTET(int *faces_nodes, int *p, double *N, double *diffN, double *phi_f_e[4][3], double *diff_phi_f_e[4][3], int gdim, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Hdiv base functions, Edge-based face functions by Ainsworth .
Definition Hdiv.cpp:24
MoFEMErrorCode Hdiv_Ainsworth_EdgeFaceShapeFunctions_MBTET_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f_e[3], double *diff_phi_f_e[3], int gdim, int nb, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Hdiv base functions, Edge-based face functions by Ainsworth .
Definition Hdiv.cpp:97
MoFEMErrorCode Hdiv_Demkowicz_Interior_MBTET(int p, double *N, double *diffN, int p_face[], double *phi_f[4], double *diff_phi_f[4], double *phi_v, double *diff_phi_v, int gdim)
Definition Hdiv.cpp:829
MoFEMErrorCode Hdiv_Ainsworth_FaceBasedVolumeShapeFunctions_MBTET(int p, double *N, double *diffN, double *phi_v_f[], double *diff_phi_v_f[], int gdim, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Definition Hdiv.cpp:450
MoFEMErrorCode Hdiv_Ainsworth_FaceBubbleShapeFunctions_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f, double *diff_phi_f, int gdim, int nb, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face bubble functions by Ainsworth .
Definition Hdiv.cpp:224
MoFEMErrorCode Hdiv_Ainsworth_EdgeBasedVolumeShapeFunctions_MBTET(int p, double *N, double *diffN, double *phi_v_e[6], double *diff_phi_v_e[6], int gdim, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Hdiv base function, Edge-based interior (volume) functions by Ainsworth .
Definition Hdiv.cpp:357
MoFEMErrorCode Hdiv_Ainsworth_VolumeBubbleShapeFunctions_MBTET(int p, double *N, double *diffN, double *phi_v, double *diff_phi_v, int gdim, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Interior bubble functions by Ainsworth .
Definition Hdiv.cpp:556
const int N
Definition speed_test.cpp:3
Compile-time options for Ainsworth H(div) basis variants.
Definition Hdiv.hpp:34
EdgeCoordinate
Auxiliary edge coordinate used in Ainsworth H(div) functions.
Definition Hdiv.hpp:37
@ PAPER
xi_oi = lambda_i - lambda_o, as in .
@ ENDPOINT_O
1 - 2*lambda_o, rank-repaired variant.
@ ENDPOINT_I
2*lambda_i - 1, rank-repaired variant.
static constexpr EdgeCoordinate edge_coordinate
Selected edge coordinate variant.
Definition Hdiv.hpp:50
Broken base Ainsworth subentries order change hooks.
Definition Hdiv.hpp:24
static boost::function< int(int)> broken_nbvolumetet_edge_hdiv
Definition Hdiv.hpp:27
static boost::function< int(int)> broken_nbvolumetet_face_hdiv
Definition Hdiv.hpp:28
static boost::function< int(int)> broken_nbfacetri_face_hdiv
Definition Hdiv.hpp:26
static boost::function< int(int)> broken_nbvolumetet_volume_hdiv
Definition Hdiv.hpp:29
static boost::function< int(int)> broken_nbfacetri_edge_hdiv
Definition Hdiv.hpp:25