14#include "arcane/utils/ApplicationInfo.h"
15#include "arcane/utils/CommandLineArguments.h"
18#include "arcane/core/ServiceBuilder.h"
19#include "arcane/core/ICaseMeshService.h"
20#include "arcane/core/ICaseMeshReader.h"
21#include "arcane/core/IMeshBuilder.h"
22#include "arcane/core/IPrimaryMesh.h"
23#include "arcane/core/IItemFamily.h"
24#include "arcane/core/IMeshPartitionerBase.h"
25#include "arcane/core/IVariableMng.h"
26#include "arcane/core/IMeshModifier.h"
27#include "arcane/core/IMeshUtilities.h"
28#include "arcane/core/IParallelMng.h"
29#include "arcane/core/MeshBuildInfo.h"
30#include "arcane/core/IMeshMng.h"
31#include "arcane/core/IMeshFactoryMng.h"
32#include "arcane/core/IGhostLayerMng.h"
33#include "arcane/core/MeshPartInfo.h"
34#include "arcane/core/IMeshSubdivider.h"
35#include "arcane/core/IMeshUniqueIdMng.h"
36#include "arcane/core/internal/StringVariableReplace.h"
38#include "arcane/impl/ArcaneCaseMeshService_axl.h"
78 void _initializeVariables();
79 void _doInitialPartition();
80 void _doInitialPartition2(
const String& name);
81 void _setGhostLayerInfos();
83 void _setUniqueIdNumberingVersion();
89ArcaneCaseMeshService::
92, m_sub_domain(
sbi.subDomain())
105 info() <<
"Creating mesh from 'ArcaneCaseMeshService'";
114 ARCANE_FATAL(
"In '{0}': one and one only of <{1}> or <{2}> has to be specified",
115 options()->configList()->xpathFullName(),
116 options()->generator.rootTagName(),
120 if (m_mesh_file_name.
empty())
122 m_mesh_file_name,
options()->filename.xpathFullName());
128 if (m_mesh_builder_ref.isNull())
129 ARCANE_FATAL(
"No 'IMeshBuilder' created by specific reader");
132 m_mesh_builder_ref = _createBuilderFromFile(
read_info);
134 m_mesh_builder = m_mesh_builder_ref.get();
137 m_mesh_builder =
options()->generator();
154 m_partitioner_name =
options()->partitioner();
158 build_info.addFactoryName(
"ArcaneDynamicMeshFactory");
171 _checkMeshCreationAndAllocation(
false);
175 _setGhostLayerInfos();
176 _setUniqueIdNumberingVersion();
187 _checkMeshCreationAndAllocation(
true);
190 if (!m_partitioner_name.
empty())
191 _doInitialPartition();
200 _checkMeshCreationAndAllocation(
true);
206 _initializeVariables();
212void ArcaneCaseMeshService::
216 ARCANE_FATAL(
"Mesh is not created. You should call createMesh() before");
218 ARCANE_FATAL(
"Mesh is not allocated. You should call initializeMesh() before");
224void ArcaneCaseMeshService::
225_fillReadInfo(CaseMeshReaderReadInfo& read_info)
227 read_info.setFileName(m_mesh_file_name);
233 std::size_t extension_pos = fview.find_last_of(
'.');
234 if (extension_pos!=std::string_view::npos){
235 fview.remove_prefix(extension_pos+1);
238 read_info.setFormat(extension);
241 String partitioner_name =
options()->partitioner();
242 bool use_internal_partitioner = partitioner_name !=
"External";
243 if (use_internal_partitioner)
244 m_partitioner_name = partitioner_name;
246 info() <<
"Mesh filename=" << m_mesh_file_name
247 <<
" extension=" << read_info.format() <<
" partitioner=" << partitioner_name;
249 read_info.setParallelRead(use_internal_partitioner);
255Ref<IMeshBuilder> ArcaneCaseMeshService::
256_createBuilderFromFile(
const CaseMeshReaderReadInfo& read_info)
263 ServiceBuilder<ICaseMeshReader> builder(m_sub_domain);
264 UniqueArray<Ref<ICaseMeshReader>> mesh_readers(builder.createAllInstances());
266 for(
auto& mesh_reader_ref : mesh_readers ){
267 ICaseMeshReader* mesh_reader = mesh_reader_ref.get();
268 Ref<IMeshBuilder> builder = mesh_reader->createBuilder(read_info);
269 if (!builder.isNull())
276 builder.getServicesNames(valid_names);
277 String available_readers = String::join(
", ",valid_names);
278 ARCANE_FATAL(
"The mesh reader required for format '{0}' is not available."
279 "The following reader services are available: {1}",
280 read_info.format(),available_readers);
286void ArcaneCaseMeshService::
292 const bool use_partitioner_tester =
false;
293 String test_service =
"MeshPartitionerTester";
294 if (use_partitioner_tester) {
296 Int64 min_nb_cell = m_mesh->
parallelMng()->reduce(Parallel::ReduceMin,nb_cell);
297 info() <<
"Min nb cell=" << min_nb_cell;
299 _doInitialPartition2(test_service);
301 info() <<
"Mesh name=" << m_mesh->
name() <<
" have cells. Do not use " << test_service;
304 info() <<
"No basic partition first needed";
305 _doInitialPartition2(m_partitioner_name);
311void ArcaneCaseMeshService::
312_doInitialPartition2(
const String& partitioner_name)
314 info() <<
"Doing initial partitioning service=" << partitioner_name;
318 ServiceBuilder<IMeshPartitionerBase> sbuilder(m_sub_domain);
319 auto mesh_partitioner = sbuilder.createReference(partitioner_name,m_mesh);
321 IMesh* mesh = m_mesh;
323 mesh->modifier()->setDynamic(
true);
324 mesh->utilities()->partitionAndExchangeMeshWithReplication(mesh_partitioner.get(),
true);
325 mesh->modifier()->setDynamic(is_dynamic);
331void ArcaneCaseMeshService::
332_initializeVariables()
335 const auto& vars_opt =
options()->initialization().variable;
336 UniqueArray<String> errors;
337 for( Integer i=0, n=vars_opt.size(); i<n; ++i ){
338 const auto& o = vars_opt[i];
339 String var_name = o.
name;
340 String group_name = o.group;
341 String value = o.value;
342 info() <<
"Initialize variable=" << var_name <<
" group=" << group_name <<
" value=" << value;
343 IVariable* var = vm->findMeshVariable(m_mesh,var_name);
345 errors.add(String::format(
"No variable named '{0}' exists",var_name));
352 IItemFamily* var_family = var->itemFamily();
354 errors.add(String::format(
"Variable '{0}' has no family",var->fullName()));
358 ItemGroup group = var_family->findGroup(group_name);
360 errors.add(String::format(
"No group named '{0}' exists in family '{1}'",
361 group_name,var_family->name()));
365 bool ret = var->initialize(group,value);
367 errors.add(String::format(
"Bad value '{0}' for initializing variable '{1}'",
368 value,var->fullName()));
372 if (!errors.empty()){
373 for( String s : errors )
374 pinfo() <<
"ERROR: " << s;
375 ARCANE_FATAL(
"Variable initialization failed for option '{0}'",
376 vars_opt.xpathFullName());
383void ArcaneCaseMeshService::
394 if (nb_ghost_layer >= 0) {
395 info() <<
"Set number of ghost layers to '" << nb_ghost_layer <<
"' from caseoption";
396 gm->setNbGhostLayer(nb_ghost_layer);
400 if (builder_version >= 0) {
401 info() <<
"Set ghostlayer builder version to '" << builder_version <<
"' from caseoption";
402 gm->setBuilderVersion(builder_version);
409void ArcaneCaseMeshService::
410_setUniqueIdNumberingVersion()
415 if (
options()->faceNumberingVersion.isPresent()) {
417 info() <<
"Set face uniqueId numbering version to '" << v <<
"' from caseoption";
419 mum->setFaceBuilderVersion(v);
426ARCANE_REGISTER_SERVICE_ARCANECASEMESHSERVICE(ArcaneCaseMeshService,
427 ArcaneCaseMeshService);
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
Generation de la classe de base du Service.
CaseOptionsArcaneCaseMeshService * options() const
Options du jeu de données du service.
Service Arcane un maillage du jeu de données.
void createMesh(const String &default_name) override
Créé le maillage avec le nom name.
void allocateMeshItems() override
Alloue les éléments du maillage.
void partitionMesh() override
Partitionne le maillage.
void applyAdditionalOperations() override
Applique les opérations après tout le reste.
Informations nécessaires pour la lecture d'un fichier de maillage.
const Type & value() const
Retourne la valeur de l'option.
bool isPresent() const
Retourne true si l'option est présente.
virtual String name() const
Retourne le nom de l'élément dans le langage du jeu de données.
virtual String name() const =0
Nom du maillage.
virtual Integer nbCell()=0
Nombre de mailles du maillage.
Interface d'un service de création/lecture du maillage.
virtual void allocateMeshItems(IPrimaryMesh *pm)=0
Alloue les entités du maillage géré par ce service.
virtual void fillMeshBuildInfo(MeshBuildInfo &build_info)=0
Remplit build_info avec les informations nécessaires pour créer le maillage.
virtual void subdivideMesh(IPrimaryMesh *mesh)=0
Subdivise le maillage mesh.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IMeshUniqueIdMng * meshUniqueIdMng() const =0
Gestionnare de la numérotation des identifiants uniques.
virtual bool isAllocated()=0
Vrai si le maillage est allouée.
virtual IGhostLayerMng * ghostLayerMng() const =0
Gestionnare de couche fantômes associé
virtual bool isDynamic() const =0
Indique si le maillage est dynamique (peut évoluer)
virtual const MeshPartInfo & meshPartInfo() const =0
Informations sur les parties du maillage.
Interface du gestionnaire d'un sous-domaine.
virtual const ApplicationInfo & applicationInfo() const =0
Informations sur l'exécutable.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Paramètres nécessaires à la construction d'un maillage.
Caractéristiques d'un maillage.
Structure contenant les informations pour créer un service.
static String replaceWithCmdLineArgs(const ParameterList ¶meter_list, StringView string_with_symbols, bool fatal_if_not_found=false, bool fatal_if_invalid=true)
Méthode permettant de remplacer les symboles de la chaine de caractères string_with_symbols par leurs...
Chaîne de caractères unicode.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
std::string_view toStdStringView() const
Retourne une vue de la STL sur la chaîne actuelle.
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
Int32 Integer
Type représentant un entier.