Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshToMeshTransposer.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* MeshToMeshTransposer.cc (C) 2000-2009 */
9/* */
10/* Opérateur de transposition entre sous-maillages. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/Array.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/TraceInfo.h"
18
19#include "arcane/IMesh.h"
20#include "arcane/Item.h"
21#include "arcane/ItemEnumerator.h"
22#include "arcane/ItemTypes.h"
23#include "arcane/IItemFamily.h"
24#include "arcane/MeshToMeshTransposer.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29ARCANE_BEGIN_NAMESPACE
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
35MeshToMeshTransposer::
36kindTranspose(eItemKind kindA, IMesh * meshA, IMesh * meshB) {
37 // Cas des noeuds qui sont toujours de dimension fixe
38 if (kindA == IK_Node) return IK_Node;
39
40 // On garde la hiérarchie Node <= Edge <= Face <= Cell
41 // même si parfois en faible dimension certaines notions collapsent.
42 Integer dimA = meshA->dimension();
43 Integer dimB = meshB->dimension();
44
45 Integer iKind;
46 switch (kindA) {
47 case IK_Node:
48 iKind = 0; break;
49 case IK_Edge:
50 iKind = 1; break;
51 case IK_Face:
52 iKind = 2; break;
53 case IK_Cell:
54 iKind = 3; break;
55 default:
56 throw FatalErrorException(A_FUNCINFO,"Cannot transpose unknown kind");
57 }
58
59 iKind = iKind - dimB + dimA; // transposition numérique (kindA+dimA==kindB+dimB)
60
63 throw FatalErrorException(A_FUNCINFO,"Cannot transpose unknown dimension");
65
66 // Gestion de la condensation de dimension
67 if (kindB == IK_Edge && dimB < 3) kindB = IK_Node;
68 else if (kindB == IK_Face && dimB < 2) kindB = IK_Node;
69
70 return kindB;
71}
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
76ItemVector MeshToMeshTransposer::
77transpose(IMesh * meshA, IMesh * meshB, ItemVectorView itemsA, bool do_fatal)
78{
79 ARCANE_ASSERT((meshA!=NULL && meshB!=NULL),("Bad NULL mesh"));
80
81 // Empty itemsA => empty return
82 if (itemsA.size() == 0)
83 return ItemVector();
84
85 // On doit calculer la transition sur le kind
86 eItemKind kindA = itemsA[0].kind(); // vu que itemsA n'est pas vide
87 eItemKind kindB = kindTranspose(kindA,meshA,meshB);
88 IItemFamily * familyA = meshA->itemFamily(kindA);
89 IItemFamily * familyB = meshB->itemFamily(kindB);
90 return _transpose(familyA,familyB,itemsA,do_fatal);
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
96ItemVector MeshToMeshTransposer::
98{
99 ARCANE_ASSERT((familyA!=NULL && familyB!=NULL),("Bad NULL mesh"));
100
101 // Empty itemsA => empty return
102 if (itemsA.size() == 0)
103 return ItemVector();
104
105 return _transpose(familyA,familyB,itemsA,do_fatal);
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
111ItemVector MeshToMeshTransposer::
113{
114 eItemKind kindB = familyB->itemKind();
115 IItemFamily * parent_familyA = familyA->parentFamily();
116 IItemFamily * parent_familyB = familyB->parentFamily();
117
118 // Ne traite que la transposition sur un seul niveau
119 if (parent_familyA == familyB) {
120 // meshA est sous-maillage de meshB
121 UniqueArray<Int32> lidsB(itemsA.size(),NULL_ITEM_LOCAL_ID);
123 const Item & item = *iitem;
124 lidsB[iitem.index()] = item.parent().localId();
125 }
126 return ItemVector(familyB,lidsB);
127 }
128 else if (parent_familyB == familyA) {
129 // meshB est sous-maillage de meshA
130 if (kindB==IK_Node || kindB==IK_Face || kindB==IK_Edge || kindB==IK_Cell ) {
131 // Actuellement les uids sont les mêmes entre sous-maillages et maillage parent
132 // Par transitivité, cela revient à chercher les uids de itemsA dans meshB
133 UniqueArray<Int64> uidsA(itemsA.size());
134 ENUMERATE_ITEM(iitem,itemsA) {
135 uidsA[iitem.index()] = iitem->uniqueId();
136 }
137 UniqueArray<Int32> lidsB(uidsA.size());
138 familyB->itemsUniqueIdToLocalId(lidsB,uidsA,do_fatal);
139 return ItemVector(familyB,lidsB);
140 }
141 else {
142 throw NotImplementedException(A_FUNCINFO,"Cannot only transpose item to cell or node");
143 }
144 } else if (familyA == familyB) {
145 // même maillage
146 return ItemVector(familyB,itemsA.localIds());
147 } else {
148 throw NotImplementedException(A_FUNCINFO,String::format("Cannot transpose between families {0}::{1} and {2}::{3}",familyA->mesh()->name(),familyA->name(),familyA->mesh()->name(),familyB->name()));
149 }
150
151// // L'implémentation suppose et vérifie que meshA et meshB ont le même maillage parent
152// {
153// IMesh * masterSupportA = meshA;
154// while (masterSupportA->parentMesh()) {
155// masterSupportA = masterSupportA->parentMesh();
156// }
157// IMesh * masterSupportB = meshB;
158// while (masterSupportB->parentMesh()) {
159// masterSupportB = masterSupportB->parentMesh();
160// }
161// if (masterSupportA != masterSupportB)
162// throw FatalErrorException(A_FUNCINFO,"Non common parent for transposition between meshes");
163// }
164}
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
169ARCANE_END_NAMESPACE
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
Interface d'une famille d'entités.
virtual String name() const =0
Nom de la famille.
virtual IMesh * mesh() const =0
Maillage associé
virtual void itemsUniqueIdToLocalId(Int32ArrayView local_ids, Int64ConstArrayView unique_ids, bool do_fatal=true) const =0
Converti un tableau de numéros uniques en numéros locaux.
Vue sur un vecteur d'entités.
Int32 size() const
Nombre d'éléments du vecteur.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Vecteur d'entités.
Definition ItemVector.h:59
Classe de base d'un élément de maillage.
Definition Item.h:83
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
Item parent(Int32 i) const
i-ème parent pour les sous-maillages
Definition Item.h:277
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Exception lorsqu'une erreur fatale est survenue.
eItemKind
Genre d'entité de maillage.
@ 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_Edge
Entité de maillage de genre arête.