# Using Salome with SfePy

NOTE This tutorial was created in 2014, so it may be obsolete.

## Introduction

Salome is a powerful open-source tool for generating meshes for numerical simulation and post processing the results. This is a short tutorial on using Salome as a preprocessor for preparing meshes for use with SfePy.

### Tutorial prerequisites

This tutorial assumes that you have a working copy of Salome. It is possible to build Salome from source code. Fortunately, for the less brave, many pre-compiled binaries for different platforms are available at the Salome download page. Registration for a free account may be required to download from the preceding site.

In addition, this tutorial assumes you have a working copy of SfePy with MED read support. See the Installation for help. Note that it is not actually necessary to “install” SfePy; one may run the code from the source directory (see notation below) after compilation of the C extension modules (again, see the installation notes if you are confused).

### Note on notation used in this tutorial

We are using the following notations:

- <sfepy_root>: the root directory of the SfePy source code

- <work_dir>: the working directory where you plan to save your files

## Step 1: Using Salome

Salome has its own set of tutorials and community resources. It is suggested you look around on Salome web site to familiarize yourself with the available resources.

This tutorial follows the EDF Exercise 1 available from the Salome Tutorial Site. Go ahead and complete this tutorial now. We will use the result from there in the following.

This is the mesh you should end up with:

## Step 2: Exporting mesh from Salome

In the Salome MESH module, right click on the mesh object `Mesh_Partition_Hexa` you created in the Salome EDF Exercise 1 Tutorial and click `Export to MED file`. Save the file as `Mesh_Partition_Hexa.med` in your working directory <work_dir>.

## Step 3: Copy SfePy project description files

In this tutorial, we will assume that we need to solve a linear elasticity problem on the mesh generated by Salome. Since the Salome mesh looks a bit like a fish, we will try to simulate the fish waving its tail.

Copy the file `<sfepy_root>/sfepy/examples/linear_elasticity/linear_elastic.py` to <work_dir>. Use your favorite python editor to load this file. We will customize this file for our purposes.

## Step 4: Modify linear_elastic.py

### Mesh specification

The first thing we have to do is tell SfePy to use our new mesh. Change the line

    filename_mesh = data_dir + '/meshes/3d/cylinder.mesh'

to

    filename_mesh = 'Mesh_Partition_Hexa.med'

### Region specification

Next, we have to define sensible Regions for the mesh. We will apply a displacement to the Tail and keep the Top and Bottom of the fish fixed. Change the lines

    regions = {
        'Omega' : 'all',
        'Left' : ('vertices in (x < 0.001)', 'facet'),
        'Right' : ('vertices in (x > 0.099)', 'facet'),
        'SomewhereTop' : ('vertices in (z > 0.017) & (x > 0.03) & (x < 0.07)', 'vertex'),
    }

to

    regions = {
        'Omega' : 'all',
        'Tail' : ('vertices in (x < -94)', 'facet'),
        'TopFixed' : ('vertices in (z > 9.999) & (x > 54)', 'facet'),
        'BotFixed' : ('vertices in (z < 0.001) & (x > 54)', 'facet'),
    }

### Field specification

The Salome mesh uses hexahedral linear order elements; in SfePy notation these are called `3_8`, see User’s Guide.

Just keep the lines

    fields = {
        'displacement': ('real', 'vector', 'Omega', 1),
    }

### Boundary condition specifications

In this section, we tell SfePy to fix the top and bottom parts of the “head” of the fish and move the tail 10 units to the side (z direction).

Change the lines

    ebcs = {
        'Fixed' : ('Left', {'u.all' : 0.0}),
        'Displaced' : ('Right', {'u.0' : 0.01, 'u.[1,2]' : 0.0}),
        'PerturbedSurface' : ('SomewhereTop', {'u.2' : 0.005}),
    }

to

    ebcs = {
        'TopFixed' : ('TopFixed', {'u.all' : 0.0}),
        'BotFixed' : ('BotFixed', {'u.all' : 0.0}),
        'Displaced' : ('Tail', {'u.2' : 10, 'u.[0,1]' : 0.0}),
    }

## Step 5: Run SfePy

Save your changes to `linear_elastic.py`. Now it’s time to run the SfePy calculation. In your <work_dir> in your terminal type:

    sfepy-run linear_elastic.py

This will run the SfePy calculation. Some progress information is printed to your screen and the residual (a measure of the convergence of the solution) is printed for each iteration of the solver. The solver terminates when this residual is less than a certain value. It should only take 1 iteration since we are solving a linear problem. The results will be saved to `Mesh_Partition_Hexa.vtk`.

Now we can view the results of our work. In your terminal, type:

    sfepy-view Mesh_Partition_Hexa.vtk -f u:wu:f2.0:p0 0:vw:p0

You should get the plot with the deformed and undeformed meshs. Notice how the fish is bending its tail in response to the applied displacement.

Now you should be able to use meshes created in Salome with SfePy!