32 #ifndef CORE_BASIS_QUADBILINEARLGN_H
33 #define CORE_BASIS_QUADBILINEARLGN_H 1
93 static inline double length(
int edge)
97 const double dx = v1[0] - v0[0];
98 const double dy = v1[1] - v0[1];
99 return sqrt(dx*dx+dy*dy);
102 static double area(
int ) {
return 1; }
116 template<
class VECTOR>
118 const unsigned div_per_unit,
119 VECTOR &coords)
const
121 typedef typename VECTOR::value_type VECTOR2;
122 coords.resize(div_per_unit + 1);
129 for(
unsigned i = 0; i <= div_per_unit; i ++)
131 const double d = (double)i / (
double)div_per_unit;
132 typename VECTOR::value_type &tmp = coords[i];
134 tmp[0] =
static_cast<typename VECTOR2::value_type
>(p1x + d * dx);
135 tmp[1] =
static_cast<typename VECTOR2::value_type
>(p1y + d * dy);
142 template<
class VECTOR>
144 const unsigned div_per_unit,
145 VECTOR &coords)
const
147 typedef typename VECTOR::value_type VECTOR2;
148 typedef typename VECTOR2::value_type VECTOR3;
150 coords.resize(div_per_unit);
151 double d = 1. / div_per_unit;
152 for(
unsigned j = 0; j < div_per_unit; j++)
154 coords[j].resize(2 * (div_per_unit + 1));
156 for(
unsigned i = 0; i <= div_per_unit; i++)
158 typename VECTOR2::value_type &e1 = coords[j][e++];
160 e1[0] =
static_cast<typename VECTOR3::value_type
>((double)i / (
double)div_per_unit);
161 e1[1] =
static_cast<typename VECTOR3::value_type
>((double)j / (
double)div_per_unit);
162 typename VECTOR2::value_type &e2 = coords[j][e++];
165 e2[1] =
static_cast<typename VECTOR3::value_type
>((double)j / (
double)div_per_unit + d);
174 template <
class ElemBasis>
177 typedef typename ElemBasis::value_type
T;
183 template <
class ElemData,
class VECTOR>
185 const T& value,
const ElemData &cd)
const
193 template <
class VECTOR>
207 template <
class ElemData,
class VECTOR>
209 VECTOR & guess)
const
211 double dist = DBL_MAX;
218 for (
int x = 1; x < end; x++)
220 coord[0] = x / (double) end;
221 for (
int y = 1; y < end; y++)
223 coord[1] = y / (double) end;
228 pElem->derivate(coord, cd, derivs);
277 {0.211324865405, 0.211324865405},
278 {0.788675134595, 0.211324865405},
279 {0.788675134595, 0.788675134595},
280 {0.211324865405, 0.788675134595}};
283 T QuadGaussian2<T>::GaussianWeights[4] = {.25, .25, .25, .25};
300 {0.11270166537950, 0.11270166537950}, {0.5, 0.11270166537950}, {0.88729833462050, 0.11270166537950},
301 {0.11270166537950, 0.5}, {0.5, 0.5}, {0.88729833462050, 0.5},
302 {0.11270166537950, 0.88729833462050}, {0.5, 0.88729833462050}, {0.88729833462050, 0.88729833462050}
306 T QuadGaussian3<T>::GaussianWeights[9] = {
307 0.07716049378395, 0.12345679007654, 0.07716049378395,
308 0.12345679007654, 0.19753086415802, 0.12345679007654,
309 0.07716049378395, 0.12345679007654, 0.07716049378395
332 template<
class VECTOR>
336 template<
class VECTOR>
341 template <
class ElemData,
class VECTOR>
347 return (T)(w[0] * cd.node0() +
355 template <
class ElemData,
class VECTOR1,
class VECTOR2>
356 void derivate(
const VECTOR1 &coords,
const ElemData &cd,
357 VECTOR2 &derivs)
const
364 derivs[0] =
static_cast<typename VECTOR2::value_type
>(
370 derivs[1] =
static_cast<typename VECTOR2::value_type
>(
378 template <
class ElemData,
class VECTOR>
380 const ElemData &cd)
const
383 return CL.
get_coords(
this, coords, value, cd);
387 template <
class ElemData>
390 return get_arc2d_length<CrvGaussian1<double> >(
this, edge, cd);
394 template <
class ElemData>
395 double get_area(
const unsigned face,
const ElemData &cd)
const
397 return get_area2<QuadGaussian2<double> >(
this, face, cd);
401 template <
class ElemData>
408 static const std::string
type_name(
int n = -1);
422 ASSERT((n >= -1) && n <= 1);
430 static const std::string nm(
"QuadBilinearLgn");
450 std::string(__FILE__),
static int vertices_of_face()
return number of vertices per face
Definition: QuadBilinearLgn.h:86
static SCISHARE int unit_edges[4][2]
References to vertices of unit edge.
Definition: QuadBilinearLgn.h:51
static const std::string type_name(int n=-1)
Definition: QuadBilinearLgn.h:420
static T GaussianWeights[1]
Definition: QuadBilinearLgn.h:248
void approx_edge(const unsigned edge, const unsigned div_per_unit, VECTOR &coords) const
Definition: QuadBilinearLgn.h:117
static T GaussianPoints[1][2]
Definition: QuadBilinearLgn.h:247
static int domain_dimension()
return dimension of domain
Definition: QuadBilinearLgn.h:62
static int GaussianNum
Definition: QuadBilinearLgn.h:290
static T GaussianPoints[4][2]
Definition: QuadBilinearLgn.h:268
double check_zero(const VECTOR &derivs, double epsilon=1e-7)
Definition: Locate.h:709
bool check_coords(const VECTOR &x) const
Definition: QuadBilinearLgn.h:194
Class with weights and coordinates for 2nd order Gaussian integration.
Definition: QuadBilinearLgn.h:264
Definition: Persistent.h:89
T interpolate(const VECTOR &coords, const ElemData &cd) const
get value at parametric coordinate
Definition: QuadBilinearLgn.h:342
static int polynomial_order()
Definition: QuadBilinearLgn.h:330
void approx_face(const unsigned, const unsigned div_per_unit, VECTOR &coords) const
Definition: QuadBilinearLgn.h:143
static int GaussianNum
Definition: QuadBilinearLgn.h:246
static int dofs()
return degrees of freedom
Definition: QuadBilinearLgn.h:78
Definition: TypeDescription.h:45
#define SCISHARE
Definition: share.h:39
std::vector< const TypeDescription * > td_vec
Definition: TypeDescription.h:56
QuadLocate()
Definition: QuadBilinearLgn.h:179
Definition: QuadBilinearLgn.h:316
bool get_coords(VECTOR &coords, const T &value, const ElemData &cd) const
get parametric coordinate for value within the element
Definition: QuadBilinearLgn.h:379
static int faces_of_cell()
return number of faces per cell
Definition: QuadBilinearLgn.h:90
#define ASSERT(condition)
Definition: Assert.h:110
Class for describing interfaces to basis elements.
Definition: Basis.h:48
Definition: QuadElementWeights.h:36
virtual int begin_class(const std::string &name, int current_version)
Definition: Persistent.cc:143
static int number_of_edges()
return number of edges
Definition: QuadBilinearLgn.h:82
ElemBasis::value_type T
Definition: Locate.h:587
static SCISHARE double unit_face_normals[1][3]
References to normal of unit face.
Definition: QuadBilinearLgn.h:55
const string find_type_name(float *)
Definition: TypeName.cc:63
void get_linear_derivate_weights(const VECTOR &coords, double *w) const
get derivative weight factors at parametric coordinate
Definition: QuadElementWeights.h:51
ElemBasis::value_type T
Definition: QuadBilinearLgn.h:177
double get_area(const unsigned face, const ElemData &cd) const
get area
Definition: QuadBilinearLgn.h:395
Definition: QuadSamplingSchemes.h:42
static T GaussianPoints[9][2]
Definition: QuadBilinearLgn.h:291
const char * name[]
Definition: BoostGraphExampleTests.cc:87
QuadApprox()
Definition: QuadBilinearLgn.h:110
Definition: StackVector.h:50
virtual ~QuadBilinearLgnUnitElement()
Definition: QuadBilinearLgn.h:60
Definition: QuadBilinearLgn.h:175
static T GaussianWeights[9]
Definition: QuadBilinearLgn.h:292
Class for describing unit geometry of QuadBilinearLgn.
Definition: QuadBilinearLgn.h:46
double get_arc_length(const unsigned edge, const ElemData &cd) const
get arc length for edge
Definition: QuadBilinearLgn.h:388
bool get_coords(const ElemBasis *pEB, VECTOR &coords, const T &value, const ElemData &cd) const
find value in interpolation for given value
Definition: QuadBilinearLgn.h:184
QuadBilinearLgn()
Definition: QuadBilinearLgn.h:327
static double domain_size()
return size of the domain
Definition: QuadBilinearLgn.h:66
virtual ~QuadApprox()
Definition: QuadBilinearLgn.h:111
static const std::string make_template_id(const std::string &templateName, const std::string &templateParam)
Definition: TypeName.h:62
static int GaussianNum
Definition: QuadBilinearLgn.h:267
virtual ~QuadBilinearLgn()
Definition: QuadBilinearLgn.h:328
QuadBilinearLgnUnitElement()
Definition: QuadBilinearLgn.h:59
static double length(int edge)
Definition: QuadBilinearLgn.h:93
static SCISHARE double unit_center[2]
Center of the unit element.
Definition: QuadBilinearLgn.h:57
void get_weights(const VECTOR &coords, double *w) const
Definition: QuadBilinearLgn.h:333
bool compare_distance(const T &interp, const T &val, double &cur_d, double dist)
Definition: Locate.h:667
double get_volume(const ElemData &) const
get volume
Definition: QuadBilinearLgn.h:402
virtual void end_class()
Definition: Persistent.cc:178
static SCISHARE double unit_vertices[4][2]
Parametric coordinates of vertices of unit edge.
Definition: QuadBilinearLgn.h:49
static double volume()
return volume
Definition: QuadBilinearLgn.h:103
static int number_of_vertices()
return number of vertices
Definition: QuadBilinearLgn.h:70
void resize(size_t size, const value_type &val=value_type())
Definition: StackVector.h:61
void get_derivate_weights(const VECTOR &coords, double *w) const
Definition: QuadBilinearLgn.h:337
static T GaussianWeights[4]
Definition: QuadBilinearLgn.h:269
virtual void io(Piostream &str)
Definition: QuadBilinearLgn.h:460
Class for creating geometrical approximations of Quad meshes.
Definition: QuadBilinearLgn.h:108
static SCISHARE int unit_faces[1][4]
References to vertices of unit face.
Definition: QuadBilinearLgn.h:53
static double area(int)
return area
Definition: QuadBilinearLgn.h:102
int n
Definition: eab.py:9
void get_linear_weights(const VECTOR &coords, double *w) const
Definition: QuadElementWeights.h:40
bool get_iterative(const ElemBasis *pEB, VECTOR &x, const T &value, const ElemData &cd) const
find value in interpolation for given value
Definition: Locate.h:597
virtual ~QuadLocate()
Definition: QuadBilinearLgn.h:180
void initial_guess(const ElemBasis *pElem, const T &val, const ElemData &cd, VECTOR &guess) const
find a reasonable initial guess
Definition: QuadBilinearLgn.h:208
static int number_of_mesh_vertices()
return number of vertices in mesh
Definition: QuadBilinearLgn.h:74
Class with weights and coordinates for 3rd order Gaussian integration.
Definition: QuadBilinearLgn.h:287
void derivate(const VECTOR1 &coords, const ElemData &cd, VECTOR2 &derivs) const
get first derivative at parametric coordinate
Definition: QuadBilinearLgn.h:356
Class with weights and coordinates for 2nd order Gaussian integration.
Definition: QuadBilinearLgn.h:243
const int QUADBILINEARLGN_VERSION
Definition: QuadBilinearLgn.h:457
T value_type
Definition: QuadBilinearLgn.h:325
Definition: TypeDescription.h:49
const TypeDescription * get_type_description(Core::Basis::ConstantBasis< T > *)
Definition: Constant.h:209