REFERENCE_FRAME
Specifies a reference frame for element sets and boundary conditions.
Type
AcuSolve Command
Syntax
REFERENCE_FRAME("name") {parameters...}
Qualifier
User-given name.
Parameters
- centrifugal (boolean) [=on]
- Flag specifying whether to apply centrifugal force.
- coriolis (boolean) [=on]
- Flag specifying whether to apply coriolis force.
- angular_acceleration (boolean) [=on]
- Flag specifying whether to apply angular acceleration force.
- rotation_center or center (array) [={0,0,0}]
- Center of rotation, specified in global xyz coordinate system.
- angular_velocity or ang_vel (array) [={0,0,0}]
- Angular velocity vector of the rotating frame, in radians per unit of time.
- multiplier_function (string) [=none]
- User-given name of the multiplier function for scaling the angular velocity. If none, no scaling is performed.
Description
This command, instead of ROTATION_FORCE, is the preferred way to specify rotational body forces. Using both commands at the same time will normally produce incorrect results.
This command specifies a rotating frame of reference. This frame of reference has two uses. First, when it is referenced in an ELEMENT_SET command, the elements are assumed to be solved in the given rotating reference frame and rotational body forces are added for that element set. Second, when referenced in a NODAL_BOUNDARY_CONDITION command for a velocity component, the velocity vector is transformed appropriately before the boundary condition is applied.
The rotational body forces are known as the centrifugal, coriolis, and angular acceleration forces. They appear as the last three terms in the momentum equation:
REFERENCE_FRAME( "rotating frame" ) {
centrifugal = on
coriolis = on
rotation_center = { 0, 0, 0 }
angular_velocity = { 0, 1, 0 }
}
ELEMENT_SET( "fluid in rotating frame of reference" ) {
reference_frame = "rotating frame"
...
}
In this example, the frame of reference rotates around the y axis at the rate of one radian per unit of time, with the axis of rotation centered at the point (0,0,0) in the global xyz coordinate system. The right hand rule is used to define the direction of rotation of the reference frame. Since the angular velocity is constant, the angular acceleration is zero and thus the angular_acceleration flag has no effect.
In NODAL_BOUNDARY_CONDITION commands the default reference frame is none. This means that no transformation of the velocity field from the fixed (sometimes called "laboratory") reference frame is performed before the boundary condition is applied. If a reference frame is specified then the following transformation is performed:
NODAL_BOUNDARY_CONDITION( "blade x_velocity" ) {
variable = x_velocity
type = zero
nodes = Read( "blade.nbc" )
reference_frame = "rotating frame"
}
The commands for the other two components of velocity are similar. The reference_frame parameter has no effect on any other variable. Boundary conditions specified in this manner are independent of the reference frame(s) of the elements connected to the boundary condition nodes. In particular, any of these nodes may be connected to two or more elements with different reference frames.
The multiplier_function parameter may be used to scale the angular velocity. The value of this parameter refers to the user-given name of a MULTIPLIER_FUNCTION command in the input file; see the MULTIPLIER_FUNCTION command for an example. The angular acceleration vector is calculated from a simple numerical difference of the multiplier function, as follows:
where and are the multiplier function values at the current and previous time steps, Ω is given by angular_velocity, and is the time increment. The angular acceleration is set equal to zero during the first step since the previous multiplier function value is not available then. The angular acceleration is always zero if the multiplier function is constant or not specified.
ASSIGN {
variable = RPM
value = (2* PI) / 60
}
REFERENCE_FRAME( "impeller 1" ) {
rotation_center = { 0.0, 0.0, 0.0 }
angular_velocity = { 0, 250. * RPM, 0 }
}
ELEMENT_SET( "impeller 1 region" ) {
shape = four_node_tet
material_model = glycerin
elements = Read( "mixing.impeller1.cnn" )
reference_frame = "impeller 1"
SIMPLE_BOUNDARY_CONDITION( "impeller 1 wall" ) {
surfaces = Read( "mixing.impeller1.wall.ebc" )
element_set = "impeller 1 region"
shape = three_node_triangle
type = wall
reference_frame = "impeller 1"
}
ELEMENT_SET( "stationary region" ) {
shape = four_node_tet
material_model = glycerin
elements = Read( "mixing.stationary.cnn" )
}
SIMPLE_BOUNDARY_CONDITION( "stationary wall" ) {
surfaces = Read( "mixing.stationary.wall.ebc" )
element_set = "stationary region"
shape = three_node_triangle
type = wall
}