14#include "arcane/utils/Array.h"
15#include "arcane/utils/Real3.h"
16#include "arcane/utils/StringBuilder.h"
17#include "arcane/utils/TraceAccessor.h"
18#include "arcane/utils/NotImplementedException.h"
20#include "arcane/ISubDomain.h"
21#include "arcane/IMesh.h"
22#include "arcane/IItemFamily.h"
23#include "arcane/Item.h"
24#include "arcane/BasicService.h"
25#include "arcane/FactoryService.h"
26#include "arcane/ItemPrinter.h"
27#include "arcane/ItemGroup.h"
28#include "arcane/VariableTypes.h"
29#include "arcane/IRayMeshIntersection.h"
30#include "arcane/IParallelMng.h"
31#include "arcane/IParticleFamily.h"
33#include "arcane_packages.h"
35#ifdef ARCANE_HAS_PACKAGE_LIMA
36#include <Lima/lima++.h>
37#define GLOBAL_HAS_LIMA true
39#define GLOBAL_HAS_LIMA false
47const bool global_has_lima = GLOBAL_HAS_LIMA;
81 m_rays_origin = origins;
82 m_rays_direction = directions;
93 m_triangles_coordinates = coordinates;
94 m_triangles_indexes = indexes;
125 return m_intersected_triangle_indexes;
153 Integer nb_ray = m_rays_origin.
size();
154 m_distances.
resize(nb_ray);
155 m_distances.
fill(1.0e100);
156 m_intersected_triangle_indexes.
resize(nb_ray);
157 m_intersected_triangle_indexes.
fill(-1);
158 Integer nb_index = m_triangles_indexes.
size();
161 Integer nb_triangle = nb_index / 3;
162 info() <<
"COMPUTE RAY INTERSECTION nb_ray=" << nb_ray
163 <<
" nb_triangle=" << nb_triangle;
165 for( Integer i=0; i<nb_triangle; ++i ){
166 Real3 p0 = m_triangles_coordinates[m_triangles_indexes[(i*3)]];
167 Real3 p1 = m_triangles_coordinates[m_triangles_indexes[(i*3)+1]];
168 Real3 p2 = m_triangles_coordinates[m_triangles_indexes[(i*3)+2]];
169 _compute2(i,p0,p1,p2);
172 for( Integer i=0; i<nb_ray; ++i ){
173 Int32 tid = m_intersected_triangle_indexes[i];
175 m_distances[i] = -1.0;
182void RayTriangle3DIntersection::
186 for( Integer i=0; i<
nb_ray; ++i ){
189 info() <<
"Segment " << i <<
" intersect triangle " <<
triangle_id <<
" T=" <<
t;
190 if (
t<m_distances[i]){
193 info() <<
"Get this triangle";
310bool RayTriangle3DIntersection::
339 afAWdU[1] = math::abs(afWdU[1]);
341 afADdU[1] = math::abs(afDdU[1]);
342 if (afADdU[1] > Extent[1] && afDdU[1]*afWdU[1] >= (Real)0.0)
348 afAWdU[2] = math::abs(afWdU[2]);
350 afADdU[2] = math::abs(afDdU[2]);
351 if (afADdU[2] > Extent[2] && afDdU[2]*afWdU[2] >= (Real)0.0)
358 afAWxDdU[0] = math::abs(
math::dot(kWxD,Axis[0]));
359 fRhs = Extent[1]*afAWdU[2] + Extent[2]*afAWdU[1];
360 if (afAWxDdU[0] > fRhs)
365 afAWxDdU[1] = math::abs(
math::dot(kWxD,Axis[1]));
366 fRhs = Extent[0]*afAWdU[2] + Extent[2]*afAWdU[0];
367 if (afAWxDdU[1] > fRhs)
372 afAWxDdU[2] = math::abs(
math::dot(kWxD,Axis[2]));
373 fRhs = Extent[0]*afAWdU[1] + Extent[1]*afAWdU[0];
374 if (afAWxDdU[2] > fRhs)
390 : m_triangle_intersector(
tm)
395 Int32 orig_face_local_id,
399 Real* distance,
Real3* position)
401 ARCANE_UNUSED(orig_face_local_id);
402 ARCANE_UNUSED(face_local_id);
415 if (
d0>=0.0 &&
d0<
d){
419 if (
d1>=0.0 &&
d1<
d){
423 if (
d2>=0.0 &&
d2<
d){
427 if (
d3>=0.0 &&
d3<
d){
434 *position =
origin +
d * direction;
487 return m_face_intersector;
510 void _writeSegments(Int32 rank,
515 IRayFaceIntersector* m_face_intersector;
521BasicRayMeshIntersection::
522BasicRayMeshIntersection(
const ServiceBuildInfo& sbi)
524, m_face_intersector(0)
540 IMesh* mesh = this->mesh();
543 info() <<
"COMPUTE INTERSECTION!!";
580 if (!m_face_intersector)
589 Real distance = 1.0e100;
591 Int32 user_value = 0;
621 fatal() <<
"Intersection found but no bounding box intersection";
644 Int32 orig_face_local_id;
687 Integer index =
iitem.index();
694 if (
pm->isParallel()){
699 Integer index =
iitem.index();
772 Int32 owner =
fi.owner;
776 Int32 local_id =
fi.local_id;
778 Real distance =
fi.distance;
780 distances[
ray] = distance;
794 ray_family->toParticleFamily()->exchangeParticles();
803 Integer index =
iitem.index();
816 Integer index =
iitem.index();
831 Integer index =
iitem.index();
848void BasicRayMeshIntersection::
849_writeSegments(Int32 rank,
854#ifdef ARCANE_HAS_PACKAGE_LIMA
855 Lima::Maillage
lima(
"segments");
856 lima.dimension(Lima::D3);
861 Real
t = distances[i];
875 StringBuilder sb(
"segments");
878 std::string s(sb.toString().localstr());
882 ARCANE_UNUSED(positions);
883 ARCANE_UNUSED(directions);
884 ARCANE_UNUSED(distances);
885 ARCANE_THROW(NotSupportedException,
"Lima is not available");
893 BasicRayMeshIntersection);
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_REGISTER_SUB_DOMAIN_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
bool computeIntersection(Real3 origin, Real3 direction, Int32 orig_face_local_id, Int32 face_local_id, Real3ConstArrayView face_nodes, Int32 *user_value, Real *distance, Real3 *position)
Calcul l'intersection entre un rayon et une face.
Service basique de calcul d'intersection entre segments et maillage.
virtual void build()
Construction de niveau build du service.
virtual void setFaceIntersector(IRayFaceIntersector *intersector)
Positionne le callback d'intersection.
virtual IRayFaceIntersector * faceIntersector()
Intersecteur utilisé (0 si aucun spécifié)
virtual void compute(Real3ConstArrayView segments_position, Real3ConstArrayView segments_direction, Int32ConstArrayView segments_orig_face, Int32ArrayView user_values, Real3ArrayView intersections, RealArrayView distances, Int32ArrayView faces_local_id)
Calcule l'intersection.
Classe de base de service lié à un sous-domaine.
Interface d'une famille d'entités.
virtual FaceGroup outerFaces()=0
Groupe de toutes les faces sur la frontière.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface générique du calcul de l'intersection d'un rayon avec une face.
virtual bool computeIntersection(Real3 origin, Real3 direction, Int32 orig_face_local_id, Int32 face_local_id, Real3ConstArrayView face_nodes, Int32 *user_value, Real *distance, Real3 *intersection_position)=0
Calcul l'intersection entre un rayon et une face.
Calcul de l'intersection entre un ensemble de segments et la surface d'un maillage.
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
bool isOwn() const
true si l'entité est appartient au sous-domaine
Variable scalaire sur un type d'entité du maillage.
Vue sur les informations des particules.
Calcul l'intersection d'un rayon avec un ensemble de triangles en 3D.
void setRays(Real3ConstArrayView origins, Real3ConstArrayView directions)
Position la liste des rayons dont on souhaite calculer l'intersection.
Real checkIntersection(Real3 origin, Real3 direction, Real3 p0, Real3 p1, Real3 p2)
Calcul l'intersection de la demi-droite [origin,direction) avec le triangle (p0,p1,...
void compute()
Calcul l'intersection de chaque rayon avec la liste des triangles. Si un rayon intersecte plusieurs t...
void setTriangles(Real3ConstArrayView coordinates, Int32ConstArrayView indexes)
Positionne la liste des triangles dont on souhaite calculer l'intersection avec les rayons....
Int32ConstArrayView intersectedTriangleIndexes()
Indices des triangles intersectés. Indice dans le tableau donnée par setTriangles() du triangle inter...
RealConstArrayView distances()
Distance de l'origine d'un rayon à son point d'intersection. Distance (exprimée relativivement à la n...
Classe gérant un vecteur de réel de dimension 3.
Structure contenant les informations pour créer un service.
Vue modifiable d'un tableau d'un type T.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Exception lorsqu'une erreur fatale est survenue.
Interface du gestionnaire de traces.
Référence à une instance.
Vecteur 1D de données avec sémantique par valeur (style STL).
__host__ __device__ Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
__host__ __device__ Real3 vecMul(Real3 u, Real3 v)
Produit vectoriel de u par v. dans .
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
ConstArrayView< Real3 > Real3ConstArrayView
Equivalent C d'un tableau à une dimension de Real3.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.