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() ){
174 particles_owner[particle] = cells_owner[particle.
cell()] ;
179 if(m_mesh->itemFamilyNetwork())
182 for(
IItemFamily* family : m_mesh->itemFamilies() )
184 if (family->itemKind()!=
IK_DoF || family->name()==mesh::GraphDoFs::linkFamilyName())
188 for(
auto dualitem_kind : dualitem_kinds)
190 IItemFamily* dualitem_family = dualitem_kind==
IK_Particle? m_mesh->findItemFamily(dualitem_kind,mesh::ParticleFamily::defaultFamilyName(),
false):
191 m_mesh->itemFamily(dualitem_kind) ;
196 auto connectivity_name = mesh::connectivityName(family,dualitem_family) ;
197 bool is_dof2dual = true ;
198 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(family,dualitem_family,connectivity_name) ;
201 connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(dualitem_family,family,connectivity_name) ;
202 is_dof2dual = false ;
213 if(connected_items.size()>0)
215 dofs_new_owner[*item] = dualitems_new_owner[connected_items[0]] ;
225 dofs_new_owner[*connected_item] = dualitems_new_owner[*item] ;
234 IItemFamily* links_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::linkFamilyName(),
false);
238 IItemFamily* dualnodes_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::dualNodeFamilyName(),
false);
242 auto connectivity_name = mesh::connectivityName(links_family,dualnodes_family) ;
243 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(links_family,dualnodes_family,connectivity_name) ;
250 if(connected_items.size()>0)
252 links_new_owner[*item] = dualnodes_new_owner[connected_items[0]] ;
264void UnstructuredMeshUtilities::
265localIdsFromConnectivity(
eItemKind item_kind,
274 "IK_Cell or IK_Face expected",
279 if (nb_item!=local_ids.
size())
281 "Size different from 'items_nb_node'",
284 Integer item_connectivity_index = 0;
288 for(
Integer i=0; i<nb_item; ++i ){
289 Integer current_nb_node = items_nb_node[i];
291 item_connectivity_index += current_nb_node;
293 buf.
resize(current_nb_node);
295 Int64 first_node_uid = buf[0];
299 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array,first_node_uid_array,!allow_null);
300 if (first_node_lid == NULL_ITEM_LOCAL_ID){
302 local_ids[i] = NULL_ITEM_LOCAL_ID;
306 for(
Integer j=0;j<current_nb_node;++j) {
307 if (j != 0) sb +=
" ";
308 sb += current_nodes[j];
310 sb +=
") not found (first node ";
311 sb += first_node_uid;
318 Node node(nodes[first_node_lid]);
319 Face face(mesh_utils::getFaceFromNodesUnique(node,buf));
322 local_ids[i] = NULL_ITEM_LOCAL_ID;
326 for(
Integer j=0;j<current_nb_node;++j) {
327 if (j != 0) sb +=
" ";
328 sb += current_nodes[j];
343void UnstructuredMeshUtilities::
351 if (nb_item!=local_ids.
size())
353 "Size different from 'items_type'");
355 Int32 item_connectivity_index = 0;
356 ItemTypeMng* item_type_mng = m_mesh->itemTypeMng();
360 for(
Integer i=0; i<nb_item; ++i ){
364 item_connectivity_index += current_nb_node;
366 face_reorderer.reorder(current_type_id,current_nodes);
368 Int64 first_node_uid = buf[0];
372 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array,first_node_uid_array,!allow_null);
373 if (first_node_lid == NULL_ITEM_LOCAL_ID){
375 local_ids[i] = NULL_ITEM_LOCAL_ID;
379 for(
Integer j=0;j<current_nb_node;++j) {
380 if (j != 0) sb +=
" ";
381 sb += current_nodes[j];
383 sb +=
") not found (first node ";
384 sb += first_node_uid;
391 Node node(nodes[first_node_lid]);
392 Face face(MeshUtils::getFaceFromNodesUnique(node,buf));
395 local_ids[i] = NULL_ITEM_LOCAL_ID;
399 for(
Integer j=0;j<current_nb_node;++j) {
400 if (j != 0) sb +=
" ";
401 sb += current_nodes[j];
415Real3 UnstructuredMeshUtilities::
418 Real3 rvalue = value;
420 if (math::isNearlyZero(value.x))
422 if (math::isNearlyZero(value.y))
424 if (math::isNearlyZero(value.z))
450 String func_name =
"UnstructuredMeshUtilities::computeNormal";
455 Integer mesh_dimension = m_mesh->dimension();
460 Real3 global_normal = Real3::null();
461 Real nb_global_normal_used_node = 0.0;
465 nb_node += face_nb_node;
469 if (mesh_dimension==3){
470 Real3 v1 = nodes_coord[face.
node(1)] - nodes_coord[face.
node(0)];
471 Real3 v2 = nodes_coord[face.
node(2)] - nodes_coord[face.
node(0)];
474 else if (mesh_dimension==2){
475 Real3 dir = nodes_coord[face.
node(0)] - nodes_coord[face.
node(1)];
476 face_normal.
x = - dir.
y;
477 face_normal.
y = dir.
x;
481 face_normal = -face_normal;
483 global_normal = global_normal + face_normal;
484 nb_global_normal_used_node += 1.0;
495 NodeOccurenceMap nodes_occurence(nb_node*2,
true,nb_node);
498 for( NodeLocalId inode : face.
nodeIds() ){
499 NodeOccurenceMap::Data* v = nodes_occurence.lookup(inode);
504 nodes_occurence.add(inode,1);
510 nodes_occurence.each([&](NodeOccurenceMap::Data* d){
512 Node node = nodes_internal[d->key()];
514 if (node.
owner()==rank){
515 single_nodes.
add(node);
525 Real3 total_global_normal;
532 pm->
computeMinMaxSum(nb_global_normal_used_node,all_min,all_max,all_sum,min_rank,max_rank);
539 total_global_normal = buf;
542 info() <<
"TOTAL SINGLE NODE= " << total_nb_single_node <<
" surface=" << face_group.
name()
543 <<
" global_normal = " << total_global_normal;
544 if (total_nb_single_node<2){
545 ARCANE_FATAL(
"not enough nodes connected to only one face");
548 for(
Integer i=0; i<nb_single_node; ++i ){
549 coords[i] = nodes_coord[single_nodes[i]];
556 Real3 barycentre = Real3::null();
557 for(
Integer i=0; i<total_nb_single_node; ++i ){
558 barycentre += all_nodes_coord[i];
560 barycentre /= (
Real)total_nb_single_node;
561 if (total_nb_single_node==2 && m_mesh->dimension()==3){
567 Real max_distance = 0.0;
569 Real3 s0 = all_nodes_coord[0];
570 Real3 s1 = all_nodes_coord[1];
571 nodes_occurence.each([&](NodeOccurenceMap::Data* d){
572 Node node = nodes_internal[d->key()];
573 Real3 coord = nodes_coord[node];
579 Real distance = (coord - barycentre).squareNormL2();
580 if (distance>max_distance){
584 max_distance = distance;
585 farthest_node = node;
590 if (!farthest_node.
null()){
591 info() <<
" FARTHEST NODE= " <<
ItemPrinter(farthest_node) <<
" dist=" << max_distance;
594 Real3 farthest_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
595 info() <<
" FARTHEST NODE ALL coord=" << farthest_coord;
596 all_nodes_coord.
add(farthest_coord);
601 std::sort(std::begin(all_nodes_coord),std::end(all_nodes_coord));
603 Real3 full_normal = Real3::null();
604 info() <<
" NB FINAL NODE=" << nb_final_node;
605 for(
Integer i=0; i<nb_final_node; ++i )
606 info() <<
" NODE=" << all_nodes_coord[i];
607 if (m_mesh->dimension()==2){
608 if (nb_final_node!=2){
611 Real3 direction = all_nodes_coord[1] - all_nodes_coord[0];
612 full_normal.
x = - direction.
y;
613 full_normal.
y = direction.
x;
615 else if (m_mesh->dimension()==3){
625 all_nodes_coord[1]-all_nodes_coord[0]);
626 for(
Integer i=0; i<nb_final_node; ++i ){
627 Real3 s0 = all_nodes_coord[i];
628 Real3 s1 = all_nodes_coord[(i+nb_final_node-1)%nb_final_node];
629 Real3 s2 = all_nodes_coord[(i+1)%nb_final_node];
631 info() <<
" ADD NORMAL: " << normal;
632 full_normal += normal;
633 info() <<
" FULL: " << full_normal;
636 full_normal = first_normal;
639 ARCANE_FATAL(
"invalid mesh dimension (should be 2 or 3)");
646 info() <<
" Normal is " << full_normal;
648 total_global_normal /= b;
651 full_normal = -full_normal;
653 full_normal = _round(full_normal);
654 info() <<
" Final normal is " << full_normal <<
" dir=" << dir;
668computeDirection(
const NodeGroup& node_group,
672 String func_name =
"UnstructuredMeshUtilities::computeDirection";
677 Real3 barycentre = Real3::null();
679 barycentre += nodes_coord[inode];
681 Real r_barycentre[3];
682 r_barycentre[0] = barycentre.
x;
683 r_barycentre[1] = barycentre.
y;
684 r_barycentre[2] = barycentre.
z;
687 barycentre =
Real3(rav[0],rav[1],rav[2]);
688 debug() <<
" BARYCENTRE COMPUTE DIRECTION = " << barycentre;
692 Real3 first_boundary_coord;
694 Real max_distance = 0.0;
698 Real3 coord = nodes_coord[node];
699 Real distance = (coord - barycentre).squareNormL2();
700 if (distance>max_distance){
701 max_distance = distance;
702 farthest_node = node;
705 first_boundary_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
707 *n1 = first_boundary_coord;
709 Real3 second_boundary_coord;
711 Real max_distance = 0.0;
715 Real3 coord = nodes_coord[node];
716 Real distance = (coord - first_boundary_coord).squareNormL2();
717 if (distance>max_distance){
718 max_distance = distance;
719 farthest_node = node;
722 second_boundary_coord = _broadcastFarthestNode(max_distance,farthest_node,nodes_coord);
724 *n2 = second_boundary_coord;
726 Real3 direction = second_boundary_coord - first_boundary_coord;
729 ARCANE_FATAL(
"Direction is null for group '{0}' first_coord={1} second_coord={2}",
730 node_group.
name(),first_boundary_coord,second_boundary_coord);
732 return direction / norm;
738Real3 UnstructuredMeshUtilities::
739_broadcastFarthestNode(
Real distance,
const Node& farthest_node,
742 String func_name =
"UnstructuredMeshUtilities::_broadcastFarthestNode()";
746 Real all_min_distance = 0.0;
747 Real all_max_distance = 0.0;
748 Real all_sum_distance = 0.0;
751 pm->
computeMinMaxSum(distance,all_min_distance,all_max_distance,all_sum_distance,min_rank,max_rank);
753 if (!farthest_node.
null())
754 debug() <<
" FARTHEST NODE myself coord=" << nodes_coord[farthest_node]
755 <<
" distance=" << distance
756 <<
" rank=" << max_rank
757 <<
" max_distance=" << all_max_distance;
759 debug() <<
" FARTHEST NODE myself coord=none"
760 <<
" distance=" << distance
761 <<
" rank=" << max_rank
762 <<
" max_distance=" << all_max_distance;
765 if (farthest_node.
null())
768 buf = nodes_coord[farthest_node];
769 debug() <<
" I AM FARTHEST NODE ALL coord=" << buf;
771 pm->broadcast(Real3ArrayView(1,&buf),max_rank);
772 Real3 farthest_coord(buf);
773 debug() <<
" FARTHEST NODE ALL coord=" << farthest_coord
774 <<
" rank=" << max_rank
775 <<
" max_distance=" << all_max_distance;
776 return farthest_coord;
782void UnstructuredMeshUtilities::
785 m_compute_adjacency_functor->computeAdjacency(adjency_array, link_kind, nb_layer);
791bool UnstructuredMeshUtilities::
792writeToFile(
const String& file_name,
const String& service_name)
800 warning() << String::format(
"The specified service '{0}' to write the mesh is not available."
801 " Valid names are {1}",service_name,available_names);
804 mesh_writer->writeMeshToFile(m_mesh,file_name);
811void UnstructuredMeshUtilities::
813 bool initial_partition)
817 if (
mesh!=this->m_mesh)
832 info() <<
"Partitioning the mesh (initial?=" << initial_partition <<
")";
836 info() <<
"Waiting for partition information from the master replica";
838 if (has_replication){
842 mesh->checker()->checkValidReplication();
853 rep_pm->broadcast(owners,replica_master_rank);
874 if (initial_partition || has_replication)
875 mesh->prepareForDump();
881void UnstructuredMeshUtilities::
884 bool allow_non_corresponding_face)
887 merger.
mergeNodes(nodes_local_id, nodes_to_merge_local_id, allow_non_corresponding_face);
893void UnstructuredMeshUtilities::
894computeAndSetOwnersForNodes()
897 owner_builder.computeNodesOwner();
903void UnstructuredMeshUtilities::
904computeAndSetOwnersForFaces()
907 owner_builder.computeFacesOwner();
923 unique_ids[index] = node.uniqueId();
926 Int64 new_uid = MeshUtils::generateHashUniqueId(unique_ids);
936void UnstructuredMeshUtilities::
937recomputeItemsUniqueIdFromNodesUniqueId()
943 tm->
info() <<
"Calling RecomputeItemsUniqueIdFromNodesUniqueId()";
946 mesh->nodeFamily()->notifyItemsUniqueIdChanged();
947 _recomputeUniqueIds(
mesh->edgeFamily());
948 _recomputeUniqueIds(
mesh->faceFamily());
949 _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 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é.
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.
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.
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.
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.
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