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