netgen/libsrc/meshing/curvedelems.hpp

218 lines
6.6 KiB
C++
Raw Normal View History

2009-01-13 04:40:13 +05:00
#ifndef CURVEDELEMS
#define CURVEDELEMS
/**************************************************************************/
/* File: curvedelems.hpp */
/* Author: Robert Gaisbauer (first version) */
/* redesign by Joachim Schoeberl */
/* Date: 27. Sep. 02, Feb 2006 */
2009-01-13 04:40:13 +05:00
/**************************************************************************/
class Refinement;
2009-01-13 04:40:13 +05:00
class CurvedElements
{
const Mesh & mesh;
2009-01-25 17:35:25 +05:00
Array<int> edgeorder;
Array<int> faceorder;
2009-01-13 04:40:13 +05:00
2009-01-25 17:35:25 +05:00
Array<int> edgecoeffsindex;
Array<int> facecoeffsindex;
2009-01-13 04:40:13 +05:00
2009-01-25 17:35:25 +05:00
Array< Vec<3> > edgecoeffs;
Array< Vec<3> > facecoeffs;
2009-01-13 04:40:13 +05:00
2009-01-25 17:35:25 +05:00
Array< double > edgeweight; // for rational 2nd order splines
2009-01-13 04:40:13 +05:00
int order;
bool rational;
2009-01-13 04:40:13 +05:00
bool ishighorder;
2009-01-13 04:40:13 +05:00
public:
2009-01-13 04:40:13 +05:00
CurvedElements (const Mesh & amesh);
~CurvedElements();
// bool IsHighOrder() const { return order > 1; }
bool IsHighOrder() const { return ishighorder; }
2009-01-13 04:40:13 +05:00
// void SetHighOrder (int aorder) { order=aorder; }
void SetIsHighOrder (bool ho) { ishighorder = ho; }
void BuildCurvedElements(Refinement * ref, int aorder, bool arational = false);
2009-01-13 04:40:13 +05:00
int GetOrder () { return order; }
2009-01-13 04:40:13 +05:00
bool IsSegmentCurved (SegmentIndex segnr) const;
bool IsSurfaceElementCurved (SurfaceElementIndex sei) const;
bool IsElementCurved (ElementIndex ei) const;
2009-01-13 04:40:13 +05:00
void CalcSegmentTransformation (double xi, SegmentIndex segnr,
2009-01-13 04:40:13 +05:00
Point<3> & x)
{ CalcSegmentTransformation (xi, segnr, &x, NULL); };
void CalcSegmentTransformation (double xi, SegmentIndex segnr,
2009-01-13 04:40:13 +05:00
Vec<3> & dxdxi)
{ CalcSegmentTransformation (xi, segnr, NULL, &dxdxi); };
void CalcSegmentTransformation (double xi, SegmentIndex segnr,
2009-01-13 04:40:13 +05:00
Point<3> & x, Vec<3> & dxdxi)
{ CalcSegmentTransformation (xi, segnr, &x, &dxdxi, NULL); };
void CalcSegmentTransformation (double xi, SegmentIndex segnr,
Point<3> & x, Vec<3> & dxdxi, bool & curved)
{ CalcSegmentTransformation (xi, segnr, &x, &dxdxi, &curved); };
2009-01-13 04:40:13 +05:00
void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
2009-01-13 04:40:13 +05:00
Point<3> & x)
{ CalcSurfaceTransformation (xi, elnr, &x, NULL); };
void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
2009-01-13 04:40:13 +05:00
Mat<3,2> & dxdxi)
{ CalcSurfaceTransformation (xi, elnr, NULL, &dxdxi); };
void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
2009-01-13 04:40:13 +05:00
Point<3> & x, Mat<3,2> & dxdxi)
{ CalcSurfaceTransformation (xi, elnr, &x, &dxdxi, NULL); };
2009-01-13 04:40:13 +05:00
void CalcSurfaceTransformation (const Point<2> & xi, SurfaceElementIndex elnr,
Point<3> & x, Mat<3,2> & dxdxi, bool & curved)
{ CalcSurfaceTransformation (xi, elnr, &x, &dxdxi, &curved); };
2009-01-13 04:40:13 +05:00
void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
2009-01-13 04:40:13 +05:00
Point<3> & x)
{ CalcElementTransformation (xi, elnr, &x, NULL); };
void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
2009-01-13 04:40:13 +05:00
Mat<3,3> & dxdxi)
{ CalcElementTransformation (xi, elnr, NULL, &dxdxi); };
void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
2009-01-13 04:40:13 +05:00
Point<3> & x, Mat<3,3> & dxdxi)
{ CalcElementTransformation (xi, elnr, &x, &dxdxi /* , NULL */ ); };
void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
Point<3> & x, Mat<3,3> & dxdxi,
void * buffer, bool valid)
{ CalcElementTransformation (xi, elnr, &x, &dxdxi, /* NULL, */ buffer, valid ); };
2009-01-13 04:40:13 +05:00
// void CalcElementTransformation (const Point<3> & xi, ElementIndex elnr,
// Point<3> & x, Mat<3,3> & dxdxi) // , bool & curved)
// { CalcElementTransformation (xi, elnr, &x, &dxdxi /* , &curved * ); }
2009-01-13 04:40:13 +05:00
2009-01-25 17:35:25 +05:00
void CalcMultiPointSegmentTransformation (Array<double> * xi, SegmentIndex segnr,
Array<Point<3> > * x,
Array<Vec<3> > * dxdxi);
2009-01-13 04:40:13 +05:00
2009-01-25 17:35:25 +05:00
void CalcMultiPointSurfaceTransformation (Array< Point<2> > * xi, SurfaceElementIndex elnr,
Array< Point<3> > * x,
Array< Mat<3,2> > * dxdxi);
template <int DIM_SPACE>
void CalcMultiPointSurfaceTransformation (SurfaceElementIndex elnr, int n,
2010-04-22 18:28:55 +06:00
const double * xi, size_t sxi,
double * x, size_t sx,
double * dxdxi, size_t sdxdxi);
2009-01-13 04:40:13 +05:00
2009-01-25 17:35:25 +05:00
void CalcMultiPointElementTransformation (Array< Point<3> > * xi, ElementIndex elnr,
Array< Point<3> > * x,
Array< Mat<3,3> > * dxdxi);
2009-01-13 04:40:13 +05:00
void CalcMultiPointElementTransformation (ElementIndex elnr, int n,
2010-04-22 18:28:55 +06:00
const double * xi, size_t sxi,
double * x, size_t sx,
double * dxdxi, size_t sdxdxi);
2009-01-13 04:40:13 +05:00
private:
void CalcSegmentTransformation (double xi, SegmentIndex segnr,
Point<3> * x = NULL, Vec<3> * dxdxi = NULL, bool * curved = NULL);
2009-01-13 04:40:13 +05:00
void CalcSurfaceTransformation (Point<2> xi, SurfaceElementIndex elnr,
Point<3> * x = NULL, Mat<3,2> * dxdxi = NULL, bool * curved = NULL);
2009-01-13 04:40:13 +05:00
void CalcElementTransformation (Point<3> xi, ElementIndex elnr,
Point<3> * x = NULL, Mat<3,3> * dxdxi = NULL, // bool * curved = NULL,
void * buffer = NULL, bool valid = 0);
2009-01-13 04:40:13 +05:00
class SegmentInfo
2009-01-13 04:40:13 +05:00
{
public:
SegmentIndex elnr;
int order;
int nv;
int ndof;
int edgenr;
2009-01-13 04:40:13 +05:00
};
void CalcElementShapes (SegmentInfo & elnr, double xi, Vector & shapes) const;
2009-01-25 17:35:25 +05:00
void GetCoefficients (SegmentInfo & elnr, Array<Vec<3> > & coefs) const;
void CalcElementDShapes (SegmentInfo & elnr, double xi, Vector & dshapes) const;
2009-01-13 04:40:13 +05:00
class ElementInfo
2009-01-13 04:40:13 +05:00
{
public:
ElementIndex elnr;
int order;
int nv;
int ndof;
int nedges;
int nfaces;
int edgenrs[12];
int facenrs[6];
Mat<3> hdxdxi;
Vec<3> hcoefs[10]; // enough for second order tets
2009-01-13 04:40:13 +05:00
};
void CalcElementShapes (ElementInfo & info, const Point<3> & xi, Vector & shapes) const;
void GetCoefficients (ElementInfo & info, Vec<3> * coefs) const;
void CalcElementDShapes (ElementInfo & info, const Point<3> & xi, MatrixFixWidth<3> & dshapes) const;
2009-01-13 04:40:13 +05:00
class SurfaceElementInfo
2009-01-13 04:40:13 +05:00
{
public:
SurfaceElementIndex elnr;
int order;
int nv;
int ndof;
ArrayMem<int,4> edgenrs;
int facenr;
2009-01-13 04:40:13 +05:00
};
void CalcElementShapes (SurfaceElementInfo & elinfo, const Point<2> & xi, Vector & shapes) const;
template <int DIM_SPACE>
void GetCoefficients (SurfaceElementInfo & elinfo, Array<Vec<DIM_SPACE> > & coefs) const;
void CalcElementDShapes (SurfaceElementInfo & elinfo, const Point<2> & xi, MatrixFixWidth<2> & dshapes) const;
2009-01-13 04:40:13 +05:00
};
#endif