33 : _nedges( ne), _nnodes( std::
max(ne,nn)), _order( 1+ (_nedges!=_nnodes)) {
34 assert( ne==3 || ne==4);
45 N[0] = 1. - nc[0] - nc[1];
51 const Real xi = nc[0], xi_minus = 1. - xi;
52 const Real eta = nc[1], eta_minus = 1. - eta;
54 N[0] = xi_minus * eta_minus;
55 N[1] = xi * eta_minus;
57 N[3] = xi_minus * eta;
61 const Real xi=nc[0], eta=nc[1], zeta=1.-xi-eta;
62 N[0] = 2*zeta*zeta-zeta;
72 const Real xi = nc[0], xi_minus = 1. - xi;
73 const Real eta = nc[1], eta_minus = 1. - eta;
75 N[0] = xi_minus * eta_minus * (1. - 2.*xi - 2.*eta);
76 N[1] = xi * eta_minus * (-1. + 2.*xi - 2.*eta);
77 N[2] = xi * eta * (-3. + 2.*xi + 2.*eta);
78 N[3] = xi_minus * eta * (-1. - 2.*xi + 2.*eta);
79 N[4] = 4. * xi_minus * eta_minus * xi;
80 N[5] = 4. * xi * eta_minus * eta;
81 N[6] = 4. * xi * eta * xi_minus;
82 N[7] = 4. * xi_minus * eta * eta_minus;
97 Np[0][0] = -1; Np[0][1] = -1.;
98 Np[1][0] = 1; Np[1][1] = 0;
99 Np[2][0] = 0; Np[2][1] = 1;
103 const Real xi = nc[0], xi_minus = 1. - xi;
104 const Real eta = nc[1], eta_minus = 1. - eta;
106 Np[0][0] = -eta_minus; Np[0][1] = -xi_minus;
107 Np[1][0] = eta_minus; Np[1][1] = -xi;
108 Np[2][0] = eta; Np[2][1] = xi;
109 Np[3][0] = -eta; Np[3][1] = xi_minus;
114 const Real xi=nc[0], eta=nc[1], zeta=1.-xi-eta;
116 Np[0][0] = 1.-4.*zeta; Np[0][1] = 1.-4.*zeta;
117 Np[1][0] = 4.*xi-1; Np[1][1] = 0;
118 Np[2][0] = 0; Np[2][1] = 4*eta-1;
119 Np[3][0] = 4*(zeta-xi); Np[3][1] = -4*xi;
120 Np[4][0] = 4*eta; Np[4][1] = 4*xi;
121 Np[5][0] = -4*eta; Np[5][1] = 4*(zeta-eta);
126 const Real xi = nc[0], xi_minus = 1. - xi;
127 const Real eta = nc[1], eta_minus = 1. - eta;
129 Np[0][0] = eta_minus * ( -3+4*xi+2*eta); Np[0][1] = xi_minus * ( -3+4*eta+2*xi);
130 Np[1][0] = eta_minus * ( -1+4*xi-2*eta); Np[1][1] = xi * (1-2*xi+4.*eta);
131 Np[2][0] = eta * ( -3+4*xi+2*eta); Np[2][1] = xi * ( -3+4*eta+2*xi);
132 Np[3][0] = eta * ( 1 + 4*xi-2*eta); Np[3][1] = xi_minus * ( -1-2*xi+4.*eta);
133 Np[4][0] = eta_minus * (-8 * xi); Np[4][1] = -4*xi*xi_minus;
134 Np[5][0] = 4*eta_minus*eta; Np[5][1] = xi*(-8*eta);
135 Np[6][0] = eta * (-8 * xi); Np[6][1] = 4*xi*xi_minus;
136 Np[7][0] = -4*eta*eta_minus; Np[7][1] = xi_minus*(-8*eta);
161 return (
_nedges == 3) ? 1./2. : 1./4.;
167 if (i==8)
return 16./81.;
168 else if (i<4)
return 25./324.;
175 return (i<3) ? 0.054975871827661 : 0.1116907948390055;
183 const Size doa)
const {
186 nc =
Nat_coor( 0.333333333333333, 0.333333333333333);
188 const Real coors[4][2] = { {0.2113248654051871, 0.2113248654051871},
189 {0.2113248654051871, 0.7886751345948129},
190 {0.7886751345948129, 0.2113248654051871},
191 {0.7886751345948129, 0.7886751345948129}};
192 nc =
Nat_coor( coors[i][0], coors[i][1]);
197 const Real coors[3][2] = { {0.666666666666667, 0.166666666666667},
198 {0.166666666666667, 0.666666666666667},
199 {0.166666666666667, 0.166666666666667}};
200 nc =
Nat_coor( coors[i][0], coors[i][1]);
203 const Real coors[9][2] = { {0.112701665379258, 0.112701665379258},
204 {0.887298334620742, 0.112701665379258},
205 {0.887298334620742, 0.887298334620742},
206 {0.112701665379258, 0.887298334620742},
207 {0.5, 0.112701665379258},
208 {0.887298334620742, 0.5 },
209 {0.5, 0.887298334620742},
210 {0.112701665379258, 0.5 },
212 nc =
Nat_coor( coors[i][0], coors[i][1]);
218 const Real coors[6][2] = { {0.816847572980459, 0.091576213509771},
219 {0.091576213509771, 0.816847572980459},
220 {0.091576213509771, 0.091576213509771},
221 {0.108103018168070, 0.445948490915965},
222 {0.445948490915965, 0.108103018168070},
223 {0.445948490915965, 0.445948490915965}};
224 nc =
Nat_coor( coors[i][0], coors[i][1]);
234 Vector_2( J[1]*J[0]/-area_sq, J[0]*J[0]/area_sq) };
237 Vector_3 Jinv[2] = { J[0]*t[0][0]+=J[1]*t[1][0], J[0]*t[0][1]+=J[1]*t[1][1]};
240 x[
i] = Jinv[0]*b[
i][0] += Jinv[1]*b[
i][1];
SURF::Vector_2< Real > Vector_2
void shape_func_deriv(const Nat_coor &nc, Vector_2 Np[]) const
Evaluates the derivatives of the shape functions.
#define SURF_END_NAMESPACE
Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
void get_gp_nat_coor(const Size i, Nat_coor &nc, const Size doa=0) const
Get the natrual coordinate associated with a Gauss point.
Real get_gp_weight(const Size i, const Size doa=0) const
Get the weight associated with a Gauss point.
#define SURF_BEGIN_NAMESPACE
Generic_element_2(Size ne, Size nn=0)
Constructor.
void solve(const Vector_3 M[2], Vector_3 x[], const Vector_2 b[]) const
void shape_func(const Nat_coor &nc, Real N[]) const
Evaluates the shape functions of the element and output the barycentric coordinates into the array N...
Type squared_norm() const
static Vector_3 cross_product(const Vector_3 &v, const Vector_3 &w)
Size size_of_nodes() const
Number of nodes.
Size get_num_gp(const Size doa=0) const
Get the number of Gauss points.
Some basic geometric data types.