diff --git a/docs/source/_tutorials/pictures/cylinder_mod_unv_C0.png b/docs/source/_tutorials/pictures/cylinder_mod_unv_C0.png new file mode 100644 index 0000000..a7d49d1 Binary files /dev/null and b/docs/source/_tutorials/pictures/cylinder_mod_unv_C0.png differ diff --git a/docs/source/_tutorials/pictures/cylinder_mod_unv_C1.png b/docs/source/_tutorials/pictures/cylinder_mod_unv_C1.png new file mode 100644 index 0000000..0bfc7be Binary files /dev/null and b/docs/source/_tutorials/pictures/cylinder_mod_unv_C1.png differ diff --git a/docs/source/_tutorials/pictures/cylinder_orig_unv.png b/docs/source/_tutorials/pictures/cylinder_orig_unv.png new file mode 100644 index 0000000..c778da7 Binary files /dev/null and b/docs/source/_tutorials/pictures/cylinder_orig_unv.png differ diff --git a/docs/source/_tutorials/tutorial3unv.html b/docs/source/_tutorials/tutorial3unv.html new file mode 100644 index 0000000..e0981d2 --- /dev/null +++ b/docs/source/_tutorials/tutorial3unv.html @@ -0,0 +1,387 @@ + + + +tutorial-3-unv + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+

PyGeM

+
+
+
+
+
+
+
+
+

Tutorial 3: Free Form Deformation on a unv mesh on cylinder: continuity of the deformation

+
+
+
+
+
+
+
+
+

In this tutorial we show how to perform the Free Form Deformation on a hexaedral mesh of a cylinder. In particular, above what already seen in the previous tutorials, we give some information about how to set the desired continuity to the geometry we are morphing.

+

First of all we just import pygem package and we read a parameters file.

+ +
+
+
+
+
+
In [1]:
+
+
+
import pygem as pg
+
+params = pg.params.FFDParameters()
+params.read_parameters(filename='../tests/test_datasets/parameters_test_ffd_pipe_unv_C0.prm')
+
+ +
+
+
+ +
+
+
+
+
+
+

The following is the parameters file for the case at hand. In particular, if you look at the Box info section, there is 2-by-2-by-3 lattice around a cylinder. Since we want to shift the middle section of the cylinder along the x direction we modify only the parameter x weights corresponding to the middle point in z direction (index==1). In the following we show only the important parts of the parameters file

+ +
+
+
+
+
+
+
+
+

[Box info]

+

n control points x: 2
+n control points y: 2
+n control points z: 3

+

box lenght x: 2.2
+box lenght y: 2.2
+box lenght z: 6.0

+

box origin x: -1.1
+box origin y: -1.1
+box origin z: 2.0

+

[Parameters weights]

+

parameter x:

+ +
          0   0   1   0.8
+          0   1   1   0.8
+          1   0   1   0.8
+          1   1   1   0.8
+ +
+
+
+
+
+
+
+
+

We now load the unv file...

+ +
+
+
+
+
+
In [2]:
+
+
+
unv_handler = pg.unvhandler.UnvHandler()
+mesh_points = unv_handler.parse('../tests/test_datasets/test_pipe.unv')
+
+ +
+
+
+ +
+
+
+
+
+
+

and visualize the undeformed mesh.

+

+

We now, as always, perform the FFD and write out the results in another unv file.

+ +
+
+
+
+
+
In [3]:
+
+
+
free_form = pg.freeform.FFD(params, mesh_points)
+free_form.perform()
+new_mesh_points = free_form.modified_mesh_points
+
+unv_handler.write(new_mesh_points, 'test_pipe_mod_C0.unv')
+
+ +
+
+
+ +
+
+
+
+
+
+

Let us see the result...

+

+

As you can easily see the ffd deformation makes the mesh only C0 continuous.

+

This is not wrong a priori, but it can have some drawbacks.

+

First of all, if you start with a smooth geometry, probably you do not want to end up with a geometry with more edges.

+

For large deformations this can cause inaccurancy errors when you try to perform analysis on the deformed mesh. In fact, it can happen that we have very stretched cells that the solver can not treat properly. Of course it depends mainly on the solver choosen, but, in general, it is not very clever to have "spiky" cells.

+

Moreover, if you are interested in some quantities, such as grandients and normal vectors, it can be difficult to compute them close to the "artificial edges".

+

Thus, we can rely on the properties of the Bernstein polynomials (on which FFD is built upon) to overcome this potential problem. In fact, if we add 2 new control points in the z direction we can move only the middle one, leaving the first two and the last two still. The new parameter file (only the relevant changes) becomes:

+

[Box info]

+

n control points x: 2
+n control points y: 2
+n control points z: 5

+

box lenght x: 2.2
+box lenght y: 2.2
+box lenght z: 6.0

+

box origin x: -1.1
+box origin y: -1.1
+box origin z: 2.0

+

[Parameters weights]

+

parameter x:

+ +
          0   0   2   0.8
+          0   1   2   0.8
+          1   0   2   0.8
+          1   1   2   0.8
+ +
+
+
+
+
+
+
+
+

We again load the new parameter file, perform the FFD and write out the results in another unv file.

+ +
+
+
+
+
+
In [4]:
+
+
+
params = pg.params.FFDParameters()
+params.read_parameters(filename='../tests/test_datasets/parameters_test_ffd_pipe_unv_C1.prm')
+
+free_form = pg.freeform.FFD(params, mesh_points)
+free_form.perform()
+new_mesh_points = free_form.modified_mesh_points
+
+unv_handler.write(new_mesh_points, 'test_pipe_mod_C1.unv')
+
+ +
+
+
+ +
+
+
+
+
+
+

And here it is the C1 mesh on the cylinder.

+

+

You can add some other points to increase again the continuity of the mesh!

+ +
+
+
+
+
+ + diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst new file mode 100644 index 0000000..e3c0276 --- /dev/null +++ b/docs/source/contributing.rst @@ -0,0 +1,36 @@ +How to contribute +=================== + +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. + +Submitting a patch: + + 1. It's generally best to start by opening a new issue describing the bug or + feature you're intending to fix. Even if you think it's relatively minor, + it's helpful to know what people are working on. Mention in the initial + issue that you are planning to work on that bug or feature so that it can + be assigned to you. + + 2. Follow the normal process of forking the project, and setup a new + branch to work in. It's important that each group of changes be done in + separate branches in order to ensure that a pull request only includes the + commits related to that bug or feature. + + 3. To ensure properly formatted code, please make sure to use a tab of 4 + spaces to indent the code. You should also run pylint over your code. + It's not strictly necessary that your code be completely "lint-free", + but this will help you find common style issues. + + 4. Any significant changes should almost always be accompanied by tests. The + project already has good test coverage, so look at some of the existing + tests if you're unsure how to go about it. We're using coveralls that + is an invaluable tools for seeing which parts of your code aren't being + exercised by your tests. + + 5. Do your best to have well-formed commit messages for each change. + This provides consistency throughout the project, and ensures that commit + messages are able to be formatted properly by various git tools. + + 6. Finally, push the commits to your fork and submit a pull request. Please, + remember to rebase properly in order to maintain a clean, linear git history. \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index dae8bef..ec48720 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -39,7 +39,8 @@ Tutorials We made some tutorial examples: - `Tutorial 1 `_ shows how to deal with stl files -- `Turorial 2 `_ show how to deal with iges files +- `Turorial 2 `_ shows how to deal with iges files +- `Turorial 3 `_ shows how to deal with unv files and how to set the desired continuity to the geometry diff --git a/tutorials/tutorial-2-iges.ipynb b/tutorials/tutorial-2-iges.ipynb index 7c4ff87..a045408 100644 --- a/tutorials/tutorial-2-iges.ipynb +++ b/tutorials/tutorial-2-iges.ipynb @@ -25,7 +25,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "First of all we just import pygem package, we set matplotlib for the notebook and we read a parameters file." + "First of all we just import pygem package and we read a parameters file." ] }, { diff --git a/tutorials/tutorial-3-unv.ipynb b/tutorials/tutorial-3-unv.ipynb index 7988505..0c69545 100644 --- a/tutorials/tutorial-3-unv.ipynb +++ b/tutorials/tutorial-3-unv.ipynb @@ -18,7 +18,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In this tutorial we show how to perform the Free Form Deformation on a hexaedral mesh of a cylinder. In particular, above what already seen in the previous tutorials, we give some information about how set the continuity we want to the geometry we are morphing.\n", + "In this tutorial we show how to perform the Free Form Deformation on a hexaedral mesh of a cylinder. In particular, above what already seen in the previous tutorials, we give some information about how to set the desired continuity to the geometry we are morphing.\n", "\n", "First of all we just import pygem package and we read a parameters file." ] @@ -58,18 +58,18 @@ "n control points y: 2 \n", "n control points z: 3 \n", " \n", - "box lenght x: 2.2\n", - "box lenght y: 2.2\n", - "box lenght z: 6.0 \n", - "\n", - "box origin x: -1.1\n", - "box origin y: -1.1\n", - "box origin z: 2.0\n", - "\n", + "box lenght x: 2.2 \n", + "box lenght y: 2.2 \n", + "box lenght z: 6.0 \n", "\n", + "box origin x: -1.1 \n", + "box origin y: -1.1 \n", + "box origin z: 2.0 \n", + " \n", + " \n", "[Parameters weights] \n", "\n", - "parameter x: \n", + "parameter x: \n", "\n", " 0 0 1 0.8\n", " 0 1 1 0.8\n", @@ -150,13 +150,13 @@ "n control points y: 2 \n", "n control points z: 5 \n", " \n", - "box lenght x: 2.2\n", - "box lenght y: 2.2\n", - "box lenght z: 6.0 \n", + "box lenght x: 2.2 \n", + "box lenght y: 2.2 \n", + "box lenght z: 6.0 \n", "\n", - "box origin x: -1.1\n", - "box origin y: -1.1\n", - "box origin z: 2.0\n", + "box origin x: -1.1 \n", + "box origin y: -1.1 \n", + "box origin z: 2.0 \n", "\n", "\n", "[Parameters weights] \n", @@ -222,7 +222,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.10" } }, "nbformat": 4,