# COUSUB/COUXX/COUXX2

ModelingUsed to specify a user coupler element.

## Definition

Coupler constraints are used to constrain the relative translational and/or the rotational motion of two or three joints. By using a subroutine-based formulation, for example, you can specify a variable coupler ratio based on system states, relational operators, and logical expressions. A typical example is a nonlinear coupler multiplier ratio defined as a function of an input joint velocity.

## Use

User-defined coupler entity example:

```
<Constraint_UserConstr
id =
```*id* ...
usrsub_param_string = "USER(*r1,… r30*)"
usrsub_dll_name = "NULL">
</Constraint_UserConstr>

## Format

```
SUBROUTINE COUSUB (ID, TIME, PAR, NPAR, DISP, NDISP, IFLAG, PHI)
SUBROUTINE COUXX (ID, TIME, PAR, NPAR, DISP, NDISP, IFLAG, DFDA)
SUBROUTINE COUXX2 (ID, TIME, PAR, NPAR, DISP, NDISP, IFLAG, D2FDA2)
```

```
void STDCALL COUSUB (int *id, double *time, double *par, int *npar, double *disp, int *ndisp, int *iflag, double *phi)
void STDCALL COUXX (int *id, double *time, double *par, int *npar, double *disp, int *ndisp, int *iflag, double *DFDA)
void STDCALL COUXX2 (int *id, double *time, double *par, int *npar, double *disp, int *ndisp, int *iflag, double *D2FDA2)
```

**def** COUSUB(**id**, time, par, npar, disp, ndisp, iflag):
**return** phi
**def** COUXX(**id**, time, par, npar, disp, ndisp, iflag):
**return** dfda
**def** COUXX2(**id**, time, par, npar, disp, ndisp, iflag):
**return** dfda2

```
function phi = COUSUB(id, time, par, npar, disp1, ndisp, iflag)
function dfda = COUSUBXX(id, time, par, npar, disp1, ndisp, iflag)
function d2fda2 = COUSUBXX2(id, time, par, npar, disp1, ndisp, iflag)
```

## Attributes

`ID`- [integer]
`TIME`- [double precision]
`PAR`- [double precision]
`NPAR`- [integer]
`DISP`- [double precision]
`NDISP`- [integer]
`IFLAG`- [logical]

## Output

- PHI
- [double precision]
- DFDA
- [double precision]
- D2FDA2
- [double precision]

## Example

**def** COUSUB(**id**, time, par, npar, disp, ndisp, iflag):
phi = disp[0]+par[0]*disp[1]
**return** phi
**def** COUXX(**id**, time, par, npar, disp, ndisp, iflag):
dfda =2*[0]
dfda[0] =1.0dfda[1] = par[0]
**return** dfda
**def** COUXX2(**id**, time, par, npar, disp, ndisp, iflag):
d2fda2 = 2*[0]
**return** d2fda2