Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ExternalPartitionConstraint.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* ExternalPartitionConstraint.cc (C) 2000-2024 */
9/* */
10/* Informations sur les contraintes pour le partitionnement. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/ExternalPartitionConstraint.h"
15
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/NotImplementedException.h"
18
19#include "arcane/core/IMesh.h"
20#include "arcane/core/IMeshPartitionConstraint.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
32addLinkedCells(Int64Array& linked_cells,Int32Array& linked_owners)
33{
34 m_mesh->traceMng()->info()<<"ExternalPartitionConstraint::addLinkedCells(...)";
35
36 // mise en place d'un filtre sur les cell pour éviter de les mettre plusieurs fois dans le tableau cells
37 UniqueArray<Integer> filtre_cell;
38 filtre_cell.resize(m_mesh->allCells().size());
39 Integer marque = 0;
40 filtre_cell.fill(marque);
41
42 for( ItemGroup& group : m_constraints ){
43 // tableau contenant la liste des mailles à maintenir ensemble
44 // cette liste est distribuée sur les processeurs
45 // et comporte comme éléments communs les mailles fantômes
47 if (group.itemKind() == IK_Cell){
48 ENUMERATE_CELL(icell,group.cellGroup()){
49 cells.add(*icell);
50 }
51 }
52 // cette méthode permet de récupérer les mailles dans le cas d'une semi-conformité
53 // on filtre les cell pour ne les sélectionner qu'une fois
54 else if (group.itemKind() == IK_Face){
55 marque++;
56 ENUMERATE_FACE(iface,group.faceGroup()){
57 for( Node node : iface->nodes()){
58 for( Cell cell : node.cells()){
59 if (filtre_cell[cell.localId()]!=marque){
60 cells.add(cell);
61 filtre_cell[cell.localId()]=marque;
62 }
63 }
64 }
65 }
66 }
67 else if (group.itemKind() == IK_Node){
68 ENUMERATE_NODE(inode,group.nodeGroup()){
69 for( Cell cell : inode->cells()){
70 cells.add(cell);
71 }
72 }
73 }
74
75 if (cells.size()==0)
76 continue;
77
78 // on renseigne les contraintes sous forme de couples de mailles
79 Cell cell0 = cells[0];
80 Int32 owner0 = cell0.owner();
81 ItemUniqueId uid0 = cell0.uniqueId();
82
83 for (Integer i=1; i<cells.size(); ++i){
84 ItemUniqueId uidi = cells[i].uniqueId();
85 if (uid0<uidi){
86 linked_cells.add(uid0);
87 linked_cells.add(uidi);
88 }
89 else {
90 linked_cells.add(uidi);
91 linked_cells.add(uid0);
92 }
93 linked_owners.add(owner0);
94 } // end for i=1; i<cells.size()
95
96 m_mesh->traceMng()->info()<<"cells.size() = "<<cells.size();
97
98
99 } // end for iter=m_constraints.begin()
100}
101
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
#define ENUMERATE_FACE(name, group)
Enumérateur générique d'un groupe de faces.
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
#define ENUMERATE_NODE(name, group)
Enumérateur générique d'un groupe de noeuds.
Integer size() const
Nombre d'éléments du vecteur.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Maille d'un maillage.
Definition Item.h:1191
virtual void addLinkedCells(Int64Array &linked_cells, Int32Array &linked_owners)
Ajoute un ensemble de contraintes sur les mailles.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Identifiant unique d'une entité.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Definition Item.h:238
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:225
Noeud d'un maillage.
Definition Item.h:573
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:212
Int32 Integer
Type représentant un entier.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:214
std::int32_t Int32
Type entier signé sur 32 bits.