54 this->
edgeEvalN(answer, boundary, lcoords, cellgeo);
57double FEInterpolation3d :: boundaryEdgeGiveTransformationJacobian(
int boundary,
const FloatArray &lcoords,
const FEICellGeometry &cellgeo)
const
82double FEInterpolation3d :: boundaryGiveTransformationJacobian(
int boundary,
const FloatArray &lcoords,
const FEICellGeometry &cellgeo)
const
92IntArray FEInterpolation3d :: computeEdgeMapping(
const IntArray &elemNodes,
int iedge)
const
95 int size = ln.giveSize();
97 for (
int i = 1; i <= size; i++ ) {
98 edgeNodes.
at(i) = elemNodes.
at( ln.at(i) );
103IntArray FEInterpolation3d :: computeSurfaceMapping(
const IntArray &elemNodes,
int isurf)
const
106 int size = ln.giveSize();
108 for (
int i = 1; i <= size; i++ ) {
109 surfNodes.
at(i) = elemNodes.
at( ln.at(i) );
114std::unique_ptr<IntegrationRule> FEInterpolation3d :: giveBoundaryEdgeIntegrationRule(
int order,
int boundary,
Element_Geometry_Type egt)
const
116 auto iRule = std::make_unique<GaussIntegrationRule>(1,
nullptr);
117 int points = iRule->getRequiredNumberOfIntegrationPoints(
_Line,
order + this->order);
118 iRule->SetUpPointsOnLine(points, _Unknown);
146 auto normal =
cross(G1, G2);
147 double J =
norm(normal);
152std::tuple<double, FloatArrayF<3>>
156 auto normal =
cross(G1, G2);
157 double J =
norm(normal);
158 return std::make_tuple(J, normal/J);
183 for (
int i = 0; i < nodeIndices.giveSize(); ++i) {
187 return std::make_tuple(G1, G2);
196 auto G3 =
cross(G1, G2);
201 return jacobianMatrix;
207FEInterpolation3d :: surfaceGiveTransformationJacobian(
int isurf,
const FloatArray &lcoords,
virtual const FloatArray giveVertexCoordinates(int i) const =0
virtual void edgeEvalN(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
double boundarySurfaceEvalNormal(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const override
virtual IntArray computeLocalEdgeMapping(int iedge) const =0
IntArray boundarySurfaceGiveNodes(int boundary, Element_Geometry_Type, bool includeHierarchical=false) const override
virtual void surfaceEvalN(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual std::tuple< double, FloatArrayF< 3 > > surfaceEvalUnitNormal(int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
virtual double edgeGiveTransformationJacobian(int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual double surfaceGiveTransformationJacobian(int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual double giveVolume(const FEICellGeometry &cellgeo) const
virtual std::tuple< FloatArrayF< 3 >, FloatArrayF< 3 > > surfaceEvalBaseVectorsAt(int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
void surfaceEvald2Ndxi2(FloatMatrix &answer, const FloatArray &lcoords) const override
virtual void surfaceLocal2global(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
virtual double surfaceEvalNormal(FloatArray &answer, int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
void surfaceEvaldNdxi(FloatMatrix &answer, const FloatArray &lcoords) const override
virtual IntArray computeLocalSurfaceMapping(int isurf) const =0
virtual void edgeLocal2global(FloatArray &answer, int iedge, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
void setColumn(const FloatArrayF< N > &src, std::size_t c)
double norm(const FloatArray &x)
FloatArrayF< 3 > cross(const FloatArrayF< 3 > &x, const FloatArrayF< 3 > &y)
Computes $ x \cross y $.