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