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
114 ~ArcaneCasePartitioner()
override;
136 std::ofstream m_sortiesCorrespondance;
140 void _partitionMesh(
Int32 nb_part);
163 tm->
info() <<
" _regroupeContraintes: nbMailles = " << meshes[0]->nbCell() <<
", nbMaillesLocales = " << meshes[0]->ownCells().
size();
165 Integer nb_contraintes = m_main->options()->constraints.size();
166 tm->
info() <<
"Number of constraints = " << nb_contraintes;
167 if (nb_contraintes == 0)
173 cells_new_owner[icell] = (*icell).owner();
178 mesh->partitionConstraintMng()->addConstraint(c);
179 mesh->partitionConstraintMng()->computeAndApplyConstraints();
181 cells_new_owner.synchronize();
182 mesh->utilities()->changeOwnersFromCells();
183 mesh->modifier()->setDynamic(
true);
184 bool compact =
mesh->properties()->getBool(
"compact");
185 mesh->properties()->setBool(
"compact",
true);
186 mesh->toPrimaryMesh()->exchangeItems();
187 mesh->properties()->setBool(
"compact", compact);
191 FactoryT<IMeshWriter> mesh_writer_factory(sd->
serviceMng());
192 mesh_writer = mesh_writer_factory.createInstance(
"Lima",
true);
199 mesh_writer->writeMeshToFile(
mesh,filename);
210 String lib_name = m_main->options()->library();
218 tm->
info() <<
"DoInitialPartition. Service=" << lib_name;
220 if (!mesh_partitioner.get())
221 ARCANE_FATAL(
"can not found service named '{0}' for initial mesh partitioning", lib_name);
230 Int32 nb_part = m_main->options()->nbCutPart();
233 tm->
info() <<
"NbPart = " << nb_part <<
" nb_mesh=" << nb_mesh;
235 for (
Integer i = 0; i < nb_mesh; ++i) {
248 bool is_dynamic =
mesh->isDynamic();
249 mesh->modifier()->setDynamic(
true);
260 mesh_partitioner->partitionMesh(
mesh, nb_part);
266 Int32 new_owner = cells_new_owner[icell];
267 true_cells_owner[icell] = new_owner;
268 cells_new_owner[icell] = new_owner % nb_rank;
271 true_nodes_owner[inode] = nodes_new_owner[inode];
274 mesh->utilities()->changeOwnersFromCells();
277 bool compact =
mesh->properties()->getBool(
"compact");
278 mesh->properties()->setBool(
"compact",
true);
279 mesh->toPrimaryMesh()->exchangeItems();
280 mesh->modifier()->setDynamic(is_dynamic);
281 mesh->properties()->setBool(
"compact", compact);
287 if (m_main->options()->nbGhostLayer() == 2)
288 mesh->updateGhostLayers(
false);
299 Int32 new_owner = new_owners[icell];
300 ++nb_cells[new_owner];
304 ITraceMng* tm = m_sub_domain->traceMng();
305 tm->
info() <<
" -- Partitioning statistics --";
306 tm->
info() <<
" Part NbCell";
307 for (
Integer i = 0; i < nb_part; ++i) {
315ArcaneCasePartitioner::
320 info() <<
"** ** SET INITIAL PARTITIONER 2";
327ArcaneCasePartitioner::
328~ArcaneCasePartitioner()
339 info() <<
"ArcaneCasePartitioner::execute() nb_part=" << nb_part;
341 subDomain()->timeStats()->dumpTimeAndMemoryUsage(subDomain()->parallelMng());
342 _partitionMesh(nb_part);
352void ArcaneCasePartitioner::
353_partitionMesh(
Int32 nb_part)
364 if (mesh_writer_name.
empty())
365 pfatal() <<
"No service selected to write the mesh";
367 auto mesh_writer = sb.createReference(mesh_writer_name,
SB_Collective);
370 info() <<
"Mesh file pattern=" << pattern;
384 info() <<
"TOTAL_NB_CELL=" << total_current_nb_cell;
390 build_info.addMeshKind(current_mesh->
meshKind());
406 impl::MshMeshGenerationInfo* new_msh_mesh_info =
nullptr;
407 auto* msh_mesh_info = impl::MshMeshGenerationInfo::getReference(mesh(),
false);
409 new_msh_mesh_info = impl::MshMeshGenerationInfo::getReference(new_mesh,
true);
410 *new_msh_mesh_info = *msh_mesh_info;
413 Int32 saved_nb_cell = 0;
414 Int32 min_nb_cell = total_current_nb_cell;
415 Int32 max_nb_cell = 0;
417 if (
options()->createCorrespondances())
421 Integer maxLocalIdCell = mesh()->cellFamily()->maxLocalId();
422 Integer maxLocalIdNode = mesh()->nodeFamily()->maxLocalId();
426 for (IItemFamily* family : mesh()->itemFamilies()) {
428 iitem->mutableItemBase().setOwner(0, 0);
434 info() <<
"NbPart=" << nb_part <<
" my_rank=" << my_rank;
435 for (
Integer i = 0; i < nb_part; ++i) {
436 if ((i % nb_rank) != my_rank) {
437 if (my_rank == 0 &&
options()->createCorrespondances()) {
439 info() <<
"Receive on master to build correspondence file on sub-domain " << i
440 <<
" sent from processor " << i % nb_rank;
445 pm->
recv(taillesTab, i % nb_rank);
446 nodesUniqueId.resize(taillesTab[0]);
447 cellsUniqueId.resize(taillesTab[1]);
448 pm->
recv(nodesUniqueId, i % nb_rank);
449 pm->
recv(cellsUniqueId, i % nb_rank);
458 UniqueArray<Cell> cells_selected_for_new_mesh;
460 if (true_cells_owner[icell] == i) {
462 cells_selected_for_new_mesh.add(cell);
468 _addGhostLayers(current_all_cells, cells_selected_for_new_mesh,
options()->nbGhostLayer(), maxLocalIdCell, maxLocalIdNode);
472 for (
Integer j = 0, js = cells_selected_for_new_mesh.size(); j < js; ++j) {
473 Cell cell = cells_selected_for_new_mesh[j];
474 cells_local_id.add(cell.localId());
475 cells_unique_id.add(
static_cast<Int64>(cell.uniqueId()));
479 SerializeBuffer buffer;
481 info() <<
"NB_CELL_TO_SERIALIZE=" << nb_cell_to_copy;
492 for (
Integer zid = 0; zid < nb_cell_to_copy; ++zid) {
493 Cell current_cell = current_cells[cells_local_id[zid]];
494 Cell new_cell = new_cells[new_cells_local_id[zid]];
495 if (current_cell.uniqueId() != new_cell.uniqueId())
496 fatal() <<
"Inconsistent unique ids";
497 Integer nb_node = current_cell.nbNode();
501 for (
Integer z2 = 0; z2 < nb_node; ++z2) {
502 Real3 coord = current_coordinates[current_cell.node(z2)];
505 new_coordinates[new_cell.node(z2)] = coord;
507 new_cell.node(z2).mutableItemBase().setOwner(true_nodes_owner[current_cell.node(z2)], 0);
517 if (
options()->nbGhostLayer() > 0)
518 _addGhostGroups(new_mesh, cells_selected_for_new_mesh, true_cells_owner, true_nodes_owner, new_cells_local_id, i);
521 info() <<
"NB_NEW_CELL=" << new_nb_cell;
522 min_nb_cell =
math::min(min_nb_cell, new_nb_cell);
523 max_nb_cell =
math::max(max_nb_cell, new_nb_cell);
524 saved_nb_cell += new_nb_cell;
526 if (pattern.
empty()) {
527 StringBuilder sfilename =
"cut_mesh_";
529 sfilename +=
".mli2";
530 filename = sfilename;
536 if (pattern.
length() > 128) {
537 pfatal() <<
"Pattern too long (max=128)";
539 sprintf(buf, pattern.
localstr(), i);
540 filename = String(StringView(buf));
543 info() <<
"Writing mesh file filename='" << filename <<
"'";
544 bool is_bad = mesh_writer->writeMeshToFile(new_mesh, filename);
546 ARCANE_FATAL(
"Can not write mesh file '{0}'", filename);
550 if (
options()->createCorrespondances()) {
551 info() <<
"Participation to build correspondence file on sub-domain " << i;
559 NodeInfoListView nodes(new_mesh->
nodeFamily());
560 for (
int j = 0; j < taillesTab[0]; ++j) {
561 Node node = nodes[j];
562 nodesUniqueId[j] = node.uniqueId();
565 CellInfoListView cells(new_mesh->
cellFamily());
566 for (
int j = 0; j < taillesTab[1]; ++j) {
567 Cell cell = cells[j];
568 cellsUniqueId[j] = cell.uniqueId();
572 pm->send(taillesTab, 0);
573 pm->send(nodesUniqueId, 0);
574 pm->send(cellsUniqueId, 0);
585 info() <<
"TOTAL_NEW_NB_CELL=" << total_new_nb_cell
586 <<
" min=" << total_min_nb_cell
587 <<
" max=" << total_max_nb_cell
588 <<
" computed_average=" << (total_current_nb_cell / nb_part);
590 subDomain()->timeStats()->dumpTimeAndMemoryUsage(pm);
592 if (
options()->createCorrespondances())
595 if (
options()->nbGhostLayer() == 0)
596 if (total_new_nb_cell != total_current_nb_cell)
597 pfatal() <<
"Bad number of saved cells current=" << total_current_nb_cell
598 <<
" saved=" << total_new_nb_cell;
609 info() <<
" _initCorrespondance(" << my_rank <<
")";
614 m_sortiesCorrespondance.open(
"Correspondances");
616 if (m_sortiesCorrespondance.fail()) {
617 pfatal() <<
"Unable to write to file 'Correspondances' ";
620 m_sortiesCorrespondance <<
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
621 m_sortiesCorrespondance <<
"<!-- Correspondence file generated by Arcane/Decoupe3D V2 -->\n";
622 m_sortiesCorrespondance <<
"\n<cpus>\n";
631 info() <<
" _writeCorrespondance(" << rank <<
", nodesUniqueId.size() = "
632 << nodesUniqueId.
size() <<
", cellsUniqueId.size() = " << cellsUniqueId.
size() <<
")";
634 m_sortiesCorrespondance <<
" <cpu id=\"" << rank <<
"\">" <<
"\n"
635 <<
" <noeuds>" <<
"\n"
638 m_sortiesCorrespondance << nodesUniqueId[i] <<
" ";
640 m_sortiesCorrespondance <<
"\n"
643 <<
" <mailles>" <<
"\n"
646 m_sortiesCorrespondance << cellsUniqueId[i] <<
" ";
647 m_sortiesCorrespondance <<
"\n"
648 <<
" </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);
738 filtre_lid_cell.
fill(0);
740 filtre_lid_node.
fill(0);
743 for (
Integer j = 0, js = cells_selected_for_new_mesh.
size(); j < js; ++j) {
744 Cell cell = cells_selected_for_new_mesh[j];
745 filtre_lid_cell[cell.
localId()] = 1;
750 for (
Integer j = 0, js = cells_selected_for_new_mesh.
size(); j < js; ++j) {
751 Cell cell = cells_selected_for_new_mesh[j];
754 for (
Integer k = 0, ks = nodes.
size(); k < ks; ++k) {
755 Node node = nodes[k];
756 if (filtre_lid_node[node.
localId()] == 0) {
760 for (
Integer i = 0, is = cells_vois.
size(); i < is; ++i) {
761 Cell cell_vois = cells_vois[i];
762 if (filtre_lid_cell[cell_vois.
localId()] == 0) {
764 cells_selected_for_new_mesh.
add(cell_vois);
766 filtre_lid_cell[cell_vois.
localId()] = 1;
769 filtre_lid_node[node.
localId()] = 1;
775 _addGhostLayers(current_all_cells, cells_selected_for_new_mesh, nbCouches - 1, maxLocalIdCell, maxLocalIdNode);
789 info() <<
"ArcaneCasePartitioner::_addGhostGroups (id_loc = " << id_loc <<
")";
792 std::map<Integer, Integer> dom_vois;
793 for (
Integer j = 0, js = cells_selected_for_new_mesh.
size(); j < js; ++j) {
794 Cell cell = cells_selected_for_new_mesh[j];
795 dom_vois[true_cells_owner[cell]] += 1;
799 std::map<Integer, SharedArray<Int32>> map_groupes;
800 for (std::map<Integer, Integer>::const_iterator iter = dom_vois.begin(); iter != dom_vois.end(); ++iter) {
801 Integer no_sous_dom = iter->first;
802 Integer nb_mailles_sous_dom = iter->second;
806 tab.
reserve(nb_mailles_sous_dom);
809 for (
Integer j = 0, js = cells_selected_for_new_mesh.
size(); j < js; ++j) {
810 Cell cell = cells_selected_for_new_mesh[j];
811 Integer no_sous_dom = true_cells_owner[cell];
814 Int32Array& liste_lid = map_groupes[no_sous_dom];
815 liste_lid.
add(new_cells_local_id[j]);
820 Integer no_sous_dom = iter->first;
824 if (no_sous_dom == id_loc)
828 nom_mf = nom_mf + no_sous_dom;
832 groupe_loc.
addItems(liste_lid,
false);
842 for (
int j = 0; j < nbnodes; ++j) {
843 Node node = nodes[j];
844 if (true_nodes_owner[node] == id_loc)
849 groupe_loc.
addItems(liste_lid,
false);
855 groupe_glob.
addItems(new_cells_local_id,
false);
#define ARCANE_CHECK_POINTER(ptr)
Macro returning the pointer ptr if it is not null or throwing an exception if it is null.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Integer size() const
Number of elements in the vector.
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.
External mesh partitioning service.
void _addGhostLayers(CellGroup current_all_cells, Array< Cell > &cells_selected_for_new_mesh, Integer nb_layer, Integer maxLocalIdCell, Integer maxLocalIdNode)
Adds to the cell array the desired number of cell layers.
bool isActive() const override
True if the service is active.
void execute() override
Executes the service operation.
void _initCorrespondance(Int32 my_rank)
Opens the Correspondence file (only on proc 0).
void _computeGroups(IItemFamily *current_family, IItemFamily *new_family)
Recopy the groups of the current family into the new one.
void build() override
Build-level construction of the service.
void _finalizeCorrespondance(Int32 my_rank)
Closes the Correspondence file (only on proc 0).
void setParallelMng(IParallelMng *) override
Positions the associated parallelism manager. This method must be called before execute().
void _writeCorrespondance(Int32 rank, Int64Array &nodesUniqueId, Int64Array &cellsUniqueId)
Writes the Correspondence file.
void _addGhostGroups(IMesh *new_mesh, Array< Cell > &cells_selected_for_new_mesh, VariableCellInt32 &true_cells_owner, VariableNodeInt32 &true_nodes_owner, Int32Array &new_cells_local_id, Integer id_loc)
Adds the TOUT, LOCAL, and MF_* cell groups based on neighbor groups Also adds the LOCALN node group (...
void partitionAndDistributeMeshes(ConstArrayView< IMesh * > meshes) override
Partitions the meshes.
void _printStats(Integer nb_part, IMesh *mesh, VariableCellInt32 &new_owners)
Prints statistics on the partitioning.
void _mergeConstraints(ConstArrayView< IMesh * > meshes)
Groups cells associated with constraints on the same process.
UniqueArray< TrueOwnerInfo > m_part_indexes
Stores for each mesh a variable indicating which partition each cell belongs to.
Base class for 1D data vectors.
void fill(ConstReferenceType value)
Fills the array with the value value.
void clear()
Removes the elements from the array.
iterator begin()
Iterator over the first element of the array.
void add(ConstReferenceType val)
Adds element val to the end of the array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
EnumeratorT< ItemGroup > Enumerator
Constant view of an array of type T.
constexpr Integer size() const noexcept
Number of elements in the array.
virtual ITraceMng * traceMng() const =0
Trace manager.
virtual IServiceMng * serviceMng() const =0
Service manager.
Interface of an initial partitioner.
Interface of an entity family.
virtual ItemGroup findGroup(const String &name) const =0
Searches for a group.
virtual ItemGroupCollection groups() const =0
Collection of groups in this family.
virtual ItemGroup allItems() const =0
Group of all entities.
virtual ItemGroup createGroup(const String &name, Int32ConstArrayView local_ids, bool do_override=false)=0
Creates an entity group named name containing the entities local_ids.
virtual Int32 maxLocalId() const =0
virtual String name() const =0
Family name.
virtual void itemsUniqueIdToLocalId(Int32ArrayView local_ids, Int64ConstArrayView unique_ids, bool do_fatal=true) const =0
Converts an array of unique numbers to local numbers.
virtual Integer nbItem() const =0
Number of entities.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable containing the number of the new subdomain owning the entity.
virtual IItemFamily * nodeFamily()=0
Returns the node family.
virtual Integer nbCell()=0
Number of mesh cells.
virtual IItemFamily * edgeFamily()=0
Returns the edge family.
virtual IItemFamily * faceFamily()=0
Returns the face family.
virtual IItemFamily * cellFamily()=0
Returns the cell family.
Interface of the mesh factory manager.
virtual IPrimaryMesh * createMesh(const MeshBuildInfo &build_info)=0
Creates a mesh or a sub-mesh.
virtual IMeshFactoryMng * meshFactoryMng() const =0
Mesh factory associated with this manager.
virtual void setDynamic(bool v)=0
Sets the property indicating whether the mesh can evolve.
virtual void addCells(Integer nb_cell, Int64ConstArrayView cell_infos, Int32ArrayView cells_lid=Int32ArrayView())=0
Adds cells.
virtual void endUpdate()=0
Notifies the instance that mesh modification is finished.
virtual void clearItems()=0
Deletes all entities of all families in this mesh.
Interface of a mesh partitioning constraint.
virtual ItemInternalList itemsInternal(eItemKind)=0
Internal array of mesh elements of type type.
virtual IMeshModifier * modifier()=0
Associated modifier interface.
virtual ARCANE_DEPRECATED_240 void serializeCells(ISerializer *buffer, Int32ConstArrayView cells_local_id)=0
virtual void destroyGroups()=0
Destroys all groups of all families.
virtual const MeshKind meshKind() const =0
Mesh characteristics.
virtual IPrimaryMesh * toPrimaryMesh()=0
Returns the instance in the form of an IPrimaryMesh.
virtual Properties * properties()=0
Properties associated with this mesh.
Interface of the parallelism manager for a subdomain.
virtual Int32 commRank() const =0
Rank of this instance in the communicator.
virtual IParallelMng * sequentialParallelMng()=0
Returns a sequential parallelism manager.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual Int32 commSize() const =0
Number of instances in the communicator.
virtual char reduce(eReduceType rt, char v)=0
Performs a reduction of type rt on the real v and returns the value.
virtual VariableNodeReal3 & nodesCoordinates()=0
Node coordinates.
virtual void allocateCells(Integer nb_cell, Int64ConstArrayView cells_infos, bool one_alloc=true)=0
Allocation of a mesh.
virtual void setDimension(Integer dim)=0
Positions the mesh dimension (1D, 2D, or 3D).
Interface of the subdomain manager.
virtual ITimeStats * timeStats() const =0
Execution time statistics.
virtual IParallelMng * parallelMng()=0
Returns the parallelism manager.
virtual IMeshMng * meshMng() const =0
Returns the mesh manager.
virtual void setInitialPartitioner(IInitialPartitioner *partitioner)=0
Sets the initial partitioner.
virtual void dumpTimeAndMemoryUsage(IParallelMng *pm)=0
Displays the current date and memory consumption.
virtual TraceMessage info()=0
Stream for an information message.
const String & name() const
Group name.
bool isOwn() const
Returns whether the group contains only elements belonging to the subdomain.
Integer size() const
Number of elements in the group.
void addItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Adds entities.
bool isAllItems() const
Indicates if the group is that of all entities.
Int32 size() const
Number of elements in the vector.
NodeConnectedListViewType nodes() const
List of nodes of the entity.
constexpr Int32 localId() const
Local identifier of the entity in the processor subdomain.
Parameters necessary for building a mesh.
View of node information.
CellConnectedListViewType cells() const
List of cells of the node.
void setBool(const String &name, bool value)
Sets a boolean property of name name and value value.
Encapsulation of an automatically destructing pointer.
ISubDomain * subDomain() const
Access to the associated ISubDomain.
Structure containing the information to create a service.
Utility class for instantiating a service of a given interface.
Ref< InterfaceType > createReference(const String &name, eServiceBuilderProperties properties=SB_None)
Creates an instance implementing the InterfaceType interface.
1D vector of data with reference semantics.
Unicode character string constructor.
Unicode character string.
Int64 length() const
Returns the length of the string.
const char * localstr() const
Returns the conversion of the instance into UTF-8 encoding.
bool empty() const
True if the string is empty (null or "").
Sentinel for the timer. The sentinel associated with a timer allows it to be triggered upon its const...
@ TimerReal
Timer using real time.
Real lastActivationTime() const
Returns the time (in seconds) spent during the last activation of the timer.
TraceMessage pinfo() const
Flow for a parallel information message.
TraceMessage fatal() const
Flow for a fatal error message.
TraceMessage pfatal() const
Flow for a parallel fatal error message.
TraceMessage info() const
Flow for an information message.
Formatting the stream by length.
1D data vector with value semantics (STL style).
Parameters necessary for building a variable.
__host__ __device__ Real2 min(Real2 a, Real2 b)
Returns the minimum of two Real2.
T max(const T &a, const T &b, const T &c)
Returns the maximum of three elements.
ItemVectorViewT< Node > NodeVectorView
View over a vector of nodes.
ItemGroupT< Cell > CellGroup
Group of cells.
ItemVectorViewT< Cell > CellVectorView
View over a vector of cells.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Coordinate type quantity at node.
MeshVariableScalarRefT< Node, Int32 > VariableNodeInt32
Quantity at the node of 32-bit integer type.
ItemVariableScalarRefT< Int32 > VariableItemInt32
32-bit integer type quantity
MeshVariableScalarRefT< Cell, Int32 > VariableCellInt32
Quantity at the cell center of 32-bit integer type.
@ ReduceSum
Sum of values.
@ ReduceMin
Minimum of values.
@ ReduceMax
Maximum of values.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Array< Int64 > Int64Array
Dynamic one-dimensional array of 64-bit integers.
@ SB_Collective
Indicates that all processes perform the same operation.
@ SB_AllowNull
Allows the service to be absent.
UniqueArray< Int64 > Int64UniqueArray
Dynamic 1D array of 64-bit integers.
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
ConstArrayView< ItemInternal * > ItemInternalList
Type of the internal list of entities.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
@ IK_Cell
Cell mesh entity.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Creates a reference on a pointer.
Array< Int32 > Int32Array
Dynamic one-dimensional array of 32-bit integers.
@ Cell
The mesh is AMR by cell.
std::int32_t Int32
Signed integer type of 32 bits.