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"
21#include "arcane/utils/Convert.h"
23#define INSURE_CONSTRAINTS
25#include "arcane/core/ServiceBuildInfo.h"
26#include "arcane/core/IMesh.h"
27#include "arcane/core/IMeshModifier.h"
28#include "arcane/core/IMeshSubMeshTransition.h"
29#include "arcane/core/IMeshUtilities.h"
30#include "arcane/core/IItemFamily.h"
31#include "arcane/core/ItemGroup.h"
32#include "arcane/core/ItemPrinter.h"
33#include "arcane/core/ISubDomain.h"
34#include "arcane/core/IParallelMng.h"
36#include "arcane/core/IVariableMng.h"
37#include "arcane/core/VariableTypes.h"
38#include "arcane/core/CommonVariables.h"
39#include "arcane/core/IMeshPartitionConstraintMng.h"
40#include "arcane/core/ILoadBalanceMng.h"
41#include "arcane/core/MeshKind.h"
42#include "arcane/core/internal/ILoadBalanceMngInternal.h"
44#include "arcane/std/MeshPartitionerBase.h"
58, m_sub_domain(sbi.subDomain())
60, m_cell_family(sbi.
mesh()->cellFamily())
61, m_lbMng(sbi.subDomain()->loadBalanceMng())
62, m_lb_mng_internal(sbi.subDomain()->loadBalanceMng()->_internalApi())
64 IParallelMng* pm = m_mesh->parallelMng();
66 m_is_non_manifold_mesh = m_mesh->meshKind().isNonManifold();
76 delete m_unique_id_reference;
82void* MeshPartitionerBase::
83getCommunicator()
const
85 return m_pm_sub->getMPICommunicator();
91Parallel::Communicator MeshPartitionerBase::
94 return m_pm_sub->communicator();
100void MeshPartitionerBase::
101changeOwnersFromCells()
103 m_mesh->utilities()->changeOwnersFromCells();
109void MeshPartitionerBase::
110initConstraints(
bool uidref)
112 m_mesh_dimension = m_mesh->dimension();
114 _initArrayCellsWithConstraints();
116 _initFilterLidCells();
121 _initLid2LidCompacted();
123 _initNbCellsWithConstraints();
125 m_lb_mng_internal->initAccess(m_mesh);
127 info() <<
"Weight (" << subDomain()->commonVariables().globalIteration()
128 <<
"): " << m_lb_mng_internal->nbCriteria(m_mesh);
134void MeshPartitionerBase::
137 m_lb_mng_internal->endAccess();
139 m_cells_with_constraints.clear();
140 m_cells_with_weak_constraints.clear();
141 m_nb_cells_with_constraints = 0;
142 m_filter_lid_cells.clear();
143 m_local_id_2_local_id_compacted.clear();
144 delete m_unique_id_reference;
145 m_unique_id_reference =
nullptr;
152bool MeshPartitionerBase::
153_createConstraintsLists(Int64MultiArray2& tied_uids)
158 m_cells_with_constraints.clear();
160 IItemFamily* cellFamily = m_mesh->itemFamily(IK_Cell);
163 for (Integer i = 0, n = tied_uids.dim1Size(); i < n; ++i) {
169 cellFamily->itemsUniqueIdToLocalId(lids, uids,
false);
174 for (Integer j = 0, js = lids.size(); j < js; ++j) {
176 if (lid != NULL_ITEM_LOCAL_ID)
181 ItemVectorView items_view = cellFamily->view(lids_loc);
182 SharedArray<Cell> cells;
183 for (Integer j = 0, js = items_view.size(); j < js; j++)
184 if (items_view[j].isOwn())
185 cells.add(items_view[j].toCell());
188 allLocal += (((cells.size() == 0) ||
189 (cells.size() == uids.size()))
195 m_cells_with_constraints.add(cells);
197 IParallelMng* pm = m_mesh->parallelMng();
200 int sum = pm->reduce(Parallel::ReduceSum, allLocal);
207void MeshPartitionerBase::
208_initArrayCellsWithConstraints()
211 m_cells_with_constraints.clear();
212 m_cells_with_weak_constraints.clear();
214 if (!m_mesh->partitionConstraintMng())
225 m_mesh->partitionConstraintMng()->computeConstraintList(tied_uids);
227#ifdef INSURE_CONSTRAINTS
228 if (!_createConstraintsLists(tied_uids)) {
229 if (m_is_non_manifold_mesh)
230 ARCANE_FATAL(
"Constraints are not supported for non manifold mesh");
234 cells_new_owner[icell] = (*icell).owner();
236 m_mesh->modifier()->setDynamic(
true);
237 m_mesh->partitionConstraintMng()->computeAndApplyConstraints();
238 m_mesh->utilities()->changeOwnersFromCells();
239 m_mesh->toPrimaryMesh()->exchangeItems();
241 if (!_createConstraintsLists(tied_uids))
242 throw FatalErrorException(A_FUNCINFO,
"Issue with constraints !");
243#ifdef INSURE_CONSTRAINTS
245 m_mesh->partitionConstraintMng()->computeWeakConstraintList(tied_uids);
247 for (Integer i = 0; i < tied_uids.dim1Size(); ++i) {
248 std::pair<Int64, Int64> ids(tied_uids[i][0], tied_uids[i][1]);
249 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();
343void MeshPartitionerBase::
344_initLid2LidCompacted()
349 m_local_id_2_local_id_compacted.resize(m_mesh->cellFamily()->maxLocalId());
350 m_check.resize(m_mesh->cellFamily()->maxLocalId());
354 switch (m_filter_lid_cells[icell.itemLocalId()]) {
357 m_local_id_2_local_id_compacted[icell->localId()] = index++;
362 m_local_id_2_local_id_compacted[icell->localId()] = -1;
374void MeshPartitionerBase::
375_initNbCellsWithConstraints()
378 m_nb_cells_with_constraints = m_mesh->ownCells().size();
379 for (
Integer i = 0; i < m_cells_with_constraints.size(); ++i) {
380 m_nb_cells_with_constraints -= (m_cells_with_constraints[i].size() - 1);
384 for (Integer i=0; i<m_cells_with_constraints.size(); ++i){
385 Array<Cell> & listCell = m_cells_with_constraints[i];
386 for (Integer j = 1 ; j < listCell.size() ; ++j) {
387 if (m_filter_lid_cells[listCell[j].localId()] != eCellGrouped) {
388 info() <<
"Pb in group " << i <<
" " << listCell[j].localId() <<
"is not grouped";
391 info() <<
"Group of size " << i <<
" : " << listCell.size();
395 info() <<
"allCells().size() = " << m_mesh->allCells().size();
396 info() <<
"ownCells().size() = " << m_mesh->ownCells().size();
397 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 || m_filter_lid_cells[cell.localId()] == eCellReference) {
417 getNeighbourCellsUidWithConstraints(cell, neighbors);
418 nbNeighbors = neighbors.size();
422 return (nbNeighbors);
427Real MeshPartitionerBase::
428_addNgb(
const Cell& cell,
const Face& face,
429 Int64Array& neighbourcells, Array<bool>& contrib,
430 HashTableMapT<Int64, Int32>& map,
431 Array<float>* ptrcommWeights, Int32 offset,
432 HashTableMapT<Int32, Int32>& lids,
bool special)
434 ARCANE_UNUSED(contrib);
437 Int64 uid = (*m_unique_id_reference)[cell];
439 Int32 myoffset = neighbourcells.size();
442 const float face_comm_cost =
static_cast<float>(commCost[face]);
444 if ((!special) && (m_filter_lid_cells[cell.localId()] == eCellClassical))
447 HashTableMapT<Int64, Int32>::Data* ptr;
448 ptr = map.lookupAdd(uid, myoffset, toAdd);
449 if (!toAdd && ptrcommWeights) {
450 myoffset = ptr->value();
451 (*ptrcommWeights)[offset + myoffset] += face_comm_cost;
455 neighbourcells.add(uid);
456 if (ptrcommWeights) {
457 (*ptrcommWeights).add(face_comm_cost);
476Real MeshPartitionerBase::
477getNeighbourCellsUidWithConstraints(Cell cell, Int64Array& neighbourcells,
478 Array<float>* ptrcommWeights,
479 bool no_cell_contrib)
481 ARCANE_UNUSED(no_cell_contrib);
486 if ((m_filter_lid_cells[cell.localId()] != eCellClassical) && (m_filter_lid_cells[cell.localId()] != eCellReference))
490 offset = (*ptrcommWeights).size();
492 neighbourcells.resize(0);
496 Int64 uid = uids_ref[cell];
500 Integer nbFaces = cell.nbFace();
503 if (m_filter_lid_cells[cell.localId()] == eCellReference) {
504 for (index = 0; index < m_cells_with_constraints.size() && m_cells_with_constraints[index][0] != cell; ++index) {
506 if (index == m_cells_with_constraints.size())
507 throw FatalErrorException(A_FUNCINFO,
"Unable to find cell");
509 Array<Cell>& listCell = m_cells_with_constraints[index];
512 for (Integer j = 1; j < listCell.size(); ++j) {
513 m_filter_lid_cells[listCell[j].localId()] = eCellInAConstraint;
514 nbFaces += listCell[j].nbFace();
518 HashTableMapT<Int64, Int32> difficultNgb(nbFaces,
true);
519 HashTableMapT<Int32, Int32> lids(nbFaces,
true);
520 UniqueArray<bool> contrib(nbFaces);
524 if (m_filter_lid_cells[cell.localId()] == eCellClassical) {
525 if (m_is_non_manifold_mesh && cell.hasFlags(ItemFlags::II_HasEdgeFor1DItems)) {
531 for (Edge sub_edge : cell.edges()) {
533 if (sub_edge.nbCell() >= 2) {
534 for (Cell sub_cell : sub_edge.cells()) {
535 if (sub_cell != cell && sub_cell.hasFlags(ItemFlags::II_HasEdgeFor1DItems)) {
537 neighbourcells.add((*m_unique_id_reference)[sub_cell]);
540 (*ptrcommWeights).add(1.0f);
547 for (Integer z = 0; z < cell.nbFace(); ++z) {
548 Face face = cell.face(z);
550 if (face.nbCell() == 2) {
552 Cell opposite_cell = (face.cell(0) != cell ? face.cell(0) : face.cell(1));
553 hg_contrib += _addNgb(opposite_cell, face, neighbourcells, contrib, difficultNgb,
554 ptrcommWeights, offset, lids);
567 Array<Cell>& listCell = m_cells_with_constraints[index];
568 m_filter_lid_cells[listCell[0].localId()] = eCellInAConstraint;
570 for (Integer j = 0; j < listCell.size(); ++j) {
574 for (Integer z = 0; z < listCell[j].nbFace(); ++z) {
575 const Face& face = listCell[j].face(z);
577 if ((face.nbCell() == 2) && (m_filter_lid_cells[face.cell(0).localId()] != eCellInAConstraint || m_filter_lid_cells[face.cell(1).localId()] != eCellInAConstraint)) {
579 const Cell& opposite_cell = (m_filter_lid_cells[face.cell(0).localId()] != eCellInAConstraint ? face.cell(0) : face.cell(1));
580 hg_contrib += _addNgb(opposite_cell, face, neighbourcells, contrib, difficultNgb,
581 ptrcommWeights, offset, lids,
true);
592 m_filter_lid_cells[listCell[0].localId()] = eCellReference;
593 for (Integer j = 1; j < listCell.size(); ++j)
594 m_filter_lid_cells[listCell[j].localId()] = eCellGrouped;
602void MeshPartitionerBase::
603getNeighbourNodesUidWithConstraints(Cell cell, Int64UniqueArray neighbournodes)
605 neighbournodes.resize(cell.nbNode());
607 for (Integer z = 0; z < cell.nbNode(); ++z) {
608 neighbournodes[z] = cell.node(z).uniqueId();
613Int32 MeshPartitionerBase::
614localIdWithConstraints(Cell cell)
616 return m_local_id_2_local_id_compacted[cell.localId()];
619Int32 MeshPartitionerBase::
620localIdWithConstraints(Int32 cell_lid)
623 return m_local_id_2_local_id_compacted[cell_lid];
627void MeshPartitionerBase::
628invertArrayLid2LidCompacted()
632 for (Integer i = 0; i < m_mesh->allCells().size(); i++) {
633 if (m_local_id_2_local_id_compacted[i] != -1)
634 m_local_id_2_local_id_compacted[index++] = i;
636 for (; index < m_mesh->allCells().size(); index++)
637 m_local_id_2_local_id_compacted[index] = -2;
641SharedArray<float> MeshPartitionerBase::
642cellsSizeWithConstraints()
645 return _cellsProjectWeights(mWgt);
648SharedArray<float> MeshPartitionerBase::
649cellsWeightsWithConstraints(Int32 max_nb_weight,
bool ask_lb_cells)
651 ARCANE_UNUSED(ask_lb_cells);
653 Int32 nb_weight = max_nb_weight;
655 Int32 nb_criteria = m_lb_mng_internal->nbCriteria(m_mesh);
657 if (max_nb_weight <= 0 || max_nb_weight > nb_criteria)
658 nb_weight = nb_criteria;
660 info() <<
"Nombre de poids " << nb_weight <<
" / " << nb_criteria;
663 return _cellsProjectWeights(mWgt, nb_weight);
669SharedArray<float> MeshPartitionerBase::
670_cellsProjectWeights(VariableCellArrayReal& cellWgtIn, Int32 nbWgt)
const
672 SharedArray<float> cellWgtOut(nbOwnCellsWithConstraints() * nbWgt);
673 if (nbWgt > cellWgtIn.arraySize()) {
674 ARCANE_FATAL(
"Demande trop de poids n={0} array_size={1}", nbWgt, cellWgtIn.arraySize());
678 if (m_filter_lid_cells[icell->localId()] == eCellClassical)
679 for (
int i = 0; i < nbWgt; ++i) {
680 float v =
static_cast<float>(cellWgtIn[icell][i]);
681 cellWgtOut[m_local_id_2_local_id_compacted[icell->localId()] * nbWgt + i] = v;
685 for (
auto& ptr : m_cells_with_constraints) {
687 for (
const auto& cell : ptr) {
688 for (
int i = 0; i < nbWgt; ++i)
689 w[i] += cellWgtIn[cell][i];
691 for (
int i = 0; i < nbWgt; ++i)
692 cellWgtOut[m_local_id_2_local_id_compacted[ptr[0].localId()] * nbWgt + i] = (float)(w[i]);
700SharedArray<float> MeshPartitionerBase::
701_cellsProjectWeights(VariableCellReal& cellWgtIn)
const
703 SharedArray<float> cellWgtOut(nbOwnCellsWithConstraints());
706 if (m_filter_lid_cells[icell->localId()] == eCellClassical)
707 cellWgtOut[m_local_id_2_local_id_compacted[icell->localId()]] = (float)cellWgtIn[icell];
709 for (
auto& ptr : m_cells_with_constraints) {
711 for (Cell cell : ptr) {
712 w += cellWgtIn[cell];
714 cellWgtOut[m_local_id_2_local_id_compacted[ptr[0].localId()]] = (float)w;
721bool MeshPartitionerBase::
722cellUsedWithConstraints(Cell cell)
724 eMarkCellWithConstraint marque = m_filter_lid_cells[cell.localId()];
726 return (marque == eCellClassical || marque == eCellReference);
729bool MeshPartitionerBase::
730cellUsedWithWeakConstraints(std::pair<Int64, Int64>& paired_item)
732 std::pair<Int64, Int64> other_pair(paired_item.second, paired_item.first);
733 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());
737void MeshPartitionerBase::
738changeCellOwner(Item cell, VariableItemInt32& cells_new_owner, Int32 new_owner)
743 cells_new_owner[cell] = new_owner;
745 if (m_filter_lid_cells[cell.localId()] == eCellReference) {
747 for (index = 0; index < m_cells_with_constraints.size() && m_cells_with_constraints[index][0] != cell; ++index) {
749 if (index == m_cells_with_constraints.size())
750 throw FatalErrorException(
"MeshPartitionerBase::changeCellOwner(): unable to find cell");
752 Array<Cell>& listCell = m_cells_with_constraints[index];
754 for (Integer i = 1; i < listCell.size(); i++)
755 cells_new_owner[listCell[i]] = new_owner;
765 m_lb_mng_internal->reset(m_mesh);
768 for (
int i = 0; i < nb_weight; ++i) {
775 (myvar)[icell] = weights[icell->localId() * nb_weight + i];
777 m_lb_mng_internal->addCriterion(myvar, m_mesh);
780 m_lb_mng_internal->initAccess(m_mesh);
781 m_lb_mng_internal->setMassAsCriterion(m_mesh,
false);
782 m_lb_mng_internal->setNbCellsAsCriterion(m_mesh,
false);
791 return math::max(m_lb_mng_internal->nbCriteria(m_mesh), 1);
794ArrayView<float> MeshPartitionerBase::
800void MeshPartitionerBase::
810template <
class ArrayType> Parallel::Request
817 mysize[0] = data.
size();
827 if (!header.
null()) {
832 ofile << sum << std::endl;
835 for (
int rank = 0; rank < pm->
commSize(); ++rank) {
837 pm->
recv(otherdata, rank,
true);
839 for (
int j = 0; (j < step) && myiter(); ++j, ++myiter)
840 ofile << *myiter <<
" ";
866 if ((m_filter_lid_cells[icell->localId()] != eCellClassical) && (m_filter_lid_cells[icell->localId()] != eCellReference))
869 uid[i++] = uids_ref[icell];
883 myiterf(); ++myiterf, ++myiterr)
884 (*myiterr) = (
Real)(*myiterf);
894 if ((m_filter_lid_cells[icell->localId()] != eCellClassical) && (m_filter_lid_cells[icell->localId()] != eCellReference))
898 for (
Integer z = 0, zs = (*icell).nbNode(); z < zs; ++z) {
899 const Node& node = (*icell).node(z);
900 my_coords[i] += coords[node];
914 if ((m_filter_lid_cells[icell->localId()] != eCellClassical) && (m_filter_lid_cells[icell->localId()] != eCellReference))
916 getNeighbourCellsUidWithConstraints(*icell, neighbourcells, &commWeights);
917 Int64 my_uid = uids_ref[icell];
918 for (
Integer j = 0; j < neighbourcells.
size(); ++j) {
919 if (neighbourcells[j] > my_uid)
921 Real3 tmp(
static_cast<Real>(my_uid + 1),
static_cast<Real>(neighbourcells[j] + 1), commWeights[j]);
927 StringBuilder myheader =
"%%MatrixMarket matrix coordinate real symmetric\n";
928 myheader += nbvertices;
930 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 réel de 3 dimensions.
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.
MeshVariableArrayRefT< Cell, Real > VariableCellArrayReal
Grandeur au centre des mailles de type tableau de réel.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
double toDouble(Real r)
Convertit 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.