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/IMesh.h"
30#include "arcane/IMeshWriter.h"
31#include "arcane/IParallelMng.h"
32#include "arcane/MeshUtils.h"
33#include "arcane/IItemFamily.h"
34#include "arcane/ItemPrinter.h"
35#include "arcane/VariableTypes.h"
36#include "arcane/ItemPairGroup.h"
37#include "arcane/ISubDomain.h"
38#include "arcane/ServiceBuilder.h"
39#include "arcane/IParallelReplication.h"
40#include "arcane/Timer.h"
41#include "arcane/IMeshPartitioner.h"
42#include "arcane/IPrimaryMesh.h"
43#include "arcane/IMeshChecker.h"
45#include "arcane/mesh/UnstructuredMeshUtilities.h"
46#include "arcane/IItemFamilyNetwork.h"
47#include "arcane/ConnectivityItemVector.h"
48#include "arcane/mesh/NewItemOwnerBuilder.h"
49#include "arcane/mesh/ParticleFamily.h"
50#include "arcane/mesh/GraphDoFs.h"
51#include "arcane/mesh/BasicItemPairGroupComputeFunctor.h"
52#include "arcane/mesh/MeshNodeMerger.h"
53#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
54#include "arcane/mesh/ItemsOwnerBuilder.h"
67UnstructuredMeshUtilities::
78UnstructuredMeshUtilities::
79~UnstructuredMeshUtilities()
81 delete m_compute_adjacency_functor;
87void UnstructuredMeshUtilities::
88changeOwnersFromCells()
109 mesh::NewItemOwnerBuilder owner_builder;
119 const Node node = *i_node;
120 const Cell cell = owner_builder.connectedCellOfItem(node);
121#ifdef ARCANE_DEBUG_LOAD_BALANCING
122 if (nodes_owner[node]!= cells_owner[cell]){
124 <<
" old_owner=" << nodes_owner[node]
125 <<
" current_cell_owner=" << cell.
owner()
126 <<
" new_owner=" << cells_owner[cell];
129 nodes_owner[node] = cells_owner[cell];
131 nodes_owner.synchronize();
137 const Edge edge = *i_edge;
138 const Cell cell = owner_builder.connectedCellOfItem(edge);
139#ifdef ARCANE_DEBUG_LOAD_BALANCING
140 if (edges_owner[edge] != cells_owner[cell]) {
142 <<
" old_owner=" << edges_owner[edge]
143 <<
" current_cell_owner=" << cell.
owner()
144 <<
" new_owner=" << cells_owner[cell];
147 edges_owner[edge] = cells_owner[cell];
149 edges_owner.synchronize();
155 const Face face = *i_face;
156 const Cell cell = owner_builder.connectedCellOfItem(face);
157 faces_owner[face] = cells_owner[cell];
159 faces_owner.synchronize();
166 for(
IItemFamily* family : m_mesh->itemFamilies() ){
173 particles_owner[particle] = cells_owner[particle.
cell()] ;
178 if(m_mesh->itemFamilyNetwork())
181 for(
IItemFamily* family : m_mesh->itemFamilies() )
183 if (family->itemKind()!=
IK_DoF || family->name()==mesh::GraphDoFs::linkFamilyName())
187 for(
auto dualitem_kind : dualitem_kinds)
189 IItemFamily* dualitem_family = dualitem_kind==
IK_Particle? m_mesh->findItemFamily(dualitem_kind,mesh::ParticleFamily::defaultFamilyName(),
false):
190 m_mesh->itemFamily(dualitem_kind) ;
195 auto connectivity_name = mesh::connectivityName(family,dualitem_family) ;
196 bool is_dof2dual = true ;
197 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(family,dualitem_family,connectivity_name) ;
200 connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(dualitem_family,family,connectivity_name) ;
201 is_dof2dual = false ;
212 if(connected_items.size()>0)
214 dofs_new_owner[*item] = dualitems_new_owner[connected_items[0]] ;
224 dofs_new_owner[*connected_item] = dualitems_new_owner[*item] ;
233 IItemFamily* links_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::linkFamilyName(),
false);
237 IItemFamily* dualnodes_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::dualNodeFamilyName(),
false);
241 auto connectivity_name = mesh::connectivityName(links_family,dualnodes_family) ;
242 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(links_family,dualnodes_family,connectivity_name) ;
249 if(connected_items.size()>0)
251 links_new_owner[*item] = dualnodes_new_owner[connected_items[0]] ;
263void UnstructuredMeshUtilities::
264localIdsFromConnectivity(
eItemKind item_kind,
273 "IK_Cell or IK_Face expected",
278 if (nb_item!=local_ids.
size())
280 "Size different from 'items_nb_node'",
283 Integer item_connectivity_index = 0;
287 for(
Integer i=0; i<nb_item; ++i ){
288 Integer current_nb_node = items_nb_node[i];
290 item_connectivity_index += current_nb_node;
292 buf.
resize(current_nb_node);
294 Int64 first_node_uid = buf[0];
298 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array,first_node_uid_array,!allow_null);
299 if (first_node_lid == NULL_ITEM_LOCAL_ID){
301 local_ids[i] = NULL_ITEM_LOCAL_ID;
305 for(
Integer j=0;j<current_nb_node;++j) {
306 if (j != 0) sb +=
" ";
307 sb += current_nodes[j];
309 sb +=
") not found (first node ";
310 sb += first_node_uid;
317 Node node(nodes[first_node_lid]);
318 Face face(mesh_utils::getFaceFromNodesUnique(node,buf));
321 local_ids[i] = NULL_ITEM_LOCAL_ID;
325 for(
Integer j=0;j<current_nb_node;++j) {
326 if (j != 0) sb +=
" ";
327 sb += current_nodes[j];
342Real3 UnstructuredMeshUtilities::
345 Real3 rvalue = value;
347 if (math::isNearlyZero(value.x))
349 if (math::isNearlyZero(value.y))
351 if (math::isNearlyZero(value.z))
377 String func_name =
"UnstructuredMeshUtilities::computeNormal";
382 Integer mesh_dimension = m_mesh->dimension();
387 Real3 global_normal = Real3::null();
388 Real nb_global_normal_used_node = 0.0;
392 nb_node += face_nb_node;
396 if (mesh_dimension==3){
397 Real3 v1 = nodes_coord[face.
node(1)] - nodes_coord[face.
node(0)];
398 Real3 v2 = nodes_coord[face.
node(2)] - nodes_coord[face.
node(0)];
401 else if (mesh_dimension==2){
402 Real3 dir = nodes_coord[face.
node(0)] - nodes_coord[face.
node(1)];
403 face_normal.
x = - dir.
y;
404 face_normal.
y = dir.
x;
408 face_normal = -face_normal;
410 global_normal = global_normal + face_normal;
411 nb_global_normal_used_node += 1.0;
422 NodeOccurenceMap nodes_occurence(nb_node*2,
true,nb_node);
425 for( NodeLocalId inode : face.
nodeIds() ){
426 NodeOccurenceMap::Data* v = nodes_occurence.lookup(inode);
431 nodes_occurence.add(inode,1);
437 nodes_occurence.each([&](NodeOccurenceMap::Data* d){
439 Node node = nodes_internal[d->key()];
441 if (node.
owner()==rank){
442 single_nodes.
add(node);
452 Real3 total_global_normal;
459 pm->
computeMinMaxSum(nb_global_normal_used_node,all_min,all_max,all_sum,min_rank,max_rank);
466 total_global_normal = buf;
469 info() <<
"TOTAL SINGLE NODE= " << total_nb_single_node <<
" surface=" << face_group.
name()
470 <<
" global_normal = " << total_global_normal;
471 if (total_nb_single_node<2){
472 ARCANE_FATAL(
"not enough nodes connected to only one face");
475 for(
Integer i=0; i<nb_single_node; ++i ){
476 coords[i] = nodes_coord[single_nodes[i]];
483 Real3 barycentre = Real3::null();
484 for(
Integer i=0; i<total_nb_single_node; ++i ){
485 barycentre += all_nodes_coord[i];
487 barycentre /= (
Real)total_nb_single_node;
488 if (total_nb_single_node==2 && m_mesh->dimension()==3){
494 Real max_distance = 0.0;
496 Real3 s0 = all_nodes_coord[0];
497 Real3 s1 = all_nodes_coord[1];
498 nodes_occurence.each([&](NodeOccurenceMap::Data* d){
499 Node node = nodes_internal[d->key()];
500 Real3 coord = nodes_coord[node];
506 Real distance = (coord - barycentre).squareNormL2();
507 if (distance>max_distance){
511 max_distance = distance;
512 farthest_node = node;
517 if (!farthest_node.
null()){
518 info() <<
" FARTHEST NODE= " <<
ItemPrinter(farthest_node) <<
" dist=" << max_distance;
521 Real3 farthest_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
522 info() <<
" FARTHEST NODE ALL coord=" << farthest_coord;
523 all_nodes_coord.
add(farthest_coord);
528 std::sort(std::begin(all_nodes_coord),std::end(all_nodes_coord));
530 Real3 full_normal = Real3::null();
531 info() <<
" NB FINAL NODE=" << nb_final_node;
532 for(
Integer i=0; i<nb_final_node; ++i )
533 info() <<
" NODE=" << all_nodes_coord[i];
534 if (m_mesh->dimension()==2){
535 if (nb_final_node!=2){
538 Real3 direction = all_nodes_coord[1] - all_nodes_coord[0];
539 full_normal.
x = - direction.
y;
540 full_normal.
y = direction.
x;
542 else if (m_mesh->dimension()==3){
552 all_nodes_coord[1]-all_nodes_coord[0]);
553 for(
Integer i=0; i<nb_final_node; ++i ){
554 Real3 s0 = all_nodes_coord[i];
555 Real3 s1 = all_nodes_coord[(i+nb_final_node-1)%nb_final_node];
556 Real3 s2 = all_nodes_coord[(i+1)%nb_final_node];
558 info() <<
" ADD NORMAL: " << normal;
559 full_normal += normal;
560 info() <<
" FULL: " << full_normal;
563 full_normal = first_normal;
566 ARCANE_FATAL(
"invalid mesh dimension (should be 2 or 3)");
573 info() <<
" Normal is " << full_normal;
575 total_global_normal /= b;
578 full_normal = -full_normal;
580 full_normal = _round(full_normal);
581 info() <<
" Final normal is " << full_normal <<
" dir=" << dir;
595computeDirection(
const NodeGroup& node_group,
599 String func_name =
"UnstructuredMeshUtilities::computeDirection";
604 Real3 barycentre = Real3::null();
606 barycentre += nodes_coord[inode];
608 Real r_barycentre[3];
609 r_barycentre[0] = barycentre.
x;
610 r_barycentre[1] = barycentre.
y;
611 r_barycentre[2] = barycentre.
z;
614 barycentre =
Real3(rav[0],rav[1],rav[2]);
615 debug() <<
" BARYCENTRE COMPUTE DIRECTION = " << barycentre;
619 Real3 first_boundary_coord;
621 Real max_distance = 0.0;
625 Real3 coord = nodes_coord[node];
626 Real distance = (coord - barycentre).squareNormL2();
627 if (distance>max_distance){
628 max_distance = distance;
629 farthest_node = node;
632 first_boundary_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
634 *n1 = first_boundary_coord;
636 Real3 second_boundary_coord;
638 Real max_distance = 0.0;
642 Real3 coord = nodes_coord[node];
643 Real distance = (coord - first_boundary_coord).squareNormL2();
644 if (distance>max_distance){
645 max_distance = distance;
646 farthest_node = node;
649 second_boundary_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
651 *n2 = second_boundary_coord;
653 Real3 direction = second_boundary_coord - first_boundary_coord;
656 ARCANE_FATAL(
"Direction is null for group '{0}' first_coord={1} second_coord={2}",
657 node_group.
name(),first_boundary_coord,second_boundary_coord);
659 return direction / norm;
665Real3 UnstructuredMeshUtilities::
666_broadcastFarthestNode(
Real distance,
const Node& farthest_node,
669 String func_name =
"UnstructuredMeshUtilities::_broadcastFarthestNode()";
673 Real all_min_distance = 0.0;
674 Real all_max_distance = 0.0;
675 Real all_sum_distance = 0.0;
678 pm->
computeMinMaxSum(distance,all_min_distance,all_max_distance,all_sum_distance,min_rank,max_rank);
680 if (!farthest_node.
null())
681 debug() <<
" FARTHEST NODE myself coord=" << nodes_coord[farthest_node]
682 <<
" distance=" << distance
683 <<
" rank=" << max_rank
684 <<
" max_distance=" << all_max_distance;
686 debug() <<
" FARTHEST NODE myself coord=none"
687 <<
" distance=" << distance
688 <<
" rank=" << max_rank
689 <<
" max_distance=" << all_max_distance;
692 if (farthest_node.
null())
695 buf = nodes_coord[farthest_node];
696 debug() <<
" I AM FARTHEST NODE ALL coord=" << buf;
698 pm->broadcast(Real3ArrayView(1,&buf),max_rank);
699 Real3 farthest_coord(buf);
700 debug() <<
" FARTHEST NODE ALL coord=" << farthest_coord
701 <<
" rank=" << max_rank
702 <<
" max_distance=" << all_max_distance;
703 return farthest_coord;
709void UnstructuredMeshUtilities::
712 m_compute_adjacency_functor->computeAdjacency(adjency_array, link_kind, nb_layer);
718bool UnstructuredMeshUtilities::
719writeToFile(
const String& file_name,
const String& service_name)
727 warning() << String::format(
"The specified service '{0}' to write the mesh is not available."
728 " Valid names are {1}",service_name,available_names);
731 mesh_writer->writeMeshToFile(m_mesh,file_name);
738void UnstructuredMeshUtilities::
740 bool initial_partition)
744 if (
mesh!=this->m_mesh)
759 info() <<
"Partitioning the mesh (initial?=" << initial_partition <<
")";
763 info() <<
"Waiting for partition information from the master replica";
765 if (has_replication){
769 mesh->checker()->checkValidReplication();
780 rep_pm->broadcast(owners,replica_master_rank);
801 if (initial_partition || has_replication)
802 mesh->prepareForDump();
808void UnstructuredMeshUtilities::
812 mesh::MeshNodeMerger merger(m_mesh);
813 merger.mergeNodes(nodes_local_id,nodes_to_merge_local_id);
819void UnstructuredMeshUtilities::
820computeAndSetOwnersForNodes()
823 owner_builder.computeNodesOwner();
829void UnstructuredMeshUtilities::
830computeAndSetOwnersForFaces()
833 owner_builder.computeFacesOwner();
851 unique_ids[index] = node.uniqueId();
854 Int64 new_uid = MeshUtils::generateHashUniqueId(unique_ids);
867void UnstructuredMeshUtilities::
868recomputeItemsUniqueIdFromNodesUniqueId()
874 tm->
info() <<
"Calling RecomputeItemsUniqueIdFromNodesUniqueId()";
877 mesh->nodeFamily()->notifyItemsUniqueIdChanged();
878 _recomputeUniqueIds(
mesh->edgeFamily());
879 _recomputeUniqueIds(
mesh->faceFamily());
880 _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.
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.
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.
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 eItemKind itemKind() const =0
Genre des entités.
virtual ITraceMng * traceMng() const =0
Gestionnaire de trace associé
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 repartionnement (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é.
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.
bool isOwn() const
true si l'entité est appartient au sous-domaine
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)
Classe pour convertir un NodeLocalId vers une arête.
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.
Classe générique pour calculer les propriétaires des entités.
__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.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
@ 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