Constraint: General

Model ElementThe Constraint_General element is used to specify a user defined general constraint.


Your constraint equations may involve position as well as velocity measures of the system. Although MotionSolve provides a large set of constraints to choose from (see Constraint_Joint), there are situations that require non-standard constraints. For example, the constraint that a wheel rolls without slipping is a non-holonomic constraint that can be modeled using the Constraint_General element.


       id                   =  "integer"     
     [ label                =  "string" ]  
       expr                 =  "motionsolve_expression"     
       usrsub_dll_name      =  "valid_path_name"
       usrsub_param_string  =  "USER( [[par_1][, ...][, par_n]] )"
       usrsub_fnc_name      =  "fnc_name" >
       script_name          =  "valid_path_name"
       interpreter          =  "PYTHON"| "MATLAB" ]
       usrsub_param_string  =  "USER([[par_1][, ...][, par_n]] )"
     [ usrsub_fnc_name      =  "custom_fnc_name" ]
     [ is_virtual           = {"FALSE" | "TRUE"} ] 


Element identification number, (integer>0). This number is unique among all Constraint_General elements.
The name of the Constraint_General element.
An expression (that will be set to zero) defining the general constraint.
Specifies the path and name of the DLL or shared library containing a user subroutine. MotionSolve uses this information to load the user subroutine in the DLL at run time.
The list of parameters that are passed from the data file to the user defined subroutine, GCOSUB.
Specifies an alternative name for the user-written subroutine GCOSUB.
Specifies the path and name of the user written script that contains the routine specified by usrsub_fnc_name.
Defines whether the constraint is virtual or regular. If is_virtual is set to TRUE, the constraint is implemented as a virtual constraint. If is_virtual is set to FALSE, the constraint is implemented as a regular, algebraic constraint. This parameter is optional. The default is FALSE. See Comment 22 in Constraint: Joint for more information about virtual joints.
Specifies the interpreted language that the user script is written in. Valid choices are MATLAB or PYTHON.


  1. You can use Constraint_General to impose holonomic as well as non-holonomic constraints. Those constraints that can be written as equations involving only position measurements are called holonomic constraints. The rest are called non-holonomic constraints.
  2. For non-holonomic constraints, the constraint reaction forces applied by MotionSolve to the rest of the system are correct if the constraint satisfies the following two conditions:
    • The constraint is a function of only time, positions, and velocities of the system.
    • The second, partial derivative of the constraint against any velocity terms results in identity zero.

      The second condition implies the constraint must be linear in terms of velocity if it involves any velocity terms. If either or both of the conditions are not satisfied, certain terms in the constraint reaction forces are neglected by MotionSolve, which may result in incorrect dynamic behavior if these neglected terms become significant.

    • You can reference a Reference_Variable in Constraint_General using VARVAL(). The Reference_Variable can be defined using an explicit expression or through a user-written subroutine (VARSUB).
    • Constraint_General cannot be used in a kinematic analysis. It is also not compatible with ABAM, VSTIFF, and MSTIFF in a dynamic anaylsis.
  3. When used in a dynamic analysis with DSTIFF, the constraint must be smooth for Index-3. The constraint and its first derivative (slope) must be smooth for Index-2. The constraint and both its first derivative (slope) and second derivative (curvature) must be smooth for Index-1.