14#include "arcane/utils/Iostream.h"
15#include "arcane/utils/ITraceMng.h"
17#include "arcane/MathUtils.h"
18#include "arcane/GeometricUtilities.h"
29Real GeometricUtilities::QuadMapping::
30computeInverseJacobian(Real3 uvw,Real3x3& matrix)
32 Real3x3 jacobian = evaluateGradient(uvw);
34 Real d3 = jacobian.x.x * jacobian.y.y - jacobian.x.y * jacobian.y.x;
35 Real d2 = jacobian.x.z * jacobian.y.x - jacobian.x.y * jacobian.y.z;
36 Real d1 = jacobian.x.y * jacobian.y.z - jacobian.x.z * jacobian.y.y;
39 if (math::isNearlyZero(det))
42 Real inv_det = 1 / det;
44 jacobian.z.x = d1 * inv_det;
45 jacobian.z.y = d2 * inv_det;
46 jacobian.z.z = d3 * inv_det;
48 matrix.x.x = (jacobian.y.y * jacobian.z.z - jacobian.y.z * jacobian.z.y);
49 matrix.y.x = -(jacobian.y.x * jacobian.z.z - jacobian.y.z * jacobian.z.x);
50 matrix.z.x = (jacobian.y.x * jacobian.z.y - jacobian.y.y * jacobian.z.x);
52 matrix.x.y = -(jacobian.x.y * jacobian.z.z - jacobian.x.z * jacobian.z.y);
53 matrix.y.y = (jacobian.x.x * jacobian.z.z - jacobian.x.z * jacobian.z.x);
54 matrix.z.y = -(jacobian.x.x * jacobian.z.y - jacobian.x.y * jacobian.z.x);
56 matrix.x.z = (jacobian.x.y * jacobian.y.z - jacobian.x.z * jacobian.y.y);
57 matrix.y.z = -(jacobian.x.x * jacobian.y.z - jacobian.x.z * jacobian.y.x);
58 matrix.z.z = (jacobian.x.x * jacobian.y.y - jacobian.x.y * jacobian.y.x);
123Real3 GeometricUtilities::QuadMapping::
126 Real3 normal= QuadMapping::_normal();
127 Real
norm = normal.
x*normal.
x + normal.
y*normal.
y + normal.
z*normal.
z;
144Real3 GeometricUtilities::QuadMapping::
147 Real3 n0 =
math::vecMul(m_pos[1] - m_pos[0],m_pos[2] - m_pos[0]);
148 Real3 n1 =
math::vecMul(m_pos[2] - m_pos[1],m_pos[3] - m_pos[1]);
149 Real3 n2 =
math::vecMul(m_pos[3] - m_pos[2],m_pos[0] - m_pos[2]);
150 Real3 n3 =
math::vecMul(m_pos[0] - m_pos[3],m_pos[1] - m_pos[3]);
151 Real3 normal = (n0+n1+n2+n3) * 0.25;
180 Real3 normal = _normal();
181 for(
int i=0; i<4; ++i )
184 Real
x0 = m_pos[0].x;
185 Real
y0 = m_pos[0].y;
186 Real
z0 = m_pos[0].z;
187 Real
x1 = m_pos[1].x;
188 Real
y1 = m_pos[1].y;
189 Real
z1 = m_pos[1].z;
190 Real
x2 = m_pos[2].x;
191 Real
y2 = m_pos[2].y;
192 Real
z2 = m_pos[2].z;
193 Real
x3 = m_pos[3].x;
194 Real
y3 = m_pos[3].y;
195 Real
z3 = m_pos[3].z;
226 Real determinant = 0.0;
242 cx = +
x0*((-1 +
w0)*(-1 +
u0)*(1 - v0)
243 -
w0*(-1 +
u0)*(1 - v0)
244 + (1 -
w0)*
u0*(1 - v0)
245 + (-1 +
w0)*(-1 +
u0)*v0
267 x0*(-1 +
u0)*(1 - v0)
270 +
x3*(-1 +
u0)*(-1 + v0)
278 x0*(-1 +
w0)*(1 - v0)
282 +
x4*(-1 +
w0)*(-1 + v0)
289 +
y0*((-1 +
w0)*(-1 +
u0)*(1 - v0)
290 -
w0*(-1 +
u0)*(1 - v0)
291 + (1 -
w0)*
u0*(1 - v0)
292 + (-1 +
w0)*(-1 +
u0)*v0
315 y0*(-1 +
u0)*(1 - v0)
318 +
y3*(-1 +
u0)*(-1 + v0)
329 +
y4*(-1 +
w0)*(-1 + v0)
335 cz = +
z0*((-1 +
w0)*(-1 +
u0)*(1 - v0)
336 -
w0*(-1 +
u0)*(1 - v0)
337 + (1 -
w0)*
u0*(1 - v0)
338 + (-1 +
w0)*(-1 +
u0)*v0
361 z0*(-1 +
u0)*(1 - v0)
364 +
z3*(-1 +
u0)*(-1 + v0)
372 z0*(-1 +
w0)*(1 - v0)
376 +
z4*(-1 +
w0)*(-1 + v0)
388 tm->
info() <<
"ITERATION DETERMINANT = " << determinant <<
" " << u
389 <<
" " << v <<
" " <<
w;
391 if(math::abs(determinant)>1e-14){
418 tm->
info() <<
"echec du Newton : déterminant nul";
426 tm->
info() <<
"Too many iterations in the newton";
455 Real
fC =
kDiff.squareNormL2();
510 else if (
beta < 0.0 ){
562 else if (
fB1 >= 0.0){
656 distance =
edge1.squareNormL2();
660 distance = (
point-v2).squareNormL2();
664 distance = (
point - (v1 + alpha*
edge0)).squareNormL2();
668 cout <<
"InfosDistance: v1=" << v1 <<
" v2=" << v2 <<
" point="
669 <<
point <<
" alpha=" << alpha
670 <<
" distance=" << distance
672 <<
" projection=" << projection <<
'\n';
701 else if (
beta < 0.0 ){
Informations sur la projection d'un point sur un segment ou un triangle.
static ProjectionInfo projection(Real3 v1, Real3 v2, Real3 v3, Real3 point)
Projection du point point au triangle défini par v1, v2 et v3.
static bool isInside(Real3 v1, Real3 v2, Real3 v3, Real3 point)
Indique si un la projection du point point est à l'intérieur du triangle défini par v1,...
bool cartesianToIso(Real3 point, Real3 &uvw, ITraceMng *tm)
Convertie une coordonnée cartérienne en coordonnée iso-paramétrique.
bool cartesianToIso2(Real3 point, Real3 &uvw, ITraceMng *tm)
Convertie une coordonnée cartérienne en coordonnée iso-paramétrique.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe gérant un vecteur de réel de dimension 3.
Classe gérant une matrice de réel de dimension 3x3.
Interface du gestionnaire de traces.
TraceMessage info() const
Flot pour un message d'information.
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
ARCCORE_HOST_DEVICE Real3 vecMul(Real3 u, Real3 v)
Produit vectoriel de u par v. dans .
ARCCORE_HOST_DEVICE Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
ARCCORE_HOST_DEVICE double sqrt(double v)
Racine carrée de v.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet