Specifies a reference frame for element sets and boundary conditions.


AcuSolve Command


REFERENCE_FRAME("name") {parameters...}


User-given name.


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.


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:

ρ u t + ρ u u + p = τ ρ Ω × Ω × ( x x 0 ) 2 ρ Ω × u ρ Ω ˙ × ( x x 0 )

where ρ is the density; u is the velocity vector; p is the pressure; t = [ τ i j ] is the viscous stress tensor; x is the current coordinate vector; x 0 is the center of rotation, given by rotation_center; Ω is the angular velocity vector, given by angular_velocity (and multiplier_function, if specified); and Ω is the angular acceleration vector. For these forces to be active, the REFERENCE_FRAME command must be referenced by an ELEMENT_SET command, for example:
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:

u t r a n s = u f i x Ω × ( x x 0 )

where u f i x is the velocity in the fixed frame. The given boundary condition is then applied to the appropriate component of u t r a n s . For example, consider a fan blade rotating according to the reference frame given above. The velocity at any point on the blade is Ω × ( x x 0 ) and the transformed velocity is zero. The boundary condition command for the x -component of velocity becomes:
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:

Ω ˙ = Ω ( f n f n 1 ) / Δ t

where f n and f n 1 are the multiplier function values at the current and previous time steps, Ω is given by angular_velocity, and Δ t 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.

Element sets with different reference frames may be used in the same problem. No special user input is required at the interface of two such element sets, this is handled automatically. An example where this is useful is a mixing tank with rotating blades in the middle and fixed blades attached to the outside walls. The inner rotating element set encloses the rotating blades and is defined with a rotating reference frame while the outer stationary element set contains the fixed blades. The interface between the rotating and stationary element sets must be a surface of revolution, such as a cylinder, cone, or sphere, with the same axis as the reference frame. The rotating blades have nodal boundary conditions with the same reference frame as the rotating element set. The resulting steady solution is certainly not as accurate as a transient solution using a sliding interface and a rotating mesh for the rotating element set, but it is likely to be one or two orders of magnitude cheaper to compute. This strategy works well if the objective is to get a gross effect of the rotating body into the flow, such as the thrust and swirl of a marine impeller. However, it does not yield any information about the effect of rotors passing by stators. The commands to implement this model may be as simple as:
   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