Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SimpleTableWriterHelper.cc
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/* SimpleTableWriterHelper.cc (C) 2000-2023 */
9/* */
10/* Classe permettant d'écrire un SimpleTableInternal dans un fichier. */
11/* Simplifie l'utilisation de l'écrivain en gérant le multiprocessus et les */
12/* noms des fichiers/dossiers. */
13/*---------------------------------------------------------------------------*/
14/*---------------------------------------------------------------------------*/
15
16#include "arcane/std/SimpleTableWriterHelper.h"
17
18#include "arcane/Directory.h"
19#include "arcane/IParallelMng.h"
20#include "arcane/utils/StringBuilder.h"
21
22#include <optional>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
35{
37 _computeTableName();
38
40 _computeOutputDirectory();
41
42 m_root = Directory(root_directory, m_simple_table_reader_writer->fileType());
43 return true;
44}
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
50print(Integer rank)
51{
52 if (rank != -1 && m_simple_table_internal->m_parallel_mng->commRank() != rank)
53 return;
54 m_simple_table_reader_writer->print();
55}
56
61writeFile(const Directory& root_directory, Integer rank)
62{
63 // Finalisation du nom et du répertoire du csv (si ce n'est pas déjà fait).
64 _computeTableName();
65 _computeOutputDirectory();
66
67 // Création du répertoire.
68 bool result = SimpleTableReaderWriterUtils::createDirectoryOnlyProcess0(m_simple_table_internal->m_parallel_mng, root_directory);
69 if (!result) {
70 return false;
71 }
72
73 Directory output_directory(root_directory, m_name_output_directory);
74
75 result = SimpleTableReaderWriterUtils::createDirectoryOnlyProcess0(m_simple_table_internal->m_parallel_mng, output_directory);
76 if (!result) {
77 return false;
78 }
79
80 // Si l'on n'est pas le processus demandé, on return true.
81 // -1 = tout le monde écrit.
82 if (rank != -1 && m_simple_table_internal->m_parallel_mng->commRank() != rank)
83 return true;
84
85 // Si l'on a rank == -1 et que isOneFileByRanksPermited() == false, alors il n'y a que le
86 // processus 0 qui doit écrire.
87 if ((rank == -1 && !isOneFileByRanksPermited()) && m_simple_table_internal->m_parallel_mng->commRank() != 0)
88 return true;
89
90 return m_simple_table_reader_writer->writeTable(output_directory, m_simple_table_internal->m_table_name);
91}
92
97writeFile(Integer rank)
98{
99 return writeFile(m_root, rank);
100}
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
106precision()
107{
108 return m_simple_table_reader_writer->precision();
109}
110
112setPrecision(Integer precision)
113{
114 m_simple_table_reader_writer->setPrecision(precision);
115}
116
118isFixed()
119{
120 return m_simple_table_reader_writer->isFixed();
121}
122
124setFixed(bool fixed)
125{
126 m_simple_table_reader_writer->setFixed(fixed);
127}
128
131{
132 return m_simple_table_reader_writer->isForcedToUseScientificNotation();
133}
134
137{
138 m_simple_table_reader_writer->setForcedToUseScientificNotation(use_scientific);
139}
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143
146{
147 _computeOutputDirectory();
148 return m_name_output_directory;
149}
150
153{
154 return m_name_output_directory_without_computation;
155}
156
158setOutputDirectory(const String& directory)
159{
160 m_name_output_directory = directory;
161 m_name_output_directory_without_computation = directory;
162 m_name_output_directory_computed = false;
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169tableName()
170{
171 _computeTableName();
172 return m_simple_table_internal->m_table_name;
173}
174
177{
178 return m_name_table_without_computation;
179}
180
182setTableName(const String& name)
183{
184 m_simple_table_internal->m_table_name = name;
185 m_name_table_without_computation = name;
186 m_name_table_computed = false;
187}
188
189/*---------------------------------------------------------------------------*/
190/*---------------------------------------------------------------------------*/
191
193fileName()
194{
195 _computeTableName();
196 return m_simple_table_internal->m_table_name + "." + m_simple_table_reader_writer->fileType();
197}
198
201{
202 _computeOutputDirectory();
203 return Directory(m_root, m_name_output_directory);
204}
205
207rootPath()
208{
209 return m_root;
210}
211
214{
215 _computeTableName();
216 _computeOutputDirectory();
217
218 return m_name_table_one_file_by_ranks_permited || m_name_output_directory_one_file_by_ranks_permited;
219}
220
222fileType()
223{
224 return m_simple_table_reader_writer->fileType();
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
231internal()
232{
233 return m_simple_table_internal;
234}
235
238{
239 return m_simple_table_reader_writer;
240}
241
244{
245 if (simple_table_reader_writer.isNull())
246 ARCANE_FATAL("La réference passée en paramètre est Null.");
247 m_simple_table_reader_writer = simple_table_reader_writer;
248 m_simple_table_internal = m_simple_table_reader_writer->internal();
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254void SimpleTableWriterHelper::
255_computeTableName()
256{
257 if (!m_name_table_computed) {
258 m_simple_table_internal->m_table_name = _computeName(m_name_table_without_computation, m_name_table_one_file_by_ranks_permited);
259 m_name_table_computed = true;
260 }
261}
262
263void SimpleTableWriterHelper::
264_computeOutputDirectory()
265{
266 if (!m_name_output_directory_computed) {
267 m_name_output_directory = _computeName(m_name_output_directory_without_computation, m_name_output_directory_one_file_by_ranks_permited);
268 m_name_output_directory_computed = true;
269 }
270}
271
283{
285
286 // Permet de contourner le bug avec String::split() si le nom commence par '@'.
287 if (name.startsWith("@")) {
288 name = "@" + name;
289 }
290
292 // On découpe la string là où se trouve les @.
293 name.split(string_splited, '@');
294
295 // On traite les mots entre les "@".
296 if (string_splited.size() > 1) {
297 // On recherche "proc_id" dans le tableau (donc @proc_id@ dans le nom).
298 std::optional<Integer> proc_id = string_splited.span().findFirst("proc_id");
299 // On remplace "@proc_id@" par l'id du proc.
300 if (proc_id) {
301 string_splited[proc_id.value()] = String::fromNumber(m_simple_table_internal->m_parallel_mng->commRank());
303 }
304 // Il n'y a que un seul proc qui write.
305 else {
307 }
308
309 // On recherche "num_procs" dans le tableau (donc @num_procs@ dans le nom).
310 std::optional<Integer> num_procs = string_splited.span().findFirst("num_procs");
311 // On remplace "@num_procs@" par l'id du proc.
312 if (num_procs) {
313 string_splited[num_procs.value()] = String::fromNumber(m_simple_table_internal->m_parallel_mng->commSize());
314 }
315 }
316
317 // On recombine la chaine.
319 for (String str : string_splited) {
320 // Permet de contourner le bug avec String::split() s'il y a '@@@' dans le nom ou si le
321 // nom commence par '@' (en complément des premières lignes de la méthode).
322 if (str == "@")
323 continue;
324 combined.append(str);
325 }
326
327 return combined.toString();
328}
329
330/*---------------------------------------------------------------------------*/
331/*---------------------------------------------------------------------------*/
332
333} // End namespace Arcane
334
335/*---------------------------------------------------------------------------*/
336/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classe gérant un répertoire.
Definition Directory.h:33
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
static bool createDirectoryOnlyProcess0(IParallelMng *parallel_mng, const Directory &directory)
Méthode statique permettant de créer un répertoire avec plusieurs processus.
bool init(const Directory &root_directory, const String &table_name, const String &directory_name) override
Méthode permettant d'initialiser l'objet. Notamment le nom du tableau et le nom du répertoire qui con...
String fileType() override
Méthode permettant de connaitre le type de fichier qui sera utilisé.
void setPrecision(Integer precision) override
Méthode permettant de modifier la précision du print.
String outputDirectory() override
Méthode permettant de récupérer le nom du répertoire où sera placé les tableaux.
void setTableName(const String &name) override
Méthode permettant de définir le nom du tableau.
void setFixed(bool fixed) override
Méthode permettant de définir le flag 'std::fixed' ou non.
void print(Integer rank) override
Méthode permettant d'afficher le tableau.
void setForcedToUseScientificNotation(bool use_scientific) override
Méthode permettant de définir le flag 'std::scientific' ou non.
Ref< SimpleTableInternal > internal() override
Méthode permettant de récupérer une référence vers l'objet SimpleTableInternal utilisé.
bool isForcedToUseScientificNotation() override
Méthode permettant de savoir si le frag 'std::scientific' est actif ou non pour l'écriture des valeur...
String fileName() override
Méthode permettant de récupérer le nom du fichier.
String outputDirectoryWithoutComputation() override
Méthode permettant de récupérer le nom du répertoire tel qu'il a été donné précédement.
Ref< ISimpleTableReaderWriter > readerWriter() override
Méthode permettant de récupérer une référence vers l'objet ISimpleTableReaderWriter utilisé.
void setOutputDirectory(const String &directory) override
Méthode permettant de définir le répertoire dans lequel enregistrer les tableaux.
bool writeFile(Integer rank) override
String tableName() override
Méthode permettant de récupérer le nom du tableau.
String tableNameWithoutComputation() override
Méthode permettant de récupérer le nom du tableau tel qu'il a été donné précédement.
void setReaderWriter(const Ref< ISimpleTableReaderWriter > &simple_table_reader_writer) override
Méthode permettant de définir une référence vers un ISimpleTableReaderWriter.
Integer precision() override
Méthode permettant de récupérer la précision actuellement utilisée pour l'écriture des valeurs.
Directory rootPath() override
Méthode permettant de récupérer le chemin où l'implémentation enregistre ces tableaux.
bool isFixed() override
Méthode permettant de savoir si le frag 'std::fixed' est actif ou non pour l'écriture des valeurs.
Directory outputPath() override
Méthode permettant de récupérer le chemin où sera enregistrés les tableaux.
String _computeName(String name, bool &one_file_by_ranks_permited)
Méthode permettant de remplacer les symboles de nom par leur valeur.
bool isOneFileByRanksPermited() override
Méthode permettant de savoir si les paramètres actuellement en possession de l'implémentation lui per...
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-