Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshReaderMng.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/* MeshReaderMng.h (C) 2000-2024 */
9/* */
10/* Gestionnaire de lecteurs de maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/MeshReaderMng.h"
15
16#include "arcane/utils/UniqueArray.h"
17#include "arcane/utils/ScopedPtr.h"
18
19#include "arcane/core/ISubDomain.h"
20#include "arcane/core/IMainFactory.h"
21#include "arcane/core/IMeshReader.h"
22#include "arcane/core/ServiceBuilder.h"
23#include "arcane/core/IPrimaryMesh.h"
24#include "arcane/core/XmlNode.h"
25#include "arcane/core/Properties.h"
26#include "arcane/core/IXmlDocumentHolder.h"
27#include "arcane/core/IParallelMng.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38class IMeshReader;
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
44{
45 public:
46
47 explicit Impl(ISubDomain* sd)
48 : m_sub_domain(sd)
49 {}
50 ~Impl() = default;
51
52 public:
53
54 void checkInit()
55 {
56 if (m_is_init)
57 return;
58 m_is_init = true;
59 ServiceBuilder<IMeshReader> builder(m_sub_domain);
60 m_mesh_readers = builder.createAllInstances();
61 }
62
63 public:
64
65 ConstArrayView<Ref<IMeshReader>> readers() const { return m_mesh_readers; }
66
67 public:
68
69 ISubDomain* m_sub_domain = nullptr;
70 UniqueArray<Ref<IMeshReader>> m_mesh_readers;
71 bool m_is_init = false;
72 bool m_is_use_unit = true;
73};
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
78MeshReaderMng::
79MeshReaderMng(ISubDomain* sd)
80: m_p(new Impl(sd))
81{
82}
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87MeshReaderMng::
88~MeshReaderMng()
89{
90 delete m_p;
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
97readMesh(const String& mesh_name,const String& file_name)
98{
99 ISubDomain* sd = m_p->m_sub_domain;
101 return readMesh(mesh_name,file_name,pm);
102}
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106// TODO: fusionner cette méthode avec cell de ISubDomain.
108readMesh(const String& mesh_name,const String& file_name,IParallelMng* parallel_mng)
109{
110 m_p->checkInit();
111 String extension;
112 {
113 // Cherche l'extension du fichier et la conserve dans \a extension
114 std::string_view fview = file_name.toStdStringView();
115 std::size_t extension_pos = fview.find_last_of('.');
116 if (extension_pos==std::string_view::npos)
117 ARCANE_FATAL("file name '{0}' has no extension",file_name);
118 fview.remove_prefix(extension_pos+1);
119 extension = fview;
120
121 }
122 // TODO: à terme, créer le maillage par le lecteur.
123 ISubDomain* sd = m_p->m_sub_domain;
124 IParallelMng* pm = parallel_mng;
125 IPrimaryMesh* mesh = sd->mainFactory()->createMesh(sd,pm,mesh_name);
126
127 // Créé le maillage.
128 // Le maillage peut déjà exister.
129 // Dans notre cas, c'est une erreur s'il est déjà alloué.
130 if (mesh->isAllocated())
131 ARCANE_FATAL("Mesh '{0}' already exists and is allocated", mesh_name);
132
133 mesh->properties()->setBool("dump", false);
134
135 String use_unit_str = (m_p->m_is_use_unit) ? "true" : "false";
136 String use_unit_xml = "<?xml version=\"1.0\"?><file use-unit='"+use_unit_str+"' />";
137
138 ITraceMng* tm = sd->traceMng();
140 XmlNode mesh_xml_node = xml_doc->documentNode().documentElement();
141
142 String dir_name;
143 bool is_bad = true;
144 bool use_internal_partition = pm->isParallel();
145 for( auto& reader_ref : m_p->readers() ){
146 IMeshReader* reader = reader_ref.get();
147 if (!reader->allowExtension(extension))
148 continue;
149
150 auto ret = reader->readMeshFromFile(mesh,mesh_xml_node,
151 file_name,dir_name,
152 use_internal_partition);
153 if (ret==IMeshReader::RTOk){
154 is_bad = false;
155 break;
156 }
157 if (ret==IMeshReader::RTError){
158 ARCANE_FATAL("Can not read mesh file '{0}'",file_name);
159 }
160 }
161
162 if (is_bad)
163 ARCANE_FATAL("No mesh reader is available for mesh file '{0}'",file_name);
164
165 return mesh;
166}
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
170
172setUseMeshUnit(bool v)
173{
174 m_p->m_is_use_unit = v;
175}
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
179
181isUseMeshUnit() const
182{
183 return m_p->m_is_use_unit;
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
189} // End namespace Arcane
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual IPrimaryMesh * createMesh(ISubDomain *sub_domain, const String &name)=0
Créé ou récupère un maillage.
Interface du service gérant la lecture d'un maillage.
Definition IMeshReader.h:37
virtual bool allowExtension(const String &str)=0
Vérifie si le service supporte les fichiers avec l'extension str.
virtual eReturnType readMeshFromFile(IPrimaryMesh *mesh, const XmlNode &mesh_element, const String &file_name, const String &dir_name, bool use_internal_partition)=0
Lit un maillage à partir d'un fichier.
@ RTError
Erreur lors de l'opération.
Definition IMeshReader.h:44
@ RTOk
Opération effectuée avec succès.
Definition IMeshReader.h:43
virtual bool isAllocated()=0
Vrai si le maillage est allouée.
virtual Properties * properties()=0
Propriétés associées à ce maillage.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual IParallelMng * sequentialParallelMng()=0
Retourne un gestionnaire de parallélisme séquentiel.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual IMainFactory * mainFactory()=0
Manufacture principale.
static IXmlDocumentHolder * loadFromBuffer(Span< const Byte > buffer, const String &name, ITraceMng *tm)
Charge un document XML.
Definition DomUtils.cc:426
IMesh * readMesh(const String &mesh_name, const String &file_name)
Lit le maillage dont le nom de fichier est file_name.
void setUseMeshUnit(bool v)
Si vrai, indique qu'on utilise le système d'unité éventuellement présent dans le format de fichier (t...
bool isUseMeshUnit() const
Indique si on utilise le système d'unité présent dans le fichier.
void setBool(const String &name, bool value)
Positionne une propriété de type bool de nom name et de valeur value.
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
Classe utilitaire pour instantier un service d'une interface donnée.
UniqueArray< Ref< InterfaceType > > createAllInstances()
Créé une instance de chaque service qui implémente InterfaceType.
Noeud d'un arbre DOM.
Definition XmlNode.h:51
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:291
std::string_view toStdStringView() const
Retourne une vue de la STL sur la chaîne actuelle.
Definition String.cc:348
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-