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()
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();
165 for (
IItemFamily* family : m_mesh->itemFamilies()) {
172 particles_owner[particle] = cells_owner[particle.
cell()];
177 if (m_mesh->itemFamilyNetwork()) {
179 for (
IItemFamily* family : m_mesh->itemFamilies()) {
180 if (family->itemKind() !=
IK_DoF || family->name() == mesh::GraphDoFs::linkFamilyName())
184 for (
auto dualitem_kind : dualitem_kinds) {
185 IItemFamily* dualitem_family = dualitem_kind ==
IK_Particle ? m_mesh->findItemFamily(dualitem_kind, mesh::ParticleFamily::defaultFamilyName(),
false) : m_mesh->itemFamily(dualitem_kind);
186 if (dualitem_family) {
189 auto connectivity_name = mesh::connectivityName(family, dualitem_family);
190 bool is_dof2dual =
true;
191 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(family, dualitem_family, connectivity_name);
193 connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(dualitem_family, family, connectivity_name);
202 if (connected_items.size() > 0) {
203 dofs_new_owner[*item] = dualitems_new_owner[connected_items[0]];
210 dofs_new_owner[*connected_item] = dualitems_new_owner[*item];
219 IItemFamily* links_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::linkFamilyName(),
false);
222 IItemFamily* dualnodes_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::dualNodeFamilyName(),
false);
223 if (dualnodes_family) {
225 auto connectivity_name = mesh::connectivityName(links_family, dualnodes_family);
226 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(links_family, dualnodes_family, connectivity_name);
231 if (connected_items.size() > 0) {
232 links_new_owner[*item] = dualnodes_new_owner[connected_items[0]];
244void UnstructuredMeshUtilities::
245localIdsFromConnectivity(
eItemKind item_kind,
254 "IK_Cell or IK_Face expected",
259 if (nb_item != local_ids.
size())
261 "Size different from 'items_nb_node'",
264 Integer item_connectivity_index = 0;
268 for (
Integer i = 0; i < nb_item; ++i) {
269 Integer current_nb_node = items_nb_node[i];
271 item_connectivity_index += current_nb_node;
273 buf.
resize(current_nb_node);
275 Int64 first_node_uid = buf[0];
277 Int32 first_node_lid = CheckedConvert::toInt32(buf[0]);
279 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array, first_node_uid_array, !allow_null);
280 if (first_node_lid == NULL_ITEM_LOCAL_ID) {
282 local_ids[i] = NULL_ITEM_LOCAL_ID;
286 for (
Integer j = 0; j < current_nb_node; ++j) {
289 sb += current_nodes[j];
291 sb +=
") not found (first node ";
292 sb += first_node_uid;
299 Node node(nodes[first_node_lid]);
300 Face face(mesh_utils::getFaceFromNodesUnique(node, buf));
303 local_ids[i] = NULL_ITEM_LOCAL_ID;
307 for (
Integer j = 0; j < current_nb_node; ++j) {
310 sb += current_nodes[j];
325void UnstructuredMeshUtilities::
333 if (nb_item != local_ids.
size())
335 "Size different from 'items_type'");
337 Int32 item_connectivity_index = 0;
338 ItemTypeMng* item_type_mng = m_mesh->itemTypeMng();
342 for (
Integer i = 0; i < nb_item; ++i) {
346 item_connectivity_index += current_nb_node;
348 face_reorderer.reorder(current_type_id, current_nodes);
350 Int64 first_node_uid = buf[0];
352 Int32 first_node_lid = CheckedConvert::toInt32(buf[0]);
354 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array, first_node_uid_array, !allow_null);
355 if (first_node_lid == NULL_ITEM_LOCAL_ID) {
357 local_ids[i] = NULL_ITEM_LOCAL_ID;
361 for (
Integer j = 0; j < current_nb_node; ++j) {
364 sb += current_nodes[j];
366 sb +=
") not found (first node ";
367 sb += first_node_uid;
374 Node node(nodes[first_node_lid]);
375 Face face(MeshUtils::getFaceFromNodesUnique(node, buf));
378 local_ids[i] = NULL_ITEM_LOCAL_ID;
382 for (
Integer j = 0; j < current_nb_node; ++j) {
385 sb += current_nodes[j];
399Real3 UnstructuredMeshUtilities::
402 Real3 rvalue = value;
404 if (math::isNearlyZero(value.x))
406 if (math::isNearlyZero(value.y))
408 if (math::isNearlyZero(value.z))
434 String func_name =
"UnstructuredMeshUtilities::computeNormal";
439 Integer mesh_dimension = m_mesh->dimension();
444 Real3 global_normal = Real3::null();
445 Real nb_global_normal_used_node = 0.0;
449 nb_node += face_nb_node;
453 if (mesh_dimension == 3) {
454 Real3 v1 = nodes_coord[face.
node(1)] - nodes_coord[face.
node(0)];
455 Real3 v2 = nodes_coord[face.
node(2)] - nodes_coord[face.
node(0)];
458 else if (mesh_dimension == 2) {
459 Real3 dir = nodes_coord[face.
node(0)] - nodes_coord[face.
node(1)];
460 face_normal.
x = -dir.
y;
461 face_normal.
y = dir.
x;
465 face_normal = -face_normal;
467 global_normal = global_normal + face_normal;
468 nb_global_normal_used_node += 1.0;
479 NodeOccurenceMap nodes_occurence(nb_node * 2,
true, nb_node);
482 for (NodeLocalId inode : face.
nodeIds()) {
483 NodeOccurenceMap::Data* v = nodes_occurence.lookup(inode);
488 nodes_occurence.add(inode, 1);
494 nodes_occurence.each([&](NodeOccurenceMap::Data* d) {
495 if (d->value() == 1) {
496 Node node = nodes_internal[d->key()];
498 if (node.
owner() == rank) {
499 single_nodes.
add(node);
509 Real3 total_global_normal;
516 pm->
computeMinMaxSum(nb_global_normal_used_node, all_min, all_max, all_sum, min_rank, max_rank);
518 if (max_rank == rank) {
523 total_global_normal = buf;
526 info() <<
"TOTAL SINGLE NODE= " << total_nb_single_node <<
" surface=" << face_group.
name()
527 <<
" global_normal = " << total_global_normal;
528 if (total_nb_single_node < 2) {
529 ARCANE_FATAL(
"not enough nodes connected to only one face");
532 for (
Integer i = 0; i < nb_single_node; ++i) {
533 coords[i] = nodes_coord[single_nodes[i]];
540 Real3 barycentre = Real3::null();
541 for (
Integer i = 0; i < total_nb_single_node; ++i) {
542 barycentre += all_nodes_coord[i];
544 barycentre /= (
Real)total_nb_single_node;
545 if (total_nb_single_node == 2 && m_mesh->dimension() == 3) {
551 Real max_distance = 0.0;
553 Real3 s0 = all_nodes_coord[0];
554 Real3 s1 = all_nodes_coord[1];
555 nodes_occurence.each([&](NodeOccurenceMap::Data* d) {
556 Node node = nodes_internal[d->key()];
557 Real3 coord = nodes_coord[node];
563 Real distance = (coord - barycentre).squareNormL2();
564 if (distance > max_distance) {
568 max_distance = distance;
569 farthest_node = node;
574 if (!farthest_node.
null()) {
575 info() <<
" FARTHEST NODE= " <<
ItemPrinter(farthest_node) <<
" dist=" << max_distance;
578 Real3 farthest_coord = _broadcastFarthestNode(max_distance, farthest_node, nodes_coord);
579 info() <<
" FARTHEST NODE ALL coord=" << farthest_coord;
580 all_nodes_coord.
add(farthest_coord);
585 std::sort(std::begin(all_nodes_coord), std::end(all_nodes_coord));
587 Real3 full_normal = Real3::null();
588 info() <<
" NB FINAL NODE=" << nb_final_node;
589 for (
Integer i = 0; i < nb_final_node; ++i)
590 info() <<
" NODE=" << all_nodes_coord[i];
591 if (m_mesh->dimension() == 2) {
592 if (nb_final_node != 2) {
595 Real3 direction = all_nodes_coord[1] - all_nodes_coord[0];
596 full_normal.
x = -direction.
y;
597 full_normal.
y = direction.
x;
599 else if (m_mesh->dimension() == 3) {
609 all_nodes_coord[1] - all_nodes_coord[0]);
610 for (
Integer i = 0; i < nb_final_node; ++i) {
611 Real3 s0 = all_nodes_coord[i];
612 Real3 s1 = all_nodes_coord[(i + nb_final_node - 1) % nb_final_node];
613 Real3 s2 = all_nodes_coord[(i + 1) % nb_final_node];
615 info() <<
" ADD NORMAL: " << normal;
616 full_normal += normal;
617 info() <<
" FULL: " << full_normal;
620 full_normal = first_normal;
623 ARCANE_FATAL(
"invalid mesh dimension (should be 2 or 3)");
630 info() <<
" Normal is " << full_normal;
632 total_global_normal /= b;
635 full_normal = -full_normal;
637 full_normal = _round(full_normal);
638 info() <<
" Final normal is " << full_normal <<
" dir=" << dir;
652computeDirection(
const NodeGroup& node_group,
656 String func_name =
"UnstructuredMeshUtilities::computeDirection";
661 Real3 barycentre = Real3::null();
663 barycentre += nodes_coord[inode];
665 Real r_barycentre[3];
666 r_barycentre[0] = barycentre.
x;
667 r_barycentre[1] = barycentre.
y;
668 r_barycentre[2] = barycentre.
z;
671 barycentre =
Real3(rav[0], rav[1], rav[2]);
672 debug() <<
" BARYCENTRE COMPUTE DIRECTION = " << barycentre;
676 Real3 first_boundary_coord;
678 Real max_distance = 0.0;
682 Real3 coord = nodes_coord[node];
683 Real distance = (coord - barycentre).squareNormL2();
684 if (distance > max_distance) {
685 max_distance = distance;
686 farthest_node = node;
689 first_boundary_coord = _broadcastFarthestNode(max_distance, farthest_node, nodes_coord);
691 *n1 = first_boundary_coord;
693 Real3 second_boundary_coord;
695 Real max_distance = 0.0;
699 Real3 coord = nodes_coord[node];
700 Real distance = (coord - first_boundary_coord).squareNormL2();
701 if (distance > max_distance) {
702 max_distance = distance;
703 farthest_node = node;
706 second_boundary_coord = _broadcastFarthestNode(max_distance, farthest_node, nodes_coord);
708 *n2 = second_boundary_coord;
710 Real3 direction = second_boundary_coord - first_boundary_coord;
713 ARCANE_FATAL(
"Direction is null for group '{0}' first_coord={1} second_coord={2}",
714 node_group.
name(), first_boundary_coord, second_boundary_coord);
716 return direction / norm;
722Real3 UnstructuredMeshUtilities::
723_broadcastFarthestNode(
Real distance,
const Node& farthest_node,
726 String func_name =
"UnstructuredMeshUtilities::_broadcastFarthestNode()";
730 Real all_min_distance = 0.0;
731 Real all_max_distance = 0.0;
732 Real all_sum_distance = 0.0;
735 pm->
computeMinMaxSum(distance, all_min_distance, all_max_distance, all_sum_distance, min_rank, max_rank);
737 if (!farthest_node.
null())
738 debug() <<
" FARTHEST NODE myself coord=" << nodes_coord[farthest_node]
739 <<
" distance=" << distance
740 <<
" rank=" << max_rank
741 <<
" max_distance=" << all_max_distance;
743 debug() <<
" FARTHEST NODE myself coord=none"
744 <<
" distance=" << distance
745 <<
" rank=" << max_rank
746 <<
" max_distance=" << all_max_distance;
748 if (max_rank == rank) {
749 if (farthest_node.
null())
752 buf = nodes_coord[farthest_node];
753 debug() <<
" I AM FARTHEST NODE ALL coord=" << buf;
755 pm->broadcast(Real3ArrayView(1, &buf), max_rank);
756 Real3 farthest_coord(buf);
757 debug() <<
" FARTHEST NODE ALL coord=" << farthest_coord
758 <<
" rank=" << max_rank
759 <<
" max_distance=" << all_max_distance;
760 return farthest_coord;
766void UnstructuredMeshUtilities::
769 m_compute_adjacency_functor->computeAdjacency(adjency_array, link_kind, nb_layer);
775bool UnstructuredMeshUtilities::
776writeToFile(
const String& file_name,
const String& service_name)
784 warning() << String::format(
"The specified service '{0}' to write the mesh is not available."
785 " Valid names are {1}",
786 service_name, available_names);
789 mesh_writer->writeMeshToFile(m_mesh, file_name);
796void UnstructuredMeshUtilities::
798 bool initial_partition)
802 if (
mesh != this->m_mesh)
817 info() <<
"Partitioning the mesh (initial?=" << initial_partition <<
")";
821 info() <<
"Waiting for partition information from the master replica";
823 if (has_replication) {
827 mesh->checker()->checkValidReplication();
838 rep_pm->broadcast(owners, replica_master_rank);
859 if (initial_partition || has_replication)
860 mesh->prepareForDump();
866void UnstructuredMeshUtilities::
869 bool allow_non_corresponding_face)
872 merger.
mergeNodes(nodes_local_id, nodes_to_merge_local_id, allow_non_corresponding_face);
878void UnstructuredMeshUtilities::
879computeAndSetOwnersForNodes()
882 owner_builder.computeNodesOwner();
888void UnstructuredMeshUtilities::
889computeAndSetOwnersForEdges()
892 owner_builder.computeEdgesOwner();
898void UnstructuredMeshUtilities::
899computeAndSetOwnersForFaces()
902 owner_builder.computeFacesOwner();
917 unique_ids[index] = node.uniqueId();
920 Int64 new_uid = MeshUtils::generateHashUniqueId(unique_ids);
930void UnstructuredMeshUtilities::
931recomputeItemsUniqueIdFromNodesUniqueId()
937 tm->
info() <<
"Calling RecomputeItemsUniqueIdFromNodesUniqueId()";
940 mesh->nodeFamily()->notifyItemsUniqueIdChanged();
941 _recomputeUniqueIds(
mesh->edgeFamily());
942 _recomputeUniqueIds(
mesh->faceFamily());
943 _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.
Utility functions on a mesh.
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 de réel de dimension 3.
__host__ __device__ Real normL2() const
Retourne la norme L2 du triplet .
constexpr __host__ __device__ Real squareNormL2() const
Retourne la norme L2 au carré 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.
Generic class for calculating entity owners.
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.
constexpr __host__ __device__ bool isNearlyEqual(const _Type &a, const _Type &b)
Teste si deux valeurs sont à un peu près égales. Pour les types entiers, cette fonction est équivalen...
bool isZero(const BuiltInProxy< _Type > &a)
Teste si une valeur est exactement égale à zéro.
-- 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