Arcane  v3.15.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
DynamicMesh.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* DynamicMesh.cc (C) 2000-2025 */
9/* */
10/* Classe de gestion d'un maillage non structuré évolutif. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/DynamicMesh.h"
15
16#include "arcane/utils/ValueConvert.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/ArgumentException.h"
21#include "arcane/utils/ScopedPtr.h"
22
23#include "arcane/core/ISubDomain.h"
24#include "arcane/core/ITimeStats.h"
25#include "arcane/core/IVariableMng.h"
26#include "arcane/core/Properties.h"
27#include "arcane/core/SharedVariable.h"
28#include "arcane/core/IParallelMng.h"
29#include "arcane/core/ICaseDocument.h"
31#include "arcane/core/Timer.h"
32#include "arcane/core/ItemPrinter.h"
33#include "arcane/core/IPropertyMng.h"
34#include "arcane/core/CommonVariables.h"
35#include "arcane/core/MeshStats.h"
36#include "arcane/core/IMeshFactory.h"
37#include "arcane/core/IMeshPartitionConstraintMng.h"
38#include "arcane/core/IMeshWriter.h"
39#include "arcane/core/IMeshUtilities.h"
40#include "arcane/core/Connectivity.h"
41#include "arcane/core/FactoryService.h"
42#include "arcane/core/AbstractService.h"
43#include "arcane/core/ServiceBuilder.h"
44#include "arcane/core/MeshToMeshTransposer.h"
45#include "arcane/core/IItemFamilyCompactPolicy.h"
46#include "arcane/core/IItemFamilyExchanger.h"
47#include "arcane/core/IItemFamilySerializer.h"
48#include "arcane/core/IItemFamilyPolicyMng.h"
49#include "arcane/core/IMeshExchanger.h"
50#include "arcane/core/IMeshCompacter.h"
51#include "arcane/core/MeshVisitor.h"
52#include "arcane/core/IVariableSynchronizer.h"
53#include "arcane/core/IParallelReplication.h"
54#include "arcane/core/IMeshMng.h"
55#include "arcane/core/MeshBuildInfo.h"
56#include "arcane/core/ICaseMng.h"
57
58#include "arcane/core/internal/UnstructuredMeshAllocateBuildInfoInternal.h"
59#include "arcane/core/internal/IItemFamilyInternal.h"
60#include "arcane/core/internal/IVariableMngInternal.h"
61#include "arcane/core/internal/IMeshInternal.h"
62#include "arcane/core/internal/IMeshModifierInternal.h"
63
64#include "arcane/mesh/ExtraGhostCellsBuilder.h"
65#include "arcane/mesh/ExtraGhostParticlesBuilder.h"
66
67#include "arcane/mesh/MeshPartitionConstraintMng.h"
68#include "arcane/mesh/ItemGroupsSynchronize.h"
69#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
70#include "arcane/mesh/OneMeshItemAdder.h"
71#include "arcane/mesh/DynamicMeshChecker.h"
72#include "arcane/mesh/GhostLayerMng.h"
73#include "arcane/mesh/MeshUniqueIdMng.h"
74#include "arcane/mesh/ItemGroupDynamicMeshObserver.h"
75#include "arcane/mesh/ParticleFamily.h"
76#include "arcane/mesh/MeshExchange.h"
77#include "arcane/mesh/UnstructuredMeshUtilities.h"
78#include "arcane/mesh/TiedInterfaceMng.h"
79#include "arcane/mesh/MeshCompactMng.h"
80#include "arcane/mesh/MeshExchangeMng.h"
81#include "arcane/mesh/DynamicMeshMerger.h"
82#include "arcane/mesh/ItemFamilyNetwork.h"
83#include "arcane/mesh/IncrementalItemConnectivity.h"
84#include "arcane/mesh/MeshExchanger.h"
85#include "arcane/mesh/IndexedIncrementalItemConnectivityMng.h"
86#include "arcane/mesh/NodeFamily.h"
87#include "arcane/mesh/EdgeFamily.h"
88#include "arcane/mesh/FaceFamily.h"
89#include "arcane/mesh/CellFamily.h"
90#include "arcane/mesh/DoFFamily.h"
91
93#include "arcane/mesh/MeshRefinement.h"
94#include "arcane/mesh/FaceReorienter.h"
95#include "arcane/mesh/NewItemOwnerBuilder.h"
96
97#include "arcane/mesh/IncrementalItemConnectivity.h"
98#include "arcane/mesh/ItemConnectivityMng.h"
99
100#include <functional>
101#include <memory>
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106namespace
107{
108// Propritétés publiques que l'utilisateur peut positionner
109const char* PROPERTY_SORT = "sort";
110const char* PROPERTY_COMPACT = "compact";
111const char* PROPERTY_COMPACT_AFTER_ALLOCATE = "compact-after-allocate";
112const char* PROPERTY_DUMP = "dump";
113const char* PROPERTY_DISPLAY_STATS = "display-stats";
114
115// Propritétés internes à Arcane
116const char* PROPERTY_MESH_VERSION = "mesh-version";
117}
118
119namespace Arcane::mesh
120{
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
124
125extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
126createNodeFamilyPolicyMng(ItemFamily* family);
127
128extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
129createEdgeFamilyPolicyMng(ItemFamily* family);
130
131extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
132createFaceFamilyPolicyMng(ItemFamily* family);
133
134extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
135createCellFamilyPolicyMng(ItemFamily* family);
136
137extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
138createParticleFamilyPolicyMng(ItemFamily* family);
139
140extern "C++" ARCANE_MESH_EXPORT IItemFamilyPolicyMng*
141createDoFFamilyPolicyMng(ItemFamily* family);
142
143extern "C++" ARCANE_MESH_EXPORT void
144allocateCartesianMesh(DynamicMesh* mesh,CartesianMeshAllocateBuildInfo& build_info);
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
149// #define ARCANE_DEBUG_DYNAMIC_MESH
150// #define ARCANE_DEBUG_LOAD_BALANCING
151
152#ifdef ARCANE_DEBUG_LOAD_BALANCING
153static bool arcane_debug_load_balancing = true;
154#else
155static bool arcane_debug_load_balancing = false;
156#endif
157
158#ifdef ACTIVATE_PERF_COUNTER
159const std::string DynamicMesh::PerfCounter::m_names[] = {
160 "UPGHOSTLAYER1",
161 "UPGHOSTLAYER2",
162 "UPGHOSTLAYER3",
163 "UPGHOSTLAYER4",
164 "UPGHOSTLAYER5",
165 "UPGHOSTLAYER6",
166 "UPGHOSTLAYER7"
167} ;
168#endif
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172
174: public IMeshInternal
176{
177 public:
178
179 explicit InternalApi(DynamicMesh* mesh)
180 : m_mesh(mesh)
181 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
182 {}
183
184 public:
185
186 void setMeshKind(const MeshKind& v) override
187 {
188 m_mesh->m_mesh_kind = v;
189 }
190
192 {
193 return m_connectivity_mng.get();
194 }
195
197 {
198 return nullptr;
199 }
200
202 {
203 m_mesh->incrementalBuilder()->removeNeedRemoveMarkedItems();
204 }
205
206 private:
207
208 DynamicMesh* m_mesh = nullptr;
209 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng = nullptr;
210};
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215DynamicMesh::
216DynamicMesh(ISubDomain* sub_domain,const MeshBuildInfo& mbi, bool is_submesh)
218, TraceAccessor(mbi.parallelMngRef()->traceMng())
219, m_sub_domain(sub_domain)
220, m_mesh_mng(sub_domain->meshMng())
221, m_mesh_handle(m_mesh_mng->findMeshHandle(mbi.name()))
222, m_parallel_mng(mbi.parallelMngRef().get())
223, m_variable_mng(sub_domain->variableMng())
224, m_properties(new Properties(sub_domain->propertyMng(),String("ArcaneMeshProperties_")+mbi.name()))
225, m_timestamp(0)
226, m_is_allocated(false)
227, m_dimension(-1)
228, m_name(mbi.name())
229, m_factory_name(mbi.factoryName())
230, m_need_compact(true)
231, m_node_family(nullptr)
232, m_edge_family(nullptr)
233, m_face_family(nullptr)
234, m_cell_family(nullptr)
235, m_parent_mesh(nullptr)
236, m_parent_group(nullptr)
237, m_mesh_utilities(nullptr)
238, m_mesh_builder(nullptr)
239, m_mesh_checker(nullptr)
240, m_submesh_tools(nullptr)
242, m_mesh_refinement(nullptr)
243, m_new_item_owner_builder(nullptr)
244, m_extra_ghost_cells_builder(nullptr)
245, m_extra_ghost_particles_builder(nullptr)
246, m_initial_allocator(this)
247, m_internal_api(std::make_unique<InternalApi>(this))
248, m_is_amr_activated(mbi.meshKind().meshAMRKind()!=eMeshAMRKind::None)
249, m_amr_type(mbi.meshKind().meshAMRKind())
250, m_is_dynamic(false)
251, m_tied_interface_mng(nullptr)
252, m_is_sub_connectivity_set(false)
253, m_tied_interface_need_prepare_dump(true)
254, m_partition_constraint_mng(nullptr)
255, m_ghost_layer_mng(new GhostLayerMng(m_parallel_mng->traceMng()))
256, m_mesh_unique_id_mng(new MeshUniqueIdMng(m_parallel_mng->traceMng()))
257, m_mesh_exchange_mng(new MeshExchangeMng(this))
258, m_mesh_compact_mng(new MeshCompactMng(this))
259, m_connectivity_policy(InternalConnectivityPolicy::NewOnly)
260, m_mesh_part_info(makeMeshPartInfoFromParallelMng(m_parallel_mng))
261, m_item_type_mng(ItemTypeMng::_singleton())
262, m_indexed_connectivity_mng(new IndexedIncrementalItemConnectivityMng(m_parallel_mng->traceMng()))
263, m_mesh_kind(mbi.meshKind())
264{
265 m_node_family = new NodeFamily(this,"Node");
266 m_edge_family = new EdgeFamily(this,"Edge");
267 m_face_family = new FaceFamily(this,"Face");
268 m_cell_family = new CellFamily(this,"Cell");
269
270 _addFamily(m_node_family);
271 _addFamily(m_edge_family);
272 _addFamily(m_face_family);
273 _addFamily(m_cell_family);
274
275 m_properties->setBool(PROPERTY_SORT,true);
276 m_properties->setBool(PROPERTY_COMPACT,true);
277 m_properties->setBool(PROPERTY_COMPACT_AFTER_ALLOCATE,true);
278 m_properties->setBool(PROPERTY_DUMP,true);
279 m_properties->setBool(PROPERTY_DISPLAY_STATS,true);
280 m_properties->setInt32(PROPERTY_MESH_VERSION,1);
281
282 m_item_internal_list.mesh = this;
283 m_item_internal_list._internalSetNodeSharedInfo(m_node_family->commonItemSharedInfo());
284 m_item_internal_list._internalSetEdgeSharedInfo(m_edge_family->commonItemSharedInfo());
285 m_item_internal_list._internalSetFaceSharedInfo(m_face_family->commonItemSharedInfo());
286 m_item_internal_list._internalSetCellSharedInfo(m_cell_family->commonItemSharedInfo());
287
288 info() << "Is AMR Activated? = " << m_is_amr_activated
289 << " AMR type = " << m_amr_type
290 << " allow_loose_items=" << m_mesh_kind.isNonManifold();
291
292 _printConnectivityPolicy();
293
294 // Adding the family dependencies if asked
296 m_use_mesh_item_family_dependencies = true ;
297 m_item_family_network = new ItemFamilyNetwork(traceMng());
298 _addDependency(m_cell_family,m_node_family);
299 _addDependency(m_cell_family,m_face_family);
300 _addDependency(m_cell_family,m_edge_family);
301 _addDependency(m_face_family,m_node_family);
302 _addDependency(m_edge_family,m_node_family);
303 _addRelation(m_face_family,m_edge_family);// Not seen as a dependency in DynamicMesh : for example not possible to use replaceConnectedItem for Face to Edge...
304 _addRelation(m_face_family,m_face_family);
305 _addRelation(m_face_family,m_cell_family);
306 _addRelation(m_edge_family,m_cell_family);
307 _addRelation(m_edge_family,m_face_family);
308 _addRelation(m_node_family,m_cell_family);
309 _addRelation(m_node_family,m_face_family);
310 _addRelation(m_node_family,m_edge_family);
311 // The relation concerning edge family are only added when the dimension is known since they change with dimension
312 // cf. 3D Cell <-> Faces <-> Edges <-> Nodes
313 // 2D Cell <-> Faces <-> Nodes
314 // <-> Edges <-> Nodes
315 // 1D No edge...
316 m_family_modifiers.add(m_cell_family);
317 m_family_modifiers.add(m_face_family);
318 m_family_modifiers.add(m_node_family);
319 m_family_modifiers.add(m_edge_family);
320 }
321
322 {
323 String s = platform::getEnvironmentVariable("ARCANE_GRAPH_CONNECTIVITY_POLICY");
324#ifdef USE_GRAPH_CONNECTIVITY_POLICY
325 s = "1";
326#endif
327 if (s == "1") {
328 m_item_family_network = new ItemFamilyNetwork(traceMng());
329 info()<<"Graph connectivity is activated";
330 m_family_modifiers.add(m_cell_family);
331 m_family_modifiers.add(m_face_family);
332 m_family_modifiers.add(m_node_family);
333 m_family_modifiers.add(m_edge_family);
334 }
335 }
336
337 m_extra_ghost_cells_builder = new ExtraGhostCellsBuilder(this);
338 m_extra_ghost_particles_builder = new ExtraGhostParticlesBuilder(this);
339
340 // Pour garder la compatibilité avec l'existant, autorise de ne pas
341 // sauvegarder l'attribut 'need-compact'. Cela a été ajouté pour la version 3.10
342 // de Arcane (juin 2023). A supprimer avant fin 2023.
343 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_NO_SAVE_NEED_COMPACT", true))
344 m_do_not_save_need_compact = v.value();
345
346 // Surcharge la valeur par défaut pour le mécanisme de numérotation
347 // des uniqueId() des arêtes et des faces.
348 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_GENERATE_UNIQUE_ID_FROM_NODES", true)){
349 bool is_generate = (v.value() != 0);
350 // L'utilisation des entités libres implique d'utiliser la génération des uniqueId()
351 // à partir des noeuds.
352 if (!is_generate && meshKind().isNonManifold())
353 is_generate = true;
354 m_mesh_unique_id_mng->setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(is_generate);
355 }
356}
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
363{
364 // Il serait peut-être préférable de lancer une exception mais dans un
365 // destructeur ce n'est pas forcément conseillé
366 if (m_extra_ghost_cells_builder->hasBuilder())
367 info() << "WARNING: pending ExtraGhostCellsBuilder reference";
368 if (m_extra_ghost_particles_builder->hasBuilder())
369 info() << "WARNING: pending ExtraGhostParticlesBuilder reference";
370
371 m_indexed_connectivity_mng = nullptr;
372 delete m_mesh_compact_mng;
373 delete m_mesh_exchange_mng;
374 delete m_extra_ghost_cells_builder;
375 delete m_extra_ghost_particles_builder;
376 delete m_mesh_unique_id_mng;
377 delete m_ghost_layer_mng;
378 delete m_tied_interface_mng;
379 delete m_partition_constraint_mng;
380 delete m_mesh_utilities;
381 delete m_mesh_builder;
382 delete m_mesh_checker;
384 delete m_mesh_refinement;
385 delete m_submesh_tools;
386 delete m_new_item_owner_builder;
387
388 // Détruit les familles allouées dynamiquement.
389 for( IItemFamily* family : m_item_families ){
390 eItemKind kind = family->itemKind();
391 // Seules les familles de particules ou de DoF sont allouées dynamiquement.
392 // TODO: maintenant elles le sont toute donc il faudrait toute
393 // les désallouées par cette boucle
394 if (kind==IK_Particle || kind==IK_DoF)
395 delete family;
396 }
397 m_properties->destroy();
398 delete m_properties;
399
400 delete m_cell_family;
401 delete m_face_family;
402 delete m_edge_family;
403 delete m_node_family;
404}
405
406/*---------------------------------------------------------------------------*/
407/*---------------------------------------------------------------------------*/
408
410build()
411{
412 Trace::Setter mci(traceMng(),_className());
413
414 info() << "Building DynamicMesh name=" << name()
415 << " ItemInternalMapImpl=" << ItemInternalMap::UseNewImpl;
416
417 m_tied_interface_mng = new TiedInterfaceMng(this);
418
419 // IMPORTANT: les premiers éléments de m_item_families doivent
420 // correspondre aux familles associées aux valeurs de eItemKind
421 // (IK_Node, IK_Edge, IK_Face, IK_Cell)
422 for( IItemFamily* family : m_item_families ){
423 _buildAndInitFamily(family);
424 }
425
426 // Permet d'appeler la fonction '_prepareDump' lorsqu'une
427 // protection va être effectuée
429 m_observer_pool.addObserver(this,
431 vm->writeObservable());
432 // Permet d'appeler la fonction '_reloadFromDump' lorsqu'une
433 // protection est relue
434 m_observer_pool.addObserver(this,
436 vm->readObservable());
437
438 m_mesh_builder = new DynamicMeshIncrementalBuilder(this);
439 m_mesh_checker = new DynamicMeshChecker(this);
440 m_partition_constraint_mng = new MeshPartitionConstraintMng(this);
441
442 if (parentMesh()) {
443 // Cela peut induire des segfaults si le DynamicMesh n'est pas correctement utilisé
444 m_submesh_tools = new SubMeshTools(this, m_mesh_builder);
447
448 this->properties()->setBool(PROPERTY_COMPACT,true);
449 this->properties()->setBool(PROPERTY_SORT,true);
450
452 m_parent_group->attachObserver(this, (obs = new ItemGroupDynamicMeshObserver(this)));
453
454 this->endAllocate();
455 Int32ConstArrayView localIds = m_parent_group->itemsLocalId();
456 obs->executeExtend(&localIds);
457 this->endUpdate();
458
459 } else {
460 m_submesh_tools = 0;
462
463 // GG: ne construit m_mesh_refinement qui si l'AMR est actif
464 // Cela évite de creer des variables inutile lorsque l'AMR n'est pas
465 // demandé. La création de m_mesh_refinement se fait maintenant
466 // dans readAmrActivator(). Ce n'est peut-être pas le bon endroit
467 // pour le faire et on peut éventuellement le déplacer. Il faut
468 // juste que m_mesh_refinement ne soit créé que si l'AMR est actif.
469 // SDC : OK. Remis car maintenant l'info AMR (in)actif est connue a
470 // la construction. Suppression de readAmrActivator.
471
472 if (m_is_amr_activated) {
473 if(m_amr_type == eMeshAMRKind::None || m_amr_type == eMeshAMRKind::Cell){
475 }
476 else if(m_amr_type == eMeshAMRKind::Patch){
477 ARCANE_FATAL("Patch AMR type is not implemented.");
478 }
479 else if(m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly){
480 // L'AMR PatchCartesianMeshOnly n'est pas géré par MeshRefinement().
481 // Voir dans CartesianMesh.cc.
482 }
483 }
484 }
485}
486
487/*---------------------------------------------------------------------------*/
488/*---------------------------------------------------------------------------*/
489
492{
493 return m_parallel_mng;
494}
495
496/*---------------------------------------------------------------------------*/
497/*---------------------------------------------------------------------------*/
498
499void DynamicMesh::
500_checkValidItem(ItemInternal* item)
501{
502 if (!item)
503 ARCANE_FATAL("INTERNAL: DynamicMesh: invalid use of a null entity");
504}
505
506/*---------------------------------------------------------------------------*/
507/*---------------------------------------------------------------------------*/
508
514
515/*---------------------------------------------------------------------------*/
516/*---------------------------------------------------------------------------*/
517
520{
521 Trace::Setter mci(traceMng(),_className());
522 info() << "Reloading the mesh " << name();
523 m_is_allocated = true;
524 Timer timer(subDomain(),"DynamicMesh::reloadMesh",Timer::TimerReal);
525 {
528 m_mesh_checker->checkMeshFromReferenceFile();
529 }
530 info() << "Time to reallocate the mesh structures (direct method) (unit: second): "
531 << timer.lastActivationTime();
532}
533
534/*---------------------------------------------------------------------------*/
535/*---------------------------------------------------------------------------*/
536
538setCheckLevel(Integer level)
539{
540 m_mesh_checker->setCheckLevel(level);
541}
542
543/*---------------------------------------------------------------------------*/
544/*---------------------------------------------------------------------------*/
545
547checkLevel() const
548{
549 return m_mesh_checker->checkLevel();
550}
551
552/*---------------------------------------------------------------------------*/
553/*---------------------------------------------------------------------------*/
554
557{
558 if (!m_is_allocated)
559 return;
560 m_mesh_checker->checkValidMesh();
561}
562
563/*---------------------------------------------------------------------------*/
564/*---------------------------------------------------------------------------*/
565
568{
569 if (!m_is_allocated)
570 return;
571 m_mesh_checker->checkValidMeshFull();
572}
573
574/*---------------------------------------------------------------------------*/
575/*---------------------------------------------------------------------------*/
576
577void DynamicMesh::
578checkValidConnectivity()
579{
580 m_mesh_checker->checkValidConnectivity();
581}
582
583/*---------------------------------------------------------------------------*/
584/*---------------------------------------------------------------------------*/
585
588{
589 for( IItemFamily* family : m_item_families ){
590 family->destroyGroups();
591 }
592}
593
594/*---------------------------------------------------------------------------*/
595/*---------------------------------------------------------------------------*/
596
598findGroup(const String& name)
599{
600 ItemGroup group;
601 for( IItemFamily* family : m_item_families ){
602 group = family->findGroup(name);
603 if (!group.null())
604 return group;
605 }
606 return group;
607}
608
609/*---------------------------------------------------------------------------*/
610/*---------------------------------------------------------------------------*/
611
614{
615 _checkKindRange(ik);
616 IItemFamily* family = m_item_families[ik];
617 return family->findGroup(name,create_if_needed);
618}
619
620/*---------------------------------------------------------------------------*/
621/*---------------------------------------------------------------------------*/
622
623ItemGroup DynamicMesh::
624createGroup(const String& name,eItemKind ik)
625{
626 _checkKindRange(ik);
627 IItemFamily* family = m_item_families[ik];
628 ARCANE_CHECK_PTR(family);
629 return family->findGroup(name);
630}
631
632/*---------------------------------------------------------------------------*/
633/*---------------------------------------------------------------------------*/
634
635ItemGroup DynamicMesh::
636createGroup(const String& name,const ItemGroup& parent)
637{
638 IItemFamily* family = parent.itemFamily();
639 ARCANE_CHECK_PTR(family);
640 return family->createGroup(name,parent);
641}
642
643/*--------------------------------------------------------------------------*/
644/*--------------------------------------------------------------------------*/
645
646void DynamicMesh::
647_computeSynchronizeInfos()
648{
649 _computeFamilySynchronizeInfos();
650 _computeGroupSynchronizeInfos();
651}
652
653/*--------------------------------------------------------------------------*/
654/*--------------------------------------------------------------------------*/
655
656void DynamicMesh::
657_computeFamilySynchronizeInfos()
658{
659 info() << "Computing family synchronization information for " << name();
660 for( IItemFamily* family : m_item_families ){
661 family->computeSynchronizeInfos();
662 }
663
664 // Ecrit la topologie pour la synchronisation des mailles
665 if (!platform::getEnvironmentVariable("ARCANE_DUMP_VARIABLE_SYNCHRONIZER_TOPOLOGY").null()){
666 auto* var_syncer = cellFamily()->allItemsSynchronizer();
667 Int32 iteration = subDomain()->commonVariables().globalIteration();
668 String file_name = String::format("{0}_sync_topology_iter{1}.json",name(),iteration);
669 mesh_utils::dumpSynchronizerTopologyJSON(var_syncer,file_name);
670 }
671}
672
673/*--------------------------------------------------------------------------*/
674/*--------------------------------------------------------------------------*/
675
676void DynamicMesh::
677_computeGroupSynchronizeInfos()
678{
679 auto action = [](ItemGroup& group)
680 {
681 if (group.hasSynchronizer())
682 group.synchronizer()->compute();
683 };
684
685 info() << "Computing group synchronization information for " << name();
686 meshvisitor::visitGroups(this,action);
687}
688
689/*--------------------------------------------------------------------------*/
690/*--------------------------------------------------------------------------*/
691
693groups()
694{
696 for( IItemFamily* family : m_item_families ){
697 for( ItemGroupCollection::Enumerator i_group(family->groups()); ++i_group; )
698 m_all_groups.add(*i_group);
699 }
700 return m_all_groups;
701}
702
703/*---------------------------------------------------------------------------*/
704/*---------------------------------------------------------------------------*/
710{
711 // TEMPORAIRE: recopie pour chaque famille le champ owner() dans
712 // la variable correspondante.
713 for( IItemFamily* family : m_item_families ){
714 VariableItemInt32& items_owner(family->itemsNewOwner());
715 ENUMERATE_ITEM(iitem,family->allItems()){
716 Item item = *iitem;
717 items_owner[iitem] = item.owner();
718 }
719 }
720
721 ICaseDocumentFragment* doc = subDomain()->caseMng()->caseDocumentFragment();
722 XmlNode root = doc->rootElement();
723 if (root.null())
724 return;
725
726 bool has_error = false;
727 IVariableMng* vm = m_sub_domain->variableMng();
728 XmlNodeList child_list = init_node.children(String("variable"));
729 for( const auto& i : child_list ){
730 String var_name = i.attrValue("nom");
731 IVariable* var = vm->findMeshVariable(this,var_name);
732 if (!var){
733 error() << "Failed to initialize the variable `" << var_name
734 << "'\nNo variable with that name exists";
735 has_error = true;
736 continue;
737 }
738 // N'initialise pas les variables non utilisées.
739 if (!var->isUsed())
740 continue;
741
742 String grp_name = i.attrValue("groupe");
744
745 if (grp.null()){
746 error() << "Failed to initialize the variable `" << var_name
747 << "' on the group `" << grp_name << "'\n"
748 << "No group with that name exists";
749 has_error = true;
750 continue;
751 }
752 debug() << "Read value variable `" << grp_name
753 << "' `" << var_name << "' " << var;
754 String val_str = i.attrValue("valeur");
755 bool ret = var->initialize(grp,val_str);
756 if (ret){
757 error() << "Failed to initialized the variable `" << var_name
758 << "' on the group `" << grp_name << "'";
759 has_error = true;
760 continue;
761 }
762 }
763 if (has_error)
764 fatal() << "Variable initialization failed";
765}
766
767/*---------------------------------------------------------------------------*/
768/*---------------------------------------------------------------------------*/
769
770// NOTE: a priori cette méthode ne fonctionne s'il existe des variables
771// partielles car les groupes sur lesquelles elles reposent vont être détruit
772// (A vérifier)
773
776{
777 if (!m_is_allocated)
778 ARCANE_FATAL("mesh is not allocated");
779
780 clearItems();
782 m_mesh_builder->resetAfterDeallocate();
783
784 m_is_allocated = false;
785 m_mesh_dimension = (-1);
786}
787
788/*---------------------------------------------------------------------------*/
789/*---------------------------------------------------------------------------*/
790
793{
794 if (mesh_nb_cell==0 && !cells_infos.empty())
795 ARCANE_FATAL("Can not dynamically compute the number of cells");
796
797 Trace::Setter mci(traceMng(),_className());
798
799 setEstimatedCells(mesh_nb_cell);
800
801 Timer timer(subDomain(),"AllocateCells",Timer::TimerReal);
802 {
804 _allocateCells(mesh_nb_cell,cells_infos);
805 if (one_alloc)
806 endAllocate();
807 }
808 info() << "Time to build the mesh structures (indirect method) (unit: second): "
809 << timer.lastActivationTime();
810}
811
812/*---------------------------------------------------------------------------*/
813/*---------------------------------------------------------------------------*/
814
817{
818 Trace::Setter mci(traceMng(),_className());
819 if (m_is_allocated)
820 ARCANE_FATAL("endAllocate() has already been called");
821 _checkDimension(); // HP: add control if endAllocate is called
822 _checkConnectivity(); // without any cell allocation
823
824 bool print_stats = true;
825 ITimeStats* ts = m_sub_domain->timeStats();
827 if (print_stats){
828 info() << "Begin compute face unique ids";
829 ts->dumpTimeAndMemoryUsage(pm);
830 }
831 m_mesh_builder->computeFacesUniqueIds();
832 if (print_stats){
833 info() << "Begin compute ghost layer";
834 ts->dumpTimeAndMemoryUsage(pm);
835 }
836 m_mesh_builder->addGhostLayers(true);
837 if (print_stats){
838 info() << "Begin compact items";
839 ts->dumpTimeAndMemoryUsage(pm);
840 }
841 _allocateCells2(m_mesh_builder);
842
843 if (m_properties->getBool(PROPERTY_COMPACT_AFTER_ALLOCATE))
844 _compactItems(true,false);
845
846 _compactItemInternalReferences();
847 for( IItemFamily* family : m_item_families )
848 family->_internalApi()->endAllocate();
849
850 if (print_stats)
851 ts->dumpTimeAndMemoryUsage(pm);
852
853#ifdef ARCANE_DEBUG_DYNAMIC_MESH
854 {
855 String file_name("mesh-end-allocate");
856 if (parallelMng()->isParallel()){
857 file_name += "-";
858 file_name += m_mesh_rank;
859 }
860 mesh_utils::writeMeshConnectivity(this,file_name);
861 }
862#endif
863
865 m_mesh_checker->checkMeshFromReferenceFile();
866
867 // Positionne les proprietaires pour que cela soit comme apres
868 // un echange. Ce n'est a priori pas indispensable
869 // mais cela permet d'assurer la coherence avec
870 // d'autres appels a setOwnersFromCells()
871 if (parallelMng()->isParallel()){
872 String s = platform::getEnvironmentVariable("ARCANE_CHANGE_OWNER_ON_INIT");
873 if (!s.null()){
874 info() << "** Set owners from cells";
875 _setOwnersFromCells();
876 }
877 }
878
879 // Indique aux familles qu'on vient de mettre à jour le maillage
880 // Pour qu'elles puissent recalculer les informations qu'elles souhaitent.
881 _notifyEndUpdateForFamilies();
882
884
885 m_is_allocated = true;
886 if (arcaneIsCheck())
888
889 // Affiche les statistiques du nouveau maillage
890 {
891 MeshStats ms(traceMng(),this,m_parallel_mng);
892 ms.dumpStats();
893 }
894}
895
896/*---------------------------------------------------------------------------*/
897/*---------------------------------------------------------------------------*/
898
899void DynamicMesh::
900_allocateCells(Integer mesh_nb_cell,
901 Int64ConstArrayView cells_infos,
902 Int32ArrayView cells,
903 bool allow_build_face)
904{
905 Trace::Setter mci(traceMng(),_className());
906 _checkDimension();
907 _checkConnectivity();
908 Int32 rank = meshRank();
909 if (m_use_mesh_item_family_dependencies)
910 m_mesh_builder->addCells3(mesh_nb_cell,cells_infos,rank,cells,allow_build_face);
911 else
912 m_mesh_builder->addCells(mesh_nb_cell,cells_infos,rank,cells,allow_build_face);
913}
914
915/*---------------------------------------------------------------------------*/
916/*---------------------------------------------------------------------------*/
917
919addCells(Integer nb_cell,
920 Int64ConstArrayView cells_infos,
921 Int32ArrayView cells)
922{
923 const bool allow_build_face = (m_parallel_mng->commSize() == 1);
924 _allocateCells(nb_cell,cells_infos,cells,allow_build_face);
925}
926
927/*---------------------------------------------------------------------------*/
928/*---------------------------------------------------------------------------*/
929
932{
933 bool allow_build_face = args.isAllowBuildFaces();
934 // En parallèle, on ne peut pas construire à la volée les faces
935 // (car il faut générer un uniqueId() et ce dernier ne serait pas cohérent
936 // entre les sous-domaines)
937 if (m_parallel_mng->commSize() > 1)
938 allow_build_face = false;
939 _allocateCells(args.nbCell(),args.cellInfos(),args.cellLocalIds(),allow_build_face);
940}
941
942/*---------------------------------------------------------------------------*/
943/*---------------------------------------------------------------------------*/
944
946addCells(ISerializer* buffer)
947{
948 _addCells(buffer,0);
949}
950
951/*---------------------------------------------------------------------------*/
952/*---------------------------------------------------------------------------*/
953
956{
957 _addCells(buffer,&cells_local_id);
958}
959
960/*---------------------------------------------------------------------------*/
961/*---------------------------------------------------------------------------*/
962
963void DynamicMesh::
964_addCells(ISerializer* buffer,Int32Array* cells_local_id)
965{
966 Trace::Setter mci(traceMng(),_className());
967 _checkDimension();
968 _checkConnectivity();
969 if (!itemFamilyNetwork() ||
970 !(itemFamilyNetwork() && itemFamilyNetwork()->isActivated()) ||
971 !IItemFamilyNetwork::plug_serializer) {
974 cell_serializer->deserializeItems(buffer,cells_local_id);
975 }
976 else {
977 _deserializeItems(buffer, cells_local_id, m_cell_family);
978 }
979}
980
981/*---------------------------------------------------------------------------*/
982/*---------------------------------------------------------------------------*/
983
984void DynamicMesh::
985allocate(UnstructuredMeshAllocateBuildInfo& build_info)
986{
987 auto* x = build_info._internal();
988 setDimension(x->meshDimension());
989 allocateCells(x->nbCell(),x->cellsInfos(),true);
990}
991
992/*---------------------------------------------------------------------------*/
993/*---------------------------------------------------------------------------*/
994
995void DynamicMesh::
996allocate(CartesianMeshAllocateBuildInfo& build_info)
997{
998 // L'allocation des entités du maillage est effectuée par la
999 // classe DynamicMeshCartesianBuilder.
1000 allocateCartesianMesh(this,build_info);
1001}
1002
1003/*---------------------------------------------------------------------------*/
1004/*---------------------------------------------------------------------------*/
1005
1008{
1009 Trace::Setter mci(traceMng(),_className());
1010 _checkDimension();
1011 _checkConnectivity();
1012 if ( !itemFamilyNetwork() ||
1013 !(itemFamilyNetwork() && itemFamilyNetwork()->isActivated()) ||
1014 !IItemFamilyNetwork::plug_serializer) {
1016 buffer->setMode(ISerializer::ModeReserve);
1017 cell_serializer->serializeItems(buffer,cells_local_id);
1018 buffer->allocateBuffer();
1020 cell_serializer->serializeItems(buffer,cells_local_id);
1021 }
1022 else {
1023 _serializeItems(buffer, cells_local_id, m_cell_family);
1024 }
1025}
1026
1027/*---------------------------------------------------------------------------*/
1028/*---------------------------------------------------------------------------*/
1029
1030void DynamicMesh::
1032{
1033 // 1-Get item lids for family and downard dependencies.
1034 // Rk downard relations are not taken here => automatically added in addItems(ItemData) :
1035 // this will change. Todo add relations when addItems has been updated
1036 using FamilyLidMap = std::map<String, Int32UniqueArray>;
1039 for (const auto& connectivity : mesh()->itemFamilyNetwork()->getChildDependencies(item_family)){
1043 connected_family_serialized_items.addRange(connectivity_accessor.connectedItems(ItemLocalId(item)).localIds());
1044 }
1045 }
1046 // 2-Serialize each family in the buffer. The order is important: use the family graph from leaves to root
1047 buffer->setMode(ISerializer::ModeReserve);
1048 _fillSerializer(buffer, serialized_items);
1049 buffer->allocateBuffer();
1051 _fillSerializer(buffer, serialized_items);
1052
1053}
1054
1055/*---------------------------------------------------------------------------*/
1056/*---------------------------------------------------------------------------*/
1057
1058void DynamicMesh::
1059_deserializeItems(ISerializer* buffer,Int32Array* item_local_ids, IItemFamily* item_family)
1060{
1061 ARCANE_UNUSED(item_family);
1062 buffer->setMode(ISerializer::ModeGet);
1063 mesh()->itemFamilyNetwork()->schedule([item_local_ids,buffer](IItemFamily* family) {
1064 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->createSerializer()}; // todo make_unique (not in 4.7.2...)
1065 family_serializer->deserializeItems(buffer,item_local_ids);
1066 } ,
1067 IItemFamilyNetwork::InverseTopologicalOrder);
1068 mesh()->itemFamilyNetwork()->schedule([item_local_ids,buffer](IItemFamily* family) {
1069 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->createSerializer()}; // todo make_unique (not in 4.7.2...)
1070 family_serializer->deserializeItemRelations(buffer,item_local_ids);
1071 } ,
1072 IItemFamilyNetwork::InverseTopologicalOrder);
1073}
1074
1075/*---------------------------------------------------------------------------*/
1076/*---------------------------------------------------------------------------*/
1077
1078void DynamicMesh::
1079_fillSerializer(ISerializer* buffer, std::map<String, Int32UniqueArray>& serialized_items)
1080{
1081 mesh()->itemFamilyNetwork()->schedule([& serialized_items,buffer](IItemFamily* family) {
1082 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->createSerializer()}; // todo make_unique (not in 4.7.2...)
1083 auto& serialized_items_local_ids = serialized_items[family->name()];
1084 family_serializer->serializeItems(buffer,serialized_items_local_ids);
1085 } ,
1086 IItemFamilyNetwork::InverseTopologicalOrder);
1087 mesh()->itemFamilyNetwork()->schedule([& serialized_items,buffer](IItemFamily* family) {
1088 auto family_serializer = std::unique_ptr<IItemFamilySerializer>{family->policyMng()->createSerializer()}; // todo make_unique (not in 4.7.2...)
1089 auto& serialized_items_local_ids = serialized_items[family->name()];
1090 family_serializer->serializeItemRelations(buffer,serialized_items_local_ids);
1091 } ,
1092 IItemFamilyNetwork::InverseTopologicalOrder);
1093}
1094
1095/*---------------------------------------------------------------------------*/
1096/*---------------------------------------------------------------------------*/
1097
1098void DynamicMesh::
1099addParentCells(ItemVectorView & items)
1100{
1101 Trace::Setter mci(traceMng(),_className());
1102 _checkDimension();
1103 _checkConnectivity();
1104 m_mesh_builder->addParentCells(items);
1105}
1106/*---------------------------------------------------------------------------*/
1107/*---------------------------------------------------------------------------*/
1108
1112{
1113 Trace::Setter mci(traceMng(),_className());
1114 _checkDimension();
1115 _checkConnectivity();
1116 bool allow_build_face = false /*(m_parallel_mng->commSize() == 1)*/;
1117 m_mesh_builder->addHChildrenCells(parent_cell,nb_cell,cells_infos,meshRank(),cells,allow_build_face);
1118}
1119
1120/*---------------------------------------------------------------------------*/
1121/*---------------------------------------------------------------------------*/
1122
1123void DynamicMesh::
1124addParentCellToCell(Cell child, Cell parent)
1125{
1126 Trace::Setter mci(traceMng(),_className());
1127 _checkDimension();
1128 _checkConnectivity();
1129
1130 m_cell_family->_addParentCellToCell(child,parent);
1131}
1132
1133/*---------------------------------------------------------------------------*/
1134/*---------------------------------------------------------------------------*/
1135
1136void DynamicMesh::
1137addChildCellToCell(Cell parent, Cell child)
1138{
1139 Trace::Setter mci(traceMng(),_className());
1140 _checkDimension();
1141 _checkConnectivity();
1142
1143 m_cell_family->_addChildCellToCell2(parent, child);
1144}
1145
1146/*---------------------------------------------------------------------------*/
1147/*---------------------------------------------------------------------------*/
1148
1149void DynamicMesh::
1150addParentFaceToFace(Face child, Face parent)
1151{
1152 Trace::Setter mci(traceMng(), _className());
1153 _checkDimension();
1154 _checkConnectivity();
1155
1156 m_face_family->_addParentFaceToFace(parent, child);
1157}
1158
1159/*---------------------------------------------------------------------------*/
1160/*---------------------------------------------------------------------------*/
1161
1162void DynamicMesh::
1163addChildFaceToFace(Face parent, Face child)
1164{
1165 Trace::Setter mci(traceMng(), _className());
1166 _checkDimension();
1167 _checkConnectivity();
1168
1169 m_face_family->_addChildFaceToFace(parent, child);
1170}
1171
1172/*---------------------------------------------------------------------------*/
1173/*---------------------------------------------------------------------------*/
1174
1175void DynamicMesh::
1176addParentNodeToNode(Node child, Node parent)
1177{
1178 Trace::Setter mci(traceMng(), _className());
1179 _checkDimension();
1180 _checkConnectivity();
1181
1182 m_node_family->_addParentNodeToNode(parent, child);
1183}
1184
1185/*---------------------------------------------------------------------------*/
1186/*---------------------------------------------------------------------------*/
1187
1188void DynamicMesh::
1189addChildNodeToNode(Node parent, Node child)
1190{
1191 Trace::Setter mci(traceMng(), _className());
1192 _checkDimension();
1193 _checkConnectivity();
1194
1195 m_node_family->_addChildNodeToNode(parent, child);
1196}
1197
1198/*---------------------------------------------------------------------------*/
1199/*---------------------------------------------------------------------------*/
1200
1203{
1204 _checkDimension();
1205 _checkConnectivity();
1206 Int32 rank = meshRank();
1207 if (m_use_mesh_item_family_dependencies)
1208 m_mesh_builder->addFaces3(nb_face,face_infos,rank,faces);
1209 else
1210 m_mesh_builder->addFaces(nb_face,face_infos,rank,faces);
1211}
1212
1213/*---------------------------------------------------------------------------*/
1214/*---------------------------------------------------------------------------*/
1215
1218{
1219 addFaces(args.nbFace(),args.faceInfos(),args.faceLocalIds());
1220}
1221
1222/*---------------------------------------------------------------------------*/
1223/*---------------------------------------------------------------------------*/
1224
1227{
1228 _checkDimension();
1229 _checkConnectivity();
1230 Int32 rank = meshRank();
1231 if (m_use_mesh_item_family_dependencies)
1232 m_mesh_builder->addEdges3(nb_edge,edge_infos,rank,edges);
1233 else
1234 m_mesh_builder->addEdges(nb_edge,edge_infos,rank,edges);
1235}
1236
1237/*---------------------------------------------------------------------------*/
1238/*---------------------------------------------------------------------------*/
1239
1242{
1243 _checkDimension();
1244 _checkConnectivity();
1245 Int32 rank = meshRank();
1246 if (m_use_mesh_item_family_dependencies)
1247 m_mesh_builder->addNodes2(nodes_uid,rank,nodes);
1248 else
1249 m_mesh_builder->addNodes(nodes_uid,rank,nodes);
1250}
1251
1252/*---------------------------------------------------------------------------*/
1253/*---------------------------------------------------------------------------*/
1254
1255void DynamicMesh::
1257{
1258 ARCANE_UNUSED(update_graph);
1259 Trace::Setter mci(traceMng(),_className());
1260 if (m_use_mesh_item_family_dependencies)
1261 removeItems(m_cell_family,cells_local_id);
1262 else
1263 m_cell_family->internalRemoveItems(cells_local_id);
1264
1265 if(m_item_family_network)
1266 {
1267 m_item_family_network->removeConnectedDoFsFromCells(cells_local_id) ;
1268 }
1269}
1270
1271/*---------------------------------------------------------------------------*/
1272/*---------------------------------------------------------------------------*/
1273
1274void DynamicMesh::
1275removeItems(IItemFamily* item_family, Int32ConstArrayView cells_local_id)
1276{
1277 ARCANE_UNUSED(item_family);
1278 ARCANE_ASSERT((itemFamilyNetwork()),("Cannot call DynamicMesh::removeItems if no ItemFamilyNetwork available"))
1279
1280 if (cells_local_id.empty())
1281 return;
1282
1283 // Create item info (to remove items)
1284 ItemDataList item_data_list;
1285 ItemData& cell_data = item_data_list.itemData(Integer(m_cell_family->itemKind()),
1286 cells_local_id.size(),cells_local_id.size(),Int32ArrayView(),
1287 m_cell_family,(IItemFamilyModifier*)(m_cell_family),m_parallel_mng->commRank());
1288 Integer i(0);
1289 for (auto local_id : cells_local_id) {
1290 // TODO Find a better place in ItemData to put removed item lids (with Int32...) .
1291 cell_data.itemInfos()[i++] = (Int64)local_id;
1292 }
1293 itemFamilyNetwork()->schedule([&item_data_list](IItemFamily* family){
1294 // send the whole ItemDataList since removed items are to be added for child families
1295 family->removeItems2(item_data_list);
1296 },
1297 IItemFamilyNetwork::TopologicalOrder); // item destruction done from root to leaves
1298}
1299
1300/*---------------------------------------------------------------------------*/
1301/*---------------------------------------------------------------------------*/
1302
1305{
1306 Trace::Setter mci(traceMng(),_className());
1307 if (m_use_mesh_item_family_dependencies)
1308 m_cell_family->detachCells2(cells_local_id);
1309 else {
1310 ItemInternalList cells = m_cell_family->itemsInternal();
1311 for( Integer i=0, is=cells_local_id.size(); i<is; ++i )
1312 m_cell_family->detachCell(cells[cells_local_id[i]]);
1313 }
1314}
1315
1316/*---------------------------------------------------------------------------*/
1317/*---------------------------------------------------------------------------*/
1318
1321{
1322 Trace::Setter mci(traceMng(),_className());
1323 if (m_use_mesh_item_family_dependencies)
1324 removeItems(m_cell_family,cells_local_id);
1325 else {
1326 ItemInternalList cells = m_cell_family->itemsInternal();
1327 for( Integer i=0, is=cells_local_id.size(); i<is; ++i )
1328 m_cell_family->removeDetachedCell(cells[cells_local_id[i]]);
1329 }
1330}
1331
1332/*---------------------------------------------------------------------------*/
1333/*---------------------------------------------------------------------------*/
1334
1338{
1339 Trace::Setter mci(traceMng(),_className());
1340 _checkAMR();
1342}
1343
1344/*---------------------------------------------------------------------------*/
1345/*---------------------------------------------------------------------------*/
1346
1347void DynamicMesh::
1348flagCellToCoarsen(Int32ConstArrayView lids)
1349{
1350 Trace::Setter mci(traceMng(),_className());
1351 _checkAMR();
1352 m_mesh_refinement->flagCellToCoarsen(lids);
1353}
1354
1355/*---------------------------------------------------------------------------*/
1356/*---------------------------------------------------------------------------*/
1357
1358void DynamicMesh::
1359refineItems()
1360{
1361 Trace::Setter mci(traceMng(),_className());
1362 _checkDimension();
1363 _checkConnectivity();
1364 _checkAMR();
1366}
1367/*---------------------------------------------------------------------------*/
1368/*---------------------------------------------------------------------------*/
1369
1370void DynamicMesh::
1371coarsenItems()
1372{
1373 Trace::Setter mci(traceMng(),_className());
1374 _checkDimension();
1375 _checkConnectivity();
1376 _checkAMR();
1378}
1379
1380/*---------------------------------------------------------------------------*/
1381/*---------------------------------------------------------------------------*/
1382
1383void DynamicMesh::
1384coarsenItemsV2(bool update_parent_flag)
1385{
1386 Trace::Setter mci(traceMng(), _className());
1387 _checkDimension();
1388 _checkConnectivity();
1389 _checkAMR();
1390 if (m_amr_type != eMeshAMRKind::Cell) {
1391 ARCANE_FATAL("This method is not compatible with Cartesian Mesh Patch AMR");
1392 }
1393 m_mesh_refinement->coarsenItemsV2(update_parent_flag);
1394}
1395
1396/*---------------------------------------------------------------------------*/
1397/*---------------------------------------------------------------------------*/
1398
1399bool DynamicMesh::
1400adapt()
1401{
1402 Trace::Setter mci(traceMng(),_className());
1403 _checkDimension();
1404 _checkConnectivity();
1405 _checkAMR();
1406 if(m_mesh_refinement->needUpdate())
1407 m_mesh_refinement->update() ;
1409}
1410
1411/*---------------------------------------------------------------------------*/
1412/*---------------------------------------------------------------------------*/
1413
1414void DynamicMesh::
1415compact()
1416{
1417 _compactItems(false,true);
1418}
1419
1420/*---------------------------------------------------------------------------*/
1421/*---------------------------------------------------------------------------*/
1422
1423void DynamicMesh::
1424registerCallBack(IAMRTransportFunctor* f)
1425{
1426 Trace::Setter mci(traceMng(),_className());
1427 _checkAMR();
1428 m_mesh_refinement->registerCallBack(f);
1429}
1430/*---------------------------------------------------------------------------*/
1431/*---------------------------------------------------------------------------*/
1432
1433void DynamicMesh::
1434unRegisterCallBack(IAMRTransportFunctor* f)
1435{
1436 Trace::Setter mci(traceMng(),_className());
1437 _checkAMR();
1438 m_mesh_refinement->unRegisterCallBack(f);
1439}
1440
1441/*---------------------------------------------------------------------------*/
1442/*---------------------------------------------------------------------------*/
1443
1444void DynamicMesh::
1445_allocateCells2(DynamicMeshIncrementalBuilder* mib)
1446{
1447 Trace::Setter mci(traceMng(),_className());
1448
1449 _finalizeMeshChanged();
1450
1451 mib->printInfos();
1452
1453#ifdef ARCANE_DEBUG_DYNAMIC_MESH
1454 OCStringStream ostr;
1455 _printMesh(ostr());
1456 info() << ostr.str();
1457#endif
1458}
1459
1460/*---------------------------------------------------------------------------*/
1461/*---------------------------------------------------------------------------*/
1462
1463void DynamicMesh::
1464_writeMesh(const String& base_name)
1465{
1466 StringBuilder file_name(base_name);
1467 file_name += "-";
1468 IParallelMng* pm = m_parallel_mng;
1469 bool is_parallel = pm->isParallel();
1470 Int32 rank = meshRank();
1471 if (is_parallel){
1472 file_name += subDomain()->commonVariables().globalIteration();
1473 file_name += "-";
1474 file_name += rank;
1475 }
1476 mesh_utils::writeMeshConnectivity(this,file_name.toString());
1477 //TODO pouvoir changer le nom du service
1479 if (writer.get()){
1480 String mesh_file_name = file_name.toString() + ".mli";
1481 writer->writeMeshToFile(this,mesh_file_name);
1482 }
1483}
1484
1485/*---------------------------------------------------------------------------*/
1486/*---------------------------------------------------------------------------*/
1487
1488void DynamicMesh::
1489_printMesh(std::ostream& ostr)
1490{
1491 ostr << "----------- Mesh\n";
1492 ostr << " Nodes: " << nbNode() << '\n';
1493 ostr << " Edges: " << nbEdge() << '\n';
1494 ostr << " Faces: " << nbFace() << '\n';
1495 ostr << " Cells: " << nbCell() << '\n';
1496 mesh_utils::printItems(ostr,"Nodes",allNodes());
1497 mesh_utils::printItems(ostr,"Edges",allEdges());
1498 mesh_utils::printItems(ostr,"Faces",allFaces());
1499 mesh_utils::printItems(ostr,"Cells",allCells());
1500}
1501
1502/*---------------------------------------------------------------------------*/
1503/*---------------------------------------------------------------------------*/
1509{
1510 info(4) << "DynamicMesh::_saveProperties() name=" << name()
1511 << " nb-ghost=" << ghostLayerMng()->nbGhostLayer();
1512
1513 auto p = m_properties;
1514 p->setInt32("nb-ghostlayer",ghostLayerMng()->nbGhostLayer());
1515 p->setInt32("ghostlayer-builder-version",ghostLayerMng()->builderVersion());
1516 p->setInt32("part-info-part-rank",m_mesh_part_info.partRank());
1517 p->setInt32("part-info-nb-part",m_mesh_part_info.nbPart());
1518 p->setInt32("part-info-replication-rank",m_mesh_part_info.replicationRank());
1519 p->setInt32("part-info-nb-replication",m_mesh_part_info.nbReplication());
1520 p->setBool("has-itemsharedinfo-variables",true);
1521 p->setInt64("mesh-timestamp",m_timestamp);
1522 if (!m_do_not_save_need_compact)
1523 p->setBool("need-compact",m_need_compact);
1524}
1525
1526/*---------------------------------------------------------------------------*/
1527/*---------------------------------------------------------------------------*/
1533{
1534 auto p = m_properties;
1535
1536 info(4) << "DynamicMesh::_readProperties() name=" << name()
1537 << " mesh-version=" << p->getInt32WithDefault(PROPERTY_MESH_VERSION,-1);
1538
1539 {
1540 // Relit les infos sur le gestionnaire de mailles fantômes.
1541 Int32 x = 0;
1542 if (p->get("nb-ghostlayer",x))
1544 if (p->get("ghostlayer-builder-version",x))
1546 if (p->get("part-info-part-rank",x))
1547 m_mesh_part_info.setPartRank(x);
1548 if (p->get("part-info-nb-part",x))
1549 m_mesh_part_info.setNbPart(x);
1550 if (p->get("part-info-replication-rank",x))
1551 m_mesh_part_info.setReplicationRank(x);
1552 if (p->get("part-info-nb-replication",x))
1553 m_mesh_part_info.setNbReplication(x);
1554 if (!m_do_not_save_need_compact){
1555 bool xb = false;
1556 if (p->get("need-compact",xb))
1557 m_need_compact = xb;
1558 }
1559 Int64 x2 = 0;
1560 if (p->get("mesh-timestamp",x2))
1561 m_timestamp = x2;
1562 }
1563}
1564
1565/*---------------------------------------------------------------------------*/
1566/*---------------------------------------------------------------------------*/
1572{
1573 bool want_dump = m_properties->getBool(PROPERTY_DUMP);
1574 info(4) << "DynamicMesh::prepareForDump() name=" << name()
1575 << " need_compact?=" << m_need_compact
1576 << " want_dump?=" << want_dump
1577 << " timestamp=" << m_timestamp;
1578
1579 {
1581 m_mesh_events.eventObservable(t).notify(MeshEventArgs(this,t));
1582 }
1583
1584 // Si le maillage n'est pas sauvé, ne fait rien. Cela évite de compacter
1585 // et trier le maillage ce qui n'est pas souhaitable si les propriétés
1586 // 'sort' et 'compact' sont à 'false'.
1587 if (want_dump)
1589
1590 // Sauve les propriétés. Il faut le faire à la fin car l'appel à
1591 // prepareForDumpReal() peut modifier ces propriétés
1593
1594 {
1596 m_mesh_events.eventObservable(t).notify(MeshEventArgs(this,t));
1597 }
1598}
1599
1600/*---------------------------------------------------------------------------*/
1601/*---------------------------------------------------------------------------*/
1607{
1608 if (m_need_compact){
1609 // Pour l'instant, il faut trier et compacter les entites
1610 // avant une sauvegarde
1611 _compactItems(true,true);
1612 }
1613
1614 // Préparation des connexions maillage/sous-maillage
1615 {
1616 if (m_parent_mesh) {
1617 ARCANE_ASSERT((m_parent_group != NULL),("Unexpected NULL parent group"));
1618 m_parent_mesh_name = m_parent_mesh->name();
1619 m_parent_group_name = m_parent_group->name();
1620 } else {
1621 ARCANE_ASSERT((m_parent_group == NULL),("Unexpected non-NULL parent group"));
1624 }
1625 const Integer n_sub_mesh = m_child_meshes.size();
1627 for(Integer i=0;i<n_sub_mesh; ++i)
1628 m_child_meshes_name[i] = m_child_meshes[i]->name();
1629 }
1630
1631 // Sauve les infos sur les familles d'entités
1632 {
1636 Integer index = 0;
1637 for( IItemFamily* family : m_item_families ){
1638 m_item_families_kind[index] = family->itemKind();
1639 m_item_families_name[index] = family->name();
1640 ++index;
1641 }
1642 }
1643
1644 for( IItemFamily* family : m_item_families ){
1645 family->prepareForDump();
1646 }
1647
1648 if (m_tied_interface_need_prepare_dump){
1649 m_tied_interface_mng->prepareTiedInterfacesForDump();
1650 m_tied_interface_need_prepare_dump = false;
1651 }
1652}
1653
1654/*---------------------------------------------------------------------------*/
1655/*---------------------------------------------------------------------------*/
1656
1659{
1660 IItemFamily* xfamily = findItemFamily(ik,name,false,false);
1661 if (xfamily)
1662 ARCANE_FATAL("Attempting to create a family that already exists '{0}'",name);
1663
1664 debug() << "Creating the entities family "
1665 << " name=" << name
1666 << " kind=" << itemKindName(ik);
1667 ItemFamily* family = _createNewFamily(ik,name);
1668
1669 _addFamily(family);
1670 _buildAndInitFamily(family);
1671
1672 return family;
1673}
1674
1675/*---------------------------------------------------------------------------*/
1676/*---------------------------------------------------------------------------*/
1677
1678ItemFamily* DynamicMesh::
1679_createNewFamily(eItemKind kind, const String& name)
1680{
1681 switch (kind) {
1682 case IK_Node:
1683 return new NodeFamily(this,name);
1684 case IK_Edge:
1685 return new EdgeFamily(this,name);
1686 case IK_Face:
1687 return new FaceFamily(this,name);
1688 case IK_Cell:
1689 return new CellFamily(this,name);
1690 case IK_Particle:
1691 return new ParticleFamily(this,name);
1692 case IK_DoF:
1693 return new DoFFamily(this,name);
1694 case IK_Unknown:
1695 ARCANE_FATAL("Attempting to create an ItemFamily with an unknown item kind.");
1696 }
1697 ARCANE_FATAL("Invalid ItemKind");
1698}
1699
1700/*---------------------------------------------------------------------------*/
1701/*---------------------------------------------------------------------------*/
1702
1703IItemFamilyPolicyMng* DynamicMesh::
1704_createFamilyPolicyMng(ItemFamily* family)
1705{
1706 eItemKind kind = family->itemKind();
1707 switch (kind) {
1708 case IK_Node:
1709 return createNodeFamilyPolicyMng(family);
1710 case IK_Edge:
1711 return createEdgeFamilyPolicyMng(family);
1712 case IK_Face:
1713 return createFaceFamilyPolicyMng(family);
1714 case IK_Cell:
1715 return createCellFamilyPolicyMng(family);
1716 case IK_Particle:
1717 return createParticleFamilyPolicyMng(family);
1718 case IK_DoF:
1719 return createDoFFamilyPolicyMng(family);
1720 case IK_Unknown:
1721 ARCANE_FATAL("Attempting to create an ItemFamily with an unknown item kind.");
1722 }
1723 ARCANE_FATAL("Invalid ItemKind");
1724}
1725
1726/*---------------------------------------------------------------------------*/
1727/*---------------------------------------------------------------------------*/
1728
1729void DynamicMesh::
1730_buildAndInitFamily(IItemFamily* family)
1731{
1732 family->build();
1733 ItemFamily* true_family = ARCANE_CHECK_POINTER(dynamic_cast<ItemFamily*>(family));
1734 IItemFamilyPolicyMng* policy_mng = _createFamilyPolicyMng(true_family);
1735 true_family->setPolicyMng(policy_mng);
1736}
1737
1738/*---------------------------------------------------------------------------*/
1739/*---------------------------------------------------------------------------*/
1740
1741void DynamicMesh::
1742_addFamily(ItemFamily* family)
1743{
1744 m_item_families.add(family);
1745 m_true_item_families.add(family);
1746}
1747
1748/*---------------------------------------------------------------------------*/
1749/*---------------------------------------------------------------------------*/
1750
1754{
1755 for( IItemFamily* family : m_item_families)
1756 if (family->name()==name && family->itemKind()==ik)
1757 return family;
1758 if (create_if_needed){
1761 IItemFamilyModifier* modifier = dynamic_cast<IItemFamilyModifier*>(family) ;
1762 if(modifier)
1763 m_family_modifiers.add(modifier);
1764 }
1765 return family;
1766 }
1767 return nullptr;
1768}
1769
1770/*---------------------------------------------------------------------------*/
1771/*---------------------------------------------------------------------------*/
1772
1774findItemFamily(const String& name,bool throw_exception)
1775{
1776 for( IItemFamily* family : m_item_families )
1777 if (family->name()==name)
1778 return family;
1779 if (throw_exception)
1780 ARCANE_FATAL("No family with name '{0}' exist",name);
1781 return nullptr;
1782}
1783
1784/*---------------------------------------------------------------------------*/
1785/*---------------------------------------------------------------------------*/
1786
1789{
1790 IItemFamily* family = findItemFamily(ik, name, false,false);
1791 if (!family)
1792 return nullptr;
1793 for ( IItemFamilyModifier* modifier : m_family_modifiers )
1794 if (modifier->family() == family)
1795 return modifier;
1796 return nullptr;
1797}
1798
1799/*---------------------------------------------------------------------------*/
1800/*---------------------------------------------------------------------------*/
1801
1802void DynamicMesh::
1803_exchangeItems(bool do_compact)
1804{
1805 String nb_exchange_str = platform::getEnvironmentVariable("ARCANE_NB_EXCHANGE");
1806 // Il faudrait calculer la valeur par defaut en tenant compte du nombre
1807 // de maille échangées et du nombre de variables et de leur utilisation
1808 // mémoire. Faire bien attention à ce que tous les procs utilisent la meme valeur.
1809 // Dans la pratique mieux vaut ne pas dépasser 3 ou 4 échanges car cela
1810 // augmente le temps consommé à et ne réduit pas trop la mémoire.
1811 Integer nb_exchange = 1;
1812 if (!nb_exchange_str.null()){
1813 bool is_bad = builtInGetValue(nb_exchange,nb_exchange_str);
1814 if (is_bad)
1815 nb_exchange = 1;
1816 }
1817 String exchange_version_str = platform::getEnvironmentVariable("ARCANE_MESH_EXCHANGE_VERSION");
1818 Integer exchange_version = 1;
1819 if (!exchange_version_str.null()){
1820 builtInGetValue(exchange_version,exchange_version_str);
1821 }
1822
1823 info() << "DynamicMesh::_echangeItems() do_compact?=" << do_compact
1824 << " nb_exchange=" << nb_exchange << " version=" << exchange_version;
1825
1826 if (nb_exchange>1){
1827 _multipleExchangeItems(nb_exchange,exchange_version,do_compact);
1828 }
1829 else
1830 _exchangeItemsNew();
1831 // Actuellement, la méthode exchangeItemsNew() ne prend en compte
1832 // qu'une couche de maille fantômes. Si on en demande plus, il faut
1833 // les ajouter maintenant. Cet appel n'est pas optimum mais permet
1834 // de traiter correctement tous les cas (enfin j'espère).
1835 if (ghostLayerMng()->nbGhostLayer()>1 && ! m_item_family_network) // many ghost already handled in MeshExchange with ItemFamilyNetwork
1836 updateGhostLayers(true);
1837 String check_exchange = platform::getEnvironmentVariable("ARCANE_CHECK_EXCHANGE");
1838 if (!check_exchange.null()){
1839 m_mesh_checker->checkGhostCells();
1840 pwarning() << "CHECKING SYNCHRONISATION !";
1841 m_mesh_checker->checkVariablesSynchronization();
1842 m_mesh_checker->checkItemGroupsSynchronization();
1843 }
1844 if (checkLevel()>=2)
1845 m_mesh_checker->checkValidMesh();
1846 else if (checkLevel()>=1)
1847 m_mesh_checker->checkValidConnectivity();
1848}
1849
1850/*---------------------------------------------------------------------------*/
1851/*---------------------------------------------------------------------------*/
1883_multipleExchangeItems(Integer nb_exchange,Integer version,bool do_compact)
1884{
1886 ARCANE_FATAL("Invalid value '{0}' for version. Valid values are 1 or 2",version);
1887
1888 info() << "** ** MULTIPLE EXCHANGE ITEM version=" << version << " nb_exchange=" << nb_exchange;
1890 // Il faut stocker le uid car suite a un equilibrage les localId vont changer
1892
1894 VariableItemInt32& cells_new_owner = cell_family->itemsNewOwner();
1895
1896 Integer nb_cell= ownCells().size();
1898 Cell cell = *icell;
1899 Int32 current_owner = cell.owner();
1902 continue;
1903 Integer phase = 0;
1904 if (version==2)
1905 phase = (new_owner % nb_exchange);
1906 else if (version==1)
1907 phase = icell.index() / nb_cell;
1909 cells_to_exchange_uid[phase].add(cell.uniqueId().asInt64());
1910 }
1911
1912 // Remet comme si la maille ne changeait pas de propriétaire pour
1913 // éviter de l'envoyer.
1915 Cell cell = *icell;
1916 cells_new_owner[icell] = cell.owner();
1917 }
1918
1919 // A partir d'ici, le cells_new_owner est identique au cell.owner()
1920 // pour chaque maille.
1922 for( Integer i=0; i<nb_exchange; ++i ){
1925 Integer nb_cell = new_uids.size();
1926 info() << "MultipleExchange current_exchange=" << i << " nb_cell=" << nb_cell;
1927 uids_to_lids.resize(nb_cell);
1928 cell_family->itemsUniqueIdToLocalId(uids_to_lids,new_uids);
1929 ItemInternalList cells = cell_family->itemsInternal();
1930 // Pour chaque maille de la partie en cours d'echange, positionne le new_owner
1931 // a la bonne valeurs
1932 for( Integer z=0; z<nb_cell; ++z )
1933 cells_new_owner[cells[uids_to_lids[z]]] = new_owners[z];
1934 cells_new_owner.synchronize();
1935 mesh()->utilities()->changeOwnersFromCells();
1936 _exchangeItemsNew();
1937 }
1938
1939 if (do_compact){
1940 Timer::Action ts_action1(m_sub_domain,"CompactItems",true);
1941 bool do_sort = m_properties->getBool(PROPERTY_SORT);
1942 _compactItems(do_sort,true);
1943 }
1944}
1945
1946/*---------------------------------------------------------------------------*/
1947/*---------------------------------------------------------------------------*/
1948
1951{
1952 _exchangeItems(m_properties->getBool(PROPERTY_COMPACT));
1953}
1954
1955/*---------------------------------------------------------------------------*/
1956/*---------------------------------------------------------------------------*/
1957
1959clearItems()
1960{
1961 for( IItemFamily* family : m_item_families )
1962 family->clearItems();
1963 endUpdate();
1964}
1965
1966/*---------------------------------------------------------------------------*/
1967/*---------------------------------------------------------------------------*/
1968#if 0
1970 : public UniqueArray<ItemsExchangeInfo2*>
1971{
1972public:
1974 {
1975 for( Integer i=0, is=size(); i<is; ++i ){
1976 ItemsExchangeInfo2* info = this->operator[](i);
1977 delete info;
1978 }
1979 clear();
1980 }
1981};
1982#endif
1983
1984/*---------------------------------------------------------------------------*/
1985/*---------------------------------------------------------------------------*/
1986
1987void DynamicMesh::
1988_exchangeItemsNew()
1989{
1990 // L'algo ici employé n'est pas récursif avec les sous-maillages.
1991 // Toutes les comms sont regroupées et les différents niveaux de modifs
1992 // seront dépilés ici même. Cette implémentation ne permet pas d'avoir
1993 // plus d'un niveau de sous-maillage par maillage.
1994
1995 Trace::Setter mci(traceMng(),_className());
1996
1997 if (!m_is_dynamic)
1998 ARCANE_FATAL("property isDynamic() has to be 'true'");
1999
2000 m_need_compact = true;
2001
2002 if (arcane_debug_load_balancing){
2003 // TODO: faire cela dans le MeshExchanger et par famille.
2004 // Vérifie que les variables sont bien synchronisées
2005 m_node_family->itemsNewOwner().checkIfSync(10);
2006 m_edge_family->itemsNewOwner().checkIfSync(10);
2007 m_face_family->itemsNewOwner().checkIfSync(10);
2008 m_cell_family->itemsNewOwner().checkIfSync(10);
2009 }
2010 // TODO: Vérifier que tout le monde a les mêmes familles et dans le même ordre.
2011
2012 // Cascade tous les maillages associés à ce maillage
2013 typedef Collection<DynamicMesh*> DynamicMeshCollection;
2014 DynamicMeshCollection all_cascade_meshes = List<DynamicMesh*>();
2015 all_cascade_meshes.add(this);
2016 for(Integer i=0;i<m_child_meshes.size();++i)
2017 all_cascade_meshes.add(m_child_meshes[i]);
2018
2019 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
2020 MeshExchanger* mesh_exchanger = ARCANE_CHECK_POINTER(dynamic_cast<MeshExchanger*>(iexchanger));
2021
2022 // S'il n'y a aucune entité à échanger, on arrête immédiatement l'échange.
2023 if (mesh_exchanger->computeExchangeInfos()){
2024 pwarning() << "No load balance is performed";
2025 m_mesh_exchange_mng->endExchange();
2026 return;
2027 }
2028
2029 // Éffectue l'échange des infos
2030 mesh_exchanger->processExchange();
2031
2032 // Supprime les entités qui ne doivent plus être dans notre sous-domaine.
2033 mesh_exchanger->removeNeededItems();
2034
2035 // Réajuste les groupes en supprimant les entités qui ne sont plus dans le maillage ou en
2036 // invalidant les groupes calculés.
2037 // TODO: faire une méthode de la famille qui fait cela.
2038 {
2039 auto action = [](ItemGroup& group)
2040 {
2041 // (HP) TODO: 'if (group.internal()->hasComputeFunctor())' ne fonctionne pas simplement, why ?
2042 // Anciennement: if (group.isLocalToSubDomain() || group.isOwn())
2043 // Redondant avec des calculs de ItemFamily::notifyItemsOwnerChanged
2044 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
2045 group.invalidate();
2046 else
2047 group.internal()->removeSuppressedItems();
2048 };
2049 for( DynamicMesh* mesh : all_cascade_meshes ){
2050 meshvisitor::visitGroups(mesh,action);
2051 }
2052 }
2053
2054 // Supprime les potentiels items fantômes restant après la mise à jour du groupe support
2055 // qui ont été marqués par NeedRemove (ce qui nettoie un éventuel état inconsistent du
2056 // sous-maillage vis-à-vis de son parent)
2057 // Cette partie est importante car il est possible que la mise à jour des groupes
2058 // support ne suffise pas à mettre à jour les parties fantômes des sous-maillages
2059 // (à moins de mettre une contrainte plus forte sur le groupe d'intégrer aussi tous
2060 // les fantômes du sous-maillage)
2061#if HEAD
2062 for( DynamicMesh* child_mesh : m_child_meshes )
2063 child_mesh->m_submesh_tools->removeDeadGhostCells();
2064#else
2065 for(Integer i_child_mesh=0;i_child_mesh<m_child_meshes.size();++i_child_mesh)
2066 m_child_meshes[i_child_mesh]->m_submesh_tools->removeDeadGhostCells();
2067#endif
2068
2069 // Créé les entités qu'on a recu des autres sous-domaines.
2070 mesh_exchanger->allocateReceivedItems();
2071
2072 // On reprend maintenant un cycle standard de endUpdate
2073 // mais en entrelaçant les niveaux de sous-maillages
2074 for( DynamicMesh* mesh : all_cascade_meshes )
2075 mesh->_internalEndUpdateInit(true);
2076
2077 mesh_exchanger->updateItemGroups();
2078
2079 // Recalcule des synchroniseurs sur groupes.
2080 for( DynamicMesh* mesh : all_cascade_meshes )
2081 mesh->_computeGroupSynchronizeInfos();
2082
2083 // Met à jour les valeurs des variables des entités receptionnées
2084 mesh_exchanger->updateVariables();
2085
2086 // Finalise les modifications dont le triage et compactage
2087 for( DynamicMesh* mesh : all_cascade_meshes ){
2088 // Demande l'affichage des infos pour le maillage actuel
2089 bool print_info = (mesh==this);
2090 mesh->_internalEndUpdateFinal(print_info);
2091 }
2092
2093 // Finalize les échanges
2094 // Pour l'instante cela n'est utile que pour les TiedInterface mais il
2095 // faudrait supprimer cela.
2096 mesh_exchanger->finalizeExchange();
2097
2098 // TODO: garantir cet appel en cas d'exception.
2099 m_mesh_exchange_mng->endExchange();
2100
2101 // Maintenant, le maillage est à jour mais les mailles fantômes extraordinaires
2102 // ont été potentiellement retirées. On les replace dans le maillage.
2103 // Version non optimisée. L'idéal est de gérer les mailles extraordinaires
2104 // dans MeshExchange.
2105 // endUpdate() doit être appelé dans tous les cas pour s'assurer
2106 // que les variables et les groupes sont bien dimensionnées.
2107 if (m_extra_ghost_cells_builder->hasBuilder() || m_extra_ghost_particles_builder->hasBuilder())
2108 this->endUpdate(true,false);
2109 else
2110 this->endUpdate();
2111}
2112
2113/*---------------------------------------------------------------------------*/
2114/*---------------------------------------------------------------------------*/
2115
2118{
2119 m_extra_ghost_cells_builder->addExtraGhostCellsBuilder(builder);
2120}
2121
2122/*---------------------------------------------------------------------------*/
2123/*---------------------------------------------------------------------------*/
2124
2127{
2128 m_extra_ghost_cells_builder->removeExtraGhostCellsBuilder(builder);
2129}
2130
2131/*---------------------------------------------------------------------------*/
2132/*---------------------------------------------------------------------------*/
2133
2136{
2137 m_extra_ghost_particles_builder->addExtraGhostParticlesBuilder(builder);
2138}
2139
2140/*---------------------------------------------------------------------------*/
2141/*---------------------------------------------------------------------------*/
2142
2145{
2146 m_extra_ghost_particles_builder->removeExtraGhostParticlesBuilder(builder);
2147}
2148
2149/*---------------------------------------------------------------------------*/
2150/*---------------------------------------------------------------------------*/
2151
2152void DynamicMesh::
2153_computeExtraGhostCells()
2154{
2155 m_extra_ghost_cells_builder->computeExtraGhostCells();
2156}
2157
2158/*---------------------------------------------------------------------------*/
2159/*---------------------------------------------------------------------------*/
2160
2161void DynamicMesh::
2162_computeExtraGhostParticles()
2163{
2164 m_extra_ghost_particles_builder->computeExtraGhostParticles();
2165}
2166
2167/*---------------------------------------------------------------------------*/
2168/*---------------------------------------------------------------------------*/
2169
2170void DynamicMesh::
2171_removeGhostItems()
2172{
2173 const Int32 sid = meshRank();
2174
2175 // Suppression des mailles fantômes.
2176 // Il faut passer par un tableau intermédiaire, car supprimer
2177 // des mailles invalide les itérateurs sur 'cells_map'.
2178 UniqueArray<Int32> cells_to_remove;
2179 cells_to_remove.reserve(1000);
2180
2181 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2182 cells_map.eachItem([&](Item cell) {
2183 if (cell.owner() != sid)
2184 cells_to_remove.add(cell.localId());
2185 });
2186
2187 info() << "Number of cells to remove: " << cells_to_remove.size();
2188 m_cell_family->removeCells(cells_to_remove);
2189
2190 // Réajuste les groupes en supprimant les entités qui ne sont plus dans le maillage
2192}
2193
2194/*---------------------------------------------------------------------------*/
2195/*---------------------------------------------------------------------------*/
2201{
2202 auto action = [&](const ItemGroup& group){ group.itemFamily()->partialEndUpdateGroup(group); };
2203 meshvisitor::visitGroups(this,action);
2204}
2205
2206/*---------------------------------------------------------------------------*/
2207/*---------------------------------------------------------------------------*/
2208
2211{
2212 updateGhostLayers(true);
2213}
2214
2215/*---------------------------------------------------------------------------*/
2216/*---------------------------------------------------------------------------*/
2217
2218void DynamicMesh::
2220{
2221 Trace::Setter mci(traceMng(),_className());
2222
2223 if (!m_is_dynamic)
2224 ARCANE_FATAL("property isDynamic() has to be 'true'");
2225 if (m_parent_mesh)
2226 ARCANE_FATAL("Cannot be called on submesh");
2227
2228 _internalUpdateGhost(true, remove_old_ghost);
2229 _internalEndUpdateInit(true);
2230 _synchronizeGroups();
2231 _computeGroupSynchronizeInfos();
2232 _internalEndUpdateResizeVariables();
2233 _synchronizeVariables();
2235
2236 // Finalisation des sous-maillages récursives
2237 for(Integer i=0;i<m_child_meshes.size();++i) {
2238 m_child_meshes[i]->endUpdate(true, remove_old_ghost);
2239 }
2240}
2241/*---------------------------------------------------------------------------*/
2242/*---------------------------------------------------------------------------*/
2243
2244void DynamicMesh::
2245_removeGhostChildItems()
2246{
2247 const Int32 sid = meshRank();
2248
2249 // Suppression des mailles
2250 UniqueArray<Int32> cells_to_remove;
2251 cells_to_remove.reserve(1000);
2252
2253 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2254 Integer max_level=0;
2255 cells_map.eachItem([&](impl::ItemBase cell) {
2256 if ((cell.owner() != sid) && (cell.level() != 0))
2257 max_level = math::max(cell.level(),max_level);
2258 });
2259
2260 if (max_level==0)
2261 return;
2262
2263 cells_map.eachItem([&](impl::ItemBase cell) {
2264 if ((cell.owner() != sid) && (cell.level() == max_level)) {
2265 cells_to_remove.add(cell.localId());
2266 }
2267 });
2268
2269 info() << "Number of cells to remove: " << cells_to_remove.size();
2270 m_cell_family->removeCells(cells_to_remove);
2271
2272 // Réajuste les groupes en supprimant les entités qui ne sont plus dans le maillage
2274}
2275
2276/*---------------------------------------------------------------------------*/
2277/*---------------------------------------------------------------------------*/
2278
2279void DynamicMesh::
2280_removeGhostChildItems2(Array<Int64>& cells_to_coarsen)
2281{
2282 const Int32 sid = meshRank();
2283
2284 cells_to_coarsen.reserve(1000);
2285
2286 // Suppression des mailles
2287 UniqueArray<Cell> cells_to_remove;
2288 cells_to_remove.reserve(1000);
2289
2290 ItemInternalMap& cells_map = m_cell_family->itemsMap();
2291 Integer counter=0;
2292 cells_map.eachItem([&](Cell cell) {
2293 if (cell.owner() != sid)
2294 return;
2295 if (cell.itemBase().flags() & ItemFlags::II_JustCoarsened) {
2296 cells_to_coarsen.add(cell.uniqueId());
2297 for (Integer c = 0, cs = cell.nbHChildren(); c < cs; c++) {
2298 cells_to_remove.add(cell.hChild(c));
2299 counter++;
2300 }
2301 }
2302 });
2303
2304 if (counter==0)
2305 return;
2306
2307 //info() << "Number of cells to remove: " << cells_to_remove.size();
2308 for( Integer i=0, is=cells_to_remove.size(); i<is; ++i )
2309 m_cell_family->removeCell(cells_to_remove[i]);
2310
2311 // Réajuste les groupes en supprimant les entités qui ne sont plus dans le maillage
2313}
2314
2315/*---------------------------------------------------------------------------*/
2316/*---------------------------------------------------------------------------*/
2321{
2322 Trace::Setter mci(traceMng(),_className());
2323 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER1) ) ;
2324
2325 m_need_compact = true;
2326 //Integer current_iteration = subDomain()->commonVariables().globalIteration();
2327 if (!m_is_dynamic)
2328 ARCANE_FATAL("Property isDynamic() has to be 'true'");
2329
2330 if(remove_old_ghost){
2331 _removeGhostChildItems2(ghost_cell_to_coarsen_uid) ;
2332 }
2333
2334 // En cas de raffinement/déraffinement, il est possible que l'orientation soit invalide à un moment.
2335 m_face_family->setCheckOrientation(false);
2336
2338 m_face_family->setCheckOrientation(true);
2339
2340 // A partir d'ici, les entités du maillages sont toutes connues. Il
2341 // est donc possible de les compacter si nécessaire
2342 m_mesh_builder->printStats();
2343 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER1) )
2344
2345
2346 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER2) )
2347 //_finalizeMeshChanged();
2348 {
2349 ++m_timestamp;
2350 for( IItemFamily* family : m_item_families )
2351 family->endUpdate();
2352 }
2353 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER2) )
2354
2355
2356 // Réalloue les variables du maillage car leur groupe a évolué
2357 // TODO: ce devrait être à chaque famille de le faire
2358 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER3) )
2359 {
2360 IVariableMng* vm = m_sub_domain->variableMng();
2361 VariableCollection used_vars(vm->usedVariables());
2362 used_vars.each(std::mem_fn(&IVariable::resizeFromGroup));
2363 }
2364 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER3) )
2365
2366
2367 // Recalcule les informations nécessaires pour la synchronisation
2368 // des entités
2369 //pm->computeSynchronizeInfos();
2370 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER4) )
2372 _synchronizeGroupsAndVariables();
2373 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER4) )
2374
2375
2376 //Loop of new refine ghost
2377 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER5) )
2379 m_cell_family->itemsUniqueIdToLocalId(ghost_cell_to_refine_lid,ghost_cell_to_refine_uid,true) ;
2380 ItemInternalList cells = m_cell_family->itemsInternal() ;
2381 for (Integer e = 0, i_size=ghost_cell_to_refine_lid.size(); e != i_size; ++e){
2383 m_mesh_refinement->populateBackFrontCellsFromParentFaces(i_hParent_cell);
2384
2385 //need to populate also the new own cell connected to the new ghost
2386 Integer nb_face = i_hParent_cell.nbFace();
2387 Integer lid = i_hParent_cell.localId() ;
2388 for(Integer iface=0;iface<nb_face;++iface){
2389 Face face = i_hParent_cell.face(iface);
2390 Integer nb_cell = face.nbCell() ;
2391 for(Integer icell=0;icell<nb_cell;++icell){
2392 Cell cell = face.cell(icell);
2393 if( (cell.localId()!=lid) && (cell.isOwn()) ){
2395 m_face_family->familyTree(childs,cell,false) ;
2396 for(Integer i=0,nchilds=childs.size();i<nchilds;++i){
2397 ItemInternal* child = childs[i];
2398 if(child->isAncestor())
2399 m_mesh_refinement->populateBackFrontCellsFromParentFaces(child);
2400 }
2401 }
2402 }
2403 }
2404 }
2405 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER5) )
2406
2407
2408 // Vérifie que le maillage est conforme avec la référence
2409 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER6) )
2410 m_mesh_checker->checkMeshFromReferenceFile();
2411
2412 // Compacte les références pour ne pas laisser de trou et profiter
2413 // au mieux des effets de cache.
2414 // NOTE: ce n'est en théorie pas indispensable mais actuellement si
2415 // car on ne sauve pas le #m_data_index des ItemInternal.
2416 //_compactItemInternalReferences();
2417 bool do_compact = m_properties->getBool(PROPERTY_COMPACT);
2418 if (do_compact){
2419 bool do_sort = m_properties->getBool(PROPERTY_SORT);
2420 _compactItems(do_sort,do_compact);
2421 }
2422 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER6) )
2423
2424 if (arcane_debug_load_balancing){
2425 _writeMesh("update-ghost-layer-after");
2426 }
2427
2428 // Affiche les statistiques du nouveau maillage
2429 {
2430 MeshStats ms(traceMng(),this,m_parallel_mng);
2431 ms.dumpStats();
2432 pinfo() << "Proc: " << meshRank()
2433 << " cellown=" << m_cell_family->allItems().own().size()
2434 << " cellloc=" << m_cell_family->allItems().size();
2435 }
2436
2438 CHECKPERF( m_perf_counter.start(PerfCounter::UPGHOSTLAYER7) )
2440 m_mesh_checker->updateAMRFaceOrientation(ghost_cell_to_refine_uid);
2441
2442 if (m_mesh_checker->checkLevel()>=1)
2443 m_mesh_checker->checkValidConnectivity();
2444 CHECKPERF( m_perf_counter.stop(PerfCounter::UPGHOSTLAYER7) )
2445
2446#ifdef ACTIVATE_PERF_COUNTER
2447 m_perf_counter.printInfo(info().file()) ;
2448#endif
2449}
2450
2451/*---------------------------------------------------------------------------*/
2452/*---------------------------------------------------------------------------*/
2453
2454void DynamicMesh::
2455_internalUpdateGhost(bool update_ghost_layer,bool remove_old_ghost)
2456{
2457 m_need_compact = true;
2458
2459 // Surcharge le comportement pour les sous-maillages
2460 if (parentMesh()){
2462 m_submesh_tools->updateGhostMesh();
2463 }
2464 else{
2465 if (update_ghost_layer){
2466 if(remove_old_ghost){
2467 _removeGhostItems();
2468 }
2469 // En cas de raffinement/déraffinement, il est possible que l'orientation soit invalide à un moment.
2470 m_face_family->setCheckOrientation(false);
2471 m_mesh_builder->addGhostLayers(false);
2472 m_face_family->setCheckOrientation(true);
2473 _computeExtraGhostCells();
2474 _computeExtraGhostParticles();
2475 }
2476 }
2477}
2478
2479/*---------------------------------------------------------------------------*/
2480/*---------------------------------------------------------------------------*/
2481
2482void DynamicMesh::
2483_internalEndUpdateInit(bool update_ghost_layer)
2484{
2485 // A partir d'ici, les entités du maillages sont toutes connues. Il
2486 // est donc possible de les compacter si nécessaire
2487 //m_mesh_builder->printStats();
2488
2489 //info() << "Finalize date=" << platform::getCurrentDateTime();
2490 _finalizeMeshChanged();
2491
2492 // Recalcule les informations nécessaires pour la synchronisation
2493 // des entités
2494 if (update_ghost_layer){
2495 info() << "ComputeSyncInfos date=" << platform::getCurrentDateTime();
2496 _computeFamilySynchronizeInfos();
2497 }
2498}
2499
2500/*---------------------------------------------------------------------------*/
2501/*---------------------------------------------------------------------------*/
2502
2503void DynamicMesh::
2504_internalEndUpdateResizeVariables()
2505{
2506 // Réalloue les variables du maillage car leur groupe a évolué
2507 for( IItemFamily* family : m_item_families )
2508 family->_internalApi()->resizeVariables(true);
2509}
2510
2511/*---------------------------------------------------------------------------*/
2512/*---------------------------------------------------------------------------*/
2513
2514void
2517{
2518 // Vérifie que le maillage est conforme avec la référence
2519 m_mesh_checker->checkMeshFromReferenceFile();
2520
2521 // Compacte les références pour ne pas laisser de trou et profiter
2522 // au mieux des effets de cache.
2523 // NOTE: ce n'est en théorie pas indispensable mais actuellement si
2524 // car on ne sauve pas le #m_data_index des ItemInternal.
2525 {
2526 //Timer::Action ts_action1(m_sub_domain,"CompactReferences",true);
2527 _compactItemInternalReferences(); // Utilité à confirmer
2528
2529 {
2530 bool do_compact = m_properties->getBool(PROPERTY_COMPACT);
2531 info(4) << "DynamicMesh::_internalEndUpdateFinal() compact?=" << do_compact << " sort?=" << m_properties->getBool(PROPERTY_SORT);
2532 if (do_compact){
2533 bool do_sort = m_properties->getBool(PROPERTY_SORT);
2534 _compactItems(do_sort,do_compact);
2535 }
2536 }
2537 }
2538
2539 _notifyEndUpdateForFamilies();
2540
2541 // Affiche les statistiques du nouveau maillage
2542 if (print_stat){
2543 if (m_properties->getBool(PROPERTY_DISPLAY_STATS)){
2544 MeshStats ms(traceMng(),this,m_parallel_mng);
2545 ms.dumpStats();
2546 }
2547 }
2548
2551 m_mesh_checker->updateAMRFaceOrientation();
2552
2553 if (m_mesh_checker->checkLevel()>=1)
2554 m_mesh_checker->checkValidConnectivity();
2555}
2556
2557/*---------------------------------------------------------------------------*/
2558/*---------------------------------------------------------------------------*/
2559
2560void DynamicMesh::
2561_notifyEndUpdateForFamilies()
2562{
2563 for( IItemFamily* family : m_item_families )
2564 family->_internalApi()->notifyEndUpdateFromMesh();
2565}
2566
2567/*---------------------------------------------------------------------------*/
2568/*---------------------------------------------------------------------------*/
2569
2571endUpdate()
2572{
2573 endUpdate(false,false);
2574}
2575
2576/*---------------------------------------------------------------------------*/
2577/*---------------------------------------------------------------------------*/
2578
2579void DynamicMesh::
2581{
2582 // L'ordre d'action est le suivant:
2583 // 1- Mise à jour des fantomes
2584 // 2- Finalization du maillage (fige les items)
2585 // Calcul si demandé (update_ghost_layer) les synchroniseurs sur les familles
2586 // 3- Synchronize les groupes (requiert des synchroniseurs de familles à jour)
2587 // 4- Calcul si demandé (update_ghost_layer) les synchroniseurs sur les groupes
2588 // 5- Retaille les variables (familles et groupes)
2589 // 6- Synchronize si demandé (update_ghost_layer) les variables (familles et groupes)
2590 // 7- Finalisation comprenant: compactage, triage (si activés), statistiques et contrôle de validé
2591 // 8- Appels récursifs aux sous-maillages
2592
2593 Trace::Setter mci(traceMng(),_className());
2594 _internalUpdateGhost(update_ghost_layer, remove_old_ghost);
2595
2596 _internalEndUpdateInit(update_ghost_layer);
2597 if (update_ghost_layer){
2598 _synchronizeGroups();
2599 _computeGroupSynchronizeInfos();
2600 }
2601 _internalEndUpdateResizeVariables();
2602 if (update_ghost_layer){
2603 _synchronizeVariables();
2604 }
2606
2607 // Finalisation des sous-maillages recursives
2608 for( DynamicMesh* child_mesh : m_child_meshes )
2609 child_mesh->endUpdate(update_ghost_layer, remove_old_ghost);
2610}
2611
2612/*---------------------------------------------------------------------------*/
2613/*---------------------------------------------------------------------------*/
2614
2617{
2618 _synchronizeGroupsAndVariables();
2619 // Peu tester dans le cas où le groupe parent d'un sous-maillage
2620 // avant l'appel aux maillages enfants.
2621 // Cela pourrait peut-être nécessité une mise à jour des synchronisers enfants
2622 for( DynamicMesh* child_mesh : m_child_meshes )
2623 child_mesh->synchronizeGroupsAndVariables();
2624}
2625
2626/*---------------------------------------------------------------------------*/
2627/*---------------------------------------------------------------------------*/
2628
2629void DynamicMesh::
2630_synchronizeGroupsAndVariables()
2631{
2632 _synchronizeGroups();
2633 _synchronizeVariables();
2634}
2635
2636/*---------------------------------------------------------------------------*/
2637/*---------------------------------------------------------------------------*/
2638
2639void DynamicMesh::
2640_synchronizeGroups()
2641{
2642 {
2643 ItemGroupsSynchronize igs(m_node_family);
2644 igs.synchronize();
2645 }
2646 {
2647 ItemGroupsSynchronize igs(m_edge_family);
2648 igs.synchronize();
2649 }
2650 {
2651 ItemGroupsSynchronize igs(m_face_family);
2652 igs.synchronize();
2653 }
2654 {
2655 ItemGroupsSynchronize igs(m_cell_family);
2656 igs.synchronize();
2657 }
2658 {
2659 for( IItemFamily* family : m_item_families ){
2660 if (family->itemKind()==IK_Particle){
2661 IParticleFamily* pfamily = family->toParticleFamily();
2662 if (pfamily && pfamily->getEnableGhostItems()){
2663 ItemGroupsSynchronize igs(family);
2664 igs.synchronize();
2665 }
2666 }
2667 }
2668 }
2669}
2670
2671/*---------------------------------------------------------------------------*/
2672/*---------------------------------------------------------------------------*/
2673
2674void DynamicMesh::
2675_synchronizeVariables()
2676{
2677 // On ne synchronise que les variables sur les items du maillage courant
2678 // - Les items de graphe ne sont pas traités ici (était déjà retiré de
2679 // la version précédente du code)
2680 // - Les particules et ceux sans genre (Unknown) ne pas sujet à synchronisation
2681 // La synchronisation est ici factorisée par collection de variables de même
2682 // synchroniser (même pour les synchronisers sur groupes != famille)
2683 // Pour préserver un ordre consistent de synchronisation une structure
2684 // auxiliaire OrderedSyncList est utilisée.
2685
2686 // Peut on le faire avec une structure plus compacte ?
2687 typedef UniqueArray<IVariableSynchronizer*> OrderedSyncList;
2688 typedef std::map<IVariableSynchronizer*, VariableCollection> SyncList;
2689 OrderedSyncList ordered_sync_list;
2690 SyncList sync_list;
2691
2692 VariableCollection used_vars(subDomain()->variableMng()->usedVariables());
2693 for( VariableCollection::Enumerator i_var(used_vars); ++i_var; ) {
2694 IVariable* var = *i_var;
2695 switch(var->itemKind()) {
2696 case IK_Node:
2697 case IK_Edge:
2698 case IK_Face:
2699 case IK_Cell:
2700 case IK_DoF:{
2701 IVariableSynchronizer * synchronizer = 0;
2702 if (var->isPartial())
2703 synchronizer = var->itemGroup().synchronizer();
2704 else
2705 synchronizer = var->itemFamily()->allItemsSynchronizer();
2706 IMesh * sync_mesh = synchronizer->itemGroup().mesh();
2707 if (sync_mesh != this) continue; // on ne synchronise que sur le maillage courant
2708 std::pair<SyncList::iterator,bool> inserter = sync_list.insert(std::make_pair(synchronizer,VariableCollection()));
2709 if (inserter.second) { // nouveau synchronizer
2710 ordered_sync_list.add(synchronizer);
2711 }
2712 VariableCollection & collection = inserter.first->second;
2713 collection.add(var);
2714 } break;
2715 case IK_Particle:
2716 case IK_Unknown:
2717 break;
2718 }
2719 }
2720
2721 for(Integer i_sync = 0; i_sync < ordered_sync_list.size(); ++i_sync) {
2722 IVariableSynchronizer * synchronizer = ordered_sync_list[i_sync];
2723 VariableCollection & collection = sync_list[synchronizer];
2724 synchronizer->synchronize(collection);
2725 }
2726}
2727
2728/*---------------------------------------------------------------------------*/
2729/*---------------------------------------------------------------------------*/
2730
2731 void DynamicMesh::
2732_sortInternalReferences()
2733{
2734 // TODO: cet appel spécifique doit être gérée par NodeFamily.
2735 m_node_family->sortInternalReferences();
2736}
2737
2738/*---------------------------------------------------------------------------*/
2739/*---------------------------------------------------------------------------*/
2740
2741void DynamicMesh::
2742_finalizeMeshChanged()
2743{
2744 ++m_timestamp;
2745 for( IItemFamily* family : m_item_families ){
2746 debug() << "_finalizeMeshChanged on " << family->name() << " Family on Mesh " << name();
2747 family->endUpdate();
2748 }
2749
2750 bool do_sort = m_properties->getBool(PROPERTY_SORT);
2751 if (do_sort)
2752 _sortInternalReferences();
2753 m_tied_interface_need_prepare_dump = true;
2754}
2755
2756/*---------------------------------------------------------------------------*/
2757/*---------------------------------------------------------------------------*/
2758
2759void DynamicMesh::
2760_applyCompactPolicy(const String& timer_name,
2761 std::function<void(IItemFamilyCompactPolicy*)> functor)
2762{
2763 Timer::Action ts_action(m_sub_domain,timer_name);
2764 for( IItemFamily* family : m_item_families ){
2765 IItemFamilyCompactPolicy* c = family->policyMng()->compactPolicy();
2766 if (c)
2767 functor(c);
2768 }
2769}
2770
2771/*---------------------------------------------------------------------------*/
2772/*---------------------------------------------------------------------------*/
2773
2774void DynamicMesh::
2775_compactItemInternalReferences()
2776{
2777 _applyCompactPolicy("CompactConnectivityData",[&](IItemFamilyCompactPolicy* c)
2778 { c->compactConnectivityData(); });
2779}
2780
2781/*---------------------------------------------------------------------------*/
2782/*---------------------------------------------------------------------------*/
2783
2784void DynamicMesh::
2785_compactItems(bool do_sort,bool compact_variables_and_groups)
2786{
2787 if (do_sort)
2788 info(4) << "Compress and sort the mesh entities " << name() << ".";
2789 else
2790 info(4) << "Compress the mesh entities " << name() << ".";
2791
2792 IMeshCompacter* compacter = m_mesh_compact_mng->beginCompact();
2793
2794 try{
2795 compacter->setSorted(do_sort);
2796 compacter->_setCompactVariablesAndGroups(compact_variables_and_groups);
2797
2798 compacter->doAllActions();
2799 }
2800 catch(...){
2801 m_mesh_compact_mng->endCompact();
2802 throw;
2803 }
2804 m_mesh_compact_mng->endCompact();
2805
2806 if (do_sort){
2807 Timer::Action ts_action(m_sub_domain,"CompactItemSortReferences");
2808 // TODO: mettre cela dans la politique de la famille (a priori ne sert
2809 // que pour les familles de noeud)
2810 _sortInternalReferences();
2811 }
2812
2813 m_need_compact = false;
2814
2815 // Considère le compactage comme une évolution du maillage car cela
2816 // change les structures associées aux entités et leurs connectivités
2817 ++m_timestamp;
2818}
2819
2820/*---------------------------------------------------------------------------*/
2821/*---------------------------------------------------------------------------*/
2822
2823void DynamicMesh::
2824setEstimatedCells(Integer nb_cell0)
2825{
2826 Real factor = 1.0;
2827 if (m_parallel_mng->isParallel())
2828 factor = 1.2; // Considère 20% d'entités fantômes.
2829 // Les estimations suivantes correspondantes à une évaluation pour un cube de côté N=16
2830 Integer nb_node = Convert::toInteger(nb_cell0 * 1.2 * factor); // (N+1)^3/N^3 => 1.2
2831 Integer nb_edge = Convert::toInteger(nb_cell0 * 6.8 * factor); // 6*(N+1)^2*N/N^3 => 6.8
2832 Integer nb_face = Convert::toInteger(nb_cell0 * 3.4 * factor); // 3*N^2*(N+1)/N^3 => 3.19
2833 Integer nb_cell = Convert::toInteger(nb_cell0 * 1.0 * factor); // trivial => 1.0
2834 info() << "Estimating the number of entities:"
2835 << " Node=" << nb_node
2836 << " Edge=" << nb_edge
2837 << " Face=" << nb_face
2838 << " Cell=" << nb_cell;
2839 m_node_family->preAllocate(nb_node);
2840 m_edge_family->preAllocate(nb_edge);
2841 m_face_family->preAllocate(nb_face);
2842 m_cell_family->preAllocate(nb_cell);
2843}
2844
2845/*---------------------------------------------------------------------------*/
2846/*---------------------------------------------------------------------------*/
2852{
2854
2855 // Ne fais rien sur un maillage pas encore alloué.
2856 if (m_mesh_dimension()<0)
2857 return;
2858
2859 // Connexion maillage/sous-maillage
2860 {
2861 IMeshMng* mm = meshMng();
2862 if (!m_parent_mesh_name.value().null()) {
2863 m_parent_mesh = mm->findMeshHandle(m_parent_mesh_name.value()).mesh();
2864 }
2865 if (!m_parent_group_name.value().null()) {
2866 ARCANE_ASSERT((m_parent_mesh != NULL),("Unexpected NULL Mesh"));
2867 m_parent_group = m_parent_mesh->findGroup(m_parent_group_name.value()).internal();
2868 }
2869 const Integer n_sub_mesh = m_child_meshes_name.size();
2870 m_child_meshes.resize(n_sub_mesh);
2871 for(Integer i=0;i<n_sub_mesh;++i)
2872 {
2873 IMesh* child_mesh = mm->findMeshHandle(m_child_meshes_name[i]).mesh();
2875 if (dynamic_child_mesh == 0)
2876 ARCANE_FATAL("Cannot associate sub mesh from a different concrete type");
2877 m_child_meshes[i] = dynamic_child_mesh;
2878 }
2879 }
2880
2881 {
2883 for( Integer i=0; i<nb_item_family; ++i ){
2884 info(5) << "Found family: I=" << i
2885 << " name=" << m_item_families_name[i]
2886 << " kind=" << (eItemKind)m_item_families_kind[i];
2887 }
2888 }
2889
2890 // Relit les infos sur les familles d'entités
2891 {
2893 for( Integer i=0; i<nb_item_family; ++i ){
2895 }
2896 }
2897
2898 // GG: Remise à jour des choix de connectivité
2899 // Il faut le faire ici car les familles peuvent être créées au début de cette
2900 // méthode et du coup ne pas tenir compte de la connectivité.
2901 if (!m_is_sub_connectivity_set)
2902 _setSubConnectivity();
2903
2904
2905 for( IItemFamily* family : m_item_families )
2906 family->readFromDump();
2907
2908 // Après relecture, il faut notifier les familles du changement potentiel
2909 // des entités.
2910 _notifyEndUpdateForFamilies();
2911
2912 //TODO: ne devrait pas etre fait ici.
2913 m_item_internal_list.nodes = m_node_family->itemsInternal();
2914 m_item_internal_list.edges = m_edge_family->itemsInternal();
2915 m_item_internal_list.faces = m_face_family->itemsInternal();
2916 m_item_internal_list.cells = m_cell_family->itemsInternal();
2917 m_item_internal_list.mesh = this;
2918
2919 m_tied_interface_mng->readTiedInterfacesFromDump();
2920
2921 m_mesh_builder->readFromDump();
2922 //_writeMesh("after-read-dump-"+name());
2923}
2924
2925/*---------------------------------------------------------------------------*/
2926/*---------------------------------------------------------------------------*/
2927
2930{
2931 return m_tied_interface_mng->hasTiedInterface();
2932}
2933
2934/*---------------------------------------------------------------------------*/
2935/*---------------------------------------------------------------------------*/
2936
2939{
2940 return m_tied_interface_mng->tiedInterfaces();
2941}
2942
2943/*---------------------------------------------------------------------------*/
2944/*---------------------------------------------------------------------------*/
2945
2947trueTiedInterfaces()
2948{
2949 return m_tied_interface_mng->trueTiedInterfaces();
2950}
2951
2952/*---------------------------------------------------------------------------*/
2953/*---------------------------------------------------------------------------*/
2954
2957{
2958 m_tied_interface_mng->computeTiedInterfaces(mesh_node);
2959}
2960
2961/*---------------------------------------------------------------------------*/
2962/*---------------------------------------------------------------------------*/
2963
2965setDimension(Integer dim)
2966{
2967 _setDimension(dim);
2968 _checkConnectivity();
2969}
2970
2971/*---------------------------------------------------------------------------*/
2972/*---------------------------------------------------------------------------*/
2973
2974void DynamicMesh::
2975_setDimension(Integer dim)
2976{
2977 if (m_is_allocated)
2978 ARCANE_FATAL("DynamicMesh::setDimension(): mesh is already allocated");
2979 info() << "Mesh name=" << name() << " set dimension = " << dim;
2981 bool v = m_mesh_unique_id_mng->isUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId();
2982 // Si les entités libres sont autorisées, alors il faut obligatoirement utiliser
2983 // la génération à partir des uniqueId() à partir des noeuds pour garantir
2984 // la cohérence des entités créées.
2985 if (!v && meshKind().isNonManifold()) {
2986 v = true;
2987 info() << "Force using edge and face uid generation from nodes because loose items are allowed";
2988 }
2989 if (m_mesh_builder){
2990 auto* adder = m_mesh_builder->oneMeshItemAdder();
2991 if (adder)
2992 adder->setUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId(v);
2993 }
2994}
2995
2996/*---------------------------------------------------------------------------*/
2997/*---------------------------------------------------------------------------*/
2998
2999void DynamicMesh::
3000_checkDimension() const
3001{
3002 if (m_mesh_dimension()<0)
3003 ARCANE_FATAL("dimension not set. setDimension() must be called before allocating cells");
3004}
3005
3006/*---------------------------------------------------------------------------*/
3007/*---------------------------------------------------------------------------*/
3008
3009void DynamicMesh::
3010_checkConnectivity()
3011{
3012 Connectivity c(m_mesh_connectivity);
3013 if (!c.isFrozen()) {
3014 c.freeze(this);
3015 debug() << "Mesh " << name() << " connectivity : " << Connectivity::Printer(m_mesh_connectivity());
3016 _setSubConnectivity();
3017 _updateItemFamilyDependencies(m_mesh_connectivity);
3018 }
3019}
3020
3021/*---------------------------------------------------------------------------*/
3022/*---------------------------------------------------------------------------*/
3023// AMR
3024void DynamicMesh::
3025_checkAMR() const
3026{
3027 if (!m_is_amr_activated)
3028 ARCANE_FATAL("DynamicMesh::_checkAMR(): amr activator not set.\t"
3029 "amr='true' must be set in the .arc file");
3030}
3031
3032/*---------------------------------------------------------------------------*/
3033/*---------------------------------------------------------------------------*/
3034
3035void DynamicMesh::
3036_setSubConnectivity()
3037{
3038 m_mesh_builder->setConnectivity(m_mesh_connectivity());
3039 m_node_family->setConnectivity(m_mesh_connectivity());
3040 m_edge_family->setConnectivity(m_mesh_connectivity());
3041 m_face_family->setConnectivity(m_mesh_connectivity());
3042 m_cell_family->setConnectivity(m_mesh_connectivity());
3043 m_is_sub_connectivity_set = true;
3044}
3045
3046/*---------------------------------------------------------------------------*/
3047/*---------------------------------------------------------------------------*/
3048
3049void DynamicMesh::
3050_writeCells(const String& filename)
3051{
3052 CellGroup cells(m_cell_family->allItems());
3053 std::ofstream ofile(filename.localstr());
3054 ENUMERATE_CELL(icell,cells){
3055 Cell cell = *icell;
3056 ofile << "CELL: uid=" << cell.uniqueId() << " isown="
3057 << cell.isOwn() << " owner=" << cell.owner() << '\n';
3058 }
3059}
3060
3061/*---------------------------------------------------------------------------*/
3062/*---------------------------------------------------------------------------*/
3063
3066{
3067 return m_node_family->nodesCoordinates();
3068}
3069
3070/*---------------------------------------------------------------------------*/
3071/*---------------------------------------------------------------------------*/
3072
3081
3082/*---------------------------------------------------------------------------*/
3083/*---------------------------------------------------------------------------*/
3084
3085void DynamicMesh::
3086_setOwnersFromCells()
3087{
3088 // On suppose qu'on connait les nouveaux propriétaires des mailles, qui
3089 // se trouvent dans cells_owner. Il faut
3090 // maintenant déterminer les nouveaux propriétaires des noeuds et
3091 // des faces. En attendant d'avoir un algorithme qui équilibre mieux
3092 // les messages, on applique le suivant:
3093 // - chaque sous-domaine est responsable pour déterminer le nouveau
3094 // propriétaire des noeuds et des faces qui lui appartiennent.
3095 // - pour les noeuds et les arêtes, le nouveau propriétaire est le nouveau
3096 // propriétaire de la maille connectée à ce noeud dont le uniqueId() est le plus petit.
3097 // - pour les faces, le nouveau propriétaire est le nouveau propriétaire
3098 // de la maille qui est derrière cette face s'il s'agit d'une face
3099 // interne et de la maille connectée s'il s'agit d'une face frontière.
3100 // - pour les noeuds duaux, le nouveau propriétaire est le nouveau propriétaire
3101 // de la maille connectée à l'élément dual
3102 // - pour les liaisons, le nouveau propriétaire est le nouveau propriétaire
3103 // de la maille connectée au premier noeud dual, c'est-à-dire le propriétaire
3104 // du premier noeud dual de la liaison
3105
3109
3110 const Integer sid = subDomain()->subDomainId();
3111
3112 // Outil d'affectation des owners pour les items
3113 if(m_new_item_owner_builder == NULL)
3114 m_new_item_owner_builder = new NewItemOwnerBuilder();
3115
3116 // Détermine les nouveaux propriétaires des noeuds
3117 {
3119 Node node = *i_node;
3120 nodes_owner[node] = m_new_item_owner_builder->ownerOfItem(node);
3121 }
3122 nodes_owner.synchronize();
3123 }
3124
3125 ENUMERATE_NODE(i_node,allNodes()){
3126 Node node = *i_node;
3127 node.mutableItemBase().setOwner(nodes_owner[node],sid);
3128 }
3129
3130 // Détermine les nouveaux propriétaires des arêtes
3131 {
3132 ENUMERATE_EDGE(i_edge,ownEdges()){
3133 Edge edge = *i_edge;
3134 edges_owner[edge] = m_new_item_owner_builder->ownerOfItem(edge);
3135 }
3136 edges_owner.synchronize();
3137 }
3138
3139 ENUMERATE_EDGE(i_edge,allEdges()){
3140 Edge edge = *i_edge;
3141 edge.mutableItemBase().setOwner(edges_owner[edge],sid);
3142 }
3143
3144 // Détermine les nouveaux propriétaires des faces
3145 {
3146 ENUMERATE_FACE(i_face,ownFaces()){
3147 Face face = *i_face;
3148 faces_owner[face] = m_new_item_owner_builder->ownerOfItem(face);
3149 }
3150 faces_owner.synchronize();
3151 }
3152
3153 ENUMERATE_FACE(i_face,allFaces()){
3154 Face face = *i_face;
3155 face.mutableItemBase().setOwner(faces_owner[face],sid);
3156 }
3157
3161 _computeFamilySynchronizeInfos();
3162}
3163
3164/*---------------------------------------------------------------------------*/
3165/*---------------------------------------------------------------------------*/
3166
3168utilities()
3169{
3170 if (!m_mesh_utilities)
3171 m_mesh_utilities = new UnstructuredMeshUtilities(this);
3172 return m_mesh_utilities;
3173}
3174
3175/*---------------------------------------------------------------------------*/
3176/*---------------------------------------------------------------------------*/
3177
3179outerFaces()
3180{
3181 return m_cell_family->allItems().outerFaceGroup();
3182}
3183
3185/*---------------------------------------------------------------------------*/
3186/*---------------------------------------------------------------------------*/
3190{
3191 return m_cell_family->allItems().activeCellGroup();
3192}
3193/*---------------------------------------------------------------------------*/
3194/*---------------------------------------------------------------------------*/
3198{
3199 return m_cell_family->allItems().ownActiveCellGroup();
3200}
3201/*---------------------------------------------------------------------------*/
3202/*---------------------------------------------------------------------------*/
3205allLevelCells(const Integer& level)
3206{
3207 return m_cell_family->allItems().levelCellGroup(level);
3208}
3209/*---------------------------------------------------------------------------*/
3210/*---------------------------------------------------------------------------*/
3213ownLevelCells(const Integer& level)
3214{
3215 return m_cell_family->allItems().ownLevelCellGroup(level);
3216}
3217/*---------------------------------------------------------------------------*/
3218/*---------------------------------------------------------------------------*/
3222{
3223 return m_cell_family->allItems().activeFaceGroup();
3224}
3225/*---------------------------------------------------------------------------*/
3226/*---------------------------------------------------------------------------*/
3230{
3231 return m_cell_family->allItems().ownActiveFaceGroup();
3232}
3233/*---------------------------------------------------------------------------*/
3234/*---------------------------------------------------------------------------*/
3235
3236/*---------------------------------------------------------------------------*/
3237/*---------------------------------------------------------------------------*/
3241{
3242 return m_cell_family->allItems().innerActiveFaceGroup();
3243}
3244/*---------------------------------------------------------------------------*/
3245/*---------------------------------------------------------------------------*/
3249{
3250 return m_cell_family->allItems().outerActiveFaceGroup();
3251}
3252/*---------------------------------------------------------------------------*/
3253/*---------------------------------------------------------------------------*/
3254
3255
3256/*---------------------------------------------------------------------------*/
3257/*---------------------------------------------------------------------------*/
3258
3261{
3262 Trace::Setter mci(traceMng(),_className());
3263 if (!mesh)
3264 ARCANE_FATAL("Cannot set NULL parent mesh to mesh '{0}'",name());
3265
3266 if (mesh != group.mesh())
3267 ARCANE_FATAL("Cannot set inconsistant mesh/group parents to mesh '{0}'",name());
3268
3269 if (m_parent_mesh) {
3270 if (m_parent_mesh != mesh)
3271 ARCANE_FATAL("Mesh '{0}' already has parent mesh '{1}'",name(),m_parent_mesh->name());
3272 if (m_parent_group != group.internal())
3273 ARCANE_FATAL("Mesh '{0}' already has parent group '{1}'",name(),m_parent_group->name());
3274 }
3275
3276 m_parent_mesh = mesh;
3277 m_parent_group = group.internal();
3278
3279 Integer dimension_shift = 0;
3280 if (group.itemKind() == IK_Face) {
3281 dimension_shift = 1;
3282 }
3283 else if (group.itemKind() == IK_Cell) {
3284 dimension_shift = 0;
3285 }
3286 else {
3287 ARCANE_FATAL("Only SubMesh on FaceGroup or CellGoup is allowed");
3288 }
3289
3290 _setDimension(mesh->dimension()-dimension_shift);
3291
3292 for( IItemFamily* family : m_item_families ){
3293 const eItemKind kind = family->itemKind();
3294 // Uniquement sur les items constructifs d'un maillage
3295 if (kind == IK_Node || kind == IK_Edge || kind == IK_Face || kind == IK_Cell) {
3297 if (parent_kind != IK_Unknown) {
3298 family->setParentFamily(mesh->itemFamily(parent_kind));
3299 } // else : pas de transposition
3300 } else {
3301 // do nothing. Another idea ?
3302 }
3303 }
3304}
3305
3306/*---------------------------------------------------------------------------*/
3307/*---------------------------------------------------------------------------*/
3308
3311{
3312 return m_partition_constraint_mng;
3313}
3314
3315/*---------------------------------------------------------------------------*/
3316/*---------------------------------------------------------------------------*/
3317
3319parentMesh() const
3320{
3321 return m_parent_mesh;
3322}
3323
3324/*---------------------------------------------------------------------------*/
3325/*---------------------------------------------------------------------------*/
3326
3328parentGroup() const
3329{
3330 return ItemGroup(m_parent_group);
3331}
3332
3333/*---------------------------------------------------------------------------*/
3334/*---------------------------------------------------------------------------*/
3335
3338{
3340 if (!dynamic_child_mesh)
3341 ARCANE_FATAL("Cannot associate sub mesh from a different concrete type");
3342 for(Integer i=0;i<m_child_meshes.size();++i)
3343 if (m_child_meshes[i] == dynamic_child_mesh)
3344 return;
3345 m_child_meshes.add(dynamic_child_mesh);
3346}
3347
3348/*---------------------------------------------------------------------------*/
3349/*---------------------------------------------------------------------------*/
3350
3352childMeshes() const
3353{
3355 for(Integer i=0;i<m_child_meshes.size(); ++i) {
3356 collection.add(m_child_meshes[i]);
3357 }
3358 return collection;
3359}
3360
3361/*---------------------------------------------------------------------------*/
3362/*---------------------------------------------------------------------------*/
3363
3365checker() const
3366{
3367 return m_mesh_checker;
3368}
3369
3370/*---------------------------------------------------------------------------*/
3371/*---------------------------------------------------------------------------*/
3372
3374isPrimaryMesh() const
3375{
3376 return (this->parentMesh()==nullptr);
3377}
3378
3379/*---------------------------------------------------------------------------*/
3380/*---------------------------------------------------------------------------*/
3381
3384{
3385 if (!isPrimaryMesh())
3386 throw BadCastException(A_FUNCINFO,"Mesh is not a primary mesh");
3387 return this;
3388}
3389
3390/*---------------------------------------------------------------------------*/
3391/*---------------------------------------------------------------------------*/
3392
3394nbNode()
3395{
3396 return m_node_family->nbItem();
3397}
3399nbEdge()
3400{
3401 return m_edge_family->nbItem();
3402}
3404nbFace()
3405{
3406 return m_face_family->nbItem();
3407}
3409nbCell()
3410{
3411 return m_cell_family->nbItem();
3412}
3413
3415nodeFamily()
3416{
3417 return m_node_family;
3418}
3419
3421edgeFamily()
3422{
3423 return m_edge_family;
3424}
3425
3427faceFamily()
3428{
3429 return m_face_family;
3430}
3431
3433cellFamily()
3434{
3435 return m_cell_family;
3436}
3437
3439nodesMap()
3440{
3441 return m_node_family->itemsMap();
3442}
3443
3444DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3445edgesMap()
3446{
3447 return m_edge_family->itemsMap();
3448}
3449
3450DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3451facesMap()
3452{
3453 return m_face_family->itemsMap();
3454}
3455
3456DynamicMeshKindInfos::ItemInternalMap& DynamicMesh::
3457cellsMap()
3458{
3459 return m_cell_family->itemsMap();
3460}
3461
3462/*---------------------------------------------------------------------------*/
3463/*---------------------------------------------------------------------------*/
3464
3467{
3469 for( IMesh* mesh : meshes ){
3472 }
3474 merger.mergeMeshes(true_meshes);
3475}
3476
3477/*---------------------------------------------------------------------------*/
3478/*---------------------------------------------------------------------------*/
3479
3480void DynamicMesh::
3481_printConnectivityPolicy()
3482{
3483 info() << "Connectivity policy=" << (int)m_connectivity_policy;
3484
3485 if (m_connectivity_policy != InternalConnectivityPolicy::NewOnly)
3486 ARCANE_FATAL("Invalid value '{0}' for InternalConnectivityPolicy. Only '{1}' is allowed",
3487 (int)m_connectivity_policy,(int)InternalConnectivityPolicy::NewOnly);
3488}
3489
3490/*---------------------------------------------------------------------------*/
3491/*---------------------------------------------------------------------------*/
3492
3495{
3496 m_mesh_part_info = mpi;
3497 // TODO: notifier les familles
3498}
3499
3500/*---------------------------------------------------------------------------*/
3501/*---------------------------------------------------------------------------*/
3502
3503void DynamicMesh::
3504_updateItemFamilyDependencies(VariableScalarInteger connectivity)
3505{
3506 if (!m_item_family_network)
3507 return;
3509 for (const auto& con : m_item_family_network->getConnectivities()) {
3510 if (c.hasConnectivity(c.kindsToConnectivity(con->sourceFamily()->itemKind(),con->targetFamily()->itemKind()))){
3511 m_item_family_network->setIsStored(con);
3512 }
3513 }
3514}
3515
3516/*---------------------------------------------------------------------------*/
3517/*---------------------------------------------------------------------------*/
3518
3521{
3522 return m_internal_api.get();
3523}
3524
3525/*---------------------------------------------------------------------------*/
3526/*---------------------------------------------------------------------------*/
3527
3530{
3531 return m_internal_api.get();
3532}
3533
3534/*---------------------------------------------------------------------------*/
3535/*---------------------------------------------------------------------------*/
3536
3539{
3540 _computeSynchronizeInfos();
3541}
3542
3543/*---------------------------------------------------------------------------*/
3544/*---------------------------------------------------------------------------*/
3545
3546class ARCANE_MESH_EXPORT DynamicMeshFactoryBase
3547: public AbstractService
3548, public IMeshFactory
3549{
3550 public:
3551
3553 : AbstractService(sbi), m_is_amr(is_amr) {}
3554
3555 public:
3556
3557 void build() override {}
3559 {
3561 MeshKind mk(mbi.meshKind());
3562 // Si on demande l'AMR mais que cela n'est pas indiqué dans MeshPart,
3563 // on l'ajoute.
3564 if (m_is_amr && mk.meshAMRKind()==eMeshAMRKind::None)
3565 mk.setMeshAMRKind(eMeshAMRKind::Cell);
3566 mbi.addMeshKind(mk);
3567 ISubDomain* sd = mm->variableMng()->_internalApi()->internalSubDomain();
3568 bool is_submesh = !mbi.parentGroup().null();
3569 if (is_submesh && m_is_amr)
3570 ARCANE_FATAL("Submesh cannot be refined with AMR.");
3571 return new DynamicMesh(sd,mbi,is_submesh);
3572 }
3573
3574 private:
3575
3576 bool m_is_amr;
3577};
3578
3579/*---------------------------------------------------------------------------*/
3580/*---------------------------------------------------------------------------*/
3581
3582class ARCANE_MESH_EXPORT DynamicMeshFactory
3584{
3585 public:
3586 explicit DynamicMeshFactory(const ServiceBuildInfo& sbi)
3587 : DynamicMeshFactoryBase(sbi,false) {}
3588};
3589
3590/*---------------------------------------------------------------------------*/
3591/*---------------------------------------------------------------------------*/
3592
3593class ARCANE_MESH_EXPORT DynamicAMRMeshFactory
3595{
3596 public:
3598 : DynamicMeshFactoryBase(sbi,true) {}
3599};
3600
3601/*---------------------------------------------------------------------------*/
3602/*---------------------------------------------------------------------------*/
3603
3605 ServiceProperty("ArcaneDynamicMeshFactory",ST_Application),
3607
3609 ServiceProperty("ArcaneDynamicAMRMeshFactory",ST_Application),
3611
3612/*---------------------------------------------------------------------------*/
3613/*---------------------------------------------------------------------------*/
3614
3615} // End namespace Arcane::mesh
3616
3617/*---------------------------------------------------------------------------*/
3618/*---------------------------------------------------------------------------*/
#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.
#define ENUMERATE_FACE(name, group)
Enumérateur générique d'un groupe de faces.
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
#define ENUMERATE_EDGE(name, group)
Enumérateur générique d'un groupe d'arêtes.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
#define ENUMERATE_NODE(name, group)
Enumérateur générique d'un groupe de noeuds.
Fonctions utilitaires sur le maillage.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Classe de base d'un service.
Tableau d'items de types quelconques.
Exception lorsqu'une conversion d'un type vers un autre est invalide.
Maille d'un maillage.
Definition Item.h:1191
void clear()
Supprime tous les éléments de la collection.
Definition Collection.h:68
Integer count() const
Nombre d'éléments de la collection.
Definition Collection.h:70
Gère la récupération des informations de connectivité.
Face d'une maille.
Definition Item.h:944
Cell cell(Int32 i) const
i-ème maille de la face
Definition Item.h:1633
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Definition Item.h:1019
Interface d'une partie d'un jeu de données.
Interface d'un constructeur de mailles fantômes "extraordinaires"
Interface d'un constructeur de mailles fantômes "extraordinaires".
virtual void setBuilderVersion(Integer n)=0
Positionne la version du constructeur de mailles fantômes. Pour l'instant (version 3....
virtual Integer nbGhostLayer() const =0
Nombre de couches fantômes.
virtual void setNbGhostLayer(Integer n)=0
Positionne le nombre de couches fantômes.
Interface de modification d'une famille.
virtual void removeConnectedDoFsFromCells(Int32ConstArrayView local_ids)=0
supprime les DoFs et les liens entre DoFs connectés aux mailles supprimées
virtual void setIsStored(IIncrementalItemConnectivity *connectivity)=0
Positionne une connectivité comme étant stockée.
virtual void schedule(IItemFamilyNetworkTask task, eSchedulingOrder order=TopologicalOrder)=0
Ordonnance l'exécution d'une tâche, dans l'ordre topologique ou topologique inverse du graphe de dépe...
virtual IItemFamilySerializer * createSerializer(bool with_flags=false)=0
Créé une instance pour la sérialisation des entités. L'instance retournée doit être détruite par l'op...
Interface d'une famille d'entités.
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual IVariableSynchronizer * allItemsSynchronizer()=0
Synchroniseur sur toutes les entités de la famille.
virtual void notifyItemsOwnerChanged()=0
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
virtual String name() const =0
Nom du maillage.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
Interface de méthodes de vérification d'un maillage.
virtual void endCompact()=0
Signale que le compactage est terminé.
virtual IMeshCompacter * beginCompact()=0
Débute un compactage sur toutes les familles du maillage.
virtual IMeshExchanger * beginExchange()=0
Débute un échange.
virtual void endExchange()=0
Signale que l'échange est terminé.
Interface du service gérant la lecture d'un maillage.
Partie interne de IMesh.
Interface du gestionnaire des maillages.
Definition IMeshMng.h:40
Partie interne de IMeshModifier.
Interface d'un gestionnaire de contraintes de partitionnement de maillage.
virtual bool isUseNodeUniqueIdToGenerateEdgeAndFaceUniqueId() const =0
Indique le mécanisme utilisé pour numéroter les arêtes ou les faces.
Interface d'une classe proposant des fonctions utilitaires sur maillage.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual ItemGroup findGroup(const String &name)=0
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
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 Int32 subDomainId() const =0
Numéro du sous-domaine associé à ce gestionnaire.
virtual const CommonVariables & commonVariables() const =0
Informations sur les variables standards.
virtual ITimeStats * timeStats() const =0
Statistiques des temps d'exécution.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
virtual ICaseMng * caseMng()=0
Retourne le gestionnaire du jeu de données.
Interface gérant les statistiques sur les temps d'exécution.
Definition ITimeStats.h:43
Interface du gestionnaire de variables.
Interface d'une variable.
Definition IVariable.h:56
virtual void resizeFromGroup()=0
Positionne le nombre d'éléments pour une variable du maillage.
bool isAncestor() const
@ II_JustCoarsened
L'entité vient d'être déraffiné
Definition ItemFlags.h:65
Int32ConstArrayView itemsLocalId() const
Liste des numéros locaux des entités de ce groupe.
void attachObserver(const void *ref, IItemGroupObserver *obs)
Attache un observer.
const String & name() const
Nom du groupe.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Definition ItemGroup.h:120
FaceGroup activeFaceGroup() const
Groupe des faces actives.
Definition ItemGroup.cc:351
FaceGroup innerActiveFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
Definition ItemGroup.cc:378
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
FaceGroup ownActiveFaceGroup() const
Groupe des faces actives propres au domaine des éléments de ce groupe.
Definition ItemGroup.cc:363
CellGroup levelCellGroup(const Integer &level) const
Groupe des mailles de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:328
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
Definition ItemGroup.h:109
CellGroup ownActiveCellGroup() const
Groupe des mailles propres actives des éléments de ce groupe.
Definition ItemGroup.cc:316
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
CellGroup ownLevelCellGroup(const Integer &level) const
Groupe des mailles propres de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:340
FaceGroup outerActiveFaceGroup() const
Groupe des faces externes actives des éléments de ce groupe.
Definition ItemGroup.cc:390
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:126
CellGroup activeCellGroup() const
AMR.
Definition ItemGroup.cc:304
FaceGroup outerFaceGroup() const
Groupe des faces externes des éléments de ce groupe.
Definition ItemGroup.cc:289
Informations pour synchroniser les groupes entre sous-domaines.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Definition ItemLocalId.h:41
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
Classe de base d'un élément de maillage.
Definition Item.h:83
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
Definition Item.h:374
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:219
bool isOwn() const
true si l'entité est appartient au sous-domaine
Definition Item.h:253
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Definition Item.h:238
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:225
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Paramètres nécessaires à la construction d'un maillage.
Gestionnaire des compactages de familles d'un maillage.
Arguments des évènements sur le maillage.
Definition MeshEvents.h:43
Interface du gestionnaire des échanges de maillages entre sous-domaines.
Caractéristiques d'un maillage.
Definition MeshKind.h:64
Arguments pour IMeshModifier::addCells().
Arguments pour IMeshModifier::addFaces().
Informations un maillage partitionné.
Gestionnaire de contraintes de partitionnement de maillage.
static eItemKind kindTranspose(eItemKind kindA, IMesh *meshA, IMesh *meshB)
Transpose le genre kindA du maillage meshA en le genre associé dans meshB.
Variables contenant les informations de connectivités communes aux maillages 1D, 2D et 3D.
VariableScalarString m_parent_group_name
Nom du groupe parent.
VariableScalarInteger m_mesh_connectivity
Connectivité du maillage.
VariableScalarInteger m_mesh_dimension
Dimension du maillage.
VariableArrayString m_item_families_name
Noms des familles d'entités.
VariableScalarString m_parent_mesh_name
Nom du maillage parent.
VariableArrayString m_child_meshes_name
Noms des maillages parentés.
VariableArrayInteger m_item_families_kind
Genre des entités des familles.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
Noeud d'un maillage.
Definition Item.h:573
void addObserver(T *obj, void(T::*func)(const IObservable &), IObservable *oba)
Ajoute un observateur.
Liste de propriétés.
Definition Properties.h:64
bool getBool(const String &name) const
Valeur de la propriété de nom name.
void destroy()
Supprime les valeurs associées des propriétés associées à cette référence.
void setBool(const String &name, bool value)
Positionne une propriété de type bool de nom name et de valeur value.
Structure contenant les informations pour créer un service.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Créé une instance implémentant l'interface InterfaceType.
Propriétés de création d'un service.
Implémentation du gestionnaire d'interfaces liées.
Postionne le nom de l'action en cours d'exécution.
Definition Timer.h:110
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
Fonctions utilitaires sur un maillage.
Collection de variables.
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
const DataType & value() const
Valeur du scalaire.
virtual Integer checkIfSync(int max_print=0)
Vérifie si la variable est bien synchronisée.
String name() const
Nom de la variable.
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
bool null() const
Vrai si le noeud est nul.
Definition XmlNode.h:294
Famille de mailles.
Definition CellFamily.h:46
virtual void internalRemoveItems(Int32ConstArrayView local_ids, bool keep_ghost=false) override
void _addParentCellToCell(Cell cell, Cell parent_cell)
AMR.
void setCheckLevel(Integer level) override
Positionne le niveau de vérification du maillage.
void checkValidMeshFull() override
Vérification de la validité du maillage.
void checkGhostCells()
Vérifie que la couche de mailles fantômes est correcte.
void checkItemGroupsSynchronization() override
Vérifie la synchronisation sur les groupes d'entités.
Integer checkLevel() const override
Niveau actuel de vérification.
void checkVariablesSynchronization() override
Vérifie la synchronisation des variables.
void checkValidMesh() override
Vérification sommaire de la validité du maillage. Les vérifications portent sur les points suivants:
IPrimaryMesh * createMesh(IMeshMng *mm, const MeshBuildInfo &build_info) override
Créé un maillage avec les informations de build_info.
void build() override
Construction de niveau build du service.
Construction d'un maillage de manière incrémentale.
void addNodes2(Int64ConstArrayView nodes_uid, Integer sub_domain_id, Int32ArrayView nodes)
Ajoute des noeuds au maillage actuel. Utilise l'ajout d'item générique basé sur dépendances entre fam...
void computeFacesUniqueIds()
Calcul les numéros uniques de chaque face.
void setConnectivity(Integer c)
Définit la connectivité active pour le maillage associé
void addParentCells(const ItemVectorView &items)
Ajout au maillage courant d'item venant d'un maillage parent.
void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Ajoute des mailles au maillage actuel.
void resetAfterDeallocate()
Remise à zéro des structures pour pouvoir faire à nouveau une allocation.
void addGhostChildFromParent(Array< Int64 > &ghost_cell_to_refine)
AMR.
void addNodes(Int64ConstArrayView nodes_uid, Integer sub_domain_id, Int32ArrayView nodes)
Ajoute des noeuds au maillage actuel.
void addFaces(Integer nb_face, Int64ConstArrayView face_infos, Integer sub_domain_id, Int32ArrayView faces)
Ajoute des faces au maillage actuel.
void addEdges(Integer nb_edge, Int64ConstArrayView edge_infos, Integer sub_domain_id, Int32ArrayView edges)
Ajoute des arêtes au maillage actuel.
void addHChildrenCells(Cell hParent_cell, Integer nb_cell, Int64ConstArrayView cells_infos, Int32 sub_domain_id, Int32ArrayView cells, bool allow_build_face)
Ajoute des mailles au maillage actuel.
void removeNeedRemoveMarkedItems()
Supprime les items fantômes.
void addCells3(Integer nb_cell, Int64ConstArrayView cell_infos, Integer sub_domain_id, Int32ArrayView cells, bool allow_build_face=true)
Ajoute des mailles au maillage actuel. Utilise l'ajout d'item générique basé sur dépendances entre fa...
Informations pour un échange de maillage entre sous-domaines.
IItemConnectivityMng * dofConnectivityMng() const noexcept override
Renvoie le gestionnaire de connectivités des dofs.
void removeNeedRemoveMarkedItems() override
Suppression des items qui quittent le sous-domaine. Cette méthode est appelée dans MeshExchanger.
void setMeshKind(const MeshKind &v) override
Positionne le type de maillage.
IPolyhedralMeshModifier * polyhedralMeshModifier() const noexcept override
Implémentation d'un maillage.
Definition DynamicMesh.h:97
IPrimaryMesh * toPrimaryMesh() override
Retourne l'instance sous la forme d'un IPrimaryMesh.
FaceGroup ownActiveFaces() override
Groupe de toutes les faces actives sur la frontière.
void computeSynchronizeInfos() override
Recalcule les informations de synchronisation.
void flagCellToRefine(Int32ConstArrayView cells_lids) override
AMR.
IMeshPartitionConstraintMng * partitionConstraintMng() override
Gestionnaire des contraintes de partitionnement associées à ce maillage.
void checkValidMeshFull() override
Vérification de la validité du maillage.
Integer checkLevel() const override
Niveau actuel de vérification.
VariableItemInt32 & itemsNewOwner(eItemKind ik) override
Variable contenant l'identifiant du sous-domaine propriétaire.
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
FaceGroup outerActiveFaces() override
Groupe de toutes les faces actives sur la frontière.
void addExtraGhostCellsBuilder(IExtraGhostCellsBuilder *builder) override
ajout du algorithme d'ajout de mailles fantômes "extraordinaires".
IItemFamily * cellFamily() override
Retourne la famille des mailles.
IMeshCollection childMeshes() const override
Liste des sous-maillages du maillage courant.
void endAllocate() override
Indique une fin d'allocation de mailles.
FaceGroup allFaces() override
Groupe de toutes les faces.
void _internalEndUpdateFinal(bool print_stat)
void addEdges(Integer nb_edge, Int64ConstArrayView edge_infos, Int32ArrayView edges) override
Ajoute des arêtes.
IMeshModifierInternal * _modifierInternalApi() override
API interne à Arcane.
UniqueArray< ItemFamily * > m_true_item_families
Liste des implémentations des familles d'entités.
CellGroup allActiveCells() override
AMR.
ITraceMng * traceMng() override
Gestionnaire de message associé
void setDimension(Integer dim) override
Positionne la dimension du maillage (1D, 2D ou 3D).
IParallelMng * parallelMng() override
Gestionnaire de parallèlisme.
Integer nbCell() override
Nombre de mailles du maillage.
ItemGroup findGroup(const String &name) override
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
bool isPrimaryMesh() const override
Indique si l'instance est un maillage primaire.
IMeshChecker * checker() const override
Interface du vérificateur.
IMesh * mesh() override
Maillage associé
void removeExtraGhostCellsBuilder(IExtraGhostCellsBuilder *builder) override
Supprime l'association à l'instance builder.
void mergeMeshes(ConstArrayView< IMesh * > meshes) override
Fusionne les maillages de meshes avec le maillage actuel.
VariableNodeReal3 & nodesCoordinates() override
Coordonnées des noeuds.
IItemFamily * createItemFamily(eItemKind ik, const String &name) override
Créé une famille de particule de nom name.
String name() const override
Nom du maillage.
IMeshMng * meshMng() const override
Gestionnaire de maillage associé
void setCheckLevel(Integer level) override
Positionne le niveau de vérification du maillage.
NodeGroup ownNodes() override
Groupe de tous les noeuds propres au domaine.
void _readFromDump()
Recharge le maillage à partir des variables protégés.
EdgeGroup ownEdges() override
Groupe de toutes les arêtes propres au domaine.
void serializeCells(ISerializer *buffer, Int32ConstArrayView cells_local_id) override
void reloadMesh() override
Recharge le maillage à partir des variables protégées.
IMeshModifier * modifier() override
Interface de modification associée.
void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Int32ArrayView cells) override
Ajoute des mailles.
IItemFamilyModifier * findItemFamilyModifier(eItemKind ik, const String &name) override
Retourne l'interface IItemFamilyModifier pour famille de nom name et de type ik.
bool hasTiedInterface() override
Vrai s'il existe des interfaces semi-conformes dans le maillage.
VariableScalarInteger connectivity() override
Descripteur de connectivité
void addExtraGhostParticlesBuilder(IExtraGhostParticlesBuilder *builder) override
Ajout du algorithme d'ajout de particules fantômes "extraordinaires".
void exchangeItems() override
Change les sous-domaines propriétaires des entités.
void prepareForDump() override
Prépare l'instance en vue d'une protection.
SharedVariableNodeReal3 sharedNodesCoordinates() override
Coordonnées des noeuds.
void deallocate() override
Désalloue le maillage.
ItemGroupCollection groups() override
Liste des groupes.
void clearItems() override
Supprime toutes les entitées de toutes les familles de ce maillage.
void updateGhostLayers() override
ItemFamilyList m_item_families
Liste des interfaces familles d'entités.
EdgeGroup allEdges() override
Groupe de toutes les arêtes.
void detachCells(Int32ConstArrayView cells_local_id) override
Détache des mailles du maillage.
Integer nbNode() override
Nombre de noeuds du maillage.
CellGroup allCells() override
Groupe de toutes les mailles.
FaceGroup outerFaces() override
Groupe de toutes les faces sur la frontière.
IVariableMng * variableMng() const override
Gestionnaire de variable associé
IGhostLayerMng * ghostLayerMng() const override
Gestionnare de couche fantômes associé
void addChildMesh(IMesh *sub_mesh) override
Ajoute un sous-maillage au maillage parent.
void endUpdate() override
Notifie l'instance de la fin de la modification du maillage.
TiedInterfaceCollection tiedInterfaces() override
Liste des interfaces semi-conformes.
void synchronizeGroupsAndVariables() override
Synchronise tous les groupes et les variables du maillage.
void defineParentForBuild(IMesh *mesh, ItemGroup group) override
Définit les maillage et groupe parents.
InternalConnectivityPolicy _connectivityPolicy() const override
Politique d'utilisation des connectivitées.
void removeDetachedCells(Int32ConstArrayView cells_local_id) override
Supprime les mailles détachées.
Integer nbEdge() override
Nombre d'arêtes du maillage.
FaceGroup ownFaces() override
Groupe de toutes les faces propres au domaine.
IItemFamily * faceFamily() override
Retourne la famille des faces.
void addHChildrenCells(Cell parent_cell, Integer nb_cell, Int64ConstArrayView cells_infos, Int32ArrayView cells) override
AMR.
ItemGroup parentGroup() const override
Groupe parent.
void removeExtraGhostParticlesBuilder(IExtraGhostParticlesBuilder *builder) override
Supprime l'association à l'instance builder.
void destroyGroups() override
Détruit tous les groupes de toutes les familles.
void _saveProperties()
Sauve les propriétés avant une protection.
Integer nbFace() override
Nombre de faces du maillage.
IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed, bool register_modifier_if_created) override
Retourne la famille de nom name.
const MeshKind meshKind() const override
Caractéristiques du maillage.
Properties * properties() override
Propriétés associées à ce maillage.
FaceGroup allActiveFaces() override
Groupe de toutes les faces actives.
CellGroup ownCells() override
Groupe de toutes les mailles propres au domaine.
IMeshInternal * _internalApi() override
API interne à Arcane.
IItemFamilyNetwork * itemFamilyNetwork() override
Interface du réseau de familles (familles connectées)
void computeTiedInterfaces(const XmlNode &xml_node) override
Détermine les interfaces de semi-conformités.
IMesh * parentMesh() const override
Accès au maillage parent.
void setMeshPartInfo(const MeshPartInfo &mpi) override
Positionne les informations de partitionnement.
CellGroup ownActiveCells() override
Groupe de toutes les mailles actives et propres au domaine.
ISubDomain * subDomain() override
Sous-domaine associé
void _loadProperties()
Relit les propriétés depuis une protection.
void checkValidMesh() override
Vérification de la validité des structues internes de maillage (interne)
void initializeVariables(const XmlNode &init_node) override
void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes) override
Ajoute des noeuds.
void updateGhostLayerFromParent(Array< Int64 > &ghost_cell_to_refine, Array< Int64 > &cells_to_coarsen, bool remove_old_ghost) override
AMR.
FaceGroup innerActiveFaces() override
Groupe de toutes les faces actives.
NodeGroup allNodes() override
Groupe de tous les noeuds.
void _prepareForDump()
Prépare les variables pour une protection.
void allocateCells(Integer mesh_nb_cell, Int64ConstArrayView cells_info, bool one_alloc) override
Allocation d'un maillage.
IItemFamily * edgeFamily() override
Retourne la famille des arêtes.
IMeshUtilities * utilities() override
Interface des fonctions utilitaires associée.
void _updateGroupsAfterRemove()
Met à jour les groupes suite à des suppressions d'entités.
void _multipleExchangeItems(Integer nb_exchange, Integer version, bool do_compact)
Echange les entités en plusieurs fois.
void _prepareForDumpReal()
Prépare les variables pour une protection.
ItemGroupList m_all_groups
Liste des groupes d'entités.
MeshRefinement * m_mesh_refinement
AMR.
CellGroup ownLevelCells(const Integer &level) override
Groupe de toutes les mailles propres de niveau level.
CellGroup allLevelCells(const Integer &level) override
Groupe de toutes les mailles de niveau level.
void addFaces(Integer nb_face, Int64ConstArrayView face_infos, Int32ArrayView faces) override
Ajoute des faces.
Famille d'arêtes.
Definition EdgeFamily.h:35
void setConnectivity(const Integer c)
Définit la connectivité active pour le maillage associé
Famille de faces.
Definition FaceFamily.h:53
void setCheckOrientation(bool is_check)
Indique s'il faut vérifier l'orientation des mailles et des faces.
Definition FaceFamily.h:134
Interface du gestionnaire des connectivités incrémentales indexées sur les entités.
Famille d'entités.
Definition ItemFamily.h:76
VariableItemInt32 & itemsNewOwner() override
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
Integer nbItem() const override
Nombre d'entités.
ItemInternalList itemsInternal() override
Tableau interne des entités.
IItemFamilyPolicyMng * policyMng() override
Interface des comportements/politiques associées à cette famille.
Definition ItemFamily.h:271
Tableau associatif de ItemInternal.
Informations pour échanger des entités d'une famille donnée et leur caractéristiques.
Implémentation des algorithmes d'adaptation par raffinement de maillages non-structuré.
bool coarsenItemsV2(bool update_parent_flag)
Méthode permettant de retirer les mailles marquées avec le flag "II_Coarsen".
bool refineAndCoarsenItems(const bool maintain_level_one=true)
bool refineItems(const bool maintain_level_one=true)
bool coarsenItems(const bool maintain_level_one=true)
virtual void flagCellToRefine(Int32ConstArrayView cells_lids)
Passage de l'erreur commise par maille au flag de raffinement.
Gestionnaire de numérotation des uniqueId() d'un maillage.
Famille de noeuds.
Definition NodeFamily.h:37
void setConnectivity(const Integer c)
Définit la connectivité active pour le maillage associé
Famille de particules.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Vue constante d'un tableau de type T.
constexpr bool empty() const noexcept
true si le tableau est vide (size()==0)
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
TraceMessage pwarning() const
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
Positionne une classe de message.
Vecteur 1D de données avec sémantique par valeur (style STL).
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
Definition MathUtils.h:392
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
@ None
Aucune politique d'exécution.
Integer toInteger(Real r)
Converti un Real en Integer.
Definition Convert.h:45
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:572
SharedMeshVariableScalarRefT< Node, Real3 > SharedVariableNodeReal3
Grandeur au noeud de type coordonnées.
@ ST_Application
Le service s'utilise au niveau de l'application.
eMeshEventType
Evènements générés par IMesh.
Definition MeshEvents.h:30
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
@ BeginPrepareDump
Evènement envoyé au début de prepareForDump()
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:217
InternalConnectivityPolicy
Politique d'utilisation des connectivités.
Definition ItemTypes.h:516
@ NewOnly
Alloue uniquement les nouvelles connectivités.
@ NewWithDependenciesAndLegacy
Alloue les anciennes et les nouvelles connectivités utilise les nouvelles via les nouveaux accesseurs...
eMeshAMRKind
Type de maillage AMR.
Definition MeshKind.h:41
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:543
Int32 Integer
Type représentant un entier.
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.