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