Constrained polytopic shape optimization ver 1.0.0
##################################################

The code performs constrained shape optimization of a Bernoulli free boundary
problem an unstructured polytopic mesh.

## Installation
To utilize the code, simply download all python code files within the folder to
the same directory and run 'main.py'.

## Usage
'main.py' contains a basic use of the optimization function as well as the
example used in the paper. If you wish to edit the initial function, you will
have to provide the bivariate function init() which outputs the initial
condition. Make sure that the sub-level set for the initial condition is
restricted to being within hold-all domain. If you wish to edit the target,
simply change the radius variable 'r' (make sure it is less than 1).

#returns basic optimization
problem.levelset(init, 0.55, 200)

#returns optimization from paper
problem.levelset(init, 0.55, 200, sc=1/20000, Mb=10, dMb=20)

NOTE 1: Due to the stochastic nature of the mesh generation, there is a small
probability of the code generating incompatible arrays for internal computation.
In such situations, simply rerun the code to generate a different mesh.

NOTE 2: Also, be aware that if the velocity norm is too high, it will violate
the CFL condition making the simulation unstable. In such situations, simply
reduce the velocity scaling variable 'sc' (I have found that having the
velocity norm < 0.1 to work in most instances)
