Arcane  v4.1.11.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
LimaCutInfosReader.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* LimaCutInfosReader.cc (C) 2000-2026 */
9/* */
10/* Lecteur des informations de découpages avec les fichiers Lima. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/lima/LimaCutInfosReader.h"
15
16#include "arcane/utils/ArcanePrecomp.h"
17
18#include "arcane/utils/ScopedPtr.h"
19#include "arcane/utils/StringBuilder.h"
20#include "arcane/utils/FatalErrorException.h"
21
22#include "arcane/core/ItemGroup.h"
23#include "arcane/core/Item.h"
24#include "arcane/core/IXmlDocumentHolder.h"
25#include "arcane/core/XmlNode.h"
26#include "arcane/core/XmlNodeList.h"
27#include "arcane/core/IParallelMng.h"
28#include "arcane/core/IIOMng.h"
29#include "arcane/core/Timer.h"
30#include "arcane/core/IMesh.h"
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35namespace Arcane
36{
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41//Juste pour faire le .lib sous Windows.
42class ARCANE_EXPORT LimaTest
43{
44};
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49LimaCutInfosReader::
50LimaCutInfosReader(IParallelMng* parallel_mng)
51: TraceAccessor(parallel_mng->traceMng())
52, m_parallel_mng(parallel_mng)
53{
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
65static Integer
66_readList(Int64ArrayView& int_list,const char* buf)
67{
68 std::istringstream istr(buf);
69 Integer index = 0;
70 while (!istr.eof()){
71 Int64 v = 0;
72 istr >> v;
73 if (istr.eof())
74 break;
75 int_list[index] = v;
76 ++index;
77 }
78 return index;
79}
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
88 const String& dir_name)
89{
90 _readUniqueIndex(nodes_id,cells_id,dir_name);
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
112 const String& dir_name)
113{
114 Timer time_to_read(m_parallel_mng->timerMng(),"ReadCorrespondance",Timer::TimerReal);
115 IParallelMng* pm = m_parallel_mng;
116
117 // Si le cas est parallèle, lecture du fichier de correspondance.
118 bool is_parallel = pm->isParallel();
119 Int32 comm_rank = pm->commRank();
120 Int32 nb_rank = pm->commSize();
121 // Si on est dans le cas où Arcane est retranché à un coeur
122 if ((!is_parallel) || (is_parallel && nb_rank==1)){
123 for( Integer i=0, n=nodes_id.size(); i<n; ++i )
124 nodes_id[i] = i;
125 for( Integer i=0, n=cells_id.size(); i<n; ++i )
126 cells_id[i] = i;
127 return;
128 }
129
131 StringBuilder correspondance_filename;
132 if (!dir_name.empty()){
133 correspondance_filename += dir_name;
134 correspondance_filename += "/";
135 }
136 correspondance_filename += "Correspondances";
137
138 if (comm_rank==0){
139 {
140 Timer::Sentry sentry(&time_to_read);
141 IXmlDocumentHolder* doc = pm->ioMng()->parseXmlFile(correspondance_filename);
142 doc_holder = doc;
143 }
144 if (!doc_holder.get())
145 ARCANE_FATAL("Invalid correspondance file '{0}'",correspondance_filename);
146
147 info() << "Time to read (unit: second) 'Correspondances' file: "
148 << time_to_read.lastActivationTime();
149
150 XmlNode root_element = doc_holder->documentNode().documentElement();
151
152 // D'abord, le sous-domaine lit ses valeurs.
153 _readUniqueIndexFromXml(nodes_id,cells_id,root_element,0);
154
155 {
156 Timer::Sentry sentry(&time_to_read);
157 // Ensuite boucle, sur les autres sous-domaine.
158 Int64UniqueArray other_nodes_id;
159 Int64UniqueArray other_cells_id;
160 UniqueArray<Integer> other_sizes(2);
161 for( Int32 i=1; i<nb_rank; ++i ){
162 pm->recv(other_sizes,i);
163 other_nodes_id.resize(other_sizes[0]);
164 other_cells_id.resize(other_sizes[1]);
165 _readUniqueIndexFromXml(other_nodes_id,other_cells_id,root_element,i);
166 pm->send(other_nodes_id,i);
167 pm->send(other_cells_id,i);
168 }
169 }
170 info() << "Time to transfert values: "
171 << time_to_read.lastActivationTime();
172 }
173 else{
174 // Réceptionne les valeurs envoyées par le sous-domaine 0
175 Integer mes[2];
176 IntegerArrayView mesh_element_size(2,mes);
177 mesh_element_size[0] = nodes_id.size();
178 mesh_element_size[1] = cells_id.size();
179 pm->send(mesh_element_size,0);
180 pm->recv(nodes_id,0);
181 pm->recv(cells_id,0);
182 }
183 // Vérifie que tous les messages sont envoyés et recus avant de détruire
184 // le document XML.
185 pm->barrier();
186}
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
200 XmlNode root_element,Int32 comm_rank)
201{
202 XmlNode cpu_elem;
203 XmlNodeList cpu_list = root_element.children(String("cpu"));
204
205 String ustr_buf(String::fromNumber(comm_rank));
206
207 String us_id("id");
208 for( Integer i=0, s=cpu_list.size(); i<s; ++i ){
209 String id_str = cpu_list[i].attrValue(us_id);
210 if (id_str.null())
211 continue;
212 if (id_str==ustr_buf){
213 cpu_elem = cpu_list[i];
214 break;
215 }
216 }
217 if (cpu_elem.null())
218 ARCANE_FATAL("No element <cpu[@id=\"{0}\"]>",comm_rank);
219 XmlNode node_elem = cpu_elem.child("noeuds");
220 if (node_elem.null())
221 ARCANE_FATAL("No element <noeuds>");
222 XmlNode cell_elem = cpu_elem.child("mailles");
223 if (cell_elem.null())
224 ARCANE_FATAL("No element <mailles>");
225
226 // Tableau de correspodance des noeuds
227 {
228 String ustr_value = node_elem.value();
229 Integer nb_read = _readList(nodes_id,ustr_value.localstr());
230 Integer expected_size = nodes_id.size();
231 if (nb_read!=expected_size)
232 ARCANE_FATAL("Bad number of nodes rank={0} nb_read={1} expected={2}",
233 comm_rank,nb_read,expected_size);
234 }
235
236 // Tableau de correspodance des mailles
237 {
238 String ustr_value = cell_elem.value();
239 Integer nb_read = _readList(cells_id,ustr_value.localstr());
240 Integer expected_size = cells_id.size();
241 if (nb_read!=expected_size)
242 ARCANE_FATAL("Bad number of cells rank={0} nb_read={1} expected={2}",
243 comm_rank,nb_read,expected_size);
244 }
245}
246
247/*---------------------------------------------------------------------------*/
248/*---------------------------------------------------------------------------*/
249
250} // namespace Arcane
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
virtual IXmlDocumentHolder * parseXmlFile(const String &filename, const String &schemaname=String{})=0
Lit et analyse le fichier XML filename.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual IIOMng * ioMng() const =0
Gestionnaire des entrées/sorties.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual void barrier()=0
Effectue une barière.
Gestionnaire d'un document DOM.
void _readUniqueIndex(Int64ArrayView nodes_id, Int64ArrayView cells_id, const String &dir_name)
Récupération des indices uniques des entités.
void readItemsUniqueId(Int64ArrayView nodes_id, Int64ArrayView cells_id, const String &dir_name)
Construit les structures internes du maillage.
void _readUniqueIndexFromXml(Int64ArrayView nodes_id, Int64ArrayView cells_id, XmlNode root_element, Int32 rank)
Lecture des indices uniques à partir d'un fichier de correspondance XML.
T * get() const
Retourne l'objet référé par l'instance.
Definition Ptr.h:121
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:305
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:228
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
Definition String.cc:316
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
Definition Timer.h:89
Gestion d'un timer.
Definition Timer.h:62
@ TimerReal
Timer utilisant le temps réel.
Definition Timer.h:76
Real lastActivationTime() const
Retourne le temps (en secondes) passé lors de la dernière activation du timer.
Definition Timer.h:219
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:35
Noeud d'un arbre DOM.
Definition XmlNode.h:51
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
Definition XmlNode.cc:64
String value() const
Valeur du noeud.
Definition XmlNode.cc:199
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
Definition XmlNode.cc:93
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
-*- 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.
Definition UtilsTypes.h:451
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:339
Int32 Integer
Type représentant un entier.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:457
std::int32_t Int32
Type entier signé sur 32 bits.