Arcane  v3.14.10.0
Documentation développeur
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
98{
99 ISubDomain* sd = m_p->m_sub_domain;
100 IParallelMng* pm = sd->parallelMng()->sequentialParallelMng();
101 return readMesh(mesh_name,file_name,pm);
102}
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106// TODO: fusionner cette méthode avec cell de ISubDomain.
109{
110 m_p->checkInit();
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);
120
121 }
122 // TODO: à terme, créer le maillage par le lecteur.
123 ISubDomain* sd = m_p->m_sub_domain;
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
143 bool is_bad = true;
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,
154 is_bad = false;
155 break;
156 }
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.
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 bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
static IXmlDocumentHolder * loadFromBuffer(Span< const Byte > buffer, const String &name, ITraceMng *tm)
Charge un document XML.
Definition DomUtils.cc:426
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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.
Noeud d'un arbre DOM.
Definition XmlNode.h:51
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-