# Toys

A handful of "toy" miniapps of less serious nature demonstrate the flexibility of MFEM (and provide a bit of fun):

## Automata

The `automata`

miniapp implements a one dimensional elementary cellular
automata as described in:
Wolfram MathWorld.

This miniapp shows a completely unnecessary use of the finite element method to simply display binary data (but it's fun to play with).

The `automata`

miniapp has only three options; `-vis`

or `-no-vis`

to
enable or disable visualization, `-ns`

which defines the number of
steps to evolve the cellular automata, and `-r`

to select the rule
which is applied at each step. Rules for this type of cellular
automata consist of a sequence of 8 bits which are normally passed as
an integer 0-255. The rule defines how to update each cell based on
the current values of that cell and its two nearest neighbors.

## Life

The `life`

miniapp implements Conway's Game of Life. A few simple
starting positions are available as well as a random initial
state. The game will terminate only if two successive iterations are
identical.

Users can control the size of the domain and the initial placement of
simple objects like *blinkers* and *gliders*. Arbitrary patterns can
be supplied through the `--sketch-pad`

or `-sp`

option. The sketch
pad was used to produce the above image with the command line:

```
life -nx 30 -sp '11 11 1 1 1 1 1 1 1 1 2
1 0 1 1 1 1 0 1 2
1 1 1 1 1 1 1 1'
```

The values following `-sp`

are the starting coordinates of the pattern
followed by zeros or ones to indicate pixels that should be off or on,
any twos indicate new lines in the pattern.

## Lissajous

The `lissajous`

miniapp generates two different Lissajous curves in 3D
which appear to spin vertically and/or horizontally, even though the
net motion is the same.

Vertical Rotation | Horizontal Rotation |
---|---|

Based on the 2019 Illusion of the year "Dual Axis Illusion" by Frank Force, see Dual Axis Illusion.

## Mandel

The `mandel`

miniapp is a specialized version of the `shaper`

miniapp which
adapts a mesh to the Mandelbrot set.

Both planar and surface meshes are supported.

## Mondrian

The `mondrian`

miniapp is a specialized version of the `shaper`

miniapp that converts an input image to an AMR mesh. It allows the
fast approximate meshing of any domain for which there is an image.

The input image should be in 8-bit grayscale PGM format. You can use a number of image manipulation tools, such as GIMP (gimp.org) and ImageMagick's convert utility (imagemagick.org/script/convert.php) to convert your image to this format as a pre-processing step, e.g.:

`/usr/bin/convert australia.svg -compress none -depth 8 australia.pgm`

## Rubik

The `rubik`

miniapp implements an interactive model of a Rubik's Cube™ puzzle.

The basic interactive command is of the form `[xyz][1,2,3][0-3]`

which
rotates, about the x, y, or z axis, a single tier, indicated by the
first integer, by a number of increments, indicated by the final
integer. Any manipulation of the cube can be accomplished with a
sequence of these simple three character commands.

Common commands:

Command | Action |
---|---|

`R` |
Resets or re-paints the cube |

`S` or `s` |
Solve the cube starting from the top and working down |

`r[0-9]+` |
Specific number of random moves |

`p` |
Print the current state of the cube to the screen |

`q` |
Quit |

Other commands:

Command | Action |
---|---|

`T` |
Solve the top tier only |

`M` |
Solve the middle tier assuming the top has already been solved |

`B` |
Solve the bottom tier assuming the top and middle are done |

`c` |
Swap bottom tier corners in positions 0 and 1 |

`t[0,1]` |
Twist, in place, three of the bottom tier corners |

`e[0,1]` |
Permute three of the bottom tier edges |

`f[2,4]` |
Flip, in place, 2 or 4 of the bottom tier edges |

## Snake

The `snake`

miniapp provides a light-hearted example of mesh manipulation and
GLVis integration.

The Rubik's Snake™ a.k.a. Twist is a simple tool for experimenting with geometric shapes in 3D. It consists of 24 triangular prisms attached in a row so that neighboring wedges can rotate against each other but cannot be separated. An astonishing variety of different configurations can be reached.

Thirteen pre-programmed configurations are available via the ```
-c
[0-12]
```

command line option. Other configurations can be reached with
the `-u`

option. Each configuration must be 23 integers long
corresponding to the 23 joints making up the Snake™ puzzle. The
values can be 0-3 indicating how far to rotate the joint in the
clockwise direction when looking along the snake from the starting
(lower) end. The values 0, 1, 2, and 3 correspond to angles of 0, 90,
180, and 270 degrees respectively.