netgen/libsrc/meshing/curvedelems.hpp

266 lines
8.5 KiB
C++
Raw Normal View History

#ifndef NETGEN_CURVEDELEMS_HPP
#define NETGEN_CURVEDELEMS_HPP
2009-01-13 04:40:13 +05:00
/**************************************************************************/
/* 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
/**************************************************************************/
#include <mydefs.hpp>
#include <general/ngarray.hpp>
#include <gprim/geomobjects.hpp>
2009-01-13 04:40:13 +05:00
#include "meshtype.hpp"
2009-01-13 04:40:13 +05:00
namespace netgen
{
class Refinement;
class Mesh;
2009-01-13 04:40:13 +05:00
class CurvedElements
{
const Mesh & mesh;
2019-07-09 13:39:16 +05:00
NgArray<int> edgeorder;
NgArray<int> faceorder;
2009-01-13 04:40:13 +05:00
2019-07-09 13:39:16 +05:00
NgArray<int> edgecoeffsindex;
NgArray<int> facecoeffsindex;
2009-01-13 04:40:13 +05:00
2019-07-09 13:39:16 +05:00
NgArray< Vec<3> > edgecoeffs;
NgArray< Vec<3> > facecoeffs;
2009-01-13 04:40:13 +05:00
2019-07-09 13:39:16 +05:00
NgArray< 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:
2015-10-19 13:08:30 +05:00
DLL_HEADER CurvedElements (const Mesh & amesh);
DLL_HEADER ~CurvedElements();
2009-01-13 04:40:13 +05:00
// 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; }
2015-10-19 13:08:30 +05:00
DLL_HEADER void BuildCurvedElements(const 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
void DoArchive(Archive& ar)
2018-12-14 16:01:58 +05:00
{
ar & edgeorder & faceorder & edgecoeffsindex & facecoeffsindex & edgecoeffs & facecoeffs
& edgeweight & order & rational & ishighorder;
}
2009-01-13 04:40:13 +05:00
DLL_HEADER bool IsSegmentCurved (SegmentIndex segnr) const;
DLL_HEADER bool IsSurfaceElementCurved (SurfaceElementIndex sei) const;
DLL_HEADER bool IsElementCurved (ElementIndex ei) const;
DLL_HEADER bool IsElementHighOrder (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)
2017-11-24 01:26:23 +05:00
{ CalcSegmentTransformation<double> (xi, segnr, &x, NULL); };
2009-01-13 04:40:13 +05:00
void CalcSegmentTransformation (double xi, SegmentIndex segnr,
2009-01-13 04:40:13 +05:00
Vec<3> & dxdxi)
2017-11-24 01:26:23 +05:00
{ CalcSegmentTransformation<double> (xi, segnr, NULL, &dxdxi); };
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, Vec<3> & dxdxi)
2017-11-24 01:26:23 +05:00
{ CalcSegmentTransformation<double> (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
2017-11-24 01:26:23 +05:00
/*
2019-07-09 13:39:16 +05:00
void CalcMultiPointSegmentTransformation (NgArray<double> * xi, SegmentIndex segnr,
NgArray<Point<3> > * x,
NgArray<Vec<3> > * dxdxi);
2017-11-24 01:26:23 +05:00
*/
template <int DIM_SPACE, typename T>
void CalcMultiPointSegmentTransformation (SegmentIndex elnr, int n,
2017-11-24 01:26:23 +05:00
const T * xi, size_t sxi,
T * x, size_t sx,
T * dxdxi, size_t sdxdxi);
DLL_HEADER void CalcMultiPointSurfaceTransformation (NgArray< Point<2> > * xi, SurfaceElementIndex elnr,
2019-07-09 13:39:16 +05:00
NgArray< Point<3> > * x,
NgArray< Mat<3,2> > * dxdxi);
2016-07-11 21:27:44 +05:00
template <int DIM_SPACE, typename T>
void CalcMultiPointSurfaceTransformation (SurfaceElementIndex elnr, int n,
2016-07-11 21:27:44 +05:00
const T * xi, size_t sxi,
T * x, size_t sx,
T * dxdxi, size_t sdxdxi);
DLL_HEADER void CalcMultiPointElementTransformation (NgArray< Point<3> > * xi, ElementIndex elnr,
2019-07-09 13:39:16 +05:00
NgArray< Point<3> > * x,
NgArray< Mat<3,3> > * dxdxi);
2009-01-13 04:40:13 +05:00
template <typename T>
void CalcMultiPointElementTransformation (ElementIndex elnr, int n,
const T * xi, size_t sxi,
T * x, size_t sx,
T * dxdxi, size_t sdxdxi);
2009-01-13 04:40:13 +05:00
private:
2017-11-24 01:26:23 +05:00
template <typename T>
DLL_HEADER void CalcSegmentTransformation (const T & xi, SegmentIndex segnr,
2017-11-24 01:26:23 +05:00
Point<3,T> * x = NULL, Vec<3,T> * dxdxi = NULL, bool * curved = NULL);
2009-01-13 04:40:13 +05:00
DLL_HEADER 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
DLL_HEADER 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
};
2017-11-24 01:26:23 +05:00
template <typename T>
void CalcElementShapes (SegmentInfo & elnr, T xi, TFlatVector<T> shapes) const;
2019-07-09 13:39:16 +05:00
void GetCoefficients (SegmentInfo & elnr, NgArray<Vec<3> > & coefs) const;
2017-11-24 01:26:23 +05:00
template <typename T>
void CalcElementDShapes (SegmentInfo & elnr, T xi, TFlatVector<T> 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
2022-04-21 20:16:26 +05:00
void SetEdges (FlatArray<int> edges)
{
nedges = edges.Size();
for (int i = 0; i < edges.Size(); i++)
edgenrs[i] = edges[i];
}
auto GetEdges() const
{ return FlatArray(nedges, edgenrs); }
void SetFaces (FlatArray<int> faces)
{
nfaces = faces.Size();
for (int i = 0; i < faces.Size(); i++)
facenrs[i] = faces[i];
}
auto GetFaces() const
{ return FlatArray(nfaces, facenrs); }
2009-01-13 04:40:13 +05:00
};
template <typename T>
void CalcElementShapes (ElementInfo & info, Point<3,T> xi, TFlatVector<T> shapes) const;
void GetCoefficients (ElementInfo & info, Vec<3> * coefs) const;
template <typename T>
2021-06-21 18:25:25 +05:00
void CalcElementDShapes (ElementInfo & info, const Point<3,T> xi, MatrixFixWidth<3,T> & dshapes) const;
2009-01-13 04:40:13 +05:00
template <typename T>
bool EvaluateMapping (ElementInfo & info, const Point<3,T> xi, Point<3,T> & x, Mat<3,3,T> & jac) const;
class SurfaceElementInfo
2009-01-13 04:40:13 +05:00
{
public:
SurfaceElementIndex elnr;
int order;
int nv;
int ndof;
2019-07-09 21:00:12 +05:00
NgArrayMem<int,4> edgenrs;
int facenr;
2009-01-13 04:40:13 +05:00
};
2016-07-11 21:27:44 +05:00
template <typename T>
void CalcElementShapes (SurfaceElementInfo & elinfo, const Point<2,T> xi, TFlatVector<T> shapes) const;
template <int DIM_SPACE>
2019-07-09 13:39:16 +05:00
void GetCoefficients (SurfaceElementInfo & elinfo, NgArray<Vec<DIM_SPACE> > & coefs) const;
2016-07-11 21:27:44 +05:00
template <typename T>
2021-06-21 18:25:25 +05:00
void CalcElementDShapes (SurfaceElementInfo & elinfo, const Point<2,T> xi, MatrixFixWidth<2,T> & dshapes) const;
2016-07-11 21:27:44 +05:00
template <int DIM_SPACE, typename T>
bool EvaluateMapping (SurfaceElementInfo & info, const Point<2,T> xi, Point<DIM_SPACE,T> & x, Mat<DIM_SPACE,2,T> & jac) const;
2009-01-13 04:40:13 +05:00
};
} //namespace netgen
#endif // NETGEN_CURVEDELEMS_HPP