Coreform Cubit 2024.8 User Documentation

Nodeset and Sideset Specification

Boundary conditions such as constraints and loads are applied to the finite element model using nodesets or sidesets, also known as Genesis entities. Rather than attempting to maintain specific boundary condition information, such as load, temperature, constraint, etc., Genesis entities are the generic vehicle for the user to set up boundary conditions on the model. Nodes, elements and element faces are instead grouped together and assigned unique IDs. Node, element and face IDs assigned to Genesis entities can then be written to the Exodus II mesh file. Once imported to the intended analysis application, the nodeset and sideset IDs can be appropriately interpreted as specific physical boundary conditions.

The preferred method for creating Genesis entities is to assign vertices, curves, surfaces or volumes to a specific nodeset or sideset ID. Any mesh entity owned by the geometric entity in a nodeset or sideset is automatically assigned to the same nodeset or sideset. This allows greatest flexibility in generating and updating the finite element mesh. For example, if a surface belongs to a specific sideset, remeshing the surface will automatically delete any old faces from the sideset and add the faces of the new mesh.

In some cases, the geometric model does not provide enough resolution to define the desired boundary conditions. In this case, the model may be partitioned using Coreform Cubit's virtual geometry features. Where this may not be feasible, mesh entities can also be added directly to the desired nodeset or sideset. Where individual mesh entities have been added to nodesets or sidesets, deleting the mesh will also remove these elements from the Genesis entity. If the geometry is remeshed, the new mesh entities must also be added once again to the nodesets or sidesets.

Nodesets can be created from groups of nodes categorized by their owning volumes, surfaces, curves or vertex. Individual nodes may also be added to a nodeset. Nodes can belong to more than one nodeset.

Sidesets can be created from groups of element sides or faces categorized by their owning surfaces or curves or by their individual face IDs. Element sides and faces can also belong to more than one sideset.

Creating Nodesets and Sidesets

Nodesets and Sidesets are created in Coreform Cubit by assigning the appropriate geometry or mesh entities in the model to a nodeset or sideset ID. The following commands can be used:

Nodeset <nodeset_id> [ADD|Remove] {Curve | Surface | Volume | Vertex | Node} <range>

Sideset <sideset_id> [ADD|Remove] Group <id_range>

Sideset <sideset_id> [ADD|Remove] {Curve|Surface|Edge|Face|Tri} <id_range>

Sideset <sideset_id> [Add] Edge <id_range> [wrt {{Tri|Face} <id_range> | all } ]

Sideset <sideset_id> [Add] Face <id_range> [wrt {Hex <id_range> | all} ]

Sideset <sideset_id> [Add] Tri <id_range> [wrt {Tet <id_range> | all} ]

Sideset <sideset_id> [Add] Surface <id_range> [wrt {{Volume|Surface} <id_range> | all} ] [FORWARD|Reverse|Both]

Sideset <sideset_id> [Add] Curve <id_range> [wrt {Surface <id_range> | all} ]

Like element blocks, Nodesets and Sidesets are given arbitrary, user-defined ID numbers. If there are no user-defined Nodesets or Sidesets, none are written to the Exodus II file.

With Sidesets, direction is often important. For surfaces, the direction may be specified using the Forward, Reverse, or Both options. The Forward option will write a sideset in relation to hexes in the surface's forward volume, which is the volume that the surface's normal points away from. The Reverse option will write a sideset in relation to hexes in the surface's reverse volume, which is the volume that the surface's normal points into. The Both option will allow sidesets to be written in relation to the hexes that lie in volumes on both sides of the surface. The default is Forward. The user can additionally specify the volume from which the hexes should be taken in relation to by using the wrt Volume option.

Direction is equally important for curves in Sidesets. The wrt Surface option allows the user to indicate which surface's faces will be included in the Sideset. The wrt All option will include all faces attached to the curve. The default is wrt All.

Useful hint:

When creating nodesets and sidesets it is often userful to use the Extended Command Line Entity Specification. Here is an example that creates a nodeset which includes all the nodes on the exterior of the geometry:

# Create the geometry
Create brick x 10
Create cylinder height 10 radius 2
Move volume 2 z 10
# Merge the geometry
Merge volume all
# Mesh the geometry
Mesh volume all
# Create a nodeset that includes only those nodes
# located on the exterior of the geometry
Nodeset 1 add surface in volume all with not is_merged

The following commands remove nodes from the nodeset that belong to a surface. Continuing from the previous example:

# Remove surface 2 from the nodeset
Nodeset 1 remove surface 2
# Remove nodes from the nodeset
# that belong to the curves that bound surface 2
Nodeset 1 remove node in curve in surface 2

Nodes can also be added or removed based upon their coordinates. Here is an example that removes all the nodes with a z coordinate equal to 15. Continuing from the previous example:

# Remove the nodes with a z coordinate equal to 15
Nodeset 1 remove node in surface all with z_coord = 15


Assigning Names and Descriptions to Nodesets and Sidesets

Nodesets and sidesets can be assigned names and descriptions. Using names and descriptions is often more intuitive than using traditional integer IDs. When exporting a mesh as a DART artifact, names and descriptions are included in the metadata, making them available to DART metadata-enabled applications such as SIMBA. To give a name or description to nodeset or sideset, use one of the following commands:

{Nodeset|Sideset} <ids> Name "<new_name>"

{Nodeset|Sideset} <ids> Description "<description>"

This command can also be used to define names and descriptions for Element Blocks.

Grouping Faces on a Surface into a Sideset

A sideset can be created from a subset of the faces on a given surface by using one of the following commands:

SideSet <sideset_id> Surface <id_range> Patch Maximum <x> <y> <z> Minimum <x> <y> <z>

SideSet <sideset_id> Surface <id_range> Patch Center <x> <y> <z> Radius <value> [Filter] [Partition]

SideSet <sideset_id> Surface <id_range> Patch Center <x> <y> <z> Outer_radius <value> Inner_radius <value> [Filter] [Partition]

SideSet <sideset_id> Surface <id_range> Patch Cylinder <axis_specification> Radius <rad> [Filter] [Partition]

SideSet <sideset_id> Surface <id_range> Patch Cylinder <axis_specification> Outer_radius <rad> Inner_radius <rad> [Filter] [Partition]

These commands place only the faces meeting the specified criteria into the sideset.

Normally, these commands place the individual elements into the sideset. If the mesh on the surface is deleted, the elements will be removed from the sideset. If the surface is then remeshed, new elements will NOT automatically be added to the sideset. This is usually the intended behavior.

If the filter option is included, only a single connected set of elements is added to the sideset. If the shape of the surface is such that multiple disconnected sets of elements fall within the specified spherical or cylindrical region, the filter option will limit the faces added to the sideset to the one set closest to center.

Using the partition option changes this behavior. The partition option causes the surface to be split, based on the faces included in the patch. The newly created patch surface will be added to the sideset instead of the individual elements. If the mesh is deleted and a new mesh is generated, the new mesh on the patch surface will automatically be included in the sideset, just as occurs with other geometric entities assigned to sidesets.

Note that the sideset patch commands work with both triangular and quadrilateral faces.

Grouping elements in voids and enclosures

The sideset start enclosure command creates sidesets of monotonically increasing ID numbers containing the elements comprising the watertight skin of the input elements. When there's a 'void' in the middle of the elements, a region devoid of elements, though still enclosed by elements, this enclosed region will also have a sideset defined on the skin of the enclosed region.

Sideset Start <id> Enclosure {Volume|Hex|Tet} <range>

The start id is the id of the sideset at which to start. The ID numbers will increase monotonically unless there is a conflicting ID number. The command will add as many sidesets as there are fully continuous regions or tris or faces in the input group. This function can be particularly helpful for calculations for radiation enclosures.

Deleting Nodesets and Sidesets

All Nodesets, Sidesets and Blocks may be deleted from the model using the following command:

Reset Genesis

To remove only nodesets or sidesets, the following may be used:

Reset Nodeset

Reset Sideset

To remove a specific nodeset or sideset, use:

Delete Nodeset <nodeset_id_range>

Delete Sideset <sideset_id_range>

Renumbering Nodesets and Sidesets

The nodeset and sideset renumber commands give the user the ability to renumber these entities to fit the user's needs. The command is:

{Nodeset|Sideset} <id_range> renumber start_id <id> [uniqueids]


Example:

Assume:

sideset ids: 1, 2, 4, 6, 10

sideset all renumber start 30

After renumbering:

sideset ids: 30, 31, 32, 33, 34


The id_range must specify existing nodesets or sidesets, respectively, or the command will fail.

The new ids to be assigned cannot contain the id of an existing nodeset (when renumbering nodesets), or an existing sideset (when renumbering sidesets).

For example, given sidesets with ids 100, 105, 106, and 109, the command

sideset all renumber start_id 102

would attempt to renumber the sideset ids to 102, 103, 104, and 105. Since sideset 105 already exists, the command will fail.

When the uniqueids option is specified, the new ids to be assigned cannot contain the id of an existing nodeset OR an existing sideset OR an existing block. For example, given sidesets with ids 100, 105, 106, and 109, and given blocks with ids 201, 202, and 203, the command

sideset all renumber start_id 200 uniqueids

would attempt to renumber the sideset ids to 200, 201, 202, and 203. While this does not conflict with existing sideset ids, it does conflict with the existing block ids and so the command will fail.

Transfer Nodesets and Sidesets

The capability shown in the below figure automates the transfer of sidesets and nodesets from the source mesh (e.g. design domain model) to the target mesh (e.g. topology optimized shape). Transfer of sidesets and nodesets was a user-intensive, error-prone, bottleneck as users were required to go through the painful step of manually selecting elements to define equivalent sidesets on the target mesh.

Source Mesh with BC

Target Mesh with BC

The commands to automatically transfer nodesets and sidesets are given below:

transfer nodeset <ids> onto {tri <ids> |face <ids> |tet <ids> |hex <ids> } [tolerance <value> ]

transfer sideset <ids> onto {tri <ids> |face <ids> |tet <ids> |hex <ids> } [tolerance <value> ] [log]

tri <ids> and face <ids> : if the target mesh is a surface mesh, use tri or face option.

tet <ids> and hex <ids>: this option can be used and the boundary skin mesh of the volumetric mesh will be extracted automatically to associate skin elements and nodes to the sidesets and nodesets, respectively.

tolerance <value>: The tolerance option must be used only if the default smart local tolerance doesn’t give the desired results.

log : The log option outputs the area of sidesets in source and target meshes and the ratio of the areas. The below table shows an example output. For example, the area_ratio can be used to adjust the pressure boundary conditions to maintain same forces.

Log output of transfer sideset command

sideset_id old_area ID new_area area_ratio ID
1 56.4843 4.8099 0.09
2 94.2209 68.4337 0.73

The below Python script Illustrates transfer of sidesets and nodesets from a source mesh to a target mesh using the existing and the new commands

#!python
import cubit
cubit.init(['cubit','-nojournal’])
# STEP 1: import the source mesh as mesh based geometry (MBG); delete mesh and blocks
cubit.cmd('import mesh geometry "design_domain_mesh.exo" feature_angle 135.00 merge ')
cubit.cmd('del mesh')
cubit.cmd('del block all’)
# STEP 2: import the target mesh as a free mesh
cubit.cmd('import mesh "optimized_mesh.exo" no_geom’)
# STEP 3: transfer sideset and nodeset from the source mesh to the target mesh
cubit.cmd('transfer sideset all onto tet all’)
cubit.cmd('transfer nodeset all onto tet all’)
# STEP 4: export optimized mesh with sidesets
cubit.cmd('export mesh \'optimized_mesh_with_bc.exo\' block all sideset all nodeset all')

Displaying Nodesets and Sidesets

Nodesets and Sidesets can be viewed individually through Coreform Cubit by employing the following commands:

Draw NodeSet <nodeset_id_range> [Color <color_spec>] [add]

Draw SideSet <sideset_id_range> [Color <color_spec>] [add]

Nodeset and Sideset colors can also be changed using the following commands:

Color NodeSet <nodeset_id_range> {color|Default}

Color SideSet <sideset_id_range> {color|Default}

Nodeset Associativity Data

Nodesets can be used to store geometry associativity data in the Exodus II file. This data can be used to associate the corresponding mesh to an existing geometry in a subsequent Coreform Cubit session. This functionality can be used either to associate a previously-generated mesh with a geometry (See Importing an Exodus II File), or to associate a field function with a geometry for adaptive surface meshing (See Adaptive Meshing).

The commands to control and list whether associativity data is written or read from an Exodus II files are the following:

List Import Mesh NodeSet Associativity

List [Export Mesh] NodeSet Associativity

List [Export Mesh] NodeSet Associativity Complete

set Import Mesh NodeSet Associativity [ON|off]

[set] [Export Mesh] NodeSet Associativity [on|OFF]

[set] [Export Mesh] NodeSet Associativity Complete [On|OFF]

Associativity data is stored in the Exodus II file in two locations. First, a nodeset is written for each piece of geometry (vertices, curves, etc) containing the nodes owned for that geometry. Then, the name of each geometry entity is associated with the corresponding nodeset by writing a property name and designating the corresponding nodeset as having that property. Nodeset numbers used for associativity nodesets are determined by adding a fixed base number (depending on the order of the geometric entity) to the geometric entity id number. The base numbers for various orders of geometric entities are shown in the following table. For example, nodes owned by curve number 26 would be stored in associativity nodeset 40026.

Table 1. Nodeset ID base numbers for geometric entities

Geometric Entity Base Nodeset ID
Vertex 50000
Curve 40000
Surface 30000
Volume 20000

Instead of storing just the nodes owned by a particular entity, nodes for lower order entities are also stored. For example, the associativity nodeset for a surface would contain all nodes owned by that surface as well as the nodes on the bounding curves and vertices.

Equation-Controlled Distribution Factors

By default, distribution factors on nodesets or sidesets are written with a constant value of "1" at each node. It is also possible to vary the distribution factor for each node in a nodeset or sideset, using an equation to control the value of the distribution factor at each node. To do so, an equation must first be defined using the command:

Create Equation "<expression>" name "<name>"

where expression is any mathematical expression which evaluates to a single number, and name is the name by which this equation will be known. The expression is written using aprepro syntax, with a few differences from the use of APREPRO in its usual context.

  1. The expression as a whole is not wrapped in curly braces "{" and"}".
  2. The expression may include any of the following pre-defined variables:

x - The x-coordinate of the current node
y - The y-coordinate of the current node
z - The z-coordinate of the current node
n - The Coreform Cubit ID of the current node. This is the ID of the node in Coreform Cubit, which may not be the same as the node's ID in the Exodus II file.

For example, to define an equation which varies from -10 to 10 based on the sine of the node's x_coordinate:

Create Equation "10*sin(x)" Name "my_equation"

Once an equation has been defined, it can be applied to a nodeset or sideset:

Nodeset <id> Distribution Equation "<equation_name>"

Sideset <id> Distribution Equation "<equation_name>"

For example, to apply the equation created earlier to nodeset 10:

Nodeset 10 Distribution Equation "my_equation"

When nodeset 10 is written to an Exodus II file, "my_equation" will be evaluated once for each node in the nodeset, with the values of x, y, z, and n set to appropriate values for the node. The result is used as the distribution factor for that node.

Here is a complete example that writes out the distribution factors 0.0, 0.5, and 1.0 for the 3 nodes on the curve:

# Create a straight line from (0,0,0) to (1,0,0)
create vertex 0 0 0
create vertex 1 0 0
create curve vertex 1 2
# Mesh with 3 nodes
curve 1 interval 2
mesh curve 1
# Create a block and a nodeset
block 1 curve 1
nodeset 1 curve 1
# Define an equation and apply it to the nodeset
create equation "x" name "simple_eq"
nodeset 1 distribution equation "simple_eq"
# Write the mesh
export mesh "temp.g" overwrite

Here is another complete example that varies the distribution factors for sideset 20 from zero to 1, depending on the node's x-coordinate. The sideset is applied to sides of HEX20 elements, so each element side has 8 different distribution factors.

# Mesh a cube
brick x 10
mesh volume 1
# Create a block of 20-noded hexes
block 1 volume 1
block 1 element type hex20
# Apply a sideset to be used for a variable pressure
sideset 20 surface 1
# Define an equation and apply it to the sideset
create equation "(x+5)/10" name "zero_to_one"
sideset 20 distribution equation "zero_to_one"
# Write the mesh
export mesh "temp.g" overwrite

Note that distribution equations only affect Exodus II output. Equations are currently ignored for other mesh file types.

See APREPRO in the appendix.

Nodesets/Sidesets/Blocks Behavior with Geometric Entity Copy

The below commands can be used to set the behavior of nodesets/sidesets/blocks when a copy command is applied on geometric entities. The default OFF option specifies that any nodesets/sideset/blocks on the original geometry will not be copied to the new geometry. The "on" option implies that for each nodeset/sideset/block present in the original geometric entity a corresponding nodeset/sideset/block with be present on the new geometric entity. The use_original option indicates that instead of creating new nodesets/sidesets/blocks on the new geometry, the new sideset/nodeset/block information will instead be added to the original nodesets/sidesets/blocks present in the original geometric entities.

set copy_nodeset_on_geometry_copy [on | OFF| use_original]

set copy_sideset_on_geometry_copy [on | OFF| use_original]

set copy_block_on_geometry_copy [on | OFF| use_original]