Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
NewItemOwnerBuilder.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/* */
8/* Outil de gestion des propriétaires des nouveaux items */
9/*---------------------------------------------------------------------------*/
10#ifndef ARCANE_MESH_NEWITEMOWNERBUILDER_H
11#define ARCANE_MESH_NEWITEMOWNERBUILDER_H
12
13/*---------------------------------------------------------------------------*/
14/*---------------------------------------------------------------------------*/
15
16#include "arcane/mesh/MeshGlobal.h"
17
18#include "arcane/Item.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23ARCANE_BEGIN_NAMESPACE
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28ARCANE_MESH_BEGIN_NAMESPACE
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33// En attendant d'avoir un algorithme qui équilibre mieux
34// les messages, on applique le suivant:
35// - chaque sous-domaine est responsable pour déterminer le nouveau
36// propriétaire des noeuds, faces, arêtes, noeuds duaux et liaisons qui lui appartiennent.
37// - pour les noeuds et les arêtes, le nouveau propriétaire est le nouveau
38// propriétaire de la maille connectée à ce noeud dont le uniqueId() est le plus petit.
39// - pour les faces, le nouveau propriétaire est le nouveau propriétaire
40// de la maille qui est derrière cette face s'il s'agit d'une face
41// interne et de la maille connectée s'il s'agit d'une face frontière.
42// - pour les noeuds duaux, le nouveau propriétaire est le nouveau propriétaire
43// de la maille connectée à l'élément dual
44// - pour les liaisons, le nouveau propriétaire est le nouveau propriétaire
45// de la maille connectée au premier noeud dual, c'est-à-dire le propriétaire
46// du premier noeud dual de la liaison
47
49{
50public:
51
53
54 // Détermine la maille connectée à l'item
55 template<typename T>
56 inline Cell connectedCellOfItem(const T& item) const;
57
58 // Détermine le propriétaire de l'item, c'est-à-dire
59 // le propriétaire de la maille connectée à l'item
60 template<typename T>
61 inline Integer ownerOfItem(const T& item) const
62 {
63 return connectedCellOfItem(item).owner();
64 }
65
66private:
67
68 // Trouve la maille de plus petit uniqueId() d'un item
69 // Polymorphisme statique : seul les types d'items avec une
70 // méthode cell() sont accéptés
71 template<typename T>
72 inline Cell _minimumUniqueIdCellOfItem(const T& item) const
73 {
74 Cell cell = item.cell(0);
75 for( Cell item_cell : item.cells() ){
76 if (item_cell.uniqueId() < cell.uniqueId())
77 cell = item_cell;
78 }
79 return cell;
80 }
81};
82
83// Pour les noeuds, la maille connectée est celle le uniqueId() est le plus petit.
84template<>
85inline Cell NewItemOwnerBuilder::connectedCellOfItem<Node>(const Node& node) const
86{
87 return _minimumUniqueIdCellOfItem(node);
88}
89
90// Pour les arêtes, la maille connectée est celle le uniqueId() est le plus petit.
91template<>
92inline Cell NewItemOwnerBuilder::connectedCellOfItem<Edge>(const Edge& edge) const
93{
94 return _minimumUniqueIdCellOfItem(edge);
95}
96
97// Pour les faces, la maille connectée est backCell() si elle existe sinon la frontCell()
98template<>
99inline Cell NewItemOwnerBuilder::connectedCellOfItem<Face>(const Face& face) const
100{
101 Cell cell = face.backCell();
102 if (cell.null())
103 cell = face.frontCell();
104 return cell;
105}
106template<>
107inline Cell NewItemOwnerBuilder::connectedCellOfItem<Particle>(const Particle& particle) const
108{
109 return particle.cell();
110}
111
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
116ARCANE_MESH_END_NAMESPACE
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
120
121ARCANE_END_NAMESPACE
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126#endif /* ARCANE_MESH_NEWITEMOWNERBUILDER_H */
Maille d'un maillage.
Definition Item.h:1178
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Definition Item.h:229
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Noeud d'un maillage.
Definition Dom.h:204