Vector Analysis in the Bash Shell

When performing preparatory operations for CFD or FEM analyses, for example, it is often necessary to specify vector parameters. Vector constants are easy to handle:

myMesh --direction "$1 0 0"

However, it quickly becomes complicated if the vectors have to be manipulated, e.g. multiplied by scalars or rotated.

A powerful solution is to use the Matlab Octave clone to perform the operations. Two features of Octave are useful in this context:

  • the command-line option “--eval” to specify the expression to handle
  • The `disp` function outputs results in a plain format on a single line.

Here's the translation: An example:

DIR="1 0 0"
VELOCITY=$(octave --eval "disp( 11.*[$DIR] )")

myMesh --direction "$DIR"
mySolver --velocity "$VELOCITY"

More complicated operations are possible, though one needs to take care to produce line vectors as results. Rotation is an example:

DIR="1 0 0"
ANG=45

DIR_ROT=$(octave --eval "pkg load linear-algebra; disp( (rotv([0 0 1], $ANG*pi/180)*[$DIR]')' )")

myMesh --direction "$DIR_ROT"