PK_ERROR_code_t PK_TOPOL_eval_mass_props
(
--- received arguments ---
int n_topols, --- number of topols ( >0 )
const PK_TOPOL_t topols[], --- topological entities array
double accuracy, --- 0.0 <= accuracy <= 1.0
const PK_TOPOL_eval_mass_props_o_t *options, --- options structure
--- returned arguments ---
double amount[], --- amount
double mass[], --- mass
double c_of_g[], --- centre of gravity
double m_of_i[], --- moment of inertia
double periphery[] --- periphery
)
This function evaluates mass properties of a given set of topological
entities.
Specific Errors:
PK_ERROR_bad_accuracy accuracy must lie between 0.0 and 1.0
PK_ERROR_empty_assy no bodies referenced from given assemblies
PK_ERROR_wrong_entity wrong entity type
PK_ERROR_different_types topols must all be of the same type
PK_ERROR_request_not_supported requested properties not all implemented
for the given topology
PK_ERROR_missing_geom missing geometry
PK_ERROR_density_le_0 negative or zero density
PK_ERROR_mass_eq_0 total mass is zero
This routine calculates the following geometric properties of certain
topological entities:
Type "Amount" "Mass" "Centre of "Moment of "Periphery"
Gravity" inertia"
========================================================================
Edge Length - C_of_g M_of_i -
Face Area - C_of_g M_of_i Circumference
Void region Volume - - - Surface Area
Solid region Volume Mass C_of_g M_of_i Surface Area
Wire body Length Mass C_of_g M_of_i -
Sheet Body Surface Area Mass C_of_g M_of_i Circumference
Solid Body Volume Mass C_of_g M_of_i Surface Area
Face/sheet)
considered) Volume - C_of_g M_of_i Surface Area
as Solid )
Assembly Total amount Mass As for components Total periphery
General Bodies:
dimension 3 Volume Mass C_of_g M_of_i Face area
dimension 2 Surface area Mass C_of_g M_of_i Edge length
dimension 1 Length Mass C_of_g M_of_i -
dimension 0 - Mass C_of_g M_of_i -
No other types are acceptable. The array of topologies topols must all
be of the same type, and the results are totals, except for the centre of
gravity and inertia, which refer to the collection of topologies. For an
array of assemblies, the results take account of all body occurrences
in the assemblies or sub-assemblies; these occurrences must all be
the same body type.
The values of results given as '-' are undefined on return.
The mass of a body is the product of its density and its amount, where the
density is obtained from an attached attribute and the amount depends on the
maximum dimension of the body. In the absence of a density attribute, the
density has a default value of 1. The dimension of a body is at least 0 if it
contains a vertex, 1 if it contains an edge, 2 if it contains a face and 3 if
it contains a solid region. The amount of a body is shown in the following
table:
Max. Dimension Amount
=============================================
3 Volume of solid regions
2 Surface area of faces
1 Length of edges
0 Number of vertices
For manifold bodies the dimension of all the bodies in a list must be the same
but, for general bodies, the dimension of a list of bodies is the maximum of
the dimensions of the bodies in the list.
Density attributes may also be attached to regions, faces, edges, or vertices.
Any density attached to one of these entities overrides the density of its
owning body and such an entity will always contribute to the mass, centre of
gravity and moment of inertia of its owning body, whatever the latter's maximum
dimension. As with bodies, the mass of an entity is the product of its density
and its amount (a vertex with density is regarded as a point mass, so the
density is its mass). The density of a void region is always zero and if a
density attribute is attached to a void region it will be ignored.
The periphery of a general body also depends on its maximum dimension. The
periphery of a body of dimension 3 is the surface area of all faces which bound
a void region. The periphery of a body of dimension 2 is the length of all
laminar or wireframe edges. The periphery of a body of dimension 1 or lower is
not defined.
For bodies or assemblies, m_of_i is the inertia tensor at the centre of
gravity ( with respect to the X, Y, Z axis directions ).
Accuracy of calculation:
If the calculation requested only involves simple geometries, an accurate
method of integration is used, and the parameter accuracy is ignored. In
complex cases accuracy is used to determine the accuracy of the
calculation: it must be in the range 0.0 to 1.0, and as it approaches 1.0,
the calculation will be more accurate but slower. The dependence of
results on 'accuracy' is not linear, and values below 0.9 will give
only coarse approximations. A great deal of calculation may be required
to satisfy an 'accuracy' of 1.0, and in general convergence cannot be
guaranteed. Supplying an accuracy parameter of 1.0 for parts involving
B-surfaces is not recommended.
Information found:
There are six possible requests which control how mass properties are
calculated - these are given in an option structure -
PK_TOPOL_eval_mass_props_o_t. The requests control the level of mass
properties calculated, whether periphery data is given, what style the
results bounds are presented in and whether the received entities
are considered separately or as part of a single entity.
Version 2 of the option structure also supports calculation of mass
properties by an alternative facetted method.
struct PK_TOPOL_eval_mass_props_o_s
{
int o_t_version; --- version number of option structure
PK_mass_t mass; --- required mass properties
--- (default = PK_mass_m_of_i_c)
PK_mass_periphery_t periphery; --- periphery required
--- (default = PK_mass_periphery_yes_c)
PK_mass_bound_t bound; --- bounds on results required
--- (default = PK_mass_bound_no_c)
PK_LOGICAL_t single; --- whether to treat topols as
--- single solid
--- (default = PK_LOGICAL_false)
PK_LOGICAL_t use_facets; --- whether to use alternative facetted
--- method (PK_LOGICAL_false)
double facet_tol; --- chordal tolerance to use for facets
--- 0.0 requests the internal default
};
The main mass properties form a hierarchy in that the mass is needed to find
the centre of gravity, and the centre of gravity is needed to find the
inertia. One token of type PK_mass_t controls the level to which
calculations are done. If no token for this option is given,
the default is PK_mass_m_of_i_c.
Token Interpretation
========================================================
PK_mass_no_c No data in this hierarchy is to be found
PK_mass_mass_c Finds the amount and mass of the entities only
PK_mass_c_of_g_c Finds the centre of gravity as well
PK_mass_m_of_i_c Finds the moment of inertia as well
The periphery data is controlled separately by another token of type
PK_mass_periphery_t, the default is PK_mass_periphery_yes_c.
Token Interpretation
========================================================
PK_mass_periphery_no_c No periphery data calculated
PK_mass_periphery_yes_c Calculates the periphery of the entities
Considering received entities as a single entity:
It is possible to supply an array of faces or an array of sheet bodies
and have them considered as forming the boundary of a single solid by
setting single to PK_LOGICAL_true (default is PK_LOGICAL_false).
Under this option the mass will not be returned, as there is currently
no way of unambiguously specifiying a density for the calculation.
The Moment of Inertia will be returned, but will be calculated without
reference to any density attributes attached to the supplied entities,
effectively assuming a density of one for the solid of which they form the
boundary.
No checking is done that the faces or sheets provided do form a valid
solid boundary. If they do not, the the returned results are likely to
be meaningless.
Alternative facetted method:
If the 'use_facets' option is set to PK_LOGICAL_true, then mass properties
of dimension 2 and 3 will be calculated by generated a facet mesh for each
face referenced and then combining the contributions for each facet. This
is intended to provide verification of the main parameter space based method.
The user has the option of supplying a chordal tolerance to use for the
facetting; this is equivalent to the 'curve_chord_tol' and
'surface_plane_tol' passed to PK_TOPOL_facet. If 0.0 is supplied, an
internal default will be used, taking into account the supplied 'accuracy'
parameter.
Note that is a backup method and will be slow and memory hungry if large
numbers of facets are generated; a careful choice of facet tolerance is
recommended.
Topologies are faces or edges:
An array of faces with the single option set to PK_LOGICAL_false or an
array of edges will be treated as a sheet or wire body respectively. Again
the density is not specified (any densities attached to the individual faces
or edges are ignored), so the Moment of Inertia will be calculated with an
assumed density of one.
Topologies are regions:
The periphery of a region is the sum of the unsigned areas of the faces - any
face occurring in a shell twice will be added to the total twice. The mass
of a region is only non-zero if it is solid. Properties of an array of
regions is the sum of the properties of the individual regions. It is only
possible to find the periphery of the exterior region and any other request
will result in the error PK_ERROR_request_not_supported being returned. It
is only possible to find the periphery and volume of a void region and any
other request will result in the error PK_ERROR_request_not_supported being
returned. It is possible to specify a mixture of solid and void regions, but
only if the request is supported for void regions.
Bounds:
Mass properties can be requested to calculate bounds on the values found
using a token of type PK_mass_bound_t. For each returned array, the initial
entries give the calculated value, and subsequent entries give the associated
bounds. There is the option of having no bounds output, of having a single
quantity to add or subtract from the answer value, or having intervals
specifying the ranges. For the centre of gravity, the latter two would
correspond to a sphere centred on the answer vector and a box containing
it. The default is PK_mass_bound_no_c.
Token Interpretation
========================================================
PK_mass_bound_no_c No errors are given
PK_mass_bound_modulus_c Modulus +/- to give range
PK_mass_bound_interval_c An interval bracketing the value is given
No error bounds are currently supported for the facetted method.
Returned arrays
The application must provide space for the returned information.
Parasolid will not attempt to write to return addresses for data which has
not been requested.
The size of the return arrays depends upon the setting of bound in the
options structure.
PK_mass_bound_no_c PK_mass_bound_modulus_c PK_mass_bound_interval_c
---------+------------------+-----------------------+------------------------
amount | 1 | 2 | 3
mass | 1 | 2 | 3
c_of_g | 3 | 4 | 9
m_of_i | 9 | 10 | 27
periphery| 1 | 2 | 3
---------+------------------+-----------------------+------------------------
For amount, mass and periphery, the zeroth array element is always the value.
If bound is PK_mass_bound_modulus_c then the 1st array element is the
modulus.
If bound is PK_mass_bound_interval_c then the 1st array element is the
lower bound and the 2nd array element is the upper bound.
For c_of_g, array elements 0, 1 and 2 always contain the coordinates of the
centre of gravity.
If bound is PK_mass_bound_modulus_c then the 4th array element is the
modulus.
If bound is PK_mass_bound_interval_c then elements 3, 4 and 5 contain the
lower bounds and elements 6, 7 and 8 contain the upper bounds.
For m_of_i, array elements 0 through 8 always contain the moment of inertia.
If bound is PK_mass_bound_modulus_c then the 9th array element is the
modulus.
If bound is PK_mass_bound_interval_c then elements 9 through 17 contain the
lower bounds and elements 18 through 26 contain the upper bounds.