# Python bindings¶

Warning

The python bindings are in beta. Expect API changes and possible bugs. Use at your own peril!

I am making efforts to provide a simple python interface to Polyfem.

For doing so I am maintaining a *conda* package which can be easily installed https://anaconda.org/conda-forge/polyfempy.

Note that the conda deployment is slow and this tutorial will follow the deployment version.

If you hare in a hurry for the juicy latest feature you can clone the repository Polyfem-python and use `pip`

to install:

```
python setup.py develop
```

```
python setup.py test
```

Note that the folders tests contain some tests which can be used as documentation.

The documentation can be found here.

## Tutorial¶

Polyfem relies on 3 main objects:

`Settings`

that contains the main settings such discretization order (e.g., P_1 or P_2), material parameters, formulation, etc.`Problem`

that describe the problem you want to solve, that is the boundary conditions and right-hand side. There are some predefined problems, such as`DrivenCavity`

, or generic problems, such as`GenericTensor`

.`Solver`

that is the actual FEM solver.

The usage of specific problems is indented for benchmarking, in general you want to use the `GenericTensor`

for tensor-based PDEs (e.g., elasticity) or `GenericScalar`

for scalar PDEs (e.g., Poisson).

A typical use of Polyfem is:

settings = polyfempy.Settings() # set necessary settings # e.g. settings.discr_order = 2 problem = polyfempy.GenericTensor() # or any other problem # set problem related data # e.g. problem.set_displacement(1, [0, 0], [True, False]) settings.problem = problem #now we can create a solver and solve solver = polyfempy.Solver() solver.settings(settings) solver.load_mesh_from_path(mesh_path) solver.solve()

**Note 1**: for legacy reasons Polyfem always normalizes the mesh (i.e., rescale it to lay in the [0,1]^d box, you can use `normalize_mesh = False`

while loading to disable this feature.

**Note 2**: the solution u(x) of a FEM solver are the coefficients u_i you need to multiply the bases \varphi_i(x) with:
$$
u(x)=\sum u_i \varphi_i(x).
$$
The coefficients u_i are *unrelated* with the mesh vertices because of reordering of the nodes or high-order bases. For instance P_2 bases have additional nodes on the edges which do not exist in the mesh.

For this reason Polyfem uses a *visualization mesh* where the solution is sampled at the vertices.
This mesh has two advantages:
1. it solves the problem of nodes reordering and additional nodes in the same way
2. it provides a “true” visualization for high order solution by densely sampling each element (a P_2 solution is a piecewise quadratic function which is visualized in a picewise linear fashion, thus the need of a dense element sampling).

To control the resolution of the visualization mesh use `vismesh_rel_area`

named-argument while loading.

## Notebook¶

For more details and nice interactive example go to the notebook tutorial!