Skip to content

Entity Attributes

Greg Sjaardema edited this page Apr 20, 2020 · 9 revisions

Define/Query assembly attributes and attribute names

An assembly attribute is similar to an IOSS property consisting of a name, a type, and a value or values. It is not a value per entity in the assembly, but a value for the assembly. For now, they types will be limited to text, integer, and double to provide capability without the complexity of supporting the many types available in NetCDF-4 including user-defined types. Note that an attribute can have multiple values, for example if the attribute is a range, a single attributed could have two double values -- {1.0, 100.0}

NOTE: This type of attribute (value on entity instead of value per entities members, for example nodes in a nodeset) has also be added to the other entity types (blocks and sets).

NOTE: Need a better name or way of distinguishing from the attributes which are currently supported in Exodus.

define and output an attribute ex_attribute attribute = {EX_ASSEMBLY, 100, "Offset", EX_DOUBLE, 3, {1.1, 2.2, 3.3}}; ex_put_attribute(exoid, attribute); define and output multiple attributes ex_attribute attributes[10]; /* ... Initialize attributes */ ex_put_attributes(exoid, 10, attributes); define and output a double attribute ex_put_double_attribute(exoid, EX_ASSEMBLY, id, name, num_values, values); define and output an integer attribute ex_put_integer_attribute(exoid, EX_ASSEMBLY, id, name, num_values, values); [The size of the integers used in values is based on int-size of the database] define and output a text attribute.... ex_put_text_attribute(exoid, EX_ASSEMBLY, id, name, char *values); Query number of attributes on an assembly int num_attr = ex_get_attribute_count(exoid, EX_ASSEMBLY, id); Query names, types, size/length, values of all attributes on an assembly int num_attr = ex_get_attribute_count(exoid, EX_ASSEMBLY, id); ex_attribute attributes[num_attr]; ex_get_attributes(exoid, EX_ASSEMBLY, id, attributes); Get values of all attributes on the specified entity (ASSEMBLY 100) int count = ex_get_attribute_count(exoid, EX_ASSEMBLY, 100) ex_attribute attributes[count]; memset(attributes, 0, sizeof(ex_attribute)count); ex_get_attribute_param(exoid, EX_ASSEMBLY, 100, attributes); / Get attribute values for all attributes listed in attributes ex_get_attributes() will allocate memory for attributes[i].values which must be freed by caller. / ex_get_attributes(exoid, count, attributes); Get value of specific attribute on the specified entity (ASSEMBLY 100) int count = ex_get_attribute_count(exoid, EX_ASSEMBLY, 100) ex_attribute attributes[count]; ex_get_attribute_param(exoid, EX_ASSEMBLY, 100, attributes); / ... allocate space on specific attribute to store values. If * not allocated, it will be allocated by ex_get_attribute() / attributes[3].values = calloc(attributes[3].value_count, sizeof(double)); / Get attribute values for attribute at index 3 */ ex_get_attribute(exoid, attributes[3]); The ex_attribute argument is the struct:

typedef struct ex_attribute { ex_entity_type entity_type, int64_t entity_id, char name[EX_MAX_NAME]; ex_type type; /* EX_INTEGER, EX_DOUBLE, EX_CHAR / size_t value_count; void values; /* not accessed if NULL */ } ex_attribute; NOTE: is there benefit to getting all attribute names/types/size in single call, or can we simplify API and just provide the query of individual attribute. Can do this in single call if only fill in non-NULL arguments