Arcane  v3.14.10.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-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/* LimaCutInfosReader.cc (C) 2000-2018 */
9/* */
10/* Lecteur des informations de découpages avec les fichiers Lima. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/FatalErrorException.h"
19
20#include "arcane/ItemGroup.h"
21#include "arcane/Item.h"
22#include "arcane/IXmlDocumentHolder.h"
23#include "arcane/XmlNode.h"
24#include "arcane/XmlNodeList.h"
25#include "arcane/IParallelMng.h"
26#include "arcane/IIOMng.h"
27#include "arcane/Timer.h"
28#include "arcane/IMesh.h"
29
30#include "arcane/cea/LimaCutInfosReader.h"
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35ARCANE_BEGIN_NAMESPACE
36
37//Juste pour faire le .lib sous Windows.
38class ARCANE_EXPORT LimaTest
39{
40};
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
45LimaCutInfosReader::
46LimaCutInfosReader(IParallelMng* parallel_mng)
47: TraceAccessor(parallel_mng->traceMng())
48, m_parallel_mng(parallel_mng)
49{
50}
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
61static Integer
62_readList(Int64ArrayView& int_list,const char* buf)
63{
64 std::istringstream istr(buf);
65 Integer index = 0;
66 while (!istr.eof()){
67 Int64 v = 0;
68 istr >> v;
69 if (istr.eof())
70 break;
71 int_list[index] = v;
72 ++index;
73 }
74 return index;
75}
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
84 const String& dir_name)
85{
86 _readUniqueIndex(nodes_id,cells_id,dir_name);
87}
88
89/*---------------------------------------------------------------------------*/
90/*---------------------------------------------------------------------------*/
108 const String& dir_name)
109{
110 Timer time_to_read(m_parallel_mng->timerMng(),"ReadCorrespondance",Timer::TimerReal);
111 IParallelMng* pm = m_parallel_mng;
112
113 // Si le cas est parallèle, lecture du fichier de correspondance.
114 bool is_parallel = pm->isParallel();
115 Int32 comm_rank = pm->commRank();
116 Int32 nb_rank = pm->commSize();
117 // Si on est dans le cas où Arcane est retranché à un coeur
118 if ((!is_parallel) || (is_parallel && nb_rank==1)){
119 for( Integer i=0, n=nodes_id.size(); i<n; ++i )
120 nodes_id[i] = i;
121 for( Integer i=0, n=cells_id.size(); i<n; ++i )
122 cells_id[i] = i;
123 return;
124 }
125
128 if (!dir_name.empty()){
131 }
132 correspondance_filename += "Correspondances";
133
134 if (comm_rank==0){
135 {
137 IXmlDocumentHolder* doc = pm->ioMng()->parseXmlFile(correspondance_filename);
138 doc_holder = doc;
139 }
140 if (!doc_holder.get())
141 ARCANE_FATAL("Invalid correspondance file '{0}'",correspondance_filename);
142
143 info() << "Time to read (unit: second) 'Correspondances' file: "
144 << time_to_read.lastActivationTime();
145
146 XmlNode root_element = doc_holder->documentNode().documentElement();
147
148 // D'abord, le sous-domaine lit ses valeurs.
150
151 {
153 // Ensuite boucle, sur les autres sous-domaine.
157 for( Int32 i=1; i<nb_rank; ++i ){
158 pm->recv(other_sizes,i);
159 other_nodes_id.resize(other_sizes[0]);
160 other_cells_id.resize(other_sizes[1]);
162 pm->send(other_nodes_id,i);
163 pm->send(other_cells_id,i);
164 }
165 }
166 info() << "Time to transfert values: "
167 << time_to_read.lastActivationTime();
168 }
169 else{
170 // Réceptionne les valeurs envoyées par le sous-domaine 0
171 Integer mes[2];
173 mesh_element_size[0] = nodes_id.size();
174 mesh_element_size[1] = cells_id.size();
175 pm->send(mesh_element_size,0);
176 pm->recv(nodes_id,0);
177 pm->recv(cells_id,0);
178 }
179 // Vérifie que tous les messages sont envoyés et recus avant de détruire
180 // le document XML.
181 pm->barrier();
182}
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
196 XmlNode root_element,Int32 comm_rank)
197{
199 XmlNodeList cpu_list = root_element.children(String("cpu"));
200
201 String ustr_buf(String::fromNumber(comm_rank));
202
203 String us_id("id");
204 for( Integer i=0, s=cpu_list.size(); i<s; ++i ){
205 String id_str = cpu_list[i].attrValue(us_id);
206 if (id_str.null())
207 continue;
208 if (id_str==ustr_buf){
209 cpu_elem = cpu_list[i];
210 break;
211 }
212 }
213 if (cpu_elem.null())
214 ARCANE_FATAL("No element <cpu[@id=\"{0}\"]>",comm_rank);
215 XmlNode node_elem = cpu_elem.child("noeuds");
216 if (node_elem.null())
217 ARCANE_FATAL("No element <noeuds>");
218 XmlNode cell_elem = cpu_elem.child("mailles");
219 if (cell_elem.null())
220 ARCANE_FATAL("No element <mailles>");
221
222 // Tableau de correspodance des noeuds
223 {
224 String ustr_value = node_elem.value();
225 Integer nb_read = _readList(nodes_id,ustr_value.localstr());
226 Integer expected_size = nodes_id.size();
228 ARCANE_FATAL("Bad number of nodes rank={0} nb_read={1} expected={2}",
229 comm_rank,nb_read,expected_size);
230 }
231
232 // Tableau de correspodance des mailles
233 {
234 String ustr_value = cell_elem.value();
235 Integer nb_read = _readList(cells_id,ustr_value.localstr());
236 Integer expected_size = cells_id.size();
238 ARCANE_FATAL("Bad number of cells rank={0} nb_read={1} expected={2}",
239 comm_rank,nb_read,expected_size);
240 }
241}
242
243/*---------------------------------------------------------------------------*/
244/*---------------------------------------------------------------------------*/
245
246ARCANE_END_NAMESPACE
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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 ITimerMng * timerMng() const =0
Gestionnaire de timers.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
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
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:609