58 ContactSurface :: initializeFrom(ir);
64FEContactSurface :: postInitialize()
71FEContactSurface :: giveContactElement(
int i)
80 OOFEM_ERROR(
"Element %d is not a contact element", i);
86FEContactSurface :: giveContactElement_InSet(
int i)
121 if (interpolation ==
nullptr) {
137 double tol = 1.e-12, point_tol = 1.e-6;
144 interpolation->
local2global(ro, contactPointLocalCoords, cellgeo);
152 dFdXi = -
dot(dRodXi, gapVector);
156 unitNormal =
cross(t1,t2);
168 FloatArray dRodXidXi, dRodEtadEta, dRodXidEta;
186 G = m -
dot(gapVector, unitNormal) * kappa;
190 dKsi =
dot(invG, dFdXi);
192 contactPointLocalCoords -= dKsi;
195 }
while (iter < maxIter);
197 if (iter == maxIter) {
203 for (
int i = 1; i <= 2; i++) {
204 if (contactPointLocalCoords.
at(i) < (-1. - point_tol)) {
205 contactPointLocalCoords.
at(i) = -1.;
210 else if (contactPointLocalCoords.
at(i) > (1. + point_tol)) {
211 contactPointLocalCoords.
at(i) = 1.;
218 auto gap =
dot(gapVector,unitNormal)/
norm(unitNormal);
220 return std::make_tuple(inside, contactPointLocalCoords, gap, unitNormal, t1, t2);
234 if (interpolation ==
nullptr) {
250 double tol = 1.e-8, point_tol = 5.e-2;
257 interpolation->
local2global(ro, contactPointLocalCoords, cellgeo);
260 dFdXi = -
dot(t1, gapVector);
264 normal = {+t1.
at(2), -t1.
at(1)};
279 auto G =
dot(t1,t1) -
dot(gapVector, normal) * dRodXidXi.
dotProduct(normal);
281 contactPointLocalCoords.
at(1) -= dFdXi/G ;
283 }
while (iter < maxIter);
285 if (iter == maxIter) {
290 if (contactPointLocalCoords.
at(1) < (-1. - point_tol)) {
291 contactPointLocalCoords.
at(1) = -1.;
293 }
else if (contactPointLocalCoords.
at(1) > (1. + point_tol)) {
294 contactPointLocalCoords.
at(1) = 1.;
298 auto gap =
dot(gapVector,normal)/
norm(normal);
300 return std::make_tuple(inside, contactPointLocalCoords, gap, normal, t1);
virtual FEInterpolation * giveInterpolation() const
virtual int giveNumberOfNodes() const
virtual FloatArrayF< 2 > surfaceEvalBaseVectorsAt(int isurf, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const
virtual void surfaceEvald2Ndxi2(FloatMatrix &answer, const FloatArray &lcoords) const override
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 local2global(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo) const =0
Domain * giveDomain() const
Domain * domain
Link to domain object, useful for communicating with other FEM components.
double & at(std::size_t i)
double dotProduct(const FloatArray &x) const
void add(const FloatArray &src)
void setRow(const FloatArrayF< M > &src, int r)
double at(std::size_t i, std::size_t j) const
double norm(const FloatArray &x)
FloatArrayF< 3 > cross(const FloatArrayF< 3 > &x, const FloatArrayF< 3 > &y)
Computes $ x \cross y $.
double dot(const FloatArray &x, const FloatArray &y)
FloatMatrixF< N, N > inv(const FloatMatrixF< N, N > &mat, double zeropiv=1e-24)
Computes the inverse.