Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/curvedelems.hpp
3206 views
#ifndef CURVEDELEMS1#define CURVEDELEMS23/**************************************************************************/4/* File: curvedelems.hpp */5/* Author: Robert Gaisbauer */6/* Date: 27. Sep. 02 (second version: 30. Jan. 03) */7/**************************************************************************/89#include "bisect.hpp"10#include <iostream>1112#define EPSILON 1e-2013141516void ComputeGaussRule (int n, ARRAY<double> & xi, ARRAY<double> & wi);171819202122// ----------------------------------------------------------------------------23// CurvedElements24// ----------------------------------------------------------------------------2526class CurvedElements27{28const Mesh & mesh;29const MeshTopology & top;3031bool isHighOrder;32int nvisualsubsecs;33int nIntegrationPoints;3435ARRAY<int> edgeorder;36ARRAY<int> faceorder;3738/*3940ARRAY< Vec<3> > edgecoeffs;41ARRAY< Vec<3> > facecoeffs;4243ARRAY<int> edgecoeffsindex;44ARRAY<int> facecoeffsindex;4546*/4748inline Vec<3> GetEdgeCoeff (int edgenr, int k);49inline Vec<3> GetFaceCoeff (int facenr, int k);505152void CalcSegmentTransformation (double xi, int segnr,53Point<3> * x = NULL, Vec<3> * dxdxi = NULL);5455void CalcSurfaceTransformation (Point<2> xi, int elnr,56Point<3> * x = NULL, Mat<3,2> * dxdxi = NULL);5758void CalcElementTransformation (Point<3> xi, int elnr,59Point<3> * x = NULL, Mat<3,3> * dxdxi = NULL);60616263public:6465Refinement * refinement;6667ARRAY< Vec<3> > edgecoeffs;68ARRAY< Vec<3> > facecoeffs;6970ARRAY<int> edgecoeffsindex;71ARRAY<int> facecoeffsindex;727374757677CurvedElements (const Mesh & amesh);78~CurvedElements();7980bool IsHighOrder() const81{ return isHighOrder; };82void SetHighOrder () { isHighOrder = 1; }838485int GetNVisualSubsecs() const86{ return nvisualsubsecs; };8788const class Mesh & GetMesh() const89{ return mesh; };9091void BuildCurvedElements(Refinement * ref, int polydeg, bool rational=false);9293int GetEdgeOrder (int edgenr) const94{ return edgeorder[edgenr]; };9596int GetFaceOrder (int facenr) const97{ return faceorder[facenr]; };9899int IsEdgeCurved (int edgenr) const;100101int IsFaceCurved (int facenr) const;102103int IsSurfaceElementCurved (int elnr) const;104105int IsElementCurved (int elnr) const;106107108void CalcSegmentTransformation (double xi, int segnr,109Point<3> & x)110{ CalcSegmentTransformation (xi, segnr, &x, NULL); };111112void CalcSegmentTransformation (double xi, int segnr,113Vec<3> & dxdxi)114{ CalcSegmentTransformation (xi, segnr, NULL, &dxdxi); };115116void CalcSegmentTransformation (double xi, int segnr,117Point<3> & x, Vec<3> & dxdxi)118{ CalcSegmentTransformation (xi, segnr, &x, &dxdxi); };119120121void CalcSurfaceTransformation (const Point<2> & xi, int elnr,122Point<3> & x)123{ CalcSurfaceTransformation (xi, elnr, &x, NULL); };124125void CalcSurfaceTransformation (const Point<2> & xi, int elnr,126Mat<3,2> & dxdxi)127{ CalcSurfaceTransformation (xi, elnr, NULL, &dxdxi); };128129void CalcSurfaceTransformation (const Point<2> & xi, int elnr,130Point<3> & x, Mat<3,2> & dxdxi)131{ CalcSurfaceTransformation (xi, elnr, &x, &dxdxi); };132133134void CalcElementTransformation (const Point<3> & xi, int elnr,135Point<3> & x)136{ CalcElementTransformation (xi, elnr, &x, NULL); };137138void CalcElementTransformation (const Point<3> & xi, int elnr,139Mat<3,3> & dxdxi)140{ CalcElementTransformation (xi, elnr, NULL, &dxdxi); };141142void CalcElementTransformation (const Point<3> & xi, int elnr,143Point<3> & x, Mat<3,3> & dxdxi)144{ CalcElementTransformation (xi, elnr, &x, &dxdxi); };145146147148149void CalcMultiPointSegmentTransformation (ARRAY<double> * xi, int segnr,150ARRAY<Point<3> > * x,151ARRAY<Vec<3> > * dxdxi);152153void CalcMultiPointSurfaceTransformation (ARRAY< Point<2> > * xi, int elnr,154ARRAY< Point<3> > * x,155ARRAY< Mat<3,2> > * dxdxi);156157void CalcMultiPointElementTransformation (ARRAY< Point<3> > * xi, int elnr,158ARRAY< Point<3> > * x,159ARRAY< Mat<3,3> > * dxdxi);160161};162163164165// ----------------------------------------------------------------------------166// PolynomialBasis167// ----------------------------------------------------------------------------168169class PolynomialBasis170{171int order;172int maxorder;173ArrayMem<double,20> f;174ArrayMem<double,20> df;175ArrayMem<double,20> ddf;176177ArrayMem<double,20> lp;178ArrayMem<double,20> dlp;179180inline void CalcLegendrePolynomials (double x);181// P_i(x/t) t^i182inline void CalcScaledLegendrePolynomials (double x, double t);183inline void CalcDLegendrePolynomials (double x);184185public:186187PolynomialBasis ()188{ maxorder = -1; };189190~PolynomialBasis ()191{};192193void SetOrder (int aorder)194{195order = aorder;196if (order > maxorder)197{198maxorder = order;199f.SetSize(order-1);200df.SetSize(order-1);201ddf.SetSize(order-1);202lp.SetSize(order+1);203dlp.SetSize(order);204};205};206207inline void CalcF (double x);208inline void CalcDf (double x);209inline void CalcDDf (double x);210211inline void CalcFDf (double x);212213// compute F_i(x/t) t^i214inline void CalcFScaled (double x, double t);215static inline void CalcFScaled (int p, double x, double t, double * values);216217double GetF (int p) { return f[p-2]; };218double GetDf (int p) { return df[p-2]; };219double GetDDf (int p) { return ddf[p-2]; };220};221222223224// ----------------------------------------------------------------------------225// BaseFiniteElement226// ----------------------------------------------------------------------------227228template <int DIM>229class BaseFiniteElement230{231protected:232233Point<DIM> xi;234int elnr;235const CurvedElements & curv;236const Mesh & mesh;237const MeshTopology & top;238239public:240241BaseFiniteElement(const CurvedElements & acurv)242: curv(acurv), mesh(curv.GetMesh()), top(mesh.GetTopology())243{};244245virtual ~BaseFiniteElement()246{};247248void SetElementNumber (int aelnr)249{ elnr = aelnr; }; // 1-based arrays in netgen250251virtual void SetReferencePoint (Point<DIM> axi)252{ xi = axi; };253};254255256257// ----------------------------------------------------------------------------258// BaseFiniteElement1D259// ----------------------------------------------------------------------------260261class BaseFiniteElement1D : public BaseFiniteElement<1>262{263protected:264PolynomialBasis b;265266int vertexnr[2];267int edgenr;268int edgeorient;269int edgeorder;270271int maxedgeorder;272273double vshape[2];274double vdshape[2];275ArrayMem<double,20> eshape;276ArrayMem<double,20> edshape;277ArrayMem<double,20> eddshape;278279public:280281BaseFiniteElement1D (const CurvedElements & acurv) : BaseFiniteElement<1>(acurv)282{ maxedgeorder = 1; };283284virtual ~BaseFiniteElement1D()285{};286287int GetVertexNr (int v)288{ return vertexnr[v]; };289290int GetEdgeNr ()291{ return edgenr; };292293int GetEdgeOrder ()294{ return edgeorder; };295296int GetEdgeOrientation ()297{ return edgeorient; };298299void CalcVertexShapes();300void CalcEdgeShapes();301void CalcEdgeLaplaceShapes();302303double GetVertexShape (int v)304{ return vshape[v]; };305306double GetEdgeShape (int index)307{ return eshape[index]; };308309double GetVertexDShape (int v)310{ return vdshape[v]; };311312double GetEdgeDShape (int index)313{ return edshape[index]; };314315double GetEdgeLaplaceShape (int index)316{ return eddshape[index]; };317318};319320321322323// ----------------------------------------------------------------------------324// FESegm325// ----------------------------------------------------------------------------326327class FESegm : public BaseFiniteElement1D328{329330public:331332FESegm(const CurvedElements & acurv) : BaseFiniteElement1D(acurv)333{};334335virtual ~FESegm()336{};337338void SetElementNumber (int aelnr)339{340BaseFiniteElement<1> :: SetElementNumber (aelnr);341Segment s = mesh.LineSegment(elnr);342vertexnr[0] = s.p1;343vertexnr[1] = s.p2;344edgenr = top.GetSegmentEdge(elnr);345edgeorient = top.GetSegmentEdgeOrientation(elnr);346edgeorder = curv.GetEdgeOrder(edgenr-1); // 1-based arrays in netgen347348if (edgeorder > maxedgeorder)349{350maxedgeorder = edgeorder;351eshape.SetSize(maxedgeorder-1);352edshape.SetSize(maxedgeorder-1);353eddshape.SetSize(maxedgeorder-1);354}355};356357};358359360361// ----------------------------------------------------------------------------362// FEEdge363// ----------------------------------------------------------------------------364365class FEEdge : public BaseFiniteElement1D366{367368public:369370FEEdge(const CurvedElements & acurv) : BaseFiniteElement1D(acurv)371{};372373virtual ~FEEdge()374{};375376void SetElementNumber (int aelnr)377{378BaseFiniteElement<1> :: SetElementNumber (aelnr);379top.GetEdgeVertices (elnr, vertexnr[0], vertexnr[1]);380edgenr = elnr;381edgeorient = 1;382edgeorder = curv.GetEdgeOrder(edgenr-1); // 1-based arrays in netgen383384if (edgeorder > maxedgeorder)385{386maxedgeorder = edgeorder;387eshape.SetSize(maxedgeorder-1);388edshape.SetSize(maxedgeorder-1);389eddshape.SetSize(maxedgeorder-1);390}391};392393};394395396397// ----------------------------------------------------------------------------398// BaseFiniteElement2D399// ----------------------------------------------------------------------------400401class BaseFiniteElement2D : public BaseFiniteElement<2>402{403protected:404405int nvertices;406int nedges;407408int vertexnr[4];409int edgenr[4];410int edgeorient[4];411int edgeorder[4];412int facenr;413int faceorient;414int faceorder;415416int nfaceshapes;417418int maxedgeorder;419int maxfaceorder;420421PolynomialBasis b1, b2;422423double vshape[4];424Vec<2> vdshape[4];425ArrayMem<double,80> eshape;426ArrayMem< Vec<2>,80> edshape;427ArrayMem<double,400> fshape;428ArrayMem<Vec<2>,400> fdshape;429ArrayMem<double,400> fddshape;430431virtual void CalcNFaceShapes () = 0;432433public:434435BaseFiniteElement2D (const CurvedElements & acurv) : BaseFiniteElement<2>(acurv)436{ maxedgeorder = maxfaceorder = -1; };437438virtual ~BaseFiniteElement2D()439{};440441void SetElementNumber (int aelnr);442443virtual void SetVertexSingularity (int v, int exponent) = 0;444445int GetVertexNr (int v)446{ return vertexnr[v]; };447448int GetEdgeNr (int e)449{ return edgenr[e]; };450451int GetFaceNr ()452{ return facenr; };453454int GetEdgeOrder (int e)455{ return edgeorder[e]; };456457int GetFaceOrder ()458{ return faceorder; }459460int GetNVertices ()461{ return nvertices; };462463int GetNEdges ()464{ return nedges; };465466int GetNFaceShapes ()467{ return nfaceshapes; };468469int IsCurved ()470{471bool iscurved = 0;472int e;473474for (e = 0; e < GetNEdges(); e++)475iscurved = iscurved || (GetEdgeOrder(e) > 1);476477return iscurved || (GetFaceOrder() > 1);478}479480virtual void CalcVertexShapes() = 0;481virtual void CalcEdgeShapes() = 0;482virtual void CalcFaceShapes() = 0;483484virtual void CalcFaceLaplaceShapes() = 0;485486double GetVertexShape (int v)487{ return vshape[v]; };488489double GetEdgeShape (int index)490{ return eshape[index]; };491492double GetFaceShape (int index)493{ return fshape[index]; };494495Vec<2> GetVertexDShape (int v)496{ return vdshape[v]; };497498Vec<2> GetEdgeDShape (int index)499{ return edshape[index]; };500501Vec<2> GetFaceDShape (int index)502{ return fdshape[index]; };503504double GetFaceLaplaceShape (int index)505{ return fddshape[index]; };506};507508509510// ----------------------------------------------------------------------------511// FETrig512// ----------------------------------------------------------------------------513514class FETrig : public BaseFiniteElement2D515{516Point<3> lambda;517Mat<3,2> dlambda;518519const ELEMENT_EDGE * eledge;520const ELEMENT_FACE * elface;521522virtual void CalcNFaceShapes ()523{ nfaceshapes = ((faceorder-1)*(faceorder-2))/2; };524525public:526527FETrig (const CurvedElements & acurv) : BaseFiniteElement2D(acurv)528{529nvertices = 3;530nedges = 3;531eledge = MeshTopology :: GetEdges (TRIG);532elface = MeshTopology :: GetFaces (TRIG);533};534535virtual ~FETrig()536{};537538virtual void SetReferencePoint (Point<2> axi);539540virtual void SetVertexSingularity (int v, int exponent);541542virtual void CalcVertexShapes();543virtual void CalcEdgeShapes();544virtual void CalcFaceShapes();545546virtual void CalcFaceLaplaceShapes();547};548549550551// ----------------------------------------------------------------------------552// FEQuad553// ----------------------------------------------------------------------------554555class FEQuad : public BaseFiniteElement2D556{557const ELEMENT_FACE * elface;558559virtual void CalcNFaceShapes ()560{ nfaceshapes = (faceorder-1)*(faceorder-1); };561562public:563564FEQuad (const CurvedElements & acurv) : BaseFiniteElement2D(acurv)565{566nvertices = 4;567nedges = 4;568elface = MeshTopology :: GetFaces (QUAD);569};570571virtual ~FEQuad()572{};573574virtual void SetVertexSingularity (int /* v */, int /* exponent */)575{};576577virtual void CalcVertexShapes();578virtual void CalcEdgeShapes();579virtual void CalcFaceShapes();580581virtual void CalcFaceLaplaceShapes();582};583584585586587// ----------------------------------------------------------------------------588// BaseFiniteElement3D589// ----------------------------------------------------------------------------590591class BaseFiniteElement3D : public BaseFiniteElement<3>592{593protected:594595int nvertices;596int nedges;597int nfaces;598599int vertexnr[8];600int edgenr[12];601int edgeorient[12];602int edgeorder[12];603int facenr[6];604int faceorient[6];605int faceorder[6];606int surfacenr[6];607// int surfaceorient[6];608609int nfaceshapes[6];610611int maxedgeorder;612int maxfaceorder;613614PolynomialBasis b1, b2;615616double vshape[8];617Vec<3> vdshape[8];618ArrayMem<double,120> eshape;619ArrayMem<Vec<3>,120> edshape;620ArrayMem<double,300> fshape;621ArrayMem<Vec<3>,300> fdshape;622623virtual void CalcNFaceShapes () = 0;624625public:626627int locmaxedgeorder;628int locmaxfaceorder;629630BaseFiniteElement3D (const CurvedElements & acurv) : BaseFiniteElement<3>(acurv)631{ maxedgeorder = maxfaceorder = -1; };632633void SetElementNumber (int aelnr);634635int GetVertexNr (int v)636{ return vertexnr[v]; };637638int GetEdgeNr (int e)639{ return edgenr[e]; };640641int GetFaceNr (int f)642{ return facenr[f]; };643644int GetNFaceShapes (int f)645{ return nfaceshapes[f]; };646647int GetEdgeOrder (int e)648{ return edgeorder[e]; };649650int GetFaceOrder (int f)651{ return faceorder[f]; };652653int GetNVertices ()654{ return nvertices; };655656int GetNEdges ()657{ return nedges; };658659int GetNFaces ()660{ return nfaces; };661662int IsCurved ()663{664bool iscurved = 0;665int e, f;666667for (e = 0; e < GetNEdges(); e++)668iscurved = iscurved || (GetEdgeOrder(e) > 1);669670for (f = 0; f < GetNFaces(); f++)671iscurved = iscurved || (GetFaceOrder(f) > 1);672673return iscurved;674}675676virtual void CalcVertexShapes() = 0;677virtual void CalcVertexShapesOnly()678{ CalcVertexShapes(); }679680virtual void CalcEdgeShapes() = 0;681virtual void CalcEdgeShapesOnly()682{ CalcEdgeShapes(); }683684virtual void CalcFaceShapes() = 0;685686double GetVertexShape (int v)687{ return vshape[v]; };688689double GetEdgeShape (int index)690{ return eshape[index]; };691692double GetFaceShape (int index)693{ return fshape[index]; };694695Vec<3> GetVertexDShape (int v)696{ return vdshape[v]; };697698Vec<3> GetEdgeDShape (int index)699{ return edshape[index]; };700701Vec<3> GetFaceDShape (int index)702{ return fdshape[index]; };703};704705706707// ----------------------------------------------------------------------------708// FETet709// ----------------------------------------------------------------------------710711class FETet : public BaseFiniteElement3D712{713Point<4> lambda;714Mat<4,3> dlambda;715716const ELEMENT_EDGE * eledge;717const ELEMENT_FACE * elface;718719virtual void CalcNFaceShapes ()720{721for (int f = 0; f < nfaces; f++)722nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;723};724725public:726727FETet (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)728{729nvertices = 4;730nedges = 6;731nfaces = 4;732eledge = MeshTopology :: GetEdges (TET);733elface = MeshTopology :: GetFaces (TET);734};735736void SetReferencePoint (Point<3> axi);737738virtual void CalcVertexShapes();739virtual void CalcVertexShapesOnly();740virtual void CalcEdgeShapes();741virtual void CalcEdgeShapesOnly();742virtual void CalcFaceShapes();743};744745746747// ----------------------------------------------------------------------------748// FEPrism749// ----------------------------------------------------------------------------750751class FEPrism : public BaseFiniteElement3D752{753Point<4> lambda; // mixed barycentric coordinates754Mat<4,3> dlambda;755756const ELEMENT_EDGE * eledge;757const ELEMENT_FACE * elface;758759virtual void CalcNFaceShapes ()760{761int f;762for (f = 0; f < 2; f++)763nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;764for (f = 2; f < nfaces; f++)765nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);766};767768public:769770FEPrism (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)771{772nvertices = 6;773nedges = 9;774nfaces = 5;775eledge = MeshTopology :: GetEdges (PRISM);776elface = MeshTopology :: GetFaces (PRISM);777};778779void SetReferencePoint (Point<3> axi);780781virtual void CalcVertexShapes();782virtual void CalcEdgeShapes();783virtual void CalcFaceShapes();784};785786787788789// ----------------------------------------------------------------------------790// FEPyramid791// ----------------------------------------------------------------------------792793class FEPyramid : public BaseFiniteElement3D794{795796const ELEMENT_EDGE * eledge;797const ELEMENT_FACE * elface;798799virtual void CalcNFaceShapes ()800{801int f;802for (f = 0; f < 4; f++)803nfaceshapes[f] = ((faceorder[f]-1)*(faceorder[f]-2))/2;804for (f = 4; f < nfaces; f++)805nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);806};807808public:809810FEPyramid (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)811{812nvertices = 5;813nedges = 8;814nfaces = 5;815eledge = MeshTopology :: GetEdges (PYRAMID);816elface = MeshTopology :: GetFaces (PYRAMID);817};818819void SetReferencePoint (Point<3> axi);820821virtual void CalcVertexShapes();822virtual void CalcEdgeShapes();823virtual void CalcFaceShapes();824};825826827828829// ----------------------------------------------------------------------------830// FEHex831// ----------------------------------------------------------------------------832833class FEHex : public BaseFiniteElement3D834{835836const ELEMENT_EDGE * eledge;837const ELEMENT_FACE * elface;838839virtual void CalcNFaceShapes ()840{841int f;842for (f = 0; f < 6; f++)843nfaceshapes[f] = (faceorder[f]-1)*(faceorder[f]-1);844};845846public:847848FEHex (const CurvedElements & acurv) : BaseFiniteElement3D(acurv)849{850nvertices = 8;851nedges = 12;852nfaces = 6;853eledge = MeshTopology :: GetEdges (HEX);854elface = MeshTopology :: GetFaces (HEX);855};856857void SetReferencePoint (Point<3> axi);858859virtual void CalcVertexShapes();860virtual void CalcEdgeShapes();861virtual void CalcFaceShapes();862};863864865866867#endif868869870