# Reusable Math Utilities and System Definitions

Templex can also be used to create math utilities or system definitions that can be reused in other templates.

In the following template, the Templex macro
eulerXYZ.tpl has been created to receive three angular
rotations and then calculate the corresponding Euler parameters. Euler parameters
are commonly used to orient entities such as joints, bodies, markers, and so on
within mechanical system simulation
codes.

```
{include "eulerXYZ.tpl"}
SYSTEM 1 JOINT DOF
{eulerXYZ( 90, 0, 0)}
1 FREE {e0} {e1} {e2} {e3} 0.5 0.5 0.5 0.0 0.0 0.0 50.0 0.0 0.0
END JOINT DOF
END SYS
SYSTEM 2 JOINT DOF
{eulerXYZ( 0, 90, 0)}
1 FREE {e0} {e1} {e2} {e3} 0.5 0.5 0.5 0.0 0.0 0.0 50.0 0.0 0.0
END JOINT DOF
END SYS
```

The Templex macro is executed by the
eulerXYZ(

`rx`,`ry`,`rz`) statement in the above template. The macro itself resides in the Templex file referenced by the include statement. When Templex encounters an include statement, execution passes from the current template to the specified template.```
{' This templex macro calculates the Euler params based on three sequential rotations.}
{' Rotation sequence Rx -> Ry -> Rz.}
{define eulerXYZ(rx, ry, rz)}
{ t1 = dtor(rx)}
{ t2 = dtor(ry)}
{ t3 = dtor(rz)}
{' Cosine matrix:}
{ a11=cos(t2)*cos(t3)}
{ a12=-cos(t2)*sin(t3)}
{ a13=sin(t2)}
{ a21=sin(t1)*sin(t2)*cos(t3)+sin(t3)*cos(t1)}
{ a22=cos(t1)*cos(t3)-sin(t1)*sin(t2)*sin(t3)}
{ a23=-sin(t1)*cos(t2)}
{ a31=sin(t1)*sin(t3)-cos(t1)*sin(t2)*cos(t3)}
{ a32=sin(t1)*cos(t3)+cos(t1)*sin(t2)*sin(t3)}
{ a33=cos(t1)*cos(t2)}
{ trace = a11+a22+a33 }
{' Euler parameters:}
{ e0 = 0.5*sqrt(trace+1.0) }
{ e1 = 0.5*sqrt(1.0 + 2.0*a11 - trace) }
{ e2 = 0.5*sqrt(1.0 + 2.0*a22 - trace) }
{ e3 = 0.5*sqrt(1.0 + 2.0*a33 - trace) }
{ if e0 != 0.0 }
{ e0 = sqrt(e0*e0) }
{ e1 = (a32-a23)/(4.0*e0) }
{ e2 = (a13-a31)/(4.0*e0) }
{ e3 = (a21-a12)/(4.0*e0) }
{ elseif e1 != 0.0 }
{ e1 = sqrt(e1*e1) }
{ e2 = (a13+a31)/(4.0*e1) }
{ e3 = (a21+a12)/(4.0*e1) }
{ elseif e2 != 0.0 }
{ e2 = sqrt(e2*e2) }
{ e3 = (a32+a23)/(4.0*e2) }
{ else }
{ e3 = 1.0 }
{ endif }
{enddefine}
```

The results of the template
are:

```
SYSTEM 1 JOINT DOF
1 FREE 0.707107 0.707107 0 0 0.5 0.5 0.5 0.0 0.0 0.0 50.0 0.0 0.0
END JOINT DOF
END SYS
SYSTEM 2 JOINT DOF
1 FREE 0.707107 0 0.707107 0 0.5 0.5 0.5 0.0 0.0 0.0 50.0 0.0 0.0
END JOINT DOF
END SYS
```