14#include "arcane/utils/InvalidArgumentException.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/ParallelFatalErrorException.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/Array.h"
19#include "arcane/utils/Real3.h"
20#include "arcane/utils/HashTableMap.h"
21#include "arcane/utils/OStringStream.h"
22#include "arcane/utils/ScopedPtr.h"
23#include "arcane/utils/StringBuilder.h"
24#include "arcane/utils/CheckedConvert.h"
25#include "arcane/utils/PlatformUtils.h"
26#include "arcane/utils/SmallArray.h"
27#include "arcane/utils/NotImplementedException.h"
29#include "arcane/core/IMesh.h"
30#include "arcane/core/IMeshWriter.h"
31#include "arcane/core/IParallelMng.h"
33#include "arcane/core/IItemFamily.h"
34#include "arcane/core/ItemPrinter.h"
35#include "arcane/core/VariableTypes.h"
36#include "arcane/core/ItemPairGroup.h"
37#include "arcane/core/ISubDomain.h"
38#include "arcane/core/ServiceBuilder.h"
39#include "arcane/core/IParallelReplication.h"
40#include "arcane/core/Timer.h"
41#include "arcane/core/IMeshPartitioner.h"
42#include "arcane/core/IPrimaryMesh.h"
43#include "arcane/core/IMeshChecker.h"
44#include "arcane/core/IItemFamilyNetwork.h"
45#include "arcane/core/NodesOfItemReorderer.h"
47#include "arcane/mesh/UnstructuredMeshUtilities.h"
48#include "arcane/ConnectivityItemVector.h"
49#include "arcane/mesh/NewItemOwnerBuilder.h"
50#include "arcane/mesh/ParticleFamily.h"
51#include "arcane/mesh/GraphDoFs.h"
52#include "arcane/mesh/BasicItemPairGroupComputeFunctor.h"
53#include "arcane/mesh/MeshNodeMerger.h"
54#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
55#include "arcane/mesh/ItemsOwnerBuilder.h"
68UnstructuredMeshUtilities::
79UnstructuredMeshUtilities::
80~UnstructuredMeshUtilities()
82 delete m_compute_adjacency_functor;
88void UnstructuredMeshUtilities::
89changeOwnersFromCells()
110 mesh::NewItemOwnerBuilder owner_builder;
120 const Node node = *i_node;
121 const Cell cell = owner_builder.connectedCellOfItem(node);
122#ifdef ARCANE_DEBUG_LOAD_BALANCING
123 if (nodes_owner[node]!= cells_owner[cell]){
125 <<
" old_owner=" << nodes_owner[node]
126 <<
" current_cell_owner=" << cell.
owner()
127 <<
" new_owner=" << cells_owner[cell];
130 nodes_owner[node] = cells_owner[cell];
132 nodes_owner.synchronize();
138 const Edge edge = *i_edge;
139 const Cell cell = owner_builder.connectedCellOfItem(edge);
140#ifdef ARCANE_DEBUG_LOAD_BALANCING
141 if (edges_owner[edge] != cells_owner[cell]) {
143 <<
" old_owner=" << edges_owner[edge]
144 <<
" current_cell_owner=" << cell.
owner()
145 <<
" new_owner=" << cells_owner[cell];
148 edges_owner[edge] = cells_owner[cell];
150 edges_owner.synchronize();
156 const Face face = *i_face;
157 const Cell cell = owner_builder.connectedCellOfItem(face);
158 faces_owner[face] = cells_owner[cell];
160 faces_owner.synchronize();
167 for(
IItemFamily* family : m_mesh->itemFamilies() ){
176 particles_owner[particle] = cells_owner[pcell];
179 particles_owner[particle] = particle.
owner();
184 if(m_mesh->itemFamilyNetwork())
187 for(
IItemFamily* family : m_mesh->itemFamilies() )
189 if (family->itemKind()!=
IK_DoF || family->name()==mesh::GraphDoFs::linkFamilyName())
193 for(
auto dualitem_kind : dualitem_kinds)
195 IItemFamily* dualitem_family = dualitem_kind==
IK_Particle? m_mesh->findItemFamily(dualitem_kind,mesh::ParticleFamily::defaultFamilyName(),
false):
196 m_mesh->itemFamily(dualitem_kind) ;
201 auto connectivity_name = mesh::connectivityName(family,dualitem_family) ;
202 bool is_dof2dual = true ;
203 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(family,dualitem_family,connectivity_name) ;
206 connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(dualitem_family,family,connectivity_name) ;
207 is_dof2dual = false ;
218 if(connected_items.size()>0)
220 dofs_new_owner[*item] = dualitems_new_owner[connected_items[0]] ;
230 dofs_new_owner[*connected_item] = dualitems_new_owner[*item] ;
239 IItemFamily* links_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::linkFamilyName(),
false);
243 IItemFamily* dualnodes_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::dualNodeFamilyName(),
false);
247 auto connectivity_name = mesh::connectivityName(links_family,dualnodes_family) ;
248 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(links_family,dualnodes_family,connectivity_name) ;
255 if(connected_items.size()>0)
257 links_new_owner[*item] = dualnodes_new_owner[connected_items[0]] ;
269void UnstructuredMeshUtilities::
270localIdsFromConnectivity(
eItemKind item_kind,
279 "IK_Cell or IK_Face expected",
284 if (nb_item!=local_ids.
size())
286 "Size different from 'items_nb_node'",
289 Integer item_connectivity_index = 0;
293 for(
Integer i=0; i<nb_item; ++i ){
294 Integer current_nb_node = items_nb_node[i];
296 item_connectivity_index += current_nb_node;
298 buf.
resize(current_nb_node);
300 Int64 first_node_uid = buf[0];
302 Int32 first_node_lid = CheckedConvert::toInt32(buf[0]);
304 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array,first_node_uid_array,!allow_null);
305 if (first_node_lid == NULL_ITEM_LOCAL_ID){
307 local_ids[i] = NULL_ITEM_LOCAL_ID;
311 for(
Integer j=0;j<current_nb_node;++j) {
312 if (j != 0) sb +=
" ";
313 sb += current_nodes[j];
315 sb +=
") not found (first node ";
316 sb += first_node_uid;
323 Node node(nodes[first_node_lid]);
324 Face face(mesh_utils::getFaceFromNodesUnique(node,buf));
327 local_ids[i] = NULL_ITEM_LOCAL_ID;
331 for(
Integer j=0;j<current_nb_node;++j) {
332 if (j != 0) sb +=
" ";
333 sb += current_nodes[j];
348void UnstructuredMeshUtilities::
356 if (nb_item!=local_ids.
size())
358 "Size different from 'items_type'");
360 Int32 item_connectivity_index = 0;
361 ItemTypeMng* item_type_mng = m_mesh->itemTypeMng();
365 for(
Integer i=0; i<nb_item; ++i ){
369 item_connectivity_index += current_nb_node;
371 face_reorderer.reorder(current_type_id,current_nodes);
373 Int64 first_node_uid = buf[0];
375 Int32 first_node_lid = CheckedConvert::toInt32(buf[0]);
377 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array,first_node_uid_array,!allow_null);
378 if (first_node_lid == NULL_ITEM_LOCAL_ID){
380 local_ids[i] = NULL_ITEM_LOCAL_ID;
384 for(
Integer j=0;j<current_nb_node;++j) {
385 if (j != 0) sb +=
" ";
386 sb += current_nodes[j];
388 sb +=
") not found (first node ";
389 sb += first_node_uid;
396 Node node(nodes[first_node_lid]);
397 Face face(MeshUtils::getFaceFromNodesUnique(node,buf));
400 local_ids[i] = NULL_ITEM_LOCAL_ID;
404 for(
Integer j=0;j<current_nb_node;++j) {
405 if (j != 0) sb +=
" ";
406 sb += current_nodes[j];
420Real3 UnstructuredMeshUtilities::
423 Real3 rvalue = value;
425 if (math::isNearlyZero(value.x))
427 if (math::isNearlyZero(value.y))
429 if (math::isNearlyZero(value.z))
455 String func_name =
"UnstructuredMeshUtilities::computeNormal";
460 Integer mesh_dimension = m_mesh->dimension();
465 Real3 global_normal = Real3::null();
466 Real nb_global_normal_used_node = 0.0;
470 nb_node += face_nb_node;
474 if (mesh_dimension==3){
475 Real3 v1 = nodes_coord[face.
node(1)] - nodes_coord[face.
node(0)];
476 Real3 v2 = nodes_coord[face.
node(2)] - nodes_coord[face.
node(0)];
479 else if (mesh_dimension==2){
480 Real3 dir = nodes_coord[face.
node(0)] - nodes_coord[face.
node(1)];
481 face_normal.
x = - dir.
y;
482 face_normal.
y = dir.
x;
486 face_normal = -face_normal;
488 global_normal = global_normal + face_normal;
489 nb_global_normal_used_node += 1.0;
500 NodeOccurenceMap nodes_occurence(nb_node*2,
true,nb_node);
503 for( NodeLocalId inode : face.
nodeIds() ){
504 NodeOccurenceMap::Data* v = nodes_occurence.lookup(inode);
509 nodes_occurence.add(inode,1);
515 nodes_occurence.each([&](NodeOccurenceMap::Data* d){
517 Node node = nodes_internal[d->key()];
519 if (node.
owner()==rank){
520 single_nodes.
add(node);
530 Real3 total_global_normal;
537 pm->
computeMinMaxSum(nb_global_normal_used_node,all_min,all_max,all_sum,min_rank,max_rank);
544 total_global_normal = buf;
547 info() <<
"TOTAL SINGLE NODE= " << total_nb_single_node <<
" surface=" << face_group.
name()
548 <<
" global_normal = " << total_global_normal;
549 if (total_nb_single_node<2){
550 ARCANE_FATAL(
"not enough nodes connected to only one face");
553 for(
Integer i=0; i<nb_single_node; ++i ){
554 coords[i] = nodes_coord[single_nodes[i]];
561 Real3 barycentre = Real3::null();
562 for(
Integer i=0; i<total_nb_single_node; ++i ){
563 barycentre += all_nodes_coord[i];
565 barycentre /= (
Real)total_nb_single_node;
566 if (total_nb_single_node==2 && m_mesh->dimension()==3){
572 Real max_distance = 0.0;
574 Real3 s0 = all_nodes_coord[0];
575 Real3 s1 = all_nodes_coord[1];
576 nodes_occurence.each([&](NodeOccurenceMap::Data* d){
577 Node node = nodes_internal[d->key()];
578 Real3 coord = nodes_coord[node];
584 Real distance = (coord - barycentre).squareNormL2();
585 if (distance>max_distance){
589 max_distance = distance;
590 farthest_node = node;
595 if (!farthest_node.
null()){
596 info() <<
" FARTHEST NODE= " <<
ItemPrinter(farthest_node) <<
" dist=" << max_distance;
599 Real3 farthest_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
600 info() <<
" FARTHEST NODE ALL coord=" << farthest_coord;
601 all_nodes_coord.
add(farthest_coord);
606 std::sort(std::begin(all_nodes_coord),std::end(all_nodes_coord));
608 Real3 full_normal = Real3::null();
609 info() <<
" NB FINAL NODE=" << nb_final_node;
610 for(
Integer i=0; i<nb_final_node; ++i )
611 info() <<
" NODE=" << all_nodes_coord[i];
612 if (m_mesh->dimension()==2){
613 if (nb_final_node!=2){
616 Real3 direction = all_nodes_coord[1] - all_nodes_coord[0];
617 full_normal.
x = - direction.
y;
618 full_normal.
y = direction.
x;
620 else if (m_mesh->dimension()==3){
630 all_nodes_coord[1]-all_nodes_coord[0]);
631 for(
Integer i=0; i<nb_final_node; ++i ){
632 Real3 s0 = all_nodes_coord[i];
633 Real3 s1 = all_nodes_coord[(i+nb_final_node-1)%nb_final_node];
634 Real3 s2 = all_nodes_coord[(i+1)%nb_final_node];
636 info() <<
" ADD NORMAL: " << normal;
637 full_normal += normal;
638 info() <<
" FULL: " << full_normal;
641 full_normal = first_normal;
644 ARCANE_FATAL(
"invalid mesh dimension (should be 2 or 3)");
651 info() <<
" Normal is " << full_normal;
653 total_global_normal /= b;
656 full_normal = -full_normal;
658 full_normal = _round(full_normal);
659 info() <<
" Final normal is " << full_normal <<
" dir=" << dir;
673computeDirection(
const NodeGroup& node_group,
677 String func_name =
"UnstructuredMeshUtilities::computeDirection";
682 Real3 barycentre = Real3::null();
684 barycentre += nodes_coord[inode];
686 Real r_barycentre[3];
687 r_barycentre[0] = barycentre.
x;
688 r_barycentre[1] = barycentre.
y;
689 r_barycentre[2] = barycentre.
z;
692 barycentre =
Real3(rav[0],rav[1],rav[2]);
693 debug() <<
" BARYCENTRE COMPUTE DIRECTION = " << barycentre;
697 Real3 first_boundary_coord;
699 Real max_distance = 0.0;
703 Real3 coord = nodes_coord[node];
704 Real distance = (coord - barycentre).squareNormL2();
705 if (distance>max_distance){
706 max_distance = distance;
707 farthest_node = node;
710 first_boundary_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
712 *n1 = first_boundary_coord;
714 Real3 second_boundary_coord;
716 Real max_distance = 0.0;
720 Real3 coord = nodes_coord[node];
721 Real distance = (coord - first_boundary_coord).squareNormL2();
722 if (distance>max_distance){
723 max_distance = distance;
724 farthest_node = node;
727 second_boundary_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
729 *n2 = second_boundary_coord;
731 Real3 direction = second_boundary_coord - first_boundary_coord;
734 ARCANE_FATAL(
"Direction is null for group '{0}' first_coord={1} second_coord={2}",
735 node_group.
name(),first_boundary_coord,second_boundary_coord);
737 return direction / norm;
743Real3 UnstructuredMeshUtilities::
744_broadcastFarthestNode(
Real distance,
const Node& farthest_node,
747 String func_name =
"UnstructuredMeshUtilities::_broadcastFarthestNode()";
751 Real all_min_distance = 0.0;
752 Real all_max_distance = 0.0;
753 Real all_sum_distance = 0.0;
756 pm->
computeMinMaxSum(distance,all_min_distance,all_max_distance,all_sum_distance,min_rank,max_rank);
758 if (!farthest_node.
null())
759 debug() <<
" FARTHEST NODE myself coord=" << nodes_coord[farthest_node]
760 <<
" distance=" << distance
761 <<
" rank=" << max_rank
762 <<
" max_distance=" << all_max_distance;
764 debug() <<
" FARTHEST NODE myself coord=none"
765 <<
" distance=" << distance
766 <<
" rank=" << max_rank
767 <<
" max_distance=" << all_max_distance;
770 if (farthest_node.
null())
773 buf = nodes_coord[farthest_node];
774 debug() <<
" I AM FARTHEST NODE ALL coord=" << buf;
776 pm->broadcast(Real3ArrayView(1,&buf),max_rank);
777 Real3 farthest_coord(buf);
778 debug() <<
" FARTHEST NODE ALL coord=" << farthest_coord
779 <<
" rank=" << max_rank
780 <<
" max_distance=" << all_max_distance;
781 return farthest_coord;
787void UnstructuredMeshUtilities::
790 m_compute_adjacency_functor->computeAdjacency(adjency_array, link_kind, nb_layer);
796bool UnstructuredMeshUtilities::
797writeToFile(
const String& file_name,
const String& service_name)
805 warning() << String::format(
"The specified service '{0}' to write the mesh is not available."
806 " Valid names are {1}",service_name,available_names);
809 mesh_writer->writeMeshToFile(m_mesh,file_name);
816void UnstructuredMeshUtilities::
818 bool initial_partition)
822 if (
mesh!=this->m_mesh)
837 info() <<
"Partitioning the mesh (initial?=" << initial_partition <<
")";
841 info() <<
"Waiting for partition information from the master replica";
843 if (has_replication){
847 mesh->checker()->checkValidReplication();
858 rep_pm->broadcast(owners,replica_master_rank);
879 if (initial_partition || has_replication)
880 mesh->prepareForDump();
886void UnstructuredMeshUtilities::
889 bool allow_non_corresponding_face)
892 merger.
mergeNodes(nodes_local_id, nodes_to_merge_local_id, allow_non_corresponding_face);
898void UnstructuredMeshUtilities::
899computeAndSetOwnersForNodes()
902 owner_builder.computeNodesOwner();
908void UnstructuredMeshUtilities::
909computeAndSetOwnersForEdges()
912 owner_builder.computeEdgesOwner();
918void UnstructuredMeshUtilities::
919computeAndSetOwnersForFaces()
922 owner_builder.computeFacesOwner();
937 unique_ids[index] = node.uniqueId();
940 Int64 new_uid = MeshUtils::generateHashUniqueId(unique_ids);
950void UnstructuredMeshUtilities::
951recomputeItemsUniqueIdFromNodesUniqueId()
957 tm->
info() <<
"Calling RecomputeItemsUniqueIdFromNodesUniqueId()";
960 mesh->nodeFamily()->notifyItemsUniqueIdChanged();
961 _recomputeUniqueIds(
mesh->edgeFamily());
962 _recomputeUniqueIds(
mesh->faceFamily());
963 _recomputeUniqueIds(
mesh->cellFamily());
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
bool reorderNodesOfFace(Int64ConstArrayView before_ids, Int64ArrayView after_ids)
Réordonne les noeuds d'une face.
Integer size() const
Nombre d'éléments du vecteur.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Fonctions utilitaires sur un maillage.
Gère la récupération des informations de connectivité.
ItemVectorView connectedItems(ItemLocalId item)
Retourne les entités connectées à item.
Vue constante d'un tableau de type T.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Cell frontCell() const
Maille devant la face (maille nulle si aucune).
bool isSubDomainBoundary() const
Indique si la face est au bord du sous-domaine (i.e nbCell()==1).
Cell boundaryCell() const
Maille associée à cette face frontière (maille nulle si aucune).
Table de hachage pour tableaux associatifs.
Interface d'une famille d'entités.
virtual void notifyItemsUniqueIdChanged()=0
Notifie que les numéros uniques des entités ont été modifiées.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
Interface d'un partitionneur de maillage.
virtual IPrimaryMesh * primaryMesh()=0
Maillage associé
virtual void partitionMesh(bool initial_partition)=0
virtual void notifyEndPartition()=0
Notification lors de la fin d'un re-partitionnement (après échange des entités).
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void computeMinMaxSum(char val, char &min_val, char &max_val, char &sum_val, Int32 &min_rank, Int32 &max_rank)=0
Calcule en une opération la somme, le min, le max d'une valeur.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual IParallelReplication * replication() const =0
Informations sur la réplication.
virtual ITimeStats * timeStats() const =0
Gestionnaire de statistiques associé (peut être nul).
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
virtual void barrier()=0
Effectue une barière.
Informations sur la réplication des sous-domaines en parallèle.
virtual bool hasReplication() const =0
Indique si la réplication est active.
virtual IParallelMng * replicaParallelMng() const =0
Communicateur associé à tous les réplicats représentant un même sous-domaine.
virtual Int32 masterReplicationRank() const =0
Rang dans la réplication du maître.
virtual bool isMasterRank() const =0
Indique si ce rang de réplication est le maître.
virtual void exchangeItems()=0
Change les sous-domaines propriétaires des entités.
Interface gérant les statistiques sur les temps d'exécution.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Exception lorsqu'une erreur fatale est survenue.
const String & name() const
Nom du groupe.
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Index d'un Item dans une variable.
Tableau de listes d'entités.
Classe utilitaire pour imprimer les infos sur une entité.
Type d'une entité (Item).
Integer nbLocalNode() const
Nombre de noeuds de l'entité
Gestionnaire des types d'entités d'un maillage.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Node node(Int32 i) const
i-ème noeud de l'entité
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
constexpr bool isOwn() const
true si l'entité est appartient au sous-domaine
Classe pour convertir un NodeLocalId vers une arête.
Classe utilitaire pour réordonner les noeuds d'une entité.
Exception lorsqu'une fonction n'est pas implémentée.
Cell cell() const
Maille à laquelle appartient la particule. Il faut appeler setCell() avant d'appeler cette fonction....
Classe gérant un vecteur réel de 3 dimensions.
__host__ __device__ Real normL2() const
Retourne la norme L2 du triplet $ .
constexpr __host__ __device__ Real squareNormL2() const
Retourne le carré de la norme L2 du triplet $ .
Classe utilitaire pour instantier un service d'une interface donnée.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Créé une instance implémentant l'interface InterfaceType.
void getServicesNames(Array< String > &names) const
Remplit names avec les noms des services disponibles pour instantier cette interface.
Tableau 1D de données avec buffer pré-alloué sur la pile.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
Chaîne de caractères unicode.
Postionne le nom de l'action en cours d'exécution.
Classe d'accès aux traces.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage warning() const
Flot pour un message d'avertissement.
Vecteur 1D de données avec sémantique par valeur (style STL).
void changeOwnersFromCells() override
Positionne les nouveaux propriétaires des noeuds, arêtes et faces à partir des mailles.
Classe générique pour calculer les propriétaires des entités.
Fusion de nœuds d'un maillage.
void mergeNodes(Int32ConstArrayView nodes_local_id, Int32ConstArrayView nodes_to_merge_local_id, bool allow_non_corresponding_face=false)
__host__ __device__ Real3 vecMul(Real3 u, Real3 v)
Produit vectoriel de u par v dans .
__host__ __device__ Real scaMul(Real2 u, Real2 v)
Produit scalaire de u par v dans .
__host__ __device__ Real3 cross(Real3 v1, Real3 v2)
Produit vectoriel de deux vecteurs à 3 composantes.
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
@ ReduceSum
Somme des valeurs.
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
constexpr __host__ __device__ bool isNearlyEqual(const Type &a, const Type &b)
Teste si deux valeurs sont approximativement égales. Pour les types entiers, cette fonction est équiv...
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
@ SB_AllowNull
Autorise l'absence du service.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
ArrayView< Real3 > Real3ArrayView
Equivalent C d'un tableau à une dimension de Real3.
Int32 Integer
Type représentant un entier.
UniqueArray< Real3 > Real3UniqueArray
Tableau dynamique à une dimension de vecteurs de rang 3.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
double Real
Type représentant un réel.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
std::int32_t Int32
Type entier signé sur 32 bits.
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet