14#include "arcane/utils/InvalidArgumentException.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/ParallelFatalErrorException.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/Array.h"
19#include "arcane/utils/Real3.h"
20#include "arcane/utils/HashTableMap.h"
21#include "arcane/utils/OStringStream.h"
22#include "arcane/utils/ScopedPtr.h"
23#include "arcane/utils/StringBuilder.h"
24#include "arcane/utils/CheckedConvert.h"
25#include "arcane/utils/PlatformUtils.h"
26#include "arcane/utils/SmallArray.h"
27#include "arcane/utils/NotImplementedException.h"
29#include "arcane/core/IMesh.h"
30#include "arcane/core/IMeshWriter.h"
31#include "arcane/core/IParallelMng.h"
33#include "arcane/core/IItemFamily.h"
34#include "arcane/core/ItemPrinter.h"
35#include "arcane/core/VariableTypes.h"
36#include "arcane/core/ItemPairGroup.h"
37#include "arcane/core/ISubDomain.h"
38#include "arcane/core/ServiceBuilder.h"
39#include "arcane/core/IParallelReplication.h"
40#include "arcane/core/Timer.h"
41#include "arcane/core/IMeshPartitioner.h"
42#include "arcane/core/IPrimaryMesh.h"
43#include "arcane/core/IMeshChecker.h"
44#include "arcane/core/IItemFamilyNetwork.h"
45#include "arcane/core/NodesOfItemReorderer.h"
47#include "arcane/mesh/UnstructuredMeshUtilities.h"
48#include "arcane/ConnectivityItemVector.h"
49#include "arcane/mesh/NewItemOwnerBuilder.h"
50#include "arcane/mesh/ParticleFamily.h"
51#include "arcane/mesh/GraphDoFs.h"
52#include "arcane/mesh/BasicItemPairGroupComputeFunctor.h"
53#include "arcane/mesh/MeshNodeMerger.h"
54#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
55#include "arcane/mesh/ItemsOwnerBuilder.h"
68UnstructuredMeshUtilities::
79UnstructuredMeshUtilities::
80~UnstructuredMeshUtilities()
82 delete m_compute_adjacency_functor;
88void UnstructuredMeshUtilities::
89changeOwnersFromCells()
120 const Node node = *i_node;
121 const Cell cell = owner_builder.connectedCellOfItem(node);
122#ifdef ARCANE_DEBUG_LOAD_BALANCING
123 if (nodes_owner[node] != cells_owner[cell]) {
125 <<
" old_owner=" << nodes_owner[node]
126 <<
" current_cell_owner=" << cell.
owner()
127 <<
" new_owner=" << cells_owner[cell];
130 nodes_owner[node] = cells_owner[cell];
132 nodes_owner.synchronize();
138 const Edge edge = *i_edge;
139 const Cell cell = owner_builder.connectedCellOfItem(edge);
140#ifdef ARCANE_DEBUG_LOAD_BALANCING
141 if (edges_owner[edge] != cells_owner[cell]) {
143 <<
" old_owner=" << edges_owner[edge]
144 <<
" current_cell_owner=" << cell.
owner()
145 <<
" new_owner=" << cells_owner[cell];
148 edges_owner[edge] = cells_owner[cell];
150 edges_owner.synchronize();
156 const Face face = *i_face;
157 const Cell cell = owner_builder.connectedCellOfItem(face);
158 faces_owner[face] = cells_owner[cell];
160 faces_owner.synchronize();
165 for (
IItemFamily* family : m_mesh->itemFamilies()) {
174 particles_owner[particle] = cells_owner[pcell];
177 particles_owner[particle] = particle.
owner();
182 if (m_mesh->itemFamilyNetwork()) {
184 for (
IItemFamily* family : m_mesh->itemFamilies()) {
185 if (family->itemKind() !=
IK_DoF || family->name() == mesh::GraphDoFs::linkFamilyName())
189 for (
auto dualitem_kind : dualitem_kinds) {
190 IItemFamily* dualitem_family = dualitem_kind ==
IK_Particle ? m_mesh->findItemFamily(dualitem_kind, mesh::ParticleFamily::defaultFamilyName(),
false) : m_mesh->itemFamily(dualitem_kind);
191 if (dualitem_family) {
194 auto connectivity_name = mesh::connectivityName(family, dualitem_family);
195 bool is_dof2dual =
true;
196 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(family, dualitem_family, connectivity_name);
198 connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(dualitem_family, family, connectivity_name);
207 if (connected_items.size() > 0) {
208 dofs_new_owner[*item] = dualitems_new_owner[connected_items[0]];
215 dofs_new_owner[*connected_item] = dualitems_new_owner[*item];
224 IItemFamily* links_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::linkFamilyName(),
false);
227 IItemFamily* dualnodes_family = m_mesh->findItemFamily(
IK_DoF, mesh::GraphDoFs::dualNodeFamilyName(),
false);
228 if (dualnodes_family) {
230 auto connectivity_name = mesh::connectivityName(links_family, dualnodes_family);
231 auto connectivity = m_mesh->itemFamilyNetwork()->getConnectivity(links_family, dualnodes_family, connectivity_name);
236 if (connected_items.size() > 0) {
237 links_new_owner[*item] = dualnodes_new_owner[connected_items[0]];
249void UnstructuredMeshUtilities::
250localIdsFromConnectivity(
eItemKind item_kind,
259 "IK_Cell or IK_Face expected",
264 if (nb_item != local_ids.
size())
266 "Size different from 'items_nb_node'",
269 Integer item_connectivity_index = 0;
273 for (
Integer i = 0; i < nb_item; ++i) {
274 Integer current_nb_node = items_nb_node[i];
276 item_connectivity_index += current_nb_node;
278 buf.
resize(current_nb_node);
280 Int64 first_node_uid = buf[0];
282 Int32 first_node_lid = CheckedConvert::toInt32(buf[0]);
284 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array, first_node_uid_array, !allow_null);
285 if (first_node_lid == NULL_ITEM_LOCAL_ID) {
287 local_ids[i] = NULL_ITEM_LOCAL_ID;
291 for (
Integer j = 0; j < current_nb_node; ++j) {
294 sb += current_nodes[j];
296 sb +=
") not found (first node ";
297 sb += first_node_uid;
304 Node node(nodes[first_node_lid]);
305 Face face(mesh_utils::getFaceFromNodesUnique(node, buf));
308 local_ids[i] = NULL_ITEM_LOCAL_ID;
312 for (
Integer j = 0; j < current_nb_node; ++j) {
315 sb += current_nodes[j];
330void UnstructuredMeshUtilities::
338 if (nb_item != local_ids.
size())
340 "Size different from 'items_type'");
342 Int32 item_connectivity_index = 0;
343 ItemTypeMng* item_type_mng = m_mesh->itemTypeMng();
347 for (
Integer i = 0; i < nb_item; ++i) {
351 item_connectivity_index += current_nb_node;
353 face_reorderer.reorder(current_type_id, current_nodes);
355 Int64 first_node_uid = buf[0];
357 Int32 first_node_lid = CheckedConvert::toInt32(buf[0]);
359 m_mesh->nodeFamily()->itemsUniqueIdToLocalId(first_node_lid_array, first_node_uid_array, !allow_null);
360 if (first_node_lid == NULL_ITEM_LOCAL_ID) {
362 local_ids[i] = NULL_ITEM_LOCAL_ID;
366 for (
Integer j = 0; j < current_nb_node; ++j) {
369 sb += current_nodes[j];
371 sb +=
") not found (first node ";
372 sb += first_node_uid;
379 Node node(nodes[first_node_lid]);
380 Face face(MeshUtils::getFaceFromNodesUnique(node, buf));
383 local_ids[i] = NULL_ITEM_LOCAL_ID;
387 for (
Integer j = 0; j < current_nb_node; ++j) {
390 sb += current_nodes[j];
404Real3 UnstructuredMeshUtilities::
407 Real3 rvalue = value;
409 if (math::isNearlyZero(value.x))
411 if (math::isNearlyZero(value.y))
413 if (math::isNearlyZero(value.z))
439 String func_name =
"UnstructuredMeshUtilities::computeNormal";
444 Integer mesh_dimension = m_mesh->dimension();
449 Real3 global_normal = Real3::null();
450 Real nb_global_normal_used_node = 0.0;
454 nb_node += face_nb_node;
458 if (mesh_dimension == 3) {
459 Real3 v1 = nodes_coord[face.
node(1)] - nodes_coord[face.
node(0)];
460 Real3 v2 = nodes_coord[face.
node(2)] - nodes_coord[face.
node(0)];
463 else if (mesh_dimension == 2) {
464 Real3 dir = nodes_coord[face.
node(0)] - nodes_coord[face.
node(1)];
465 face_normal.
x = -dir.
y;
466 face_normal.
y = dir.
x;
470 face_normal = -face_normal;
472 global_normal = global_normal + face_normal;
473 nb_global_normal_used_node += 1.0;
484 NodeOccurenceMap nodes_occurence(nb_node * 2,
true, nb_node);
487 for (NodeLocalId inode : face.
nodeIds()) {
488 NodeOccurenceMap::Data* v = nodes_occurence.lookup(inode);
493 nodes_occurence.add(inode, 1);
499 nodes_occurence.each([&](NodeOccurenceMap::Data* d) {
500 if (d->value() == 1) {
501 Node node = nodes_internal[d->key()];
503 if (node.
owner() == rank) {
504 single_nodes.
add(node);
514 Real3 total_global_normal;
521 pm->
computeMinMaxSum(nb_global_normal_used_node, all_min, all_max, all_sum, min_rank, max_rank);
523 if (max_rank == rank) {
528 total_global_normal = buf;
531 info() <<
"TOTAL SINGLE NODE= " << total_nb_single_node <<
" surface=" << face_group.
name()
532 <<
" global_normal = " << total_global_normal;
533 if (total_nb_single_node < 2) {
534 ARCANE_FATAL(
"not enough nodes connected to only one face");
537 for (
Integer i = 0; i < nb_single_node; ++i) {
538 coords[i] = nodes_coord[single_nodes[i]];
545 Real3 barycentre = Real3::null();
546 for (
Integer i = 0; i < total_nb_single_node; ++i) {
547 barycentre += all_nodes_coord[i];
549 barycentre /= (
Real)total_nb_single_node;
550 if (total_nb_single_node == 2 && m_mesh->dimension() == 3) {
556 Real max_distance = 0.0;
558 Real3 s0 = all_nodes_coord[0];
559 Real3 s1 = all_nodes_coord[1];
560 nodes_occurence.each([&](NodeOccurenceMap::Data* d) {
561 Node node = nodes_internal[d->key()];
562 Real3 coord = nodes_coord[node];
568 Real distance = (coord - barycentre).squareNormL2();
569 if (distance > max_distance) {
573 max_distance = distance;
574 farthest_node = node;
579 if (!farthest_node.
null()) {
580 info() <<
" FARTHEST NODE= " <<
ItemPrinter(farthest_node) <<
" dist=" << max_distance;
583 Real3 farthest_coord = _broadcastFarthestNode(max_distance, farthest_node, nodes_coord);
584 info() <<
" FARTHEST NODE ALL coord=" << farthest_coord;
585 all_nodes_coord.
add(farthest_coord);
590 std::sort(std::begin(all_nodes_coord), std::end(all_nodes_coord));
592 Real3 full_normal = Real3::null();
593 info() <<
" NB FINAL NODE=" << nb_final_node;
594 for (
Integer i = 0; i < nb_final_node; ++i)
595 info() <<
" NODE=" << all_nodes_coord[i];
596 if (m_mesh->dimension() == 2) {
597 if (nb_final_node != 2) {
600 Real3 direction = all_nodes_coord[1] - all_nodes_coord[0];
601 full_normal.
x = -direction.
y;
602 full_normal.
y = direction.
x;
604 else if (m_mesh->dimension() == 3) {
614 all_nodes_coord[1] - all_nodes_coord[0]);
615 for (
Integer i = 0; i < nb_final_node; ++i) {
616 Real3 s0 = all_nodes_coord[i];
617 Real3 s1 = all_nodes_coord[(i + nb_final_node - 1) % nb_final_node];
618 Real3 s2 = all_nodes_coord[(i + 1) % nb_final_node];
620 info() <<
" ADD NORMAL: " << normal;
621 full_normal += normal;
622 info() <<
" FULL: " << full_normal;
625 full_normal = first_normal;
628 ARCANE_FATAL(
"invalid mesh dimension (should be 2 or 3)");
635 info() <<
" Normal is " << full_normal;
637 total_global_normal /= b;
640 full_normal = -full_normal;
642 full_normal = _round(full_normal);
643 info() <<
" Final normal is " << full_normal <<
" dir=" << dir;
657computeDirection(
const NodeGroup& node_group,
661 String func_name =
"UnstructuredMeshUtilities::computeDirection";
666 Real3 barycentre = Real3::null();
668 barycentre += nodes_coord[inode];
670 Real r_barycentre[3];
671 r_barycentre[0] = barycentre.
x;
672 r_barycentre[1] = barycentre.
y;
673 r_barycentre[2] = barycentre.
z;
676 barycentre =
Real3(rav[0], rav[1], rav[2]);
677 debug() <<
" BARYCENTRE COMPUTE DIRECTION = " << barycentre;
681 Real3 first_boundary_coord;
683 Real max_distance = 0.0;
687 Real3 coord = nodes_coord[node];
688 Real distance = (coord - barycentre).squareNormL2();
689 if (distance > max_distance) {
690 max_distance = distance;
691 farthest_node = node;
694 first_boundary_coord = _broadcastFarthestNode(max_distance, farthest_node, nodes_coord);
696 *n1 = first_boundary_coord;
698 Real3 second_boundary_coord;
700 Real max_distance = 0.0;
704 Real3 coord = nodes_coord[node];
705 Real distance = (coord - first_boundary_coord).squareNormL2();
706 if (distance > max_distance) {
707 max_distance = distance;
708 farthest_node = node;
711 second_boundary_coord = _broadcastFarthestNode(max_distance, farthest_node, nodes_coord);
713 *n2 = second_boundary_coord;
715 Real3 direction = second_boundary_coord - first_boundary_coord;
718 ARCANE_FATAL(
"Direction is null for group '{0}' first_coord={1} second_coord={2}",
719 node_group.
name(), first_boundary_coord, second_boundary_coord);
721 return direction / norm;
727Real3 UnstructuredMeshUtilities::
728_broadcastFarthestNode(
Real distance,
const Node& farthest_node,
731 String func_name =
"UnstructuredMeshUtilities::_broadcastFarthestNode()";
735 Real all_min_distance = 0.0;
736 Real all_max_distance = 0.0;
737 Real all_sum_distance = 0.0;
740 pm->
computeMinMaxSum(distance, all_min_distance, all_max_distance, all_sum_distance, min_rank, max_rank);
742 if (!farthest_node.
null())
743 debug() <<
" FARTHEST NODE myself coord=" << nodes_coord[farthest_node]
744 <<
" distance=" << distance
745 <<
" rank=" << max_rank
746 <<
" max_distance=" << all_max_distance;
748 debug() <<
" FARTHEST NODE myself coord=none"
749 <<
" distance=" << distance
750 <<
" rank=" << max_rank
751 <<
" max_distance=" << all_max_distance;
753 if (max_rank == rank) {
754 if (farthest_node.
null())
757 buf = nodes_coord[farthest_node];
758 debug() <<
" I AM FARTHEST NODE ALL coord=" << buf;
760 pm->broadcast(Real3ArrayView(1, &buf), max_rank);
761 Real3 farthest_coord(buf);
762 debug() <<
" FARTHEST NODE ALL coord=" << farthest_coord
763 <<
" rank=" << max_rank
764 <<
" max_distance=" << all_max_distance;
765 return farthest_coord;
771void UnstructuredMeshUtilities::
774 m_compute_adjacency_functor->computeAdjacency(adjency_array, link_kind, nb_layer);
780bool UnstructuredMeshUtilities::
781writeToFile(
const String& file_name,
const String& service_name)
789 warning() << String::format(
"The specified service '{0}' to write the mesh is not available."
790 " Valid names are {1}",
791 service_name, available_names);
794 mesh_writer->writeMeshToFile(m_mesh, file_name);
801void UnstructuredMeshUtilities::
803 bool initial_partition)
807 if (
mesh != this->m_mesh)
822 info() <<
"Partitioning the mesh (initial?=" << initial_partition <<
")";
826 info() <<
"Waiting for partition information from the master replica";
828 if (has_replication) {
832 mesh->checker()->checkValidReplication();
843 rep_pm->broadcast(owners, replica_master_rank);
864 if (initial_partition || has_replication)
865 mesh->prepareForDump();
871void UnstructuredMeshUtilities::
874 bool allow_non_corresponding_face)
877 merger.
mergeNodes(nodes_local_id, nodes_to_merge_local_id, allow_non_corresponding_face);
883void UnstructuredMeshUtilities::
884computeAndSetOwnersForNodes()
887 owner_builder.computeNodesOwner();
893void UnstructuredMeshUtilities::
894computeAndSetOwnersForEdges()
897 owner_builder.computeEdgesOwner();
903void UnstructuredMeshUtilities::
904computeAndSetOwnersForFaces()
907 owner_builder.computeFacesOwner();
922 unique_ids[index] = node.uniqueId();
925 Int64 new_uid = MeshUtils::generateHashUniqueId(unique_ids);
935void UnstructuredMeshUtilities::
936recomputeItemsUniqueIdFromNodesUniqueId()
942 tm->
info() <<
"Calling RecomputeItemsUniqueIdFromNodesUniqueId()";
945 mesh->nodeFamily()->notifyItemsUniqueIdChanged();
946 _recomputeUniqueIds(
mesh->edgeFamily());
947 _recomputeUniqueIds(
mesh->faceFamily());
948 _recomputeUniqueIds(
mesh->cellFamily());
#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.
Utility functions for the mesh.
bool reorderNodesOfFace(Int64ConstArrayView before_ids, Int64ArrayView after_ids)
Reorders the nodes of a face.
Integer size() const
Number of elements in the vector.
Exception when an argument is invalid.
Modifiable view of an array of type T.
constexpr Integer size() const noexcept
Returns the size of the array.
void resize(Int64 s)
Changes the number of elements in the array to s.
void add(ConstReferenceType val)
Adds element val to the end of the array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
Utility functions on a mesh.
Manages the retrieval of connectivity information.
ItemVectorView connectedItems(ItemLocalId item)
Returns the entities connected to item.
Constant view of an array of type T.
constexpr const_pointer data() const noexcept
Pointer to the allocated memory.
constexpr Integer size() const noexcept
Number of elements in the array.
Cell frontCell() const
Cell in front of the face (null cell if none).
bool isSubDomainBoundary() const
Indicates if the face is on the subdomain boundary (i.e nbCell()==1).
Cell boundaryCell() const
Cell associated with this boundary face (null cell if none).
Hash table for associative arrays.
Interface of an entity family.
virtual void notifyItemsUniqueIdChanged()=0
Notifies that the unique IDs of the entities have been modified.
virtual ItemGroup allItems() const =0
Group of all entities.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable containing the number of the new subdomain owning the entity.
Interface of a mesh partitioner.
virtual IPrimaryMesh * primaryMesh()=0
Associated mesh.
virtual void partitionMesh(bool initial_partition)=0
virtual void notifyEndPartition()=0
Notification when a re-partitioning finishes (after entity exchange).
Interface of the parallelism manager for a subdomain.
virtual void computeMinMaxSum(char val, char &min_val, char &max_val, char &sum_val, Int32 &min_rank, Int32 &max_rank)=0
Calculates the sum, min, and max of a value in one operation.
virtual Int32 commRank() const =0
Rank of this instance in the communicator.
virtual IParallelReplication * replication() const =0
Replication information.
virtual ITimeStats * timeStats() const =0
Associated statistics manager (can be null).
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Performs an all-gather operation across all processors.
virtual char reduce(eReduceType rt, char v)=0
Performs a reduction of type rt on the real v and returns the value.
virtual void barrier()=0
Performs a barrier.
Brief information on parallel subdomain replication.
virtual bool hasReplication() const =0
Indicates if replication is active.
virtual IParallelMng * replicaParallelMng() const =0
Communicator associated with all replicas representing the same subdomain.
virtual Int32 masterReplicationRank() const =0
Rank in the master replication.
virtual bool isMasterRank() const =0
Indicates if this replication rank is the master.
virtual void exchangeItems()=0
Changes the owning subdomains of entities.
Interface managing execution time statistics.
virtual TraceMessage info()=0
Stream for an information message.
Exception when a fatal error has occurred.
const String & name() const
Group name.
ItemGroup own() const
Group equivalent to this one but containing only the local elements of the subdomain.
Index of an Item in a variable.
Utility class for printing information about an entity.
Type of an entity (Item).
Integer nbLocalNode() const
Number of nodes of the entity.
Mesh entity type manager.
ItemTypeInfo * typeFromId(Integer id) const
Type corresponding to the number id.
Mesh element based on nodes (Edge,Face,Cell).
Node node(Int32 i) const
i-th node of the entity
NodeConnectedListViewType nodes() const
List of nodes of the entity.
Int32 nbNode() const
Number of nodes of the entity.
NodeLocalIdView nodeIds() const
List of nodes of the entity.
impl::MutableItemBase mutableItemBase() const
Mutable internal part of the entity.
constexpr Int32 localId() const
Local identifier of the entity in the processor subdomain.
Int32 owner() const
Owner subdomain number of the entity.
constexpr bool null() const
true if the entity is null (i.e. not connected to the mesh)
constexpr bool isOwn() const
true if the entity belongs to the subdomain
Class to convert a NodeLocalId to an edge.
Utility class to reorder the nodes of an entity.
Exception when a function is not implemented.
Cell cell() const
Cell to which the particle belongs. You must call setCell() before calling this function....
Class managing a 3-dimensional real vector.
__host__ __device__ Real normL2() const
Returns the L2 norm of the triplet $ .
constexpr __host__ __device__ Real squareNormL2() const
Returns the square of the L2 norm of the triplet $ .
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.
void getServicesNames(Array< String > &names) const
Fills names with the names of services available to instantiate this interface.
1D data array with pre-allocated stack buffer.
Unicode character string constructor.
String toString() const
Returns the constructed character string.
Unicode character string.
Positions the name of the currently executing action.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flow for a debug message.
TraceMessage info() const
Flow for an information message.
TraceMessage warning() const
Flow for a warning message.
1D data vector with value semantics (STL style).
void changeOwnersFromCells() override
Positions the new owners of nodes, edges, and faces based on the cells.
Generic class for calculating entity owners.
void mergeNodes(Int32ConstArrayView nodes_local_id, Int32ConstArrayView nodes_to_merge_local_id, bool allow_non_corresponding_face=false)
__host__ __device__ Real3 vecMul(Real3 u, Real3 v)
Vector cross product of u by v in .
__host__ __device__ Real scaMul(Real2 u, Real2 v)
Dot product of u by v in .
__host__ __device__ Real3 cross(Real3 v1, Real3 v2)
Cross product of two 3-component vectors.
ItemGroupT< Face > FaceGroup
Group of faces.
ItemGroupT< Node > NodeGroup
Group of nodes.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Coordinate type quantity at node.
ItemVariableScalarRefT< Int32 > VariableItemInt32
32-bit integer type quantity
@ ReduceSum
Sum of values.
bool isZero(const BuiltInProxy< _Type > &a)
Tests if a value is exactly equal to zero.
constexpr __host__ __device__ bool isNearlyEqual(const Type &a, const Type &b)
Tests if two values are approximately equal. For integer types, this function is equivalent to IsEqua...
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
ArrayView< Int64 > Int64ArrayView
C equivalent of a 1D array of 64-bit integers.
@ 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.
ArrayView< Real3 > Real3ArrayView
C equivalent of a 1D array of Real3.
Int32 Integer
Type representing an integer.
UniqueArray< Real3 > Real3UniqueArray
Dynamic 1D array of rank 3 vectors.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
ConstArrayView< ItemInternal * > ItemInternalList
Type of the internal list of entities.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
ArrayView< Int32 > Int32ArrayView
C equivalent of a 1D array of 32-bit integers.
eItemKind
Mesh entity type.
@ IK_Particle
Particle mesh entity.
@ IK_Node
Node mesh entity.
@ IK_Cell
Cell mesh entity.
@ IK_Face
Face mesh entity.
@ IK_DoF
Degree of Freedom mesh entity.
@ IK_Edge
Edge mesh entity.
double Real
Type representing a real number.
ConstArrayView< Integer > IntegerConstArrayView
C equivalent of a 1D array of integers.
ArrayView< Real > RealArrayView
C equivalent of a 1D array of reals.
std::int32_t Int32
Signed integer type of 32 bits.
Real y
second component of the triplet
Real z
third component of the triplet
Real x
first component of the triplet