14#include "arcane/utils/ArcanePrecomp.h"
15#include "arcane/utils/HashTableMap.h"
16#include "arcane/utils/ArgumentException.h"
17#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/StringBuilder.h"
20#include "arcane/utils/MultiArray2.h"
22#define INSURE_CONSTRAINTS
24#include "arcane/core/ServiceBuildInfo.h"
25#include "arcane/core/IMesh.h"
26#include "arcane/core/IMeshModifier.h"
27#include "arcane/core/IMeshSubMeshTransition.h"
28#include "arcane/core/IMeshUtilities.h"
29#include "arcane/core/IItemFamily.h"
30#include "arcane/core/ItemGroup.h"
31#include "arcane/core/ItemPrinter.h"
32#include "arcane/core/ISubDomain.h"
33#include "arcane/core/IParallelMng.h"
35#include "arcane/core/IVariableMng.h"
36#include "arcane/core/VariableTypes.h"
37#include "arcane/core/CommonVariables.h"
38#include "arcane/core/IMeshPartitionConstraintMng.h"
39#include "arcane/core/ILoadBalanceMng.h"
40#include "arcane/core/MeshKind.h"
41#include "arcane/core/internal/ILoadBalanceMngInternal.h"
43#include "arcane/std/MeshPartitionerBase.h"
57, m_sub_domain(sbi.subDomain())
59, m_cell_family(sbi.
mesh()->cellFamily())
60, m_lbMng(sbi.subDomain()->loadBalanceMng())
61, m_lb_mng_internal(sbi.subDomain()->loadBalanceMng()->_internalApi())
63 IParallelMng* pm = m_mesh->parallelMng();
65 m_is_non_manifold_mesh = m_mesh->meshKind().isNonManifold();
75 delete m_unique_id_reference;
81void* MeshPartitionerBase::
82getCommunicator()
const
84 return m_pm_sub->getMPICommunicator();
90Parallel::Communicator MeshPartitionerBase::
93 return m_pm_sub->communicator();
99void MeshPartitionerBase::
100changeOwnersFromCells()
102 m_mesh->utilities()->changeOwnersFromCells();
108void MeshPartitionerBase::
109initConstraints(
bool uidref)
111 m_mesh_dimension = m_mesh->dimension();
113 _initArrayCellsWithConstraints();
115 _initFilterLidCells();
120 _initLid2LidCompacted();
122 _initNbCellsWithConstraints();
124 m_lb_mng_internal->initAccess(m_mesh);
126 info() <<
"Weight (" << subDomain()->commonVariables().globalIteration()
127 <<
"): " << m_lb_mng_internal->nbCriteria(m_mesh);
133void MeshPartitionerBase::
136 m_lb_mng_internal->endAccess();
138 m_cells_with_constraints.clear();
139 m_cells_with_weak_constraints.clear();
140 m_nb_cells_with_constraints = 0;
141 m_filter_lid_cells.clear();
142 m_local_id_2_local_id_compacted.clear();
143 delete m_unique_id_reference;
144 m_unique_id_reference =
nullptr;
151bool MeshPartitionerBase::
152_createConstraintsLists(Int64MultiArray2& tied_uids)
157 m_cells_with_constraints.clear();
159 IItemFamily* cellFamily = m_mesh->itemFamily(IK_Cell);
162 for( Integer i=0, n=tied_uids.dim1Size(); i<n; ++i ){
168 cellFamily->itemsUniqueIdToLocalId(lids,uids,
false);
173 for( Integer j=0, js=lids.size(); j<js; ++j ){
175 if (lid!=NULL_ITEM_LOCAL_ID)
180 ItemVectorView items_view = cellFamily->view(lids_loc);
181 SharedArray<Cell> cells;
182 for ( Integer j=0, js=items_view.size(); j<js; j++)
183 if (items_view[j].isOwn())
184 cells.add(items_view[j].toCell());
187 allLocal += (((cells.size() == 0)||
188 (cells.size() == uids.size()))?0:1);
192 m_cells_with_constraints.add(cells);
194 IParallelMng* pm = m_mesh->parallelMng();
197 int sum = pm->reduce(Parallel::ReduceSum,allLocal);
204void MeshPartitionerBase::
205_initArrayCellsWithConstraints()
208 m_cells_with_constraints.clear();
209 m_cells_with_weak_constraints.clear();
211 if (!m_mesh->partitionConstraintMng())
223 m_mesh->partitionConstraintMng()->computeConstraintList(tied_uids);
225#ifdef INSURE_CONSTRAINTS
226 if (!_createConstraintsLists(tied_uids)) {
227 if (m_is_non_manifold_mesh)
228 ARCANE_FATAL(
"Constraints are not supported for non manifold mesh");
232 cells_new_owner[icell] = (*icell).owner();
234 m_mesh->modifier()->setDynamic(
true);
235 m_mesh->partitionConstraintMng()->computeAndApplyConstraints();
236 m_mesh->utilities()->changeOwnersFromCells();
237 m_mesh->toPrimaryMesh()->exchangeItems();
239 if (!_createConstraintsLists(tied_uids))
240 throw FatalErrorException(A_FUNCINFO,
"Issue with constraints !");
241#ifdef INSURE_CONSTRAINTS
243 m_mesh->partitionConstraintMng()->computeWeakConstraintList(tied_uids);
245 for(Integer i=0;i<tied_uids.dim1Size();++i)
247 std::pair<Int64, Int64> ids(tied_uids[i][0],tied_uids[i][1]);
248 m_cells_with_weak_constraints.insert(ids);
256void MeshPartitionerBase::
259 CellGroup all_cells = m_mesh->allCells();
262 m_filter_lid_cells.resize(m_mesh->cellFamily()->maxLocalId());
263 m_filter_lid_cells.fill(eCellGhost);
266 m_filter_lid_cells[icell->localId()] = eCellClassical;
269 for (Integer i=0; i<m_cells_with_constraints.size(); ++i){
270 Array<Cell> & listCell = m_cells_with_constraints[i];
271 m_filter_lid_cells[listCell[0].localId()] = eCellReference;
272 for (Integer j=1; j<listCell.size(); ++j) {
274 if (m_filter_lid_cells[listCell[j].localId()] != eCellClassical)
275 info() <<
"Pb in constraint " << i <<
" with cell[" << j
276 <<
"] = " << listCell[j].uniqueId();
278 m_filter_lid_cells[listCell[j].localId()] = eCellGrouped;
286void MeshPartitionerBase::
289 if (!m_unique_id_reference)
290 m_unique_id_reference =
new VariableCellInt64(VariableBuildInfo(m_mesh,
"CellUniqueIdRef", IVariable::PNoDump));
296void MeshPartitionerBase::
305 uids_ref[icell] = icell->uniqueId();
307 for (Integer i=0; i<m_cells_with_constraints.size(); ++i){
308 Array<Cell> & listCell = m_cells_with_constraints[i];
309 Int64 id_ref = listCell[0].uniqueId();
310 for (Integer j=1; j<listCell.size(); ++j)
311 uids_ref[listCell[j]] = id_ref;
313 uids_ref.synchronize();
319void MeshPartitionerBase::
320_initUidRef(VariableCellInteger& cell_renum_uid)
329 uids_ref[icell] = cell_renum_uid[icell];
331 for (Integer i=0; i<m_cells_with_constraints.size(); ++i){
332 Array<Cell> & listCell = m_cells_with_constraints[i];
333 Int64 id_ref = cell_renum_uid[listCell[0]];
334 for (Integer j=1; j<listCell.size(); ++j)
335 uids_ref[listCell[j]] = id_ref;
337 uids_ref.synchronize();
344void MeshPartitionerBase::
345_initLid2LidCompacted()
350 m_local_id_2_local_id_compacted.resize(m_mesh->cellFamily()->maxLocalId());
351 m_check.resize(m_mesh->cellFamily()->maxLocalId());
355 switch (m_filter_lid_cells[icell.itemLocalId()]){
358 m_local_id_2_local_id_compacted[icell->localId()] = index++;
363 m_local_id_2_local_id_compacted[icell->localId()] = -1;
373void MeshPartitionerBase::
374_initNbCellsWithConstraints()
377 m_nb_cells_with_constraints = m_mesh->ownCells().size();
378 for (
Integer i=0; i<m_cells_with_constraints.size(); ++i){
379 m_nb_cells_with_constraints -= (m_cells_with_constraints[i].size()-1);
383 for (Integer i=0; i<m_cells_with_constraints.size(); ++i){
384 Array<Cell> & listCell = m_cells_with_constraints[i];
385 for (Integer j = 1 ; j < listCell.size() ; ++j) {
386 if (m_filter_lid_cells[listCell[j].localId()] != eCellGrouped) {
387 info() <<
"Pb in group " << i <<
" " << listCell[j].localId() <<
"is not grouped";
390 info() <<
"Group of size " << i <<
" : " << listCell.size();
394 info() <<
"allCells().size() = "<<m_mesh->allCells().size();
395 info() <<
"ownCells().size() = "<<m_mesh->ownCells().size();
396 info() <<
"m_nb_cells_with_constraints = "<<m_nb_cells_with_constraints;
401Int32 MeshPartitionerBase::
402nbOwnCellsWithConstraints()
const
404 return m_nb_cells_with_constraints;
410nbNeighbourCellsWithConstraints(Cell cell)
414 if (m_filter_lid_cells[cell.localId()] == eCellClassical
415 || m_filter_lid_cells[cell.localId()] == eCellReference) {
418 getNeighbourCellsUidWithConstraints(cell, neighbors);
419 nbNeighbors = neighbors.size();
423 return (nbNeighbors);
428Real MeshPartitionerBase::
429_addNgb(
const Cell& cell,
const Face& face,
430 Int64Array& neighbourcells, Array<bool>& contrib,
431 HashTableMapT<Int64,Int32>& map,
432 Array<float> *ptrcommWeights, Int32 offset,
433 HashTableMapT<Int32,Int32>& lids,
bool special)
435 ARCANE_UNUSED(contrib);
438 Int64 uid = (*m_unique_id_reference)[cell];
440 Int32 myoffset = neighbourcells.size();
443 const float face_comm_cost =
static_cast<float>(commCost[face]);
445 if ((!special) &&(m_filter_lid_cells[cell.localId()] == eCellClassical))
448 HashTableMapT<Int64,Int32>::Data* ptr;
449 ptr = map.lookupAdd(uid, myoffset, toAdd);
450 if (!toAdd && ptrcommWeights) {
451 myoffset = ptr->value();
452 (*ptrcommWeights)[offset + myoffset] += face_comm_cost;
456 neighbourcells.add(uid);
458 (*ptrcommWeights).add(face_comm_cost);
479Real MeshPartitionerBase::
480getNeighbourCellsUidWithConstraints(Cell cell, Int64Array& neighbourcells,
481 Array<float> *ptrcommWeights,
482 bool no_cell_contrib)
484 ARCANE_UNUSED(no_cell_contrib);
489 if ((m_filter_lid_cells[cell.localId()] != eCellClassical)
490 &&(m_filter_lid_cells[cell.localId()] != eCellReference))
494 offset = (*ptrcommWeights).size();
496 neighbourcells.resize(0);
500 Int64 uid = uids_ref[cell];
504 Integer nbFaces = cell.nbFace();
507 if (m_filter_lid_cells[cell.localId()] == eCellReference) {
508 for (index=0; index<m_cells_with_constraints.size() && m_cells_with_constraints[index][0] != cell; ++index){
510 if (index==m_cells_with_constraints.size())
511 throw FatalErrorException(A_FUNCINFO,
"Unable to find cell");
513 Array<Cell>& listCell = m_cells_with_constraints[index];
516 for (Integer j=1; j<listCell.size(); ++j) {
517 m_filter_lid_cells[listCell[j].localId()] = eCellInAConstraint;
518 nbFaces += listCell[j].nbFace();
522 HashTableMapT<Int64,Int32> difficultNgb(nbFaces,
true);
523 HashTableMapT<Int32,Int32> lids(nbFaces,
true);
524 UniqueArray<bool>contrib(nbFaces);
528 if (m_filter_lid_cells[cell.localId()] == eCellClassical){
529 if (m_is_non_manifold_mesh && cell.hasFlags(ItemFlags::II_HasEdgeFor1DItems)) {
535 for (Edge sub_edge : cell.edges()) {
537 if (sub_edge.nbCell() >= 2) {
538 for (Cell sub_cell : sub_edge.cells()) {
539 if (sub_cell != cell && sub_cell.hasFlags(ItemFlags::II_HasEdgeFor1DItems)) {
541 neighbourcells.add((*m_unique_id_reference)[sub_cell]);
544 (*ptrcommWeights).add(1.0f);
551 for (Integer z = 0; z < cell.nbFace(); ++z) {
552 Face face = cell.face(z);
554 if (face.nbCell() == 2) {
556 Cell opposite_cell = (face.cell(0) != cell ? face.cell(0) : face.cell(1));
557 hg_contrib += _addNgb(opposite_cell, face, neighbourcells, contrib, difficultNgb,
558 ptrcommWeights, offset, lids);
571 Array<Cell>& listCell = m_cells_with_constraints[index];
572 m_filter_lid_cells[listCell[0].localId()] = eCellInAConstraint;
574 for (Integer j=0; j<listCell.size(); ++j){
578 for( Integer z=0; z<listCell[j].nbFace(); ++z ){
579 const Face& face = listCell[j].face(z);
581 if ((face.nbCell()==2)
582 && (m_filter_lid_cells[face.cell(0).localId()] != eCellInAConstraint
583 || m_filter_lid_cells[face.cell(1).localId()] != eCellInAConstraint)){
585 const Cell& opposite_cell = (m_filter_lid_cells[face.cell(0).localId()] != eCellInAConstraint?
586 face.cell(0):face.cell(1));
587 hg_contrib += _addNgb(opposite_cell, face, neighbourcells, contrib, difficultNgb,
588 ptrcommWeights, offset, lids,
true);
599 m_filter_lid_cells[listCell[0].localId()] = eCellReference;
600 for (Integer j=1; j<listCell.size(); ++j)
601 m_filter_lid_cells[listCell[j].localId()] = eCellGrouped;
609void MeshPartitionerBase::
610getNeighbourNodesUidWithConstraints(Cell cell, Int64UniqueArray neighbournodes)
612 neighbournodes.resize(cell.nbNode());
614 for( Integer z=0; z<cell.nbNode(); ++z ){
615 neighbournodes[z] = cell.node(z).uniqueId();
620Int32 MeshPartitionerBase::
621localIdWithConstraints(Cell cell)
623 return m_local_id_2_local_id_compacted[cell.localId()];
626Int32 MeshPartitionerBase::
627localIdWithConstraints(Int32 cell_lid)
630 return m_local_id_2_local_id_compacted[cell_lid];
634void MeshPartitionerBase::
635invertArrayLid2LidCompacted()
639 for (Integer i=0; i<m_mesh->allCells().size(); i++){
640 if (m_local_id_2_local_id_compacted[i] != -1)
641 m_local_id_2_local_id_compacted[index++] = i;
643 for (;index<m_mesh->allCells().size(); index++)
644 m_local_id_2_local_id_compacted[index] = -2;
648SharedArray<float> MeshPartitionerBase::
649cellsSizeWithConstraints()
652 return _cellsProjectWeights(mWgt);
655SharedArray<float> MeshPartitionerBase::
656cellsWeightsWithConstraints(Int32 max_nb_weight,
bool ask_lb_cells)
658 ARCANE_UNUSED(ask_lb_cells);
660 Int32 nb_weight = max_nb_weight;
662 Int32 nb_criteria = m_lb_mng_internal->nbCriteria(m_mesh);
664 if (max_nb_weight <= 0 || max_nb_weight > nb_criteria)
665 nb_weight = nb_criteria;
667 info() <<
"Number of weights " << nb_weight <<
" / " << nb_criteria;
670 return _cellsProjectWeights(mWgt, nb_weight);
676SharedArray<float> MeshPartitionerBase::
677_cellsProjectWeights(VariableCellArrayReal& cellWgtIn, Int32 nbWgt)
const
679 SharedArray<float> cellWgtOut(nbOwnCellsWithConstraints()*nbWgt);
680 if (nbWgt > cellWgtIn.arraySize()) {
681 ARCANE_FATAL(
"Asked for too many weights n={0} array_size={1}",nbWgt,cellWgtIn.arraySize());
685 if(m_filter_lid_cells[icell->localId()]==eCellClassical)
686 for (
int i = 0 ; i < nbWgt ; ++i){
687 float v =
static_cast<float>(cellWgtIn[icell][i]);
688 cellWgtOut[m_local_id_2_local_id_compacted[icell->localId()]*nbWgt+i] = v;
692 for(
auto& ptr : m_cells_with_constraints ){
694 for(
const auto& cell : ptr ){
695 for (
int i = 0 ; i <nbWgt ; ++i)
696 w[i] += cellWgtIn[cell][i];
698 for (
int i=0 ; i<nbWgt ; ++i)
699 cellWgtOut[m_local_id_2_local_id_compacted[ptr[0].localId()]*nbWgt+i] = (float)(w[i]);
707SharedArray<float> MeshPartitionerBase::
708_cellsProjectWeights(VariableCellReal& cellWgtIn)
const
710 SharedArray<float> cellWgtOut(nbOwnCellsWithConstraints());
713 if(m_filter_lid_cells[icell->localId()]==eCellClassical)
714 cellWgtOut[m_local_id_2_local_id_compacted[icell->localId()]]
715 = (float)cellWgtIn[icell];
717 for(
auto& ptr : m_cells_with_constraints ){
719 for( Cell cell : ptr ){
720 w += cellWgtIn[cell];
722 cellWgtOut[m_local_id_2_local_id_compacted[ptr[0].localId()]]
730bool MeshPartitionerBase::
731cellUsedWithConstraints(Cell cell)
733 eMarkCellWithConstraint marque = m_filter_lid_cells[cell.localId()];
735 return (marque == eCellClassical || marque == eCellReference);
738bool MeshPartitionerBase::
739cellUsedWithWeakConstraints(std::pair<Int64,Int64>& paired_item)
741 std::pair<Int64,Int64> other_pair(paired_item.second, paired_item.first);
742 return ((m_cells_with_weak_constraints.find(paired_item)!=m_cells_with_weak_constraints.end()) || m_cells_with_weak_constraints.find(other_pair)!=m_cells_with_weak_constraints.end());
746void MeshPartitionerBase::
747changeCellOwner(Item cell, VariableItemInt32& cells_new_owner, Int32 new_owner)
752 cells_new_owner[cell] = new_owner;
754 if (m_filter_lid_cells[cell.localId()] == eCellReference){
756 for (index=0; index<m_cells_with_constraints.size() && m_cells_with_constraints[index][0] != cell; ++index){
758 if (index==m_cells_with_constraints.size())
759 throw FatalErrorException(
"MeshPartitionerBase::changeCellOwner(): unable to find cell");
761 Array<Cell>& listCell = m_cells_with_constraints[index];
763 for (Integer i=1; i<listCell.size(); i++)
764 cells_new_owner[listCell[i]] = new_owner;
776 m_lb_mng_internal->reset(m_mesh);
779 for (
int i = 0 ; i <nb_weight ; ++i) {
786 (myvar)[icell] = weights[icell->localId()*nb_weight+i];
788 m_lb_mng_internal->addCriterion(myvar, m_mesh);
791 m_lb_mng_internal->initAccess(m_mesh);
792 m_lb_mng_internal->setMassAsCriterion(m_mesh,
false);
793 m_lb_mng_internal->setNbCellsAsCriterion(m_mesh,
false);
802 return math::max(m_lb_mng_internal->nbCriteria(m_mesh), 1);
805ArrayView<float> MeshPartitionerBase::
811void MeshPartitionerBase::
821template <
class ArrayType> Parallel::Request
828 mysize[0] = data.
size();
839 if (!header.
null()) {
844 ofile << sum << std::endl;
847 for (
int rank = 0 ; rank < pm->
commSize() ; ++rank) {
849 pm->
recv(otherdata, rank,
true);
851 for (
int j = 0 ; (j < step) && myiter() ; ++j, ++myiter)
852 ofile << *myiter <<
" ";
879 if ((m_filter_lid_cells[icell->localId()]!=eCellClassical)
880 &&(m_filter_lid_cells[icell->localId()]!=eCellReference))
883 uid[i++] = uids_ref[icell];
898 myiterf() ; ++myiterf, ++myiterr)
899 (*myiterr) = (
Real) (*myiterf);
909 if ((m_filter_lid_cells[icell->localId()]!=eCellClassical)
910 &&(m_filter_lid_cells[icell->localId()]!=eCellReference))
914 for(
Integer z=0, zs = (*icell).nbNode(); z<zs; ++z ){
915 const Node& node = (*icell).node(z);
916 my_coords[i] += coords[node];
931 if ((m_filter_lid_cells[icell->localId()]!=eCellClassical)
932 &&(m_filter_lid_cells[icell->localId()]!=eCellReference))
934 getNeighbourCellsUidWithConstraints(*icell, neighbourcells, &commWeights);
935 Int64 my_uid = uids_ref[icell];
936 for (
Integer j = 0 ; j < neighbourcells.
size() ; ++j) {
937 if (neighbourcells[j] > my_uid)
939 Real3 tmp(
static_cast<Real>(my_uid+1),
static_cast<Real>(neighbourcells[j]+1), commWeights[j]);
945 StringBuilder myheader =
"%%MatrixMarket matrix coordinate real symmetric\n";
946 myheader += nbvertices;
948 myheader += nbvertices;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
Classe de base d'un service.
Vue modifiable d'un tableau d'un type T.
void fill(const DataType &data)
Remplissage du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
interval d'itérateurs constant
Exception lorsqu'une erreur fatale est survenue.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void waitAllRequests(ArrayView< Request > rvalues)=0
Bloque en attendant que les requêtes rvalues soient terminées.
virtual void gather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf, Int32 rank)=0
Effectue un regroupement sur un processeurs. Il s'agit d'une opération collective....
virtual Integer masterIORank() const =0
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
@ PTemporary
Indique que la variable est temporaire.
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
interval d'itérateursCette classe gère un couple d'itérateurs autorisant la modification des éléments...
void setCellsWeight(ArrayView< float > weights, Integer nb_weight) override
Permet de définir les poids des objets à partitionner : on doit utiliser le ILoadBalanceMng maintenan...
IMesh * mesh() const override
Maillage associé au partitionneur.
virtual void dumpObject(String filename="toto")
Dump les informations de repartitionnement sur le disque.
Classe gérant un vecteur de réel de dimension 3.
Structure contenant les informations pour créer un service.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
MeshVariableScalarRefT< Cell, Real > VariableCellReal
Grandeur au centre des mailles de type réel.
MeshVariableScalarRefT< Cell, Int64 > VariableCellInt64
Grandeur au centre des mailles de type entier 64 bits.
ItemVariableScalarRefT< Real > VariableItemReal
Grandeur de type réel.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
MeshVariableArrayRefT< Cell, Real > VariableCellArrayReal
Grandeur au centre des mailles de type tableau de réel.
double toDouble(Real r)
Converti un Real en double.
@ ReduceSum
Somme des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Parallel::Request centralizePartInfo(String filename, IParallelMng *pm, UniqueArray< ArrayType > data, String header, int step=1)
Fonction auxiliaire pour dumper le graphe.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
MultiArray2< Int64 > Int64MultiArray2
Tableau 2D a taille variable d'entiers 64 bits.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
double Real
Type représentant un réel.
@ Cell
Le maillage est AMR par maille.