14#include "arcane/utils/ScopedPtr.h"
15#include "arcane/utils/StringBuilder.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/ITraceMng.h"
19#include "arcane/core/BasicService.h"
20#include "arcane/core/ISubDomain.h"
21#include "arcane/core/ServiceFinder2.h"
22#include "arcane/core/FactoryService.h"
23#include "arcane/core/SerializeBuffer.h"
24#include "arcane/core/IMeshPartitioner.h"
25#include "arcane/core/IMainFactory.h"
26#include "arcane/core/IMeshModifier.h"
27#include "arcane/core/Properties.h"
28#include "arcane/core/IInitialPartitioner.h"
29#include "arcane/core/Timer.h"
30#include "arcane/core/IMesh.h"
31#include "arcane/core/IMeshSubMeshTransition.h"
32#include "arcane/core/IItemFamily.h"
33#include "arcane/core/IDirectExecution.h"
34#include "arcane/core/IParallelMng.h"
35#include "arcane/core/IMeshUtilities.h"
36#include "arcane/core/IMeshWriter.h"
37#include "arcane/core/ITimeStats.h"
38#include "arcane/core/ServiceBuilder.h"
39#include "arcane/core/IMeshPartitionConstraintMng.h"
40#include "arcane/core/ExternalPartitionConstraint.h"
42#include "arcane/std/ArcaneCasePartitioner_axl.h"
60class ArcaneInitialPartitioner
78 void build()
override {}
91 ISubDomain* m_sub_domain =
nullptr;
92 ArcaneCasePartitioner* m_main =
nullptr;
102class ArcaneCasePartitioner
110 ~ArcaneCasePartitioner()
override;
133 std::ofstream m_sortiesCorrespondance;
137 void _partitionMesh(
Int32 nb_part);
141 void _addGhostGroups(
IMesh* new_mesh,
Array<Cell>& cells_selected_for_new_mesh,
160 tm->
info()<<
" _regroupeContraintes: nbMailles = "<<meshes[0]->nbCell() <<
", nbMaillesLocales = "<< meshes[0]->ownCells().
size();
162 Integer nb_contraintes = m_main->options()->constraints.size();
163 tm->
info() <<
"Number of constraints = " << nb_contraintes;
164 if (nb_contraintes==0)
170 cells_new_owner[icell] = (*icell).owner();
175 mesh->partitionConstraintMng()->addConstraint(c);
176 mesh->partitionConstraintMng()->computeAndApplyConstraints();
178 cells_new_owner.synchronize();
179 mesh->utilities()->changeOwnersFromCells();
180 mesh->modifier()->setDynamic(
true);
181 bool compact =
mesh->properties()->getBool(
"compact");
182 mesh->properties()->setBool(
"compact",
true);
183 mesh->toPrimaryMesh()->exchangeItems();
184 mesh->properties()->setBool(
"compact", compact);
188 FactoryT<IMeshWriter> mesh_writer_factory(sd->
serviceMng());
189 mesh_writer = mesh_writer_factory.createInstance(
"Lima",
true);
196 mesh_writer->writeMeshToFile(
mesh,filename);
207 String lib_name = m_main->options()->library();
215 tm->
info() <<
"DoInitialPartition. Service=" << lib_name;
217 if (!mesh_partitioner.get())
218 ARCANE_FATAL(
"can not found service named '{0}' for initial mesh partitioning", lib_name);
227 Int32 nb_part = m_main->options()->nbCutPart();
230 tm->
info() <<
"NbPart = " << nb_part <<
" nb_mesh=" << nb_mesh;
232 for(
Integer i=0; i<nb_mesh; ++i ){
245 bool is_dynamic =
mesh->isDynamic();
246 mesh->modifier()->setDynamic(
true);
257 mesh_partitioner->partitionMesh(
mesh,nb_part);
263 Int32 new_owner = cells_new_owner[icell];
264 true_cells_owner[icell] = new_owner;
265 cells_new_owner[icell] = new_owner % nb_rank;
268 true_nodes_owner[inode] = nodes_new_owner[inode];
271 mesh->utilities()->changeOwnersFromCells();
274 bool compact =
mesh->properties()->getBool(
"compact");
275 mesh->properties()->setBool(
"compact",
true);
276 mesh->toPrimaryMesh()->exchangeItems();
277 mesh->modifier()->setDynamic(is_dynamic);
278 mesh->properties()->setBool(
"compact", compact);
284 if (m_main->options()->nbGhostLayer()==2)
285 mesh->updateGhostLayers(
false);
296 Int32 new_owner = new_owners[icell];
297 ++nb_cells[new_owner];
301 ITraceMng* tm = m_sub_domain->traceMng();
302 tm->
info() <<
" -- Partitioning statistics --";
303 tm->
info() <<
" Part NbCell";
304 for(
Integer i=0; i<nb_part; ++i ){
312ArcaneCasePartitioner::
317 info() <<
"** ** SET INITIAL PARTITIONER 2";
324ArcaneCasePartitioner::
325~ArcaneCasePartitioner()
336 info() <<
"ArcaneCasePartitioner::execute() nb_part=" << nb_part;
338 subDomain()->timeStats()->dumpTimeAndMemoryUsage(subDomain()->parallelMng());
339 _partitionMesh(nb_part);
349void ArcaneCasePartitioner::
350_partitionMesh(
Int32 nb_part)
361 if (mesh_writer_name.
empty())
362 pfatal() <<
"No service selected to write the mesh";
364 auto mesh_writer = sb.createReference(mesh_writer_name,
SB_Collective);
367 info() <<
"Mesh file pattern=" << pattern;
382 info() <<
"TOTAL_NB_CELL=" << total_current_nb_cell;
394 Integer min_nb_cell = total_current_nb_cell;
397 if (
options()->createCorrespondances())
401 Integer maxLocalIdCell =
mesh()->cellFamily()->maxLocalId();
402 Integer maxLocalIdNode =
mesh()->nodeFamily()->maxLocalId();
408 iitem->mutableItemBase().setOwner(0,0);
415 info() <<
"NbPart=" << nb_part <<
" my_rank=" << my_rank;
416 for(
Integer i=0; i<nb_part; ++i ){
417 if ((i % nb_rank)!=my_rank){
418 if (my_rank==0 &&
options()->createCorrespondances()){
420 info()<<
"Receive on master to build correspondence file on sub-domain "<<i
421 <<
" sent from processor "<<i % nb_rank;
426 pm->
recv(taillesTab, i % nb_rank);
427 nodesUniqueId.resize(taillesTab[0]);
428 cellsUniqueId.resize(taillesTab[1]);
429 pm->
recv(nodesUniqueId, i % nb_rank);
430 pm->
recv(cellsUniqueId, i % nb_rank);
439 UniqueArray<Cell> cells_selected_for_new_mesh;
441 if (true_cells_owner[icell]==i){
443 cells_selected_for_new_mesh.add(cell);
449 _addGhostLayers(current_all_cells, cells_selected_for_new_mesh,
options()->nbGhostLayer(), maxLocalIdCell, maxLocalIdNode);
453 for(
Integer j=0, js=cells_selected_for_new_mesh.size(); j<js; ++j ){
454 Cell cell = cells_selected_for_new_mesh[j];
455 cells_local_id.add(cell.localId());
456 cells_unique_id.add(
static_cast<Int64>(cell.uniqueId()));
460 SerializeBuffer buffer;
462 info() <<
"NB_CELL_TO_SERIALIZE=" << nb_cell_to_copy;
473 for(
Integer zid=0; zid<nb_cell_to_copy; ++zid ){
474 Cell current_cell = current_cells[cells_local_id[zid]];
475 Cell new_cell = new_cells[new_cells_local_id[zid]];
476 if (current_cell.uniqueId()!=new_cell.uniqueId())
477 fatal() <<
"Inconsistent unique ids";
478 Integer nb_node = current_cell.nbNode();
482 for(
Integer z2=0; z2<nb_node; ++z2 ){
483 Real3 coord = current_coordinates[current_cell.node(z2)];
486 new_coordinates[new_cell.node(z2)] = coord;
488 new_cell.node(z2).mutableItemBase().setOwner(true_nodes_owner[current_cell.node(z2)],0);
498 if (
options()->nbGhostLayer()>0)
499 _addGhostGroups(new_mesh, cells_selected_for_new_mesh, true_cells_owner, true_nodes_owner, new_cells_local_id, i);
502 info() <<
"NB_NEW_CELL=" << new_nb_cell;
503 min_nb_cell =
math::min(min_nb_cell,new_nb_cell);
504 max_nb_cell =
math::max(max_nb_cell,new_nb_cell);
505 saved_nb_cell += new_nb_cell;
507 if (pattern.
empty()){
508 StringBuilder sfilename =
"cut_mesh_";
510 sfilename +=
".mli2";
511 filename = sfilename;
517 if (pattern.
length()>128){
518 pfatal() <<
"Pattern too long (max=128)";
521 filename = String(StringView(buf));
524 info() <<
"Writing mesh file filename='" << filename <<
"'";
525 bool is_bad = mesh_writer->writeMeshToFile(new_mesh, filename);
527 ARCANE_FATAL(
"Can not write mesh file '{0}'", filename);
531 if (
options()->createCorrespondances()){
532 info()<<
"Participation to build correspondence file on sub-domain "<<i;
540 NodeInfoListView nodes(new_mesh->
nodeFamily());
541 for(
int j=0; j<taillesTab[0]; ++j ){
542 Node node = nodes[j];
543 nodesUniqueId[j] = node.uniqueId();
546 CellInfoListView cells(new_mesh->
cellFamily());
547 for(
int j=0; j<taillesTab[1]; ++j ){
548 Cell cell = cells[j];
549 cellsUniqueId[j] = cell.uniqueId();
553 pm->send(taillesTab, 0);
554 pm->send(nodesUniqueId, 0);
555 pm->send(cellsUniqueId, 0);
566 info() <<
"TOTAL_NEW_NB_CELL=" << total_new_nb_cell
567 <<
" min=" << total_min_nb_cell
568 <<
" max=" << total_max_nb_cell
569 <<
" computed_average=" << (total_current_nb_cell/nb_part);
571 subDomain()->timeStats()->dumpTimeAndMemoryUsage(pm);
573 if (
options()->createCorrespondances())
576 if (
options()->nbGhostLayer()==0)
577 if (total_new_nb_cell!=total_current_nb_cell)
578 pfatal() <<
"Bad number of saved cells current=" << total_current_nb_cell
579 <<
" saved=" << total_new_nb_cell;
590 info()<<
" _initCorrespondance("<<my_rank<<
")";
595 m_sortiesCorrespondance.open(
"Correspondances");
597 if (m_sortiesCorrespondance.fail ()){
598 pfatal() <<
"Unable to write to file 'Correspondances' ";
601 m_sortiesCorrespondance <<
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
602 m_sortiesCorrespondance <<
"<!-- Correspondance file generated by Arcane/Decoupe3D V2 -->\n";
603 m_sortiesCorrespondance <<
"\n<cpus>\n";
612 info()<<
" _writeCorrespondance("<<rank<<
", nodesUniqueId.size() = "
613 <<nodesUniqueId.
size()<<
", cellsUniqueId.size() = "<<cellsUniqueId.
size()<<
")";
615 m_sortiesCorrespondance <<
" <cpu id=\"" << rank <<
"\">" <<
"\n"
616 <<
" <noeuds>" <<
"\n" <<
" ";
618 m_sortiesCorrespondance <<nodesUniqueId[i]<<
" ";
620 m_sortiesCorrespondance <<
"\n" <<
" </noeuds>"
622 <<
" <mailles>" <<
"\n"
625 m_sortiesCorrespondance <<cellsUniqueId[i]<<
" ";
626 m_sortiesCorrespondance <<
"\n" <<
" </mailles>" <<
"\n"
627 <<
" </cpu>" <<
"\n";
639 m_sortiesCorrespondance <<
"</cpus>\n";
640 m_sortiesCorrespondance.close ();
660 info() <<
"Compute groups family=" << current_family->
name();
670 new_items_uid[index] = (*iitem).uniqueId();
671 new_items_lid[index] = iitem.itemLocalId();
680 items_current_to_new_local_id.
fill(NULL_ITEM_LOCAL_ID);
681 for(
Integer i=0; i<nb_new_item; ++i )
682 items_current_to_new_local_id[items_lid[i]] = new_items_lid[i];
691 create_local_ids.
clear();
693 Int32 current_uid = iitem.itemLocalId();
694 Int32 new_lid = items_current_to_new_local_id[current_uid];
695 if (new_lid!=NULL_ITEM_LOCAL_ID)
696 create_local_ids.
add(new_lid);
706void ArcaneCasePartitioner::
714 filtre_lid_cell.fill(0);
716 filtre_lid_node.fill(0);
719 for(
Integer j=0, js=cells_selected_for_new_mesh.
size(); j<js; ++j ){
720 Cell cell = cells_selected_for_new_mesh[j];
721 filtre_lid_cell[cell.
localId()] = 1;
726 for(
Integer j=0, js=cells_selected_for_new_mesh.
size(); j<js; ++j ){
727 Cell cell = cells_selected_for_new_mesh[j];
730 for(
Integer k=0, ks=nodes.size(); k<ks; ++k){
731 Node node = nodes[k];
732 if (filtre_lid_node[node.localId()]==0){
736 for(
Integer i=0, is=cells_vois.size(); i<is; ++i ){
737 Cell cell_vois = cells_vois[i];
738 if (filtre_lid_cell[cell_vois.localId()]==0){
741 cells_selected_for_new_mesh.
add(cell_vois);
743 filtre_lid_cell[cell_vois.localId()] = 1;
746 filtre_lid_node[node.localId()] = 1;
752 _addGhostLayers(current_all_cells, cells_selected_for_new_mesh, nbCouches-1, maxLocalIdCell, maxLocalIdNode);
760void ArcaneCasePartitioner::
765 info()<<
"ArcaneCasePartitioner::_addGhostGroups (id_loc = "<<id_loc<<
")";
768 std::map<Integer, Integer> dom_vois;
769 for(
Integer j=0, js=cells_selected_for_new_mesh.size(); j<js; ++j ){
770 Cell cell = cells_selected_for_new_mesh[j];
771 dom_vois[true_cells_owner[cell]] += 1;
775 std::map<Integer,SharedArray<Int32> > map_groupes;
776 for (std::map<Integer, Integer>::const_iterator iter=dom_vois.begin(); iter!=dom_vois.end(); ++iter){
777 Integer no_sous_dom = iter->first;
778 Integer nb_mailles_sous_dom = iter->second;
782 tab.
reserve(nb_mailles_sous_dom);
785 for(
Integer j=0, js=cells_selected_for_new_mesh.size(); j<js; ++j ){
786 Cell cell = cells_selected_for_new_mesh[j];
787 Integer no_sous_dom = true_cells_owner[cell];
790 Int32Array & liste_lid = map_groupes[no_sous_dom];
791 liste_lid.
add(new_cells_local_id[j]);
795 for (std::map<
Integer,SharedArray<Int32> >::iterator iter=map_groupes.begin(); iter!=map_groupes.end(); ++iter){
796 Integer no_sous_dom = iter->first;
799 ItemGroup groupe_loc;
800 if (no_sous_dom==id_loc)
801 groupe_loc = new_mesh->cellFamily()->findGroup(
"LOCAL",
true);
803 String nom_mf(
"MF_");
804 nom_mf = nom_mf+no_sous_dom;
805 groupe_loc = new_mesh->cellFamily()->findGroup(nom_mf,
true);
808 groupe_loc.addItems(liste_lid,
false);
815 Integer nbnodes = new_mesh->nodeFamily()->nbItem();
817 NodeInfoListView nodes(new_mesh->nodeFamily());
818 for (
int j= 0 ; j < nbnodes ; ++j) {
820 if (true_nodes_owner[node] == id_loc)
821 liste_lid.add(node.localId());
824 ItemGroup groupe_loc = new_mesh->nodeFamily()->findGroup(
"LOCALN",
true);
825 groupe_loc.addItems(liste_lid,
false);
830 ItemGroup groupe_glob = new_mesh->cellFamily()->findGroup(
"TOUT",
true);
832 groupe_glob.addItems(new_cells_local_id,
false);
#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.
Integer size() const
Nombre d'éléments du vecteur.
Generation de la classe de base du Service.
ArcaneArcaneCasePartitionerObject(const Arcane::ServiceBuildInfo &sbi)
Constructeur.
CaseOptionsArcaneCasePartitioner * options() const
Options du jeu de données du service.
Service de partitionnement externe du maillage.
bool isActive() const override
Vrai si le service est actif.
void execute() override
Exécute l'opération du service.
void _initCorrespondance(Int32 my_rank)
Ouverture du fichier Correspondance (seulement sur le proc 0)
void _computeGroups(IItemFamily *current_family, IItemFamily *new_family)
Recopie les groupes de la famille courante dans la nouvelle.
void build() override
Construction de niveau build du service.
void _finalizeCorrespondance(Int32 my_rank)
Fermeture du fichier Correspondance (seulement sur le proc 0)
void setParallelMng(IParallelMng *) override
Positionne le gestionnaire de parallèlisme associé. Cette méthode doit être appelée avant execute()
void _writeCorrespondance(Int32 rank, Int64Array &nodesUniqueId, Int64Array &cellsUniqueId)
Ecriture du fichier Correspondance.
void partitionAndDistributeMeshes(ConstArrayView< IMesh * > meshes) override
Partitionne les maillages.
void _printStats(Integer nb_part, IMesh *mesh, VariableCellInt32 &new_owners)
Affiche des statistiques sur le partitionnement.
void _mergeConstraints(ConstArrayView< IMesh * > meshes)
Regroupe les mailles associées aux contraintes sur un même proc.
UniqueArray< TrueOwnerInfo > m_part_indexes
Stocke pour chaque maillage une variable indiquant pour chaque maille quelle partie la possède.
Tableau d'items de types quelconques.
void fill(const DataType &data)
Remplissage du tableau.
void clear()
Supprime les éléments du tableau.
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.
EnumeratorT< ItemGroup > Enumerator
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
virtual IMainFactory * mainFactory() const =0
Manufacture principale.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual IServiceMng * serviceMng() const =0
Gestionnaire de services.
Interface d'un partitionneur initial.
Interface d'une famille d'entités.
virtual ItemGroupCollection groups() const =0
Liste des groupes de cette famille.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual ItemGroup createGroup(const String &name, Int32ConstArrayView local_ids, bool do_override=false)=0
Créé un groupe d'entités de nom name contenant les entités local_ids.
virtual Int32 maxLocalId() const =0
virtual String name() const =0
Nom de la famille.
virtual void itemsUniqueIdToLocalId(Int32ArrayView local_ids, Int64ConstArrayView unique_ids, bool do_fatal=true) const =0
Converti un tableau de numéros uniques en numéros locaux.
virtual Integer nbItem() const =0
Nombre d'entités.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
Manufacture des classes d'Arcane.
virtual IPrimaryMesh * createMesh(ISubDomain *sub_domain, const String &name)=0
Créé ou récupère un maillage.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual Integer nbCell()=0
Nombre de mailles du maillage.
virtual IItemFamily * edgeFamily()=0
Retourne la famille des arêtes.
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual void setDynamic(bool v)=0
Positionne la propriété indiquant si le maillage peut évoluer.
virtual void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Int32ArrayView cells_lid=Int32ArrayView())=0
Ajoute des mailles.
virtual void endUpdate()=0
Notifie l'instance de la fin de la modification du maillage.
virtual void clearItems()=0
Supprime toutes les entitées de toutes les familles de ce maillage.
Interface d'une contrainte de partitionnement d'un maillage.
virtual ItemInternalList itemsInternal(eItemKind)=0
Tableau interne des éléments du maillage de type type.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual ARCANE_DEPRECATED_240 void serializeCells(ISerializer *buffer, Int32ConstArrayView cells_local_id)=0
virtual void destroyGroups()=0
Détruit tous les groupes de toutes les familles.
virtual IPrimaryMesh * toPrimaryMesh()=0
Retourne l'instance sous la forme d'un IPrimaryMesh.
virtual Properties * properties()=0
Propriétés associées à ce maillage.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual IParallelMng * sequentialParallelMng()=0
Retourne un gestionnaire de parallélisme séquentiel.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual void allocateCells(Integer nb_cell, Int64ConstArrayView cells_infos, bool one_alloc=true)=0
Allocation d'un maillage.
virtual void setDimension(Integer dim)=0
Positionne la dimension du maillage (1D, 2D ou 3D).
Interface du gestionnaire d'un sous-domaine.
virtual ITimeStats * timeStats() const =0
Statistiques des temps d'exécution.
virtual IApplication * application()=0
Application.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual void setInitialPartitioner(IInitialPartitioner *partitioner)=0
Positionne le partitionneur initial.
virtual void dumpTimeAndMemoryUsage(IParallelMng *pm)=0
Affiche la date actuelle et la mémoire consommée.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Groupe d'entités de maillage.
const String & name() const
Nom du groupe.
bool isOwn() const
Retourne si le groupe contient uniquement des éléments propres au sous-domaine.
Integer size() const
Nombre d'éléments du groupe.
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
void setBool(const String &name, bool value)
Positionne une propriété de type bool de nom name et de valeur value.
Encapsulation d'un pointeur qui se détruit automatiquement.
ISubDomain * subDomain() const
Accès au ISubDomain associé.
Structure contenant les informations pour créer un service.
Classe utilitaire pour instantier un service d'une interface donnée.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Créé une instance implémentant l'interface InterfaceType.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
Int64 length() const
Retourne la longueur de la chaîne.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
@ TimerReal
Timer utilisant le temps réel.
Real lastActivationTime() const
Retourne le temps (en secondes) passé lors de la dernière activation du timer.
TraceMessage pinfo() const
Flot pour un message d'information en parallèle.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
TraceMessage pfatal() const
Flot pour un message d'erreur fatale en parallèle.
TraceMessage info() const
Flot pour un message d'information.
Formattage du flot en longueur.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
__host__ __device__ Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
ItemVectorViewT< Node > NodeVectorView
Vue sur un vecteur de noeuds.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemVectorViewT< Cell > CellVectorView
Vue sur un vecteur de mailles.
MeshVariableScalarRefT< Node, Int32 > VariableNodeInt32
Grandeur au noeud de type entier 32 bits.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
MeshVariableScalarRefT< Cell, Int32 > VariableCellInt32
Grandeur au centre des mailles de type entier 32 bits.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
@ ReduceSum
Somme des valeurs.
@ ReduceMin
Minimum des valeurs.
@ ReduceMax
Maximum des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
@ SB_Collective
Indique que tous les processus font la même opération.
@ SB_AllowNull
Autorise l'absence du service.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
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.
@ IK_Cell
Entité de maillage de genre maille.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.