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/IMeshMng.h"
29#include "arcane/core/IMeshFactoryMng.h"
30#include "arcane/core/MeshBuildInfo.h"
31#include "arcane/core/MeshKind.h"
32#include "arcane/core/IInitialPartitioner.h"
33#include "arcane/core/Timer.h"
34#include "arcane/core/IMesh.h"
35#include "arcane/core/IMeshSubMeshTransition.h"
36#include "arcane/core/IItemFamily.h"
37#include "arcane/core/IDirectExecution.h"
38#include "arcane/core/IParallelMng.h"
39#include "arcane/core/IMeshUtilities.h"
40#include "arcane/core/IMeshWriter.h"
41#include "arcane/core/ITimeStats.h"
42#include "arcane/core/ServiceBuilder.h"
43#include "arcane/core/IMeshPartitionConstraintMng.h"
44#include "arcane/core/ExternalPartitionConstraint.h"
45#include "arcane/core/internal/MshMeshGenerationInfo.h"
47#include "arcane/std/ArcaneCasePartitioner_axl.h"
65class ArcaneInitialPartitioner
83 void build()
override {}
96 ISubDomain* m_sub_domain =
nullptr;
97 ArcaneCasePartitioner* m_main =
nullptr;
107class ArcaneCasePartitioner
115 ~ArcaneCasePartitioner()
override;
138 std::ofstream m_sortiesCorrespondance;
142 void _partitionMesh(
Int32 nb_part);
146 void _addGhostGroups(
IMesh* new_mesh,
Array<Cell>& cells_selected_for_new_mesh,
165 tm->
info()<<
" _regroupeContraintes: nbMailles = "<<meshes[0]->nbCell() <<
", nbMaillesLocales = "<< meshes[0]->ownCells().
size();
167 Integer nb_contraintes = m_main->options()->constraints.size();
168 tm->
info() <<
"Number of constraints = " << nb_contraintes;
169 if (nb_contraintes==0)
175 cells_new_owner[icell] = (*icell).owner();
180 mesh->partitionConstraintMng()->addConstraint(c);
181 mesh->partitionConstraintMng()->computeAndApplyConstraints();
183 cells_new_owner.synchronize();
184 mesh->utilities()->changeOwnersFromCells();
185 mesh->modifier()->setDynamic(
true);
186 bool compact =
mesh->properties()->getBool(
"compact");
187 mesh->properties()->setBool(
"compact",
true);
188 mesh->toPrimaryMesh()->exchangeItems();
189 mesh->properties()->setBool(
"compact", compact);
193 FactoryT<IMeshWriter> mesh_writer_factory(sd->
serviceMng());
194 mesh_writer = mesh_writer_factory.createInstance(
"Lima",
true);
201 mesh_writer->writeMeshToFile(
mesh,filename);
212 String lib_name = m_main->options()->library();
220 tm->
info() <<
"DoInitialPartition. Service=" << lib_name;
222 if (!mesh_partitioner.get())
223 ARCANE_FATAL(
"can not found service named '{0}' for initial mesh partitioning", lib_name);
232 Int32 nb_part = m_main->options()->nbCutPart();
235 tm->
info() <<
"NbPart = " << nb_part <<
" nb_mesh=" << nb_mesh;
237 for(
Integer i=0; i<nb_mesh; ++i ){
250 bool is_dynamic =
mesh->isDynamic();
251 mesh->modifier()->setDynamic(
true);
262 mesh_partitioner->partitionMesh(
mesh,nb_part);
268 Int32 new_owner = cells_new_owner[icell];
269 true_cells_owner[icell] = new_owner;
270 cells_new_owner[icell] = new_owner % nb_rank;
273 true_nodes_owner[inode] = nodes_new_owner[inode];
276 mesh->utilities()->changeOwnersFromCells();
279 bool compact =
mesh->properties()->getBool(
"compact");
280 mesh->properties()->setBool(
"compact",
true);
281 mesh->toPrimaryMesh()->exchangeItems();
282 mesh->modifier()->setDynamic(is_dynamic);
283 mesh->properties()->setBool(
"compact", compact);
289 if (m_main->options()->nbGhostLayer()==2)
290 mesh->updateGhostLayers(
false);
301 Int32 new_owner = new_owners[icell];
302 ++nb_cells[new_owner];
306 ITraceMng* tm = m_sub_domain->traceMng();
307 tm->
info() <<
" -- Partitioning statistics --";
308 tm->
info() <<
" Part NbCell";
309 for(
Integer i=0; i<nb_part; ++i ){
317ArcaneCasePartitioner::
322 info() <<
"** ** SET INITIAL PARTITIONER 2";
329ArcaneCasePartitioner::
330~ArcaneCasePartitioner()
341 info() <<
"ArcaneCasePartitioner::execute() nb_part=" << nb_part;
343 subDomain()->timeStats()->dumpTimeAndMemoryUsage(subDomain()->parallelMng());
344 _partitionMesh(nb_part);
354void ArcaneCasePartitioner::
355_partitionMesh(
Int32 nb_part)
366 if (mesh_writer_name.
empty())
367 pfatal() <<
"No service selected to write the mesh";
369 auto mesh_writer = sb.createReference(mesh_writer_name,
SB_Collective);
372 info() <<
"Mesh file pattern=" << pattern;
386 info() <<
"TOTAL_NB_CELL=" << total_current_nb_cell;
392 build_info.addMeshKind(current_mesh->
meshKind());
408 impl::MshMeshGenerationInfo* new_msh_mesh_info =
nullptr;
409 auto* msh_mesh_info = impl::MshMeshGenerationInfo::getReference(mesh(),
false);
411 new_msh_mesh_info = impl::MshMeshGenerationInfo::getReference(new_mesh,
true);
412 *new_msh_mesh_info = *msh_mesh_info;
415 Int32 saved_nb_cell = 0;
416 Int32 min_nb_cell = total_current_nb_cell;
417 Int32 max_nb_cell = 0;
419 if (
options()->createCorrespondances())
423 Integer maxLocalIdCell = mesh()->cellFamily()->maxLocalId();
424 Integer maxLocalIdNode = mesh()->nodeFamily()->maxLocalId();
428 for( IItemFamily* family : mesh()->itemFamilies() ){
430 iitem->mutableItemBase().setOwner(0,0);
437 info() <<
"NbPart=" << nb_part <<
" my_rank=" << my_rank;
438 for(
Integer i=0; i<nb_part; ++i ){
439 if ((i % nb_rank)!=my_rank){
440 if (my_rank==0 &&
options()->createCorrespondances()){
442 info()<<
"Receive on master to build correspondence file on sub-domain "<<i
443 <<
" sent from processor "<<i % nb_rank;
448 pm->
recv(taillesTab, i % nb_rank);
449 nodesUniqueId.resize(taillesTab[0]);
450 cellsUniqueId.resize(taillesTab[1]);
451 pm->
recv(nodesUniqueId, i % nb_rank);
452 pm->
recv(cellsUniqueId, i % nb_rank);
461 UniqueArray<Cell> cells_selected_for_new_mesh;
463 if (true_cells_owner[icell]==i){
465 cells_selected_for_new_mesh.add(cell);
471 _addGhostLayers(current_all_cells, cells_selected_for_new_mesh,
options()->nbGhostLayer(), maxLocalIdCell, maxLocalIdNode);
475 for(
Integer j=0, js=cells_selected_for_new_mesh.size(); j<js; ++j ){
476 Cell cell = cells_selected_for_new_mesh[j];
477 cells_local_id.add(cell.localId());
478 cells_unique_id.add(
static_cast<Int64>(cell.uniqueId()));
482 SerializeBuffer buffer;
484 info() <<
"NB_CELL_TO_SERIALIZE=" << nb_cell_to_copy;
495 for(
Integer zid=0; zid<nb_cell_to_copy; ++zid ){
496 Cell current_cell = current_cells[cells_local_id[zid]];
497 Cell new_cell = new_cells[new_cells_local_id[zid]];
498 if (current_cell.uniqueId()!=new_cell.uniqueId())
499 fatal() <<
"Inconsistent unique ids";
500 Integer nb_node = current_cell.nbNode();
504 for(
Integer z2=0; z2<nb_node; ++z2 ){
505 Real3 coord = current_coordinates[current_cell.node(z2)];
508 new_coordinates[new_cell.node(z2)] = coord;
510 new_cell.node(z2).mutableItemBase().setOwner(true_nodes_owner[current_cell.node(z2)],0);
520 if (
options()->nbGhostLayer()>0)
521 _addGhostGroups(new_mesh, cells_selected_for_new_mesh, true_cells_owner, true_nodes_owner, new_cells_local_id, i);
524 info() <<
"NB_NEW_CELL=" << new_nb_cell;
525 min_nb_cell =
math::min(min_nb_cell,new_nb_cell);
526 max_nb_cell =
math::max(max_nb_cell,new_nb_cell);
527 saved_nb_cell += new_nb_cell;
529 if (pattern.
empty()){
530 StringBuilder sfilename =
"cut_mesh_";
532 sfilename +=
".mli2";
533 filename = sfilename;
539 if (pattern.
length()>128){
540 pfatal() <<
"Pattern too long (max=128)";
543 filename = String(StringView(buf));
546 info() <<
"Writing mesh file filename='" << filename <<
"'";
547 bool is_bad = mesh_writer->writeMeshToFile(new_mesh, filename);
549 ARCANE_FATAL(
"Can not write mesh file '{0}'", filename);
553 if (
options()->createCorrespondances()){
554 info()<<
"Participation to build correspondence file on sub-domain "<<i;
562 NodeInfoListView nodes(new_mesh->
nodeFamily());
563 for(
int j=0; j<taillesTab[0]; ++j ){
564 Node node = nodes[j];
565 nodesUniqueId[j] = node.uniqueId();
568 CellInfoListView cells(new_mesh->
cellFamily());
569 for(
int j=0; j<taillesTab[1]; ++j ){
570 Cell cell = cells[j];
571 cellsUniqueId[j] = cell.uniqueId();
575 pm->send(taillesTab, 0);
576 pm->send(nodesUniqueId, 0);
577 pm->send(cellsUniqueId, 0);
588 info() <<
"TOTAL_NEW_NB_CELL=" << total_new_nb_cell
589 <<
" min=" << total_min_nb_cell
590 <<
" max=" << total_max_nb_cell
591 <<
" computed_average=" << (total_current_nb_cell/nb_part);
593 subDomain()->timeStats()->dumpTimeAndMemoryUsage(pm);
595 if (
options()->createCorrespondances())
598 if (
options()->nbGhostLayer()==0)
599 if (total_new_nb_cell!=total_current_nb_cell)
600 pfatal() <<
"Bad number of saved cells current=" << total_current_nb_cell
601 <<
" saved=" << total_new_nb_cell;
612 info()<<
" _initCorrespondance("<<my_rank<<
")";
617 m_sortiesCorrespondance.open(
"Correspondances");
619 if (m_sortiesCorrespondance.fail ()){
620 pfatal() <<
"Unable to write to file 'Correspondances' ";
623 m_sortiesCorrespondance <<
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
624 m_sortiesCorrespondance <<
"<!-- Correspondance file generated by Arcane/Decoupe3D V2 -->\n";
625 m_sortiesCorrespondance <<
"\n<cpus>\n";
634 info()<<
" _writeCorrespondance("<<rank<<
", nodesUniqueId.size() = "
635 <<nodesUniqueId.
size()<<
", cellsUniqueId.size() = "<<cellsUniqueId.
size()<<
")";
637 m_sortiesCorrespondance <<
" <cpu id=\"" << rank <<
"\">" <<
"\n"
638 <<
" <noeuds>" <<
"\n" <<
" ";
640 m_sortiesCorrespondance <<nodesUniqueId[i]<<
" ";
642 m_sortiesCorrespondance <<
"\n" <<
" </noeuds>"
644 <<
" <mailles>" <<
"\n"
647 m_sortiesCorrespondance <<cellsUniqueId[i]<<
" ";
648 m_sortiesCorrespondance <<
"\n" <<
" </mailles>" <<
"\n"
649 <<
" </cpu>" <<
"\n";
661 m_sortiesCorrespondance <<
"</cpus>\n";
662 m_sortiesCorrespondance.close ();
682 info() <<
"Compute groups family=" << current_family->
name();
692 new_items_uid[index] = (*iitem).uniqueId();
693 new_items_lid[index] = iitem.itemLocalId();
702 items_current_to_new_local_id.
fill(NULL_ITEM_LOCAL_ID);
703 for(
Integer i=0; i<nb_new_item; ++i )
704 items_current_to_new_local_id[items_lid[i]] = new_items_lid[i];
713 create_local_ids.
clear();
715 Int32 current_uid = iitem.itemLocalId();
716 Int32 new_lid = items_current_to_new_local_id[current_uid];
717 if (new_lid!=NULL_ITEM_LOCAL_ID)
718 create_local_ids.
add(new_lid);
728void ArcaneCasePartitioner::
736 filtre_lid_cell.fill(0);
738 filtre_lid_node.fill(0);
741 for(
Integer j=0, js=cells_selected_for_new_mesh.
size(); j<js; ++j ){
742 Cell cell = cells_selected_for_new_mesh[j];
743 filtre_lid_cell[cell.
localId()] = 1;
748 for(
Integer j=0, js=cells_selected_for_new_mesh.
size(); j<js; ++j ){
749 Cell cell = cells_selected_for_new_mesh[j];
752 for(
Integer k=0, ks=nodes.size(); k<ks; ++k){
753 Node node = nodes[k];
754 if (filtre_lid_node[node.localId()]==0){
758 for(
Integer i=0, is=cells_vois.size(); i<is; ++i ){
759 Cell cell_vois = cells_vois[i];
760 if (filtre_lid_cell[cell_vois.localId()]==0){
763 cells_selected_for_new_mesh.
add(cell_vois);
765 filtre_lid_cell[cell_vois.localId()] = 1;
768 filtre_lid_node[node.localId()] = 1;
774 _addGhostLayers(current_all_cells, cells_selected_for_new_mesh, nbCouches-1, maxLocalIdCell, maxLocalIdNode);
782void ArcaneCasePartitioner::
787 info()<<
"ArcaneCasePartitioner::_addGhostGroups (id_loc = "<<id_loc<<
")";
790 std::map<Integer, Integer> dom_vois;
791 for(
Integer j=0, js=cells_selected_for_new_mesh.size(); j<js; ++j ){
792 Cell cell = cells_selected_for_new_mesh[j];
793 dom_vois[true_cells_owner[cell]] += 1;
797 std::map<Integer,SharedArray<Int32> > map_groupes;
798 for (std::map<Integer, Integer>::const_iterator iter=dom_vois.begin(); iter!=dom_vois.end(); ++iter){
799 Integer no_sous_dom = iter->first;
800 Integer nb_mailles_sous_dom = iter->second;
804 tab.
reserve(nb_mailles_sous_dom);
807 for(
Integer j=0, js=cells_selected_for_new_mesh.size(); j<js; ++j ){
808 Cell cell = cells_selected_for_new_mesh[j];
809 Integer no_sous_dom = true_cells_owner[cell];
812 Int32Array & liste_lid = map_groupes[no_sous_dom];
813 liste_lid.
add(new_cells_local_id[j]);
817 for (std::map<
Integer,SharedArray<Int32> >::iterator iter=map_groupes.begin(); iter!=map_groupes.end(); ++iter){
818 Integer no_sous_dom = iter->first;
821 ItemGroup groupe_loc;
822 if (no_sous_dom==id_loc)
823 groupe_loc = new_mesh->cellFamily()->findGroup(
"LOCAL",
true);
825 String nom_mf(
"MF_");
826 nom_mf = nom_mf+no_sous_dom;
827 groupe_loc = new_mesh->cellFamily()->findGroup(nom_mf,
true);
830 groupe_loc.addItems(liste_lid,
false);
837 Integer nbnodes = new_mesh->nodeFamily()->nbItem();
839 NodeInfoListView nodes(new_mesh->nodeFamily());
840 for (
int j= 0 ; j < nbnodes ; ++j) {
842 if (true_nodes_owner[node] == id_loc)
843 liste_lid.add(node.localId());
846 ItemGroup groupe_loc = new_mesh->nodeFamily()->findGroup(
"LOCALN",
true);
847 groupe_loc.addItems(liste_lid,
false);
852 ItemGroup groupe_glob = new_mesh->cellFamily()->findGroup(
"TOUT",
true);
854 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 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é.
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.
Interface du gestionnaire de fabriques de maillages.
virtual IPrimaryMesh * createMesh(const MeshBuildInfo &build_info)=0
Créé un maillage ou un sous-maillage.
virtual IMeshFactoryMng * meshFactoryMng() const =0
Fabrique de maillages associée à ce gestionnaire.
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 const MeshKind meshKind() const =0
Caractéristiques du maillage.
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 IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual IMeshMng * meshMng() const =0
Retourne le gestionnaire de maillage.
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.
Paramètres nécessaires à la construction d'un maillage.
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.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
@ Cell
Le maillage est AMR par maille.
std::int32_t Int32
Type entier signé sur 32 bits.