Repository: ImperialCollegeLondon/sharpy (language: python)

Issue:
Update installation docs
Added missing directory change after building the repo, to go back one level up from the `build` folder before being able to load the environment variables.


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index d43e0f710..341699ba5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -118,3 +118,7 @@ figs/*
 
 # sharpy extension
 *.sharpy
+
+# Exceptions
+# !tests/coupled/multibody/floating_wind_turbine/oc3_cs_v07.floating.h5 
+!tests/coupled/multibody/floating_wind_turbine/oc3_cs_v07.floating.h*
diff --git a/.version.json b/.version.json
index f0d3d5195..5640fc512 100644
--- a/.version.json
+++ b/.version.json
@@ -1,6 +1,6 @@
 {
   "schemaVersion": 1,
   "label": "release version",
-  "message": "1.3",
+  "message": "2.0",
   "color": "green"
 }
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e7a8e72b9..aee230c45 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,37 @@
 # Changelog
 
+## [2.0](https://github.com/imperialcollegelondon/sharpy/tree/2.0) (2022-07-04)
+
+[Full Changelog](https://github.com/imperialcollegelondon/sharpy/compare/1.3...2.0)
+
+**Implemented enhancements:**
+
+- Plot the aeroelastic mode shape to Paraview [\#202](https://github.com/ImperialCollegeLondon/sharpy/pull/202) ([ngoiz](https://github.com/ngoiz))
+- Enhanced linear solver [\#196](https://github.com/ImperialCollegeLondon/sharpy/pull/196) ([ngoiz](https://github.com/ngoiz))
+- Add pip support [\#175](https://github.com/ImperialCollegeLondon/sharpy/pull/175) ([DavidAnderegg](https://github.com/DavidAnderegg))
+
+**Fixed bugs:**
+
+- Flap inputs in state-space model not working in certain wing configurations [\#192](https://github.com/ImperialCollegeLondon/sharpy/issues/192)
+- Fix mass matrix generation for lumped masses in case of several masses per node [\#194](https://github.com/ImperialCollegeLondon/sharpy/pull/194) ([sduess](https://github.com/sduess))
+- Fix the sparse matrix in balancing ROM [\#186](https://github.com/ImperialCollegeLondon/sharpy/pull/186) ([AntonioWR](https://github.com/AntonioWR))
+
+**Closed issues:**
+
+- scipy used for direct balancing method [\#184](https://github.com/ImperialCollegeLondon/sharpy/issues/184)
+- Potential Issue in the balancing direct method [\#183](https://github.com/ImperialCollegeLondon/sharpy/issues/183)
+- Why no pip support? [\#171](https://github.com/ImperialCollegeLondon/sharpy/issues/171)
+
+**Merged pull requests:**
+
+- Contain write operations within with statements [\#195](https://github.com/ImperialCollegeLondon/sharpy/pull/195) ([ngoiz](https://github.com/ngoiz))
+- Support loading/saving state-spaces and gains to h5 files [\#188](https://github.com/ImperialCollegeLondon/sharpy/pull/188) ([ngoiz](https://github.com/ngoiz))
+- Update installation docs [\#187](https://github.com/ImperialCollegeLondon/sharpy/pull/187) ([nacho-carnicero](https://github.com/nacho-carnicero))
+- Unittest for nonlinear dynamic solver [\#185](https://github.com/ImperialCollegeLondon/sharpy/pull/185) ([sduess](https://github.com/sduess))
+- Change in the io-Settings to add thrust. [\#164](https://github.com/ImperialCollegeLondon/sharpy/pull/164) ([Eriklyy](https://github.com/Eriklyy))
+- UDP-Inout change for multiply cs\_surface\_deflections and loads/strain [\#162](https://github.com/ImperialCollegeLondon/sharpy/pull/162) ([Eriklyy](https://github.com/Eriklyy))
+- Update AsymptoticStability and FrequencyResponse post-processors [\#103](https://github.com/ImperialCollegeLondon/sharpy/pull/103) ([ngoiz](https://github.com/ngoiz))
+
 ## [1.3](https://github.com/imperialcollegelondon/sharpy/tree/1.3) (2021-11-11)
 
 [Full Changelog](https://github.com/imperialcollegelondon/sharpy/compare/v1.2.1...1.3)
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 57e4710fb..08e53a2c1 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -74,7 +74,7 @@
 
 # General information about the project.
 project = 'SHARPy'
-copyright = '2021, LoCA Lab ICL'
+copyright = '2022, LoCA Lab ICL'
 author = 'Aeroelastics Lab, Imperial College London'
 
 # The version info for the project you're documenting, acts as replacement for
@@ -82,9 +82,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = '1.3'
+version = '2.0'
 # The full version, including alpha/beta/rc tags.
-release = '1.3'
+release = '2.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/docs/source/content/contributing.md b/docs/source/content/contributing.md
index c79252053..84a8457a5 100644
--- a/docs/source/content/contributing.md
+++ b/docs/source/content/contributing.md
@@ -201,3 +201,37 @@ If you contribute, please make sure you know what branch to work from. If in dou
 Commit names are also important since they are the backbone of the code's change log. Please write concise commit titles
 and explain the main changes in the body of the commit message. An excellent guide on writing good commit messages can
 be found [here](https://chris.beams.io/posts/git-commit/).
+
+# For developers: 
+
+## Releasing a new SHARPy version
+
+In the release candidate branch:
+
+1. Update the version number in the docs configuration file `docs/source/conf.py`. Update variables `version` and `release`
+
+2. Update `version.json` file
+
+3. Update version in `sharpy/__init__.py` file
+
+4. Commit, push and wait for tests to pass
+
+5. Merge release candidate branch into `master` branch
+
+In the `master` branch:
+
+1. Run the [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator) tool locally with the following parameters:
+  ```
+  github_changelog_generator -u imperialcollegelondon -p sharpy -t <your_github_token> --future-release <new_release_version>
+  ```
+
+2. Push the changes to the `CHANGELOG.md` file
+  
+3. Create a release tag. IMPORTANT: ensure it is an *annotated* tag, otherwise the version and commit number in SHARPy will not display properly
+  ```
+  git tag -a <tagname>
+  git push origin --tags -f
+  ```
+  where `<tagname>` is something like `2.0`.
+  
+4. Create the GitHub release, choosing the newly created tag from the dropdown menu. Do not create a tag from the dropdown menu directly because it will not be an annotated tag
diff --git a/docs/source/content/example_notebooks/source/type02_db_NREL5MW_v02.xlsx b/docs/source/content/example_notebooks/source/type02_db_NREL5MW_v02.xlsx
deleted file mode 100644
index d8c22077c..000000000
Binary files a/docs/source/content/example_notebooks/source/type02_db_NREL5MW_v02.xlsx and /dev/null differ
diff --git a/docs/source/content/example_notebooks/source/type04_db_nrel5mw_oc3_v06.xlsx b/docs/source/content/example_notebooks/source/type04_db_nrel5mw_oc3_v06.xlsx
new file mode 100755
index 000000000..b0b81909c
Binary files /dev/null and b/docs/source/content/example_notebooks/source/type04_db_nrel5mw_oc3_v06.xlsx differ
diff --git a/docs/source/content/example_notebooks/wind_turbine.ipynb b/docs/source/content/example_notebooks/wind_turbine.ipynb
index 3d09cba3b..be366343a 100644
--- a/docs/source/content/example_notebooks/wind_turbine.ipynb
+++ b/docs/source/content/example_notebooks/wind_turbine.ipynb
@@ -1,2558 +1,2570 @@
 {
-	"cells": [
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"# Simulation NREL 5MW wind turbine"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 1,
-			"metadata": {},
-			"outputs": [
-				{
-					"data": {
-						"text/html": [
-							"<img src=\"https://raw.githubusercontent.com/ImperialCollegeLondon/sharpy/dev_doc/docs/source/content/example_notebooks/images/turbulence_no_legend.png\" width=\"800\"/>"
-						],
-						"text/plain": [
-							"<IPython.core.display.Image object>"
-						]
-					},
-					"execution_count": 1,
-					"metadata": {},
-					"output_type": "execute_result"
-				}
-			],
-			"source": [
-				"%config InlineBackend.figure_format = 'svg'\n",
-				"from IPython.display import Image\n",
-				"url = 'https://raw.githubusercontent.com/ImperialCollegeLondon/sharpy/dev_doc/docs/source/content/example_notebooks/images/turbulence_no_legend.png'\n",
-				"Image(url=url, width=800)"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"In this notebook the blade loads on the NREL-5MW reference wind turbine computed with SHARPy and OpenFAST will be compared. However, zero-drag airfoils have been used."
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"OpenFAST: _https://openfast.readthedocs.io_"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"NREL-5MW: Jonkman, J.; Butterfield, S.; Musial, W. and Scott, G.. _Definition of a 5-MW Reference Wind Turbine for Offshore System Development_, Technical Report, NREL 2009"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Load the required packages:"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 2,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"# Required packages\n",
-				"%matplotlib inline\n",
-				"import numpy as np\n",
-				"import os\n",
-				"import matplotlib.pyplot as plt\n",
-				"\n",
-				"# Required SHARPy modules\n",
-				"import sharpy.sharpy_main\n",
-				"import sharpy.utils.algebra as algebra\n",
-				"import sharpy.utils.generate_cases as gc\n",
-				"import sharpy.cases.templates.template_wt as template_wt"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"These are the results from the OpenFAST simulation for comparison: out-of-plane `of_cNdrR` and in-plane `of_cTdrR` coefficients along the blade and thrust `of_ct` and power `of_cp` rotor coefficients"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 3,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"of_rR = np.array([0.20158356, 0.3127131, 0.40794048, 0.5984148, 0.6936519, 0.85238045, 0.899999, 0.95555407, 0.98729974, 1.0])\n",
-				"of_cNdrR = np.array([0.08621394, 0.14687876, 0.19345148, 0.2942731, 0.36003628, 0.43748564, 0.44762507, 0.38839236, 0.29782477, 0.0])\n",
-				"of_cTdrR = np.array([0.048268348, 0.051957503, 0.05304592, 0.052862607, 0.056001827, 0.0536646, 0.050112925, 0.038993906, 0.023664437, 0.0])\n",
-				"\n",
-				"of_ct = 0.69787693\n",
-				"of_cp = 0.48813498"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"## Create SHARPy case"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Definition of parameters"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 4,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"# Mathematical constants\n",
-				"deg2rad = np.pi/180.\n",
-				"\n",
-				"# Case\n",
-				"case = 'rotor'\n",
-				"route = './'\n",
-				"\n",
-				"# Geometry discretization\n",
-				"chord_panels = np.array([8], dtype=int)\n",
-				"revs_in_wake = 5\n",
-				"\n",
-				"# Operation\n",
-				"rotation_velocity = 12.1*2*np.pi/60\n",
-				"pitch_deg = 0. #degrees\n",
-				"\n",
-				"# Wind\n",
-				"WSP = 12.\n",
-				"air_density = 1.225\n",
-				"\n",
-				"# Simulation\n",
-				"dphi = 4.*deg2rad\n",
-				"revs_to_simulate = 5"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Computation of associated parameters"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 5,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"dt = dphi/rotation_velocity\n",
-				"time_steps = int(revs_to_simulate*2.*np.pi/dphi)\n",
-				"mstar = int(revs_in_wake*2.*np.pi/dphi)"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Generation of the rotor geometry based on the information in the excel file"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 6,
-			"metadata": {},
-			"outputs": [
-				{
-					"name": "stdout",
-					"output_type": "stream",
-					"text": [
-						"\u001b[33mWARNING: The poisson cofficient is assumed equal to 0.3\u001b[0m\n",
-						"\u001b[33mWARNING: Cross-section area is used as shear area\u001b[0m\n",
-						"\u001b[33mWARNING: Using perpendicular axis theorem to compute the inertia around xB\u001b[0m\n",
-						"\u001b[33mWARNING: Replacing node 29 by node 0\u001b[0m\n",
-						"\u001b[33mWARNING: Replacing node 58 by node 0\u001b[0m\n"
-					]
-				}
-			],
-			"source": [
-				"op_params = {'rotation_velocity': rotation_velocity,\n",
-				"             'pitch_deg': pitch_deg,\n",
-				"             'wsp': WSP,\n",
-				"             'dt': dt}\n",
-				"\n",
-				"geom_params = {'chord_panels':chord_panels,\n",
-				"               'tol_remove_points': 1e-8,\n",
-				"               'n_points_camber': 100,\n",
-				"               'm_distribution': 'uniform'}\n",
-				"\n",
-				"excel_description = {'excel_file_name': route + '/source/type02_db_NREL5MW_v02.xlsx',\n",
-				"                     'excel_sheet_parameters': 'parameters',\n",
-				"                     'excel_sheet_structural_blade': 'structural_blade',\n",
-				"                     'excel_sheet_discretization_blade': 'discretization_blade',\n",
-				"                     'excel_sheet_aero_blade': 'aero_blade',\n",
-				"                     'excel_sheet_airfoil_info': 'airfoil_info',\n",
-				"                     'excel_sheet_airfoil_chord': 'airfoil_coord'}\n",
-				"\n",
-				"options = {'camber_effect_on_twist': False,\n",
-				"           'user_defined_m_distribution_type': None,\n",
-				"           'include_polars': False}\n",
-				"\n",
-				"rotor = template_wt.rotor_from_excel_type03(op_params,\n",
-				"                                            geom_params,\n",
-				"                                            excel_description,\n",
-				"                                            options)\n"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Define simulation details. The steady simulation is faster than the dynamic simulation. However, the dynamic simulation includes wake self-induction and provides more accurate results."
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 7,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"steady_simulation = False"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 8,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"SimInfo = gc.SimulationInformation()\n",
-				"SimInfo.set_default_values()\n",
-				"\n",
-				"if steady_simulation:\n",
-				"    SimInfo.solvers['SHARPy']['flow'] = ['BeamLoader',\n",
-				"                            'AerogridLoader',\n",
-				"                            'StaticCoupledRBM',\n",
-				"                            'BeamPlot',\n",
-				"                            'AerogridPlot',            \n",
-				"                            'SaveData'] \n",
-				"else:\n",
-				"    SimInfo.solvers['SHARPy']['flow'] = ['BeamLoader',\n",
-				"                            'AerogridLoader',\n",
-				"                            'StaticCoupledRBM',\n",
-				"                            'DynamicCoupled']\n",
-				"                                         \n",
-				"SimInfo.solvers['SHARPy']['case'] = case\n",
-				"SimInfo.solvers['SHARPy']['route'] = route\n",
-				"SimInfo.solvers['SHARPy']['write_log'] = True\n",
-				"SimInfo.set_variable_all_dicts('dt', dt)\n",
-				"SimInfo.set_variable_all_dicts('rho', air_density)\n",
-				"\n",
-				"SimInfo.solvers['SteadyVelocityField']['u_inf'] = WSP\n",
-				"SimInfo.solvers['SteadyVelocityField']['u_inf_direction'] = np.array([0., 0., 1.])\n",
-				"\n",
-				"SimInfo.solvers['BeamLoader']['unsteady'] = 'on'\n",
-				"\n",
-				"SimInfo.solvers['AerogridLoader']['unsteady'] = 'on'\n",
-				"SimInfo.solvers['AerogridLoader']['mstar'] = mstar\n",
-				"SimInfo.solvers['AerogridLoader']['freestream_dir'] = np.array([0.,0.,0.])\n",
-				"SimInfo.solvers['AerogridLoader']['wake_shape_generator'] = 'HelicoidalWake'\n",
-				"SimInfo.solvers['AerogridLoader']['wake_shape_generator_input'] = {'u_inf': WSP,\n",
-				"                                                                   'u_inf_direction': SimInfo.solvers['SteadyVelocityField']['u_inf_direction'],\n",
-				"                                                                   'rotation_velocity': rotation_velocity*np.array([0., 0., 1.]),\n",
-				"                                                                   'dt': dt,\n",
-				"                                                                   'dphi1': dphi,\n",
-				"                                                                   'ndphi1': mstar,\n",
-				"                                                                   'r': 1.,\n",
-				"                                                                   'dphimax': 10*deg2rad}\n",
-				"    \n",
-				"SimInfo.solvers['StaticCoupledRBM']['structural_solver'] = 'RigidDynamicPrescribedStep'\n",
-				"SimInfo.solvers['StaticCoupledRBM']['structural_solver_settings'] = SimInfo.solvers['RigidDynamicPrescribedStep']\n",
-				"SimInfo.solvers['StaticCoupledRBM']['aero_solver'] = 'StaticUvlm'\n",
-				"SimInfo.solvers['StaticCoupledRBM']['aero_solver_settings'] = SimInfo.solvers['StaticUvlm']\n",
-				"\n",
-				"SimInfo.solvers['StaticCoupledRBM']['tolerance'] = 1e-8\n",
-				"SimInfo.solvers['StaticCoupledRBM']['n_load_steps'] = 0\n",
-				"SimInfo.solvers['StaticCoupledRBM']['relaxation_factor'] = 0.\n",
-				"\n",
-				"SimInfo.solvers['StaticUvlm']['num_cores'] = 8\n",
-				"SimInfo.solvers['StaticUvlm']['velocity_field_generator'] = 'SteadyVelocityField'\n",
-				"SimInfo.solvers['StaticUvlm']['velocity_field_input'] = SimInfo.solvers['SteadyVelocityField']\n",
-				"\n",
-				"SimInfo.solvers['SaveData']['compress_float'] = True\n",
-				"                                         \n",
-				"# Only used for steady_simulation = False\n",
-				"SimInfo.solvers['StepUvlm']['convection_scheme'] = 3\n",
-				"SimInfo.solvers['StepUvlm']['num_cores'] = 8\n",
-				"SimInfo.solvers['StepUvlm']['velocity_field_generator'] = 'SteadyVelocityField'\n",
-				"SimInfo.solvers['StepUvlm']['velocity_field_input'] = SimInfo.solvers['SteadyVelocityField']\n",
-				"\n",
-				"SimInfo.solvers['DynamicCoupled']['structural_solver'] = 'RigidDynamicPrescribedStep'\n",
-				"SimInfo.solvers['DynamicCoupled']['structural_solver_settings'] = SimInfo.solvers['RigidDynamicPrescribedStep']\n",
-				"SimInfo.solvers['DynamicCoupled']['aero_solver'] = 'StepUvlm'\n",
-				"SimInfo.solvers['DynamicCoupled']['aero_solver_settings'] = SimInfo.solvers['StepUvlm']\n",
-				"SimInfo.solvers['DynamicCoupled']['postprocessors'] = ['BeamPlot', 'AerogridPlot', 'Cleanup', 'SaveData']\n",
-				"SimInfo.solvers['DynamicCoupled']['postprocessors_settings'] = {'BeamPlot': SimInfo.solvers['BeamPlot'],\n",
-				"                                                             'AerogridPlot': SimInfo.solvers['AerogridPlot'],\n",
-				"                                                             'Cleanup': SimInfo.solvers['Cleanup'],\n",
-				"                                                             'SaveData': SimInfo.solvers['SaveData']}\n",
-				"SimInfo.solvers['DynamicCoupled']['minimum_steps'] = 0\n",
-				"SimInfo.solvers['DynamicCoupled']['include_unsteady_force_contribution'] = True\n",
-				"SimInfo.solvers['DynamicCoupled']['relaxation_factor'] = 0.\n",
-				"SimInfo.solvers['DynamicCoupled']['final_relaxation_factor'] = 0.\n",
-				"SimInfo.solvers['DynamicCoupled']['dynamic_relaxation'] = False\n",
-				"SimInfo.solvers['DynamicCoupled']['relaxation_steps'] = 0\n",
-				"\n",
-				"# Define dynamic simulation (used regardless the value of \"steady_simulation\" variable)\n",
-				"SimInfo.define_num_steps(time_steps)\n",
-				"SimInfo.with_forced_vel = True\n",
-				"SimInfo.for_vel = np.zeros((time_steps,6), dtype=float)\n",
-				"SimInfo.for_vel[:,5] = rotation_velocity\n",
-				"SimInfo.for_acc = np.zeros((time_steps,6), dtype=float)\n",
-				"SimInfo.with_dynamic_forces = True\n",
-				"SimInfo.dynamic_forces = np.zeros((time_steps,rotor.StructuralInformation.num_node,6), dtype=float)"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Generate simulation files"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 9,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"gc.clean_test_files(SimInfo.solvers['SHARPy']['route'], SimInfo.solvers['SHARPy']['case'])\n",
-				"rotor.generate_h5_files(SimInfo.solvers['SHARPy']['route'], SimInfo.solvers['SHARPy']['case'])\n",
-				"SimInfo.generate_solver_file()\n",
-				"SimInfo.generate_dyn_file(time_steps)"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"## Run SHARPy case"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 10,
-			"metadata": {},
-			"outputs": [
-				{
-					"name": "stdout",
-					"output_type": "stream",
-					"text": [
-						"--------------------------------------------------------------------------------\u001b[0m\n",
-						"            ######  ##     ##    ###    ########  ########  ##    ##\u001b[0m\n",
-						"           ##    ## ##     ##   ## ##   ##     ## ##     ##  ##  ##\u001b[0m\n",
-						"           ##       ##     ##  ##   ##  ##     ## ##     ##   ####\u001b[0m\n",
-						"            ######  ######### ##     ## ########  ########     ##\u001b[0m\n",
-						"                 ## ##     ## ######### ##   ##   ##           ##\u001b[0m\n",
-						"           ##    ## ##     ## ##     ## ##    ##  ##           ##\u001b[0m\n",
-						"            ######  ##     ## ##     ## ##     ## ##           ##\u001b[0m\n",
-						"--------------------------------------------------------------------------------\u001b[0m\n",
-						"Aeroelastics Lab, Aeronautics Department.\u001b[0m\n",
-						"    Copyright (c), Imperial College London.\u001b[0m\n",
-						"    All rights reserved.\u001b[0m\n",
-						"    License available at https://github.com/imperialcollegelondon/sharpy\u001b[0m\n",
-						"\u001b[36mRunning SHARPy from /home/am3717/code/sharpy/docs/source/content/example_notebooks\u001b[0m\n",
-						"\u001b[36mSHARPy being run is in /home/am3717/code/sharpy\u001b[0m\n",
-						"\u001b[36mThe branch being run is dev_setting_error\u001b[0m\n",
-						"\u001b[36mThe version and commit hash are: v1.2.1-357-gbb7c4b4-bb7c4b4\u001b[0m\n",
-						"SHARPy output folder set\u001b[0m\n",
-						"\u001b[34m\t./output//rotor/\u001b[0m\n",
-						"\u001b[36mGenerating an instance of BeamLoader\u001b[0m\n",
-						"\u001b[36mGenerating an instance of AerogridLoader\u001b[0m\n",
-						"Variable shear_direction has no assigned value in the settings file.\u001b[0m\n",
-						"\u001b[34m    will default to the value: [1. 0. 0.]\u001b[0m\n",
-						"Variable shear_exp has no assigned value in the settings file.\u001b[0m\n",
-						"\u001b[34m    will default to the value: 0.0\u001b[0m\n",
-						"Variable h_ref has no assigned value in the settings file.\u001b[0m\n",
-						"\u001b[34m    will default to the value: 1.0\u001b[0m\n",
-						"Variable h_corr has no assigned value in the settings file.\u001b[0m\n",
-						"\u001b[34m    will default to the value: 1.0\u001b[0m\n",
-						"\u001b[34mThe aerodynamic grid contains 3 surfaces\u001b[0m\n",
-						"\u001b[34m  Surface 0, M=8, N=26\u001b[0m\n",
-						"     Wake 0, M=450, N=26\u001b[0m\n",
-						"\u001b[34m  Surface 1, M=8, N=26\u001b[0m\n",
-						"     Wake 1, M=450, N=26\u001b[0m\n",
-						"\u001b[34m  Surface 2, M=8, N=26\u001b[0m\n",
-						"     Wake 2, M=450, N=26\u001b[0m\n",
-						"  In total: 624 bound panels\u001b[0m\n",
-						"  In total: 35100 wake panels\u001b[0m\n",
-						"  Total number of panels = 35724\u001b[0m\n",
-						"\u001b[36mGenerating an instance of StaticCoupledRBM\u001b[0m\n",
-						"\u001b[36mGenerating an instance of RigidDynamicPrescribedStep\u001b[0m\n",
-						"\u001b[36mGenerating an instance of StaticUvlm\u001b[0m\n",
-						"i_step: 0, i_iter: 0\u001b[0m\n",
-						"Resultant forces and moments: (array([2.54814836e-08, 5.82946313e-09, 2.09459948e+04]), array([1.53411975e-07, 3.24440634e-08, 5.96558361e+06]))\u001b[0m\n",
-						"\u001b[36mGenerating an instance of DynamicCoupled\u001b[0m\n",
-						"\u001b[36mGenerating an instance of RigidDynamicPrescribedStep\u001b[0m\n",
-						"\u001b[36mGenerating an instance of StepUvlm\u001b[0m\n",
-						"\u001b[36mGenerating an instance of BeamPlot\u001b[0m\n",
-						"\u001b[36mGenerating an instance of AerogridPlot\u001b[0m\n",
-						"\u001b[36mGenerating an instance of Cleanup\u001b[0m\n",
-						"\u001b[36mGenerating an instance of SaveData\u001b[0m\n",
-						"\u001b[0m\n",
-						"\u001b[0m\n",
-						"\u001b[0m\n",
-						"|=======|========|======|==============|==============|==============|==============|==============|\u001b[0m\n",
-						"|  ts   |   t    | iter | struc ratio  |  iter time   | residual vel |  FoR_vel(x)  |  FoR_vel(z)  |\u001b[0m\n",
-						"|=======|========|======|==============|==============|==============|==============|==============|\u001b[0m\n",
-						"|   1   | 0.0551 |  1   |   0.000251   |  56.804234   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   2   | 0.1102 |  1   |   0.000177   |  60.232129   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   3   | 0.1653 |  1   |   0.000234   |  59.442611   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   4   | 0.2204 |  1   |   0.000290   |  64.383652   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   5   | 0.2755 |  1   |   0.000275   |  52.774436   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   6   | 0.3306 |  1   |   0.000293   |  48.828457   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   7   | 0.3857 |  1   |   0.000316   |  49.762675   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   8   | 0.4408 |  1   |   0.000227   |  49.627842   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|   9   | 0.4959 |  1   |   0.000193   |  58.254770   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  10   | 0.5510 |  1   |   0.000233   |  49.347327   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  11   | 0.6061 |  1   |   0.000222   |  51.950339   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  12   | 0.6612 |  1   |   0.000195   |  58.489715   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  13   | 0.7163 |  1   |   0.000190   |  55.497720   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  14   | 0.7713 |  1   |   0.000287   |  49.864559   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  15   | 0.8264 |  1   |   0.000198   |  56.915311   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  16   | 0.8815 |  1   |   0.000273   |  52.475129   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  17   | 0.9366 |  1   |   0.000212   |  53.472742   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  18   | 0.9917 |  1   |   0.000220   |  51.679432   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  19   | 1.0468 |  1   |   0.000230   |  49.468328   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  20   | 1.1019 |  1   |   0.000233   |  48.806374   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  21   | 1.1570 |  1   |   0.000214   |  51.507987   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  22   | 1.2121 |  1   |   0.000152   |  75.114590   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  23   | 1.2672 |  1   |   0.000178   |  63.764692   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  24   | 1.3223 |  1   |   0.000232   |  48.927093   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  25   | 1.3774 |  1   |   0.000205   |  55.065928   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  26   | 1.4325 |  1   |   0.000209   |  53.747631   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  27   | 1.4876 |  1   |   0.000215   |  65.487096   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  28   | 1.5427 |  1   |   0.000366   |  52.159906   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  29   | 1.5978 |  1   |   0.000286   |  50.405248   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  30   | 1.6529 |  1   |   0.000243   |  53.903698   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  31   | 1.7080 |  1   |   0.000189   |  55.762230   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  32   | 1.7631 |  1   |   0.000230   |  49.679477   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  33   | 1.8182 |  1   |   0.000267   |  49.140923   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  34   | 1.8733 |  1   |   0.000217   |  51.686471   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  35   | 1.9284 |  1   |   0.000227   |  49.924635   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  36   | 1.9835 |  1   |   0.000290   |  49.295199   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  37   | 2.0386 |  1   |   0.000231   |  49.096186   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  38   | 2.0937 |  1   |   0.000267   |  53.824351   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  39   | 2.1488 |  1   |   0.000274   |  50.208116   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  40   | 2.2039 |  1   |   0.000164   |  68.475332   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  41   | 2.2590 |  1   |   0.000219   |  51.476537   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  42   | 2.3140 |  1   |   0.000258   |  50.780835   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  43   | 2.3691 |  1   |   0.000205   |  54.508414   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  44   | 2.4242 |  1   |   0.000229   |  49.643120   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  45   | 2.4793 |  1   |   0.000423   |  49.510440   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  46   | 2.5344 |  1   |   0.000229   |  49.386177   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  47   | 2.5895 |  1   |   0.000224   |  51.096846   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  48   | 2.6446 |  1   |   0.000429   |  67.054611   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  49   | 2.6997 |  1   |   0.000674   |  49.034094   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  50   | 2.7548 |  1   |   0.000473   |  67.770922   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  51   | 2.8099 |  1   |   0.000623   |  52.057162   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  52   | 2.8650 |  1   |   0.000197   |  57.338530   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  53   | 2.9201 |  1   |   0.000211   |  53.323214   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  54   | 2.9752 |  1   |   0.000228   |  49.446313   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  55   | 3.0303 |  1   |   0.000226   |  50.531894   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  56   | 3.0854 |  1   |   0.000216   |  49.277498   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  57   | 3.1405 |  1   |   0.000229   |  49.378688   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  58   | 3.1956 |  1   |   0.000456   |  49.096131   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  59   | 3.2507 |  1   |   0.000638   |  49.407950   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  60   | 3.3058 |  1   |   0.000644   |  49.355487   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  61   | 3.3609 |  1   |   0.000429   |  52.381709   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  62   | 3.4160 |  1   |   0.000227   |  50.244867   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  63   | 3.4711 |  1   |   0.000226   |  50.090238   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  64   | 3.5262 |  1   |   0.000221   |  50.890983   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  65   | 3.5813 |  1   |   0.000292   |  52.582257   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  66   | 3.6364 |  1   |   0.000229   |  48.970770   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  67   | 3.6915 |  1   |   0.000211   |  53.921150   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  68   | 3.7466 |  1   |   0.000276   |  49.332785   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  69   | 3.8017 |  1   |   0.000405   |  49.861912   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  70   | 3.8567 |  1   |   0.000678   |  50.109032   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  71   | 3.9118 |  1   |   0.000627   |  50.052867   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  72   | 3.9669 |  1   |   0.000231   |  49.125818   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  73   | 4.0220 |  1   |   0.000215   |  52.475354   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  74   | 4.0771 |  1   |   0.000302   |  51.044905   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  75   | 4.1322 |  1   |   0.000232   |  49.154350   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  76   | 4.1873 |  1   |   0.000263   |  49.587372   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  77   | 4.2424 |  1   |   0.000382   |  48.959923   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  78   | 4.2975 |  1   |   0.000207   |  54.498279   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  79   | 4.3526 |  1   |   0.000209   |  55.866552   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  80   | 4.4077 |  1   |   0.000222   |  50.659905   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  81   | 4.4628 |  1   |   0.000232   |  49.229321   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  82   | 4.5179 |  1   |   0.000230   |  49.197802   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  83   | 4.5730 |  1   |   0.000244   |  58.532026   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  84   | 4.6281 |  1   |   0.000229   |  49.010943   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  85   | 4.6832 |  1   |   0.000236   |  49.181471   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  86   | 4.7383 |  1   |   0.000234   |  50.404876   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  87   | 4.7934 |  1   |   0.000223   |  50.863604   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  88   | 4.8485 |  1   |   0.000232   |  49.386036   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  89   | 4.9036 |  1   |   0.000292   |  48.966426   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  90   | 4.9587 |  1   |   0.000204   |  55.176201   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  91   | 5.0138 |  1   |   0.000381   |  49.363449   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  92   | 5.0689 |  1   |   0.000254   |  51.436284   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  93   | 5.1240 |  1   |   0.000427   |  54.203413   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  94   | 5.1791 |  1   |   0.000278   |  51.088371   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  95   | 5.2342 |  1   |   0.000221   |  51.267494   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  96   | 5.2893 |  1   |   0.000220   |  51.246126   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  97   | 5.3444 |  1   |   0.000261   |  50.044367   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  98   | 5.3994 |  1   |   0.000237   |  48.928531   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  99   | 5.4545 |  1   |   0.000230   |  48.869230   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  100  | 5.5096 |  1   |   0.000229   |  49.124024   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  101  | 5.5647 |  1   |   0.000230   |  49.170615   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  102  | 5.6198 |  1   |   0.000227   |  51.072559   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  103  | 5.6749 |  1   |   0.000230   |  49.106752   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  104  | 5.7300 |  1   |   0.000230   |  49.157374   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  105  | 5.7851 |  1   |   0.000230   |  48.729726   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  106  | 5.8402 |  1   |   0.000230   |  49.307981   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  107  | 5.8953 |  1   |   0.000232   |  49.303297   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  108  | 5.9504 |  1   |   0.000228   |  49.388923   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  109  | 6.0055 |  1   |   0.000251   |  49.505395   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  110  | 6.0606 |  1   |   0.000294   |  49.671154   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  111  | 6.1157 |  1   |   0.000637   |  49.106910   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  112  | 6.1708 |  1   |   0.000668   |  49.600747   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  113  | 6.2259 |  1   |   0.000694   |  48.788273   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  114  | 6.2810 |  1   |   0.000605   |  49.259812   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  115  | 6.3361 |  1   |   0.000235   |  49.096078   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  116  | 6.3912 |  1   |   0.000235   |  48.627974   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  117  | 6.4463 |  1   |   0.000231   |  48.687230   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  118  | 6.5014 |  1   |   0.000261   |  50.182136   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  119  | 6.5565 |  1   |   0.000220   |  51.480792   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  120  | 6.6116 |  1   |   0.000212   |  52.759361   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  121  | 6.6667 |  1   |   0.000234   |  61.395446   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  122  | 6.7218 |  1   |   0.000196   |  57.312678   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  123  | 6.7769 |  1   |   0.000196   |  57.288595   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  124  | 6.8320 |  1   |   0.000219   |  52.597533   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  125  | 6.8871 |  1   |   0.000279   |  51.215139   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  126  | 6.9421 |  1   |   0.000232   |  48.835388   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  127  | 6.9972 |  1   |   0.000228   |  49.442145   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  128  | 7.0523 |  1   |   0.000232   |  49.943434   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  129  | 7.1074 |  1   |   0.000265   |  48.943739   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  130  | 7.1625 |  1   |   0.000233   |  48.552538   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  131  | 7.2176 |  1   |   0.000235   |  48.576140   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  132  | 7.2727 |  1   |   0.000227   |  50.729522   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  133  | 7.3278 |  1   |   0.000199   |  57.042671   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  134  | 7.3829 |  1   |   0.000229   |  49.647710   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  135  | 7.4380 |  1   |   0.000377   |  53.191903   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  136  | 7.4931 |  1   |   0.000666   |  50.832518   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  137  | 7.5482 |  1   |   0.000560   |  52.129724   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  138  | 7.6033 |  1   |   0.000593   |  48.825715   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  139  | 7.6584 |  1   |   0.000231   |  49.220850   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  140  | 7.7135 |  1   |   0.000347   |  64.642874   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  141  | 7.7686 |  1   |   0.000615   |  54.791703   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  142  | 7.8237 |  1   |   0.000557   |  55.332506   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  143  | 7.8788 |  1   |   0.000649   |  51.958248   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  144  | 7.9339 |  1   |   0.000431   |  52.224418   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  145  | 7.9890 |  1   |   0.000532   |  60.207598   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  146  | 8.0441 |  1   |   0.000267   |  48.557877   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  147  | 8.0992 |  1   |   0.000283   |  50.720948   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  148  | 8.1543 |  1   |   0.000264   |  54.107664   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  149  | 8.2094 |  1   |   0.000225   |  49.998135   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  150  | 8.2645 |  1   |   0.000297   |  48.723537   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  151  | 8.3196 |  1   |   0.000229   |  48.991915   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  152  | 8.3747 |  1   |   0.000223   |  50.525580   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  153  | 8.4298 |  1   |   0.000372   |  48.880427   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  154  | 8.4848 |  1   |   0.000232   |  48.851891   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  155  | 8.5399 |  1   |   0.000231   |  48.731096   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  156  | 8.5950 |  1   |   0.000209   |  53.669843   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  157  | 8.6501 |  1   |   0.000203   |  55.525421   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  158  | 8.7052 |  1   |   0.000216   |  48.727216   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  159  | 8.7603 |  1   |   0.000240   |  52.981239   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  160  | 8.8154 |  1   |   0.000294   |  50.516618   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  161  | 8.8705 |  1   |   0.000198   |  56.957355   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  162  | 8.9256 |  1   |   0.000268   |  48.780843   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  163  | 8.9807 |  1   |   0.000228   |  49.216988   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  164  | 9.0358 |  1   |   0.000228   |  49.020854   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  165  | 9.0909 |  1   |   0.000236   |  48.516192   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  166  | 9.1460 |  1   |   0.000275   |  48.936249   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  167  | 9.2011 |  1   |   0.000229   |  48.984558   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  168  | 9.2562 |  1   |   0.000228   |  50.011495   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  169  | 9.3113 |  1   |   0.000230   |  49.079509   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  170  | 9.3664 |  1   |   0.000232   |  48.940832   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  171  | 9.4215 |  1   |   0.000266   |  48.539668   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  172  | 9.4766 |  1   |   0.000329   |  48.707876   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  173  | 9.5317 |  1   |   0.000344   |  49.214713   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  174  | 9.5868 |  1   |   0.000221   |  50.762513   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  175  | 9.6419 |  1   |   0.000336   |  55.302099   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  176  | 9.6970 |  1   |   0.000217   |  48.736059   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  177  | 9.7521 |  1   |   0.000231   |  48.750098   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  178  | 9.8072 |  1   |   0.000229   |  48.794680   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  179  | 9.8623 |  1   |   0.000225   |  50.519301   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  180  | 9.9174 |  1   |   0.000225   |  49.930789   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  181  | 9.9725 |  1   |   0.000265   |  50.077232   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  182  |10.0275 |  1   |   0.000285   |  50.327260   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  183  |10.0826 |  1   |   0.000319   |  50.215326   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  184  |10.1377 |  1   |   0.000288   |  48.350528   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  185  |10.1928 |  1   |   0.000233   |  48.372314   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  186  |10.2479 |  1   |   0.000232   |  49.104808   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  187  |10.3030 |  1   |   0.000292   |  48.972235   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  188  |10.3581 |  1   |   0.000655   |  48.972110   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  189  |10.4132 |  1   |   0.000233   |  48.457135   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  190  |10.4683 |  1   |   0.000229   |  49.120724   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  191  |10.5234 |  1   |   0.000222   |  51.106254   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  192  |10.5785 |  1   |   0.000232   |  48.794933   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  193  |10.6336 |  1   |   0.000292   |  49.537670   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  194  |10.6887 |  1   |   0.000230   |  49.236260   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  195  |10.7438 |  1   |   0.000603   |  52.529460   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  196  |10.7989 |  1   |   0.000697   |  48.383116   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  197  |10.8540 |  1   |   0.000347   |  48.288813   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  198  |10.9091 |  1   |   0.000227   |  49.550065   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  199  |10.9642 |  1   |   0.000216   |  48.675859   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  200  |11.0193 |  1   |   0.000231   |  49.152487   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  201  |11.0744 |  1   |   0.000235   |  48.778197   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  202  |11.1295 |  1   |   0.000373   |  57.791454   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  203  |11.1846 |  1   |   0.000582   |  57.753718   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  204  |11.2397 |  1   |   0.000451   |  48.675944   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  205  |11.2948 |  1   |   0.000235   |  48.274112   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  206  |11.3499 |  1   |   0.000232   |  48.917871   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  207  |11.4050 |  1   |   0.000293   |  49.482251   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  208  |11.4601 |  1   |   0.000297   |  48.304309   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  209  |11.5152 |  1   |   0.000263   |  49.162448   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  210  |11.5702 |  1   |   0.000227   |  50.845835   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  211  |11.6253 |  1   |   0.000232   |  48.809305   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  212  |11.6804 |  1   |   0.000293   |  48.950330   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  213  |11.7355 |  1   |   0.000298   |  48.481146   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  214  |11.7906 |  1   |   0.000234   |  48.222179   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  215  |11.8457 |  1   |   0.000225   |  48.228569   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  216  |11.9008 |  1   |   0.000218   |  48.173668   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  217  |11.9559 |  1   |   0.000230   |  48.496389   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  218  |12.0110 |  1   |   0.000212   |  53.240908   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  219  |12.0661 |  1   |   0.000224   |  51.372105   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  220  |12.1212 |  1   |   0.000419   |  49.490550   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  221  |12.1763 |  1   |   0.000459   |  49.025501   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  222  |12.2314 |  1   |   0.000210   |  53.157816   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  223  |12.2865 |  1   |   0.000233   |  48.099241   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  224  |12.3416 |  1   |   0.000241   |  59.450060   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  225  |12.3967 |  1   |   0.000224   |  50.153783   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  226  |12.4518 |  1   |   0.000169   |  67.550282   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  227  |12.5069 |  1   |   0.000635   |  51.062920   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  228  |12.5620 |  1   |   0.000233   |  48.498621   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  229  |12.6171 |  1   |   0.000647   |  48.837410   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  230  |12.6722 |  1   |   0.000685   |  48.524438   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  231  |12.7273 |  1   |   0.000645   |  47.972726   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  232  |12.7824 |  1   |   0.000698   |  48.332650   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  233  |12.8375 |  1   |   0.000291   |  49.344210   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  234  |12.8926 |  1   |   0.000231   |  48.621207   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  235  |12.9477 |  1   |   0.000211   |  53.099352   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  236  |13.0028 |  1   |   0.000231   |  48.779174   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  237  |13.0579 |  1   |   0.000221   |  52.508748   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  238  |13.1129 |  1   |   0.000197   |  57.071891   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  239  |13.1680 |  1   |   0.000232   |  48.635785   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  240  |13.2231 |  1   |   0.000228   |  49.653808   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  241  |13.2782 |  1   |   0.000232   |  49.880283   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  242  |13.3333 |  1   |   0.000219   |  50.989864   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  243  |13.3884 |  1   |   0.000218   |  51.562733   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  244  |13.4435 |  1   |   0.000175   |  60.525012   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  245  |13.4986 |  1   |   0.000208   |  53.714735   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  246  |13.5537 |  1   |   0.000188   |  60.430187   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  247  |13.6088 |  1   |   0.000580   |  55.369422   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  248  |13.6639 |  1   |   0.000376   |  52.945929   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  249  |13.7190 |  1   |   0.000221   |  50.621281   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  250  |13.7741 |  1   |   0.000222   |  51.930545   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  251  |13.8292 |  1   |   0.000203   |  55.750479   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  252  |13.8843 |  1   |   0.000228   |  49.736165   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  253  |13.9394 |  1   |   0.000239   |  48.733683   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  254  |13.9945 |  1   |   0.000228   |  48.860423   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  255  |14.0496 |  1   |   0.000234   |  48.158656   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  256  |14.1047 |  1   |   0.000222   |  48.995898   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  257  |14.1598 |  1   |   0.000181   |  61.699569   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  258  |14.2149 |  1   |   0.000217   |  51.853006   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  259  |14.2700 |  1   |   0.000231   |  48.370357   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  260  |14.3251 |  1   |   0.000231   |  48.536412   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  261  |14.3802 |  1   |   0.000231   |  48.706123   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  262  |14.4353 |  1   |   0.000321   |  48.889459   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  263  |14.4904 |  1   |   0.000232   |  48.413389   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  264  |14.5455 |  1   |   0.000183   |  61.637297   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  265  |14.6006 |  1   |   0.000266   |  51.996729   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  266  |14.6556 |  1   |   0.000440   |  51.124606   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  267  |14.7107 |  1   |   0.000206   |  54.482224   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  268  |14.7658 |  1   |   0.000227   |  49.396567   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  269  |14.8209 |  1   |   0.000216   |  48.399076   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  270  |14.8760 |  1   |   0.000225   |  49.932379   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  271  |14.9311 |  1   |   0.000229   |  48.837313   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  272  |14.9862 |  1   |   0.000234   |  48.303012   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  273  |15.0413 |  1   |   0.000297   |  48.557886   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  274  |15.0964 |  1   |   0.000232   |  48.462573   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  275  |15.1515 |  1   |   0.000235   |  48.074680   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  276  |15.2066 |  1   |   0.000237   |  47.978437   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  277  |15.2617 |  1   |   0.000218   |  48.799704   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  278  |15.3168 |  1   |   0.000180   |  61.907709   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  279  |15.3719 |  1   |   0.000223   |  50.256748   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  280  |15.4270 |  1   |   0.000229   |  49.243923   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  281  |15.4821 |  1   |   0.000453   |  49.924487   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  282  |15.5372 |  1   |   0.000350   |  49.501563   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  283  |15.5923 |  1   |   0.000234   |  48.333380   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  284  |15.6474 |  1   |   0.000223   |  50.163273   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  285  |15.7025 |  1   |   0.000225   |  50.068699   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  286  |15.7576 |  1   |   0.000229   |  48.458516   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  287  |15.8127 |  1   |   0.000231   |  49.273332   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  288  |15.8678 |  1   |   0.000232   |  48.548550   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  289  |15.9229 |  1   |   0.000224   |  51.276163   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  290  |15.9780 |  1   |   0.000233   |  48.570122   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  291  |16.0331 |  1   |   0.000192   |  50.266936   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  292  |16.0882 |  1   |   0.000295   |  48.692444   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  293  |16.1433 |  1   |   0.000202   |  48.893389   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  294  |16.1983 |  1   |   0.000443   |  50.813372   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  295  |16.2534 |  1   |   0.000529   |  60.601432   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  296  |16.3085 |  1   |   0.000571   |  50.993108   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  297  |16.3636 |  1   |   0.000228   |  49.065097   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  298  |16.4187 |  1   |   0.000234   |  48.226984   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  299  |16.4738 |  1   |   0.000233   |  48.534926   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  300  |16.5289 |  1   |   0.000627   |  48.788802   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  301  |16.5840 |  1   |   0.000555   |  60.530895   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  302  |16.6391 |  1   |   0.000628   |  48.944436   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  303  |16.6942 |  1   |   0.000427   |  49.049230   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  304  |16.7493 |  1   |   0.000236   |  47.892993   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  305  |16.8044 |  1   |   0.000325   |  48.441506   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  306  |16.8595 |  1   |   0.000236   |  48.047404   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  307  |16.9146 |  1   |   0.000232   |  48.215284   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  308  |16.9697 |  1   |   0.000226   |  50.124858   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  309  |17.0248 |  1   |   0.000213   |  52.395805   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  310  |17.0799 |  1   |   0.000222   |  51.302776   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  311  |17.1350 |  1   |   0.000439   |  51.171773   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  312  |17.1901 |  1   |   0.000232   |  49.032143   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  313  |17.2452 |  1   |   0.000233   |  48.628400   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  314  |17.3003 |  1   |   0.000237   |  47.940311   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  315  |17.3554 |  1   |   0.000216   |  51.865635   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  316  |17.4105 |  1   |   0.000373   |  54.905208   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  317  |17.4656 |  1   |   0.000310   |  48.191338   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  318  |17.5207 |  1   |   0.000409   |  48.607705   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  319  |17.5758 |  1   |   0.000350   |  53.126807   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  320  |17.6309 |  1   |   0.000236   |  47.827493   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  321  |17.6860 |  1   |   0.000233   |  48.142512   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  322  |17.7410 |  1   |   0.000233   |  48.315800   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  323  |17.7961 |  1   |   0.000203   |  55.821999   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  324  |17.8512 |  1   |   0.000227   |  49.786573   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  325  |17.9063 |  1   |   0.000424   |  53.387859   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  326  |17.9614 |  1   |   0.000447   |  50.685506   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  327  |18.0165 |  1   |   0.000235   |  48.078798   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  328  |18.0716 |  1   |   0.000232   |  48.322922   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  329  |18.1267 |  1   |   0.000223   |  48.098878   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  330  |18.1818 |  1   |   0.000201   |  48.656743   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  331  |18.2369 |  1   |   0.000273   |  48.314217   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  332  |18.2920 |  1   |   0.000224   |  48.475068   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  333  |18.3471 |  1   |   0.000230   |  48.642246   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  334  |18.4022 |  1   |   0.000194   |  57.654265   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  335  |18.4573 |  1   |   0.000225   |  50.092508   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  336  |18.5124 |  1   |   0.000291   |  49.505815   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  337  |18.5675 |  1   |   0.000228   |  49.799143   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  338  |18.6226 |  1   |   0.000272   |  48.344175   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  339  |18.6777 |  1   |   0.000219   |  48.669889   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  340  |18.7328 |  1   |   0.000221   |  48.424671   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  341  |18.7879 |  1   |   0.000204   |  55.293948   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  342  |18.8430 |  1   |   0.000361   |  48.517776   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  343  |18.8981 |  1   |   0.000218   |  52.256841   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  344  |18.9532 |  1   |   0.000232   |  48.441100   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  345  |19.0083 |  1   |   0.000234   |  48.389977   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  346  |19.0634 |  1   |   0.000230   |  48.982534   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  347  |19.1185 |  1   |   0.000231   |  48.746604   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  348  |19.1736 |  1   |   0.000229   |  56.961390   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  349  |19.2287 |  1   |   0.000188   |  59.830517   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  350  |19.2837 |  1   |   0.000296   |  51.906979   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  351  |19.3388 |  1   |   0.000217   |  51.754677   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  352  |19.3939 |  1   |   0.000244   |  48.090983   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  353  |19.4490 |  1   |   0.000234   |  48.219884   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  354  |19.5041 |  1   |   0.000211   |  53.274204   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  355  |19.5592 |  1   |   0.000236   |  47.988238   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  356  |19.6143 |  1   |   0.000236   |  48.149312   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  357  |19.6694 |  1   |   0.000231   |  48.684465   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  358  |19.7245 |  1   |   0.000245   |  48.573752   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  359  |19.7796 |  1   |   0.000255   |  48.387298   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  360  |19.8347 |  1   |   0.000233   |  48.496933   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  361  |19.8898 |  1   |   0.000298   |  48.227055   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  362  |19.9449 |  1   |   0.000277   |  50.033512   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  363  |20.0000 |  1   |   0.000230   |  48.865905   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  364  |20.0551 |  1   |   0.000233   |  48.282476   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  365  |20.1102 |  1   |   0.000231   |  48.869913   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  366  |20.1653 |  1   |   0.000240   |  48.197653   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  367  |20.2204 |  1   |   0.000236   |  47.995288   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  368  |20.2755 |  1   |   0.000218   |  48.416211   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  369  |20.3306 |  1   |   0.000229   |  49.650859   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  370  |20.3857 |  1   |   0.000281   |  50.925766   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  371  |20.4408 |  1   |   0.000293   |  49.072721   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  372  |20.4959 |  1   |   0.000237   |  47.848434   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  373  |20.5510 |  1   |   0.000461   |  48.577324   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  374  |20.6061 |  1   |   0.000288   |  48.149040   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  375  |20.6612 |  1   |   0.000232   |  48.140545   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  376  |20.7163 |  1   |   0.000627   |  48.528365   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  377  |20.7713 |  1   |   0.000649   |  48.815492   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  378  |20.8264 |  1   |   0.000220   |  48.691541   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  379  |20.8815 |  1   |   0.000234   |  48.163874   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  380  |20.9366 |  1   |   0.000397   |  47.970319   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  381  |20.9917 |  1   |   0.000266   |  49.183593   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  382  |21.0468 |  1   |   0.000228   |  49.448159   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  383  |21.1019 |  1   |   0.000230   |  48.558385   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  384  |21.1570 |  1   |   0.000279   |  48.382636   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  385  |21.2121 |  1   |   0.000237   |  47.482272   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  386  |21.2672 |  1   |   0.000233   |  48.183362   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  387  |21.3223 |  1   |   0.000232   |  48.062299   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  388  |21.3774 |  1   |   0.000235   |  48.362948   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  389  |21.4325 |  1   |   0.000233   |  48.422455   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  390  |21.4876 |  1   |   0.000236   |  48.077169   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  391  |21.5427 |  1   |   0.000218   |  48.317787   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  392  |21.5978 |  1   |   0.000231   |  48.382455   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  393  |21.6529 |  1   |   0.000233   |  48.310206   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  394  |21.7080 |  1   |   0.000219   |  49.225511   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  395  |21.7631 |  1   |   0.000238   |  47.725182   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  396  |21.8182 |  1   |   0.000403   |  48.100903   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  397  |21.8733 |  1   |   0.000227   |  49.886770   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  398  |21.9284 |  1   |   0.000226   |  49.658201   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  399  |21.9835 |  1   |   0.000236   |  48.305113   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  400  |22.0386 |  1   |   0.000213   |  53.014337   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  401  |22.0937 |  1   |   0.000323   |  48.752367   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  402  |22.1488 |  1   |   0.000231   |  48.655110   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  403  |22.2039 |  1   |   0.000302   |  49.894845   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  404  |22.2590 |  1   |   0.000192   |  54.227928   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  405  |22.3140 |  1   |   0.000213   |  53.815790   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  406  |22.3691 |  1   |   0.000231   |  49.235416   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  407  |22.4242 |  1   |   0.000232   |  48.387503   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  408  |22.4793 |  1   |   0.000220   |  52.815450   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  409  |22.5344 |  1   |   0.000232   |  48.253041   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  410  |22.5895 |  1   |   0.000218   |  52.584628   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  411  |22.6446 |  1   |   0.000222   |  50.874607   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  412  |22.6997 |  1   |   0.000234   |  48.125687   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  413  |22.7548 |  1   |   0.000314   |  65.912785   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  414  |22.8099 |  1   |   0.000294   |  48.712801   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  415  |22.8650 |  1   |   0.000234   |  48.264049   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  416  |22.9201 |  1   |   0.000219   |  52.101943   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  417  |22.9752 |  1   |   0.000233   |  48.181907   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  418  |23.0303 |  1   |   0.000239   |  47.737343   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  419  |23.0854 |  1   |   0.000189   |  55.077763   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  420  |23.1405 |  1   |   0.000252   |  48.412007   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  421  |23.1956 |  1   |   0.000207   |  52.025445   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  422  |23.2507 |  1   |   0.000202   |  55.306192   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  423  |23.3058 |  1   |   0.000235   |  48.069254   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  424  |23.3609 |  1   |   0.000268   |  48.786326   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  425  |23.4160 |  1   |   0.000234   |  48.662434   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  426  |23.4711 |  1   |   0.000430   |  48.229208   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  427  |23.5262 |  1   |   0.000660   |  48.355178   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  428  |23.5813 |  1   |   0.000475   |  47.940589   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  429  |23.6364 |  1   |   0.000464   |  48.627356   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  430  |23.6915 |  1   |   0.000231   |  48.519762   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  431  |23.7466 |  1   |   0.000233   |  48.359547   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  432  |23.8017 |  1   |   0.000273   |  48.313746   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  433  |23.8567 |  1   |   0.000237   |  47.977213   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  434  |23.9118 |  1   |   0.000226   |  49.786822   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  435  |23.9669 |  1   |   0.000231   |  48.641675   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  436  |24.0220 |  1   |   0.000263   |  50.056180   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  437  |24.0771 |  1   |   0.000239   |  48.169318   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  438  |24.1322 |  1   |   0.000237   |  47.903935   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  439  |24.1873 |  1   |   0.000235   |  48.071315   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  440  |24.2424 |  1   |   0.000298   |  47.997039   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  441  |24.2975 |  1   |   0.000204   |  51.404477   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  442  |24.3526 |  1   |   0.000234   |  48.367934   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  443  |24.4077 |  1   |   0.000297   |  48.626223   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  444  |24.4628 |  1   |   0.000254   |  48.214660   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  445  |24.5179 |  1   |   0.000234   |  47.731147   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  446  |24.5730 |  1   |   0.000268   |  48.701918   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  447  |24.6281 |  1   |   0.000233   |  48.425494   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  448  |24.6832 |  1   |   0.000233   |  48.324203   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  449  |24.7383 |  1   |   0.000228   |  49.378323   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"|  450  |24.7934 |  1   |   0.000229   |  48.777402   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
-						"\u001b[34m...Finished\u001b[0m\n",
-						"\u001b[36mFINISHED - Elapsed time = 23245.3692466 seconds\u001b[0m\n",
-						"\u001b[36mFINISHED - CPU process time = 92349.9106726 seconds\u001b[0m\n"
-					]
-				}
-			],
-			"source": [
-				"sharpy_output = sharpy.sharpy_main.main(['', SimInfo.solvers['SHARPy']['route'] + SimInfo.solvers['SHARPy']['case'] + '.sharpy'])"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"## Postprocessing"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Read the structural and aerodynamic information of the last time step"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 11,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"tstep = sharpy_output.structure.timestep_info[-1]\n",
-				"astep = sharpy_output.aero.timestep_info[-1]"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Separate the structure into blades"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 12,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"# Define beams\n",
-				"ielem = 0\n",
-				"nblades = np.max(sharpy_output.structure.beam_number) + 1\n",
-				"nodes_blade = []\n",
-				"first_node = 0\n",
-				"for iblade in range(nblades):\n",
-				"    nodes_blade.append(np.zeros((sharpy_output.structure.num_node,), dtype=bool))\n",
-				"    while sharpy_output.structure.beam_number[ielem] <= iblade:\n",
-				"        ielem += 1\n",
-				"        if ielem == sharpy_output.structure.num_elem:\n",
-				"            break\n",
-				"    nodes_blade[iblade][first_node:sharpy_output.structure.connectivities[ielem-1,1]+1] = True\n",
-				"    first_node = sharpy_output.structure.connectivities[ielem-1,1]+1"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Compute the radial position of the nodes and initialise the rest of the variables"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 13,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"r = []\n",
-				"c = []\n",
-				"dr = []\n",
-				"forces = []\n",
-				"CN_drR = []\n",
-				"CTan_drR = []\n",
-				"CP_drR = []\n",
-				"nodes_num = []\n",
-				"for iblade in range(nblades):\n",
-				"    forces.append(tstep.steady_applied_forces[nodes_blade[iblade]].copy())\n",
-				"\n",
-				"    nodes_num.append(np.arange(0, sharpy_output.structure.num_node, 1)[nodes_blade[iblade]])\n",
-				"\n",
-				"    r.append(np.linalg.norm(tstep.pos[nodes_blade[iblade], :], axis=1))\n",
-				"    dr.append(np.zeros(np.sum(nodes_blade[iblade])))\n",
-				"    dr[iblade][0] = 0.5*(r[iblade][1]-r[iblade][0])\n",
-				"    dr[iblade][-1] = 0.5 * (r[iblade][-1] - r[iblade][-2])\n",
-				"    for inode in range(1,len(r[iblade]) - 1):\n",
-				"        dr[iblade][inode] = 0.5*(r[iblade][inode+1] - r[iblade][inode-1])\n",
-				"\n",
-				"    CN_drR.append(np.zeros(len(r[iblade])))\n",
-				"    c.append(np.zeros(len(r[iblade])))\n",
-				"    CTan_drR.append(np.zeros(len(r[iblade])))\n",
-				"    CP_drR.append(np.zeros(len(r[iblade])))"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Transform the loads computed by SHARPy into out-of-plane and in-plane components"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 14,
-			"metadata": {},
-			"outputs": [],
-			"source": [
-				"rho = sharpy_output.settings['StaticCoupledRBM']['aero_solver_settings']['rho']\n",
-				"uinf = sharpy_output.settings['StaticCoupledRBM']['aero_solver_settings']['velocity_field_input']['u_inf']\n",
-				"R = np.max(r[0])\n",
-				"Cp = 0\n",
-				"Ct = 0\n",
-				"\n",
-				"global_force_factor = 0.5 * rho * uinf** 2 * np.pi * R**2\n",
-				"global_power_factor = global_force_factor*uinf\n",
-				"for iblade in range(nblades):\n",
-				"    for inode in range(len(r[iblade])):\n",
-				"        forces[iblade][inode, 0] *= 0. # Discard the spanwise component\n",
-				"\n",
-				"        node_global_index = nodes_num[iblade][inode]\n",
-				"        ielem = sharpy_output.structure.node_master_elem[node_global_index, 0]\n",
-				"        inode_in_elem = sharpy_output.structure.node_master_elem[node_global_index, 1]\n",
-				"        CAB = algebra.crv2rotation(tstep.psi[ielem, inode_in_elem, :])\n",
-				"\n",
-				"        c[iblade][inode] = sharpy_output.aero.aero_dict['chord'][ielem,inode_in_elem]\n",
-				"\n",
-				"        forces_AFoR = np.dot(CAB, forces[iblade][inode, 0:3])\n",
-				"\n",
-				"        CN_drR[iblade][inode] = forces_AFoR[2]/dr[iblade][inode]*R / global_force_factor\n",
-				"        CTan_drR[iblade][inode] = np.linalg.norm(forces_AFoR[0:2])/dr[iblade][inode]*R  / global_force_factor\n",
-				"        CP_drR[iblade][inode] = np.linalg.norm(forces_AFoR[0:2])/dr[iblade][inode]*R  * r[iblade][inode]*rotation_velocity / global_power_factor\n",
-				"\n",
-				"    Cp += np.sum(CP_drR[iblade]*dr[iblade]/R)\n",
-				"    Ct += np.sum(CN_drR[iblade]*dr[iblade]/R)"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"## Results"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Plot of the loads along the blade"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 15,
-			"metadata": {},
-			"outputs": [
-				{
-					"data": {
-						"image/svg+xml": [
-							"<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
-							"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
-							"  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
-							"<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
-							"<svg height=\"207.83625pt\" version=\"1.1\" viewBox=\"0 0 720.58125 207.83625\" width=\"720.58125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
-							" <defs>\n",
-							"  <style type=\"text/css\">\n",
-							"*{stroke-linecap:butt;stroke-linejoin:round;}\n",
-							"  </style>\n",
-							" </defs>\n",
-							" <g id=\"figure_1\">\n",
-							"  <g id=\"patch_1\">\n",
-							"   <path d=\"M 0 207.83625 \n",
-							"L 720.58125 207.83625 \n",
-							"L 720.58125 0 \n",
-							"L 0 0 \n",
-							"z\n",
-							"\" style=\"fill:none;\"/>\n",
-							"  </g>\n",
-							"  <g id=\"axes_1\">\n",
-							"   <g id=\"patch_2\">\n",
-							"    <path d=\"M 43.78125 170.28 \n",
-							"L 348.144886 170.28 \n",
-							"L 348.144886 7.2 \n",
-							"L 43.78125 7.2 \n",
-							"z\n",
-							"\" style=\"fill:#ffffff;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"matplotlib.axis_1\">\n",
-							"    <g id=\"xtick_1\">\n",
-							"     <g id=\"line2d_1\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 57.615961 170.28 \n",
-							"L 57.615961 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_2\">\n",
-							"      <defs>\n",
-							"       <path d=\"M 0 0 \n",
-							"L 0 3.5 \n",
-							"\" id=\"m41855ab76f\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
-							"      </defs>\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"57.615961\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_1\">\n",
-							"      <!-- 0.0 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 31.78125 66.40625 \n",
-							"Q 24.171875 66.40625 20.328125 58.90625 \n",
-							"Q 16.5 51.421875 16.5 36.375 \n",
-							"Q 16.5 21.390625 20.328125 13.890625 \n",
-							"Q 24.171875 6.390625 31.78125 6.390625 \n",
-							"Q 39.453125 6.390625 43.28125 13.890625 \n",
-							"Q 47.125 21.390625 47.125 36.375 \n",
-							"Q 47.125 51.421875 43.28125 58.90625 \n",
-							"Q 39.453125 66.40625 31.78125 66.40625 \n",
-							"z\n",
-							"M 31.78125 74.21875 \n",
-							"Q 44.046875 74.21875 50.515625 64.515625 \n",
-							"Q 56.984375 54.828125 56.984375 36.375 \n",
-							"Q 56.984375 17.96875 50.515625 8.265625 \n",
-							"Q 44.046875 -1.421875 31.78125 -1.421875 \n",
-							"Q 19.53125 -1.421875 13.0625 8.265625 \n",
-							"Q 6.59375 17.96875 6.59375 36.375 \n",
-							"Q 6.59375 54.828125 13.0625 64.515625 \n",
-							"Q 19.53125 74.21875 31.78125 74.21875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-48\"/>\n",
-							"       <path d=\"M 10.6875 12.40625 \n",
-							"L 21 12.40625 \n",
-							"L 21 0 \n",
-							"L 10.6875 0 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-46\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(49.664398 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_2\">\n",
-							"     <g id=\"line2d_3\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 112.954804 170.28 \n",
-							"L 112.954804 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_4\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"112.954804\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_2\">\n",
-							"      <!-- 0.2 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 19.1875 8.296875 \n",
-							"L 53.609375 8.296875 \n",
-							"L 53.609375 0 \n",
-							"L 7.328125 0 \n",
-							"L 7.328125 8.296875 \n",
-							"Q 12.9375 14.109375 22.625 23.890625 \n",
-							"Q 32.328125 33.6875 34.8125 36.53125 \n",
-							"Q 39.546875 41.84375 41.421875 45.53125 \n",
-							"Q 43.3125 49.21875 43.3125 52.78125 \n",
-							"Q 43.3125 58.59375 39.234375 62.25 \n",
-							"Q 35.15625 65.921875 28.609375 65.921875 \n",
-							"Q 23.96875 65.921875 18.8125 64.3125 \n",
-							"Q 13.671875 62.703125 7.8125 59.421875 \n",
-							"L 7.8125 69.390625 \n",
-							"Q 13.765625 71.78125 18.9375 73 \n",
-							"Q 24.125 74.21875 28.421875 74.21875 \n",
-							"Q 39.75 74.21875 46.484375 68.546875 \n",
-							"Q 53.21875 62.890625 53.21875 53.421875 \n",
-							"Q 53.21875 48.921875 51.53125 44.890625 \n",
-							"Q 49.859375 40.875 45.40625 35.40625 \n",
-							"Q 44.1875 33.984375 37.640625 27.21875 \n",
-							"Q 31.109375 20.453125 19.1875 8.296875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-50\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(105.003241 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_3\">\n",
-							"     <g id=\"line2d_5\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 168.293647 170.28 \n",
-							"L 168.293647 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_6\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"168.293647\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_3\">\n",
-							"      <!-- 0.4 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 37.796875 64.3125 \n",
-							"L 12.890625 25.390625 \n",
-							"L 37.796875 25.390625 \n",
-							"z\n",
-							"M 35.203125 72.90625 \n",
-							"L 47.609375 72.90625 \n",
-							"L 47.609375 25.390625 \n",
-							"L 58.015625 25.390625 \n",
-							"L 58.015625 17.1875 \n",
-							"L 47.609375 17.1875 \n",
-							"L 47.609375 0 \n",
-							"L 37.796875 0 \n",
-							"L 37.796875 17.1875 \n",
-							"L 4.890625 17.1875 \n",
-							"L 4.890625 26.703125 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-52\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(160.342084 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_4\">\n",
-							"     <g id=\"line2d_7\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 223.63249 170.28 \n",
-							"L 223.63249 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_8\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"223.63249\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_4\">\n",
-							"      <!-- 0.6 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 33.015625 40.375 \n",
-							"Q 26.375 40.375 22.484375 35.828125 \n",
-							"Q 18.609375 31.296875 18.609375 23.390625 \n",
-							"Q 18.609375 15.53125 22.484375 10.953125 \n",
-							"Q 26.375 6.390625 33.015625 6.390625 \n",
-							"Q 39.65625 6.390625 43.53125 10.953125 \n",
-							"Q 47.40625 15.53125 47.40625 23.390625 \n",
-							"Q 47.40625 31.296875 43.53125 35.828125 \n",
-							"Q 39.65625 40.375 33.015625 40.375 \n",
-							"z\n",
-							"M 52.59375 71.296875 \n",
-							"L 52.59375 62.3125 \n",
-							"Q 48.875 64.0625 45.09375 64.984375 \n",
-							"Q 41.3125 65.921875 37.59375 65.921875 \n",
-							"Q 27.828125 65.921875 22.671875 59.328125 \n",
-							"Q 17.53125 52.734375 16.796875 39.40625 \n",
-							"Q 19.671875 43.65625 24.015625 45.921875 \n",
-							"Q 28.375 48.1875 33.59375 48.1875 \n",
-							"Q 44.578125 48.1875 50.953125 41.515625 \n",
-							"Q 57.328125 34.859375 57.328125 23.390625 \n",
-							"Q 57.328125 12.15625 50.6875 5.359375 \n",
-							"Q 44.046875 -1.421875 33.015625 -1.421875 \n",
-							"Q 20.359375 -1.421875 13.671875 8.265625 \n",
-							"Q 6.984375 17.96875 6.984375 36.375 \n",
-							"Q 6.984375 53.65625 15.1875 63.9375 \n",
-							"Q 23.390625 74.21875 37.203125 74.21875 \n",
-							"Q 40.921875 74.21875 44.703125 73.484375 \n",
-							"Q 48.484375 72.75 52.59375 71.296875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-54\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(215.680927 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_5\">\n",
-							"     <g id=\"line2d_9\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 278.971333 170.28 \n",
-							"L 278.971333 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_10\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"278.971333\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_5\">\n",
-							"      <!-- 0.8 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 31.78125 34.625 \n",
-							"Q 24.75 34.625 20.71875 30.859375 \n",
-							"Q 16.703125 27.09375 16.703125 20.515625 \n",
-							"Q 16.703125 13.921875 20.71875 10.15625 \n",
-							"Q 24.75 6.390625 31.78125 6.390625 \n",
-							"Q 38.8125 6.390625 42.859375 10.171875 \n",
-							"Q 46.921875 13.96875 46.921875 20.515625 \n",
-							"Q 46.921875 27.09375 42.890625 30.859375 \n",
-							"Q 38.875 34.625 31.78125 34.625 \n",
-							"z\n",
-							"M 21.921875 38.8125 \n",
-							"Q 15.578125 40.375 12.03125 44.71875 \n",
-							"Q 8.5 49.078125 8.5 55.328125 \n",
-							"Q 8.5 64.0625 14.71875 69.140625 \n",
-							"Q 20.953125 74.21875 31.78125 74.21875 \n",
-							"Q 42.671875 74.21875 48.875 69.140625 \n",
-							"Q 55.078125 64.0625 55.078125 55.328125 \n",
-							"Q 55.078125 49.078125 51.53125 44.71875 \n",
-							"Q 48 40.375 41.703125 38.8125 \n",
-							"Q 48.828125 37.15625 52.796875 32.3125 \n",
-							"Q 56.78125 27.484375 56.78125 20.515625 \n",
-							"Q 56.78125 9.90625 50.3125 4.234375 \n",
-							"Q 43.84375 -1.421875 31.78125 -1.421875 \n",
-							"Q 19.734375 -1.421875 13.25 4.234375 \n",
-							"Q 6.78125 9.90625 6.78125 20.515625 \n",
-							"Q 6.78125 27.484375 10.78125 32.3125 \n",
-							"Q 14.796875 37.15625 21.921875 38.8125 \n",
-							"z\n",
-							"M 18.3125 54.390625 \n",
-							"Q 18.3125 48.734375 21.84375 45.5625 \n",
-							"Q 25.390625 42.390625 31.78125 42.390625 \n",
-							"Q 38.140625 42.390625 41.71875 45.5625 \n",
-							"Q 45.3125 48.734375 45.3125 54.390625 \n",
-							"Q 45.3125 60.0625 41.71875 63.234375 \n",
-							"Q 38.140625 66.40625 31.78125 66.40625 \n",
-							"Q 25.390625 66.40625 21.84375 63.234375 \n",
-							"Q 18.3125 60.0625 18.3125 54.390625 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-56\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(271.01977 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_6\">\n",
-							"     <g id=\"line2d_11\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 334.310176 170.28 \n",
-							"L 334.310176 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_12\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"334.310176\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_6\">\n",
-							"      <!-- 1.0 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 12.40625 8.296875 \n",
-							"L 28.515625 8.296875 \n",
-							"L 28.515625 63.921875 \n",
-							"L 10.984375 60.40625 \n",
-							"L 10.984375 69.390625 \n",
-							"L 28.421875 72.90625 \n",
-							"L 38.28125 72.90625 \n",
-							"L 38.28125 8.296875 \n",
-							"L 54.390625 8.296875 \n",
-							"L 54.390625 0 \n",
-							"L 12.40625 0 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-49\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(326.358613 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-49\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"text_7\">\n",
-							"     <!-- r/R [-] -->\n",
-							"     <defs>\n",
-							"      <path d=\"M 41.109375 46.296875 \n",
-							"Q 39.59375 47.171875 37.8125 47.578125 \n",
-							"Q 36.03125 48 33.890625 48 \n",
-							"Q 26.265625 48 22.1875 43.046875 \n",
-							"Q 18.109375 38.09375 18.109375 28.8125 \n",
-							"L 18.109375 0 \n",
-							"L 9.078125 0 \n",
-							"L 9.078125 54.6875 \n",
-							"L 18.109375 54.6875 \n",
-							"L 18.109375 46.1875 \n",
-							"Q 20.953125 51.171875 25.484375 53.578125 \n",
-							"Q 30.03125 56 36.53125 56 \n",
-							"Q 37.453125 56 38.578125 55.875 \n",
-							"Q 39.703125 55.765625 41.0625 55.515625 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-114\"/>\n",
-							"      <path d=\"M 25.390625 72.90625 \n",
-							"L 33.6875 72.90625 \n",
-							"L 8.296875 -9.28125 \n",
-							"L 0 -9.28125 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-47\"/>\n",
-							"      <path d=\"M 44.390625 34.1875 \n",
-							"Q 47.5625 33.109375 50.5625 29.59375 \n",
-							"Q 53.5625 26.078125 56.59375 19.921875 \n",
-							"L 66.609375 0 \n",
-							"L 56 0 \n",
-							"L 46.6875 18.703125 \n",
-							"Q 43.0625 26.03125 39.671875 28.421875 \n",
-							"Q 36.28125 30.8125 30.421875 30.8125 \n",
-							"L 19.671875 30.8125 \n",
-							"L 19.671875 0 \n",
-							"L 9.8125 0 \n",
-							"L 9.8125 72.90625 \n",
-							"L 32.078125 72.90625 \n",
-							"Q 44.578125 72.90625 50.734375 67.671875 \n",
-							"Q 56.890625 62.453125 56.890625 51.90625 \n",
-							"Q 56.890625 45.015625 53.6875 40.46875 \n",
-							"Q 50.484375 35.9375 44.390625 34.1875 \n",
-							"z\n",
-							"M 19.671875 64.796875 \n",
-							"L 19.671875 38.921875 \n",
-							"L 32.078125 38.921875 \n",
-							"Q 39.203125 38.921875 42.84375 42.21875 \n",
-							"Q 46.484375 45.515625 46.484375 51.90625 \n",
-							"Q 46.484375 58.296875 42.84375 61.546875 \n",
-							"Q 39.203125 64.796875 32.078125 64.796875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-82\"/>\n",
-							"      <path id=\"DejaVuSans-32\"/>\n",
-							"      <path d=\"M 8.59375 75.984375 \n",
-							"L 29.296875 75.984375 \n",
-							"L 29.296875 69 \n",
-							"L 17.578125 69 \n",
-							"L 17.578125 -6.203125 \n",
-							"L 29.296875 -6.203125 \n",
-							"L 29.296875 -13.1875 \n",
-							"L 8.59375 -13.1875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-91\"/>\n",
-							"      <path d=\"M 4.890625 31.390625 \n",
-							"L 31.203125 31.390625 \n",
-							"L 31.203125 23.390625 \n",
-							"L 4.890625 23.390625 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-45\"/>\n",
-							"      <path d=\"M 30.421875 75.984375 \n",
-							"L 30.421875 -13.1875 \n",
-							"L 9.71875 -13.1875 \n",
-							"L 9.71875 -6.203125 \n",
-							"L 21.390625 -6.203125 \n",
-							"L 21.390625 69 \n",
-							"L 9.71875 69 \n",
-							"L 9.71875 75.984375 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-93\"/>\n",
-							"     </defs>\n",
-							"     <g transform=\"translate(181.454474 198.556563)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-114\"/>\n",
-							"      <use x=\"41.113281\" xlink:href=\"#DejaVuSans-47\"/>\n",
-							"      <use x=\"74.804688\" xlink:href=\"#DejaVuSans-82\"/>\n",
-							"      <use x=\"144.287109\" xlink:href=\"#DejaVuSans-32\"/>\n",
-							"      <use x=\"176.074219\" xlink:href=\"#DejaVuSans-91\"/>\n",
-							"      <use x=\"215.087891\" xlink:href=\"#DejaVuSans-45\"/>\n",
-							"      <use x=\"251.171875\" xlink:href=\"#DejaVuSans-93\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"   </g>\n",
-							"   <g id=\"matplotlib.axis_2\">\n",
-							"    <g id=\"ytick_1\">\n",
-							"     <g id=\"line2d_13\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 43.78125 162.867273 \n",
-							"L 348.144886 162.867273 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_14\">\n",
-							"      <defs>\n",
-							"       <path d=\"M 0 0 \n",
-							"L -3.5 0 \n",
-							"\" id=\"m9f26eca53c\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
-							"      </defs>\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m9f26eca53c\" y=\"162.867273\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_8\">\n",
-							"      <!-- 0.0 -->\n",
-							"      <g transform=\"translate(20.878125 166.666491)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_2\">\n",
-							"     <g id=\"line2d_15\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 43.78125 129.747022 \n",
-							"L 348.144886 129.747022 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_16\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m9f26eca53c\" y=\"129.747022\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_9\">\n",
-							"      <!-- 0.1 -->\n",
-							"      <g transform=\"translate(20.878125 133.546241)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-49\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_3\">\n",
-							"     <g id=\"line2d_17\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 43.78125 96.626771 \n",
-							"L 348.144886 96.626771 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_18\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m9f26eca53c\" y=\"96.626771\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_10\">\n",
-							"      <!-- 0.2 -->\n",
-							"      <g transform=\"translate(20.878125 100.42599)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_4\">\n",
-							"     <g id=\"line2d_19\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 43.78125 63.506521 \n",
-							"L 348.144886 63.506521 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_20\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m9f26eca53c\" y=\"63.506521\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_11\">\n",
-							"      <!-- 0.3 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 40.578125 39.3125 \n",
-							"Q 47.65625 37.796875 51.625 33 \n",
-							"Q 55.609375 28.21875 55.609375 21.1875 \n",
-							"Q 55.609375 10.40625 48.1875 4.484375 \n",
-							"Q 40.765625 -1.421875 27.09375 -1.421875 \n",
-							"Q 22.515625 -1.421875 17.65625 -0.515625 \n",
-							"Q 12.796875 0.390625 7.625 2.203125 \n",
-							"L 7.625 11.71875 \n",
-							"Q 11.71875 9.328125 16.59375 8.109375 \n",
-							"Q 21.484375 6.890625 26.8125 6.890625 \n",
-							"Q 36.078125 6.890625 40.9375 10.546875 \n",
-							"Q 45.796875 14.203125 45.796875 21.1875 \n",
-							"Q 45.796875 27.640625 41.28125 31.265625 \n",
-							"Q 36.765625 34.90625 28.71875 34.90625 \n",
-							"L 20.21875 34.90625 \n",
-							"L 20.21875 43.015625 \n",
-							"L 29.109375 43.015625 \n",
-							"Q 36.375 43.015625 40.234375 45.921875 \n",
-							"Q 44.09375 48.828125 44.09375 54.296875 \n",
-							"Q 44.09375 59.90625 40.109375 62.90625 \n",
-							"Q 36.140625 65.921875 28.71875 65.921875 \n",
-							"Q 24.65625 65.921875 20.015625 65.03125 \n",
-							"Q 15.375 64.15625 9.8125 62.3125 \n",
-							"L 9.8125 71.09375 \n",
-							"Q 15.4375 72.65625 20.34375 73.4375 \n",
-							"Q 25.25 74.21875 29.59375 74.21875 \n",
-							"Q 40.828125 74.21875 47.359375 69.109375 \n",
-							"Q 53.90625 64.015625 53.90625 55.328125 \n",
-							"Q 53.90625 49.265625 50.4375 45.09375 \n",
-							"Q 46.96875 40.921875 40.578125 39.3125 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-51\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(20.878125 67.305739)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-51\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_5\">\n",
-							"     <g id=\"line2d_21\">\n",
-							"      <path clip-path=\"url(#p8be783128f)\" d=\"M 43.78125 30.38627 \n",
-							"L 348.144886 30.38627 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_22\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m9f26eca53c\" y=\"30.38627\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_12\">\n",
-							"      <!-- 0.4 -->\n",
-							"      <g transform=\"translate(20.878125 34.185489)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"text_13\">\n",
-							"     <!-- CN/d(r/R) [-] -->\n",
-							"     <defs>\n",
-							"      <path d=\"M 64.40625 67.28125 \n",
-							"L 64.40625 56.890625 \n",
-							"Q 59.421875 61.53125 53.78125 63.8125 \n",
-							"Q 48.140625 66.109375 41.796875 66.109375 \n",
-							"Q 29.296875 66.109375 22.65625 58.46875 \n",
-							"Q 16.015625 50.828125 16.015625 36.375 \n",
-							"Q 16.015625 21.96875 22.65625 14.328125 \n",
-							"Q 29.296875 6.6875 41.796875 6.6875 \n",
-							"Q 48.140625 6.6875 53.78125 8.984375 \n",
-							"Q 59.421875 11.28125 64.40625 15.921875 \n",
-							"L 64.40625 5.609375 \n",
-							"Q 59.234375 2.09375 53.4375 0.328125 \n",
-							"Q 47.65625 -1.421875 41.21875 -1.421875 \n",
-							"Q 24.65625 -1.421875 15.125 8.703125 \n",
-							"Q 5.609375 18.84375 5.609375 36.375 \n",
-							"Q 5.609375 53.953125 15.125 64.078125 \n",
-							"Q 24.65625 74.21875 41.21875 74.21875 \n",
-							"Q 47.75 74.21875 53.53125 72.484375 \n",
-							"Q 59.328125 70.75 64.40625 67.28125 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-67\"/>\n",
-							"      <path d=\"M 9.8125 72.90625 \n",
-							"L 23.09375 72.90625 \n",
-							"L 55.421875 11.921875 \n",
-							"L 55.421875 72.90625 \n",
-							"L 64.984375 72.90625 \n",
-							"L 64.984375 0 \n",
-							"L 51.703125 0 \n",
-							"L 19.390625 60.984375 \n",
-							"L 19.390625 0 \n",
-							"L 9.8125 0 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-78\"/>\n",
-							"      <path d=\"M 45.40625 46.390625 \n",
-							"L 45.40625 75.984375 \n",
-							"L 54.390625 75.984375 \n",
-							"L 54.390625 0 \n",
-							"L 45.40625 0 \n",
-							"L 45.40625 8.203125 \n",
-							"Q 42.578125 3.328125 38.25 0.953125 \n",
-							"Q 33.9375 -1.421875 27.875 -1.421875 \n",
-							"Q 17.96875 -1.421875 11.734375 6.484375 \n",
-							"Q 5.515625 14.40625 5.515625 27.296875 \n",
-							"Q 5.515625 40.1875 11.734375 48.09375 \n",
-							"Q 17.96875 56 27.875 56 \n",
-							"Q 33.9375 56 38.25 53.625 \n",
-							"Q 42.578125 51.265625 45.40625 46.390625 \n",
-							"z\n",
-							"M 14.796875 27.296875 \n",
-							"Q 14.796875 17.390625 18.875 11.75 \n",
-							"Q 22.953125 6.109375 30.078125 6.109375 \n",
-							"Q 37.203125 6.109375 41.296875 11.75 \n",
-							"Q 45.40625 17.390625 45.40625 27.296875 \n",
-							"Q 45.40625 37.203125 41.296875 42.84375 \n",
-							"Q 37.203125 48.484375 30.078125 48.484375 \n",
-							"Q 22.953125 48.484375 18.875 42.84375 \n",
-							"Q 14.796875 37.203125 14.796875 27.296875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-100\"/>\n",
-							"      <path d=\"M 31 75.875 \n",
-							"Q 24.46875 64.65625 21.28125 53.65625 \n",
-							"Q 18.109375 42.671875 18.109375 31.390625 \n",
-							"Q 18.109375 20.125 21.3125 9.0625 \n",
-							"Q 24.515625 -2 31 -13.1875 \n",
-							"L 23.1875 -13.1875 \n",
-							"Q 15.875 -1.703125 12.234375 9.375 \n",
-							"Q 8.59375 20.453125 8.59375 31.390625 \n",
-							"Q 8.59375 42.28125 12.203125 53.3125 \n",
-							"Q 15.828125 64.359375 23.1875 75.875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-40\"/>\n",
-							"      <path d=\"M 8.015625 75.875 \n",
-							"L 15.828125 75.875 \n",
-							"Q 23.140625 64.359375 26.78125 53.3125 \n",
-							"Q 30.421875 42.28125 30.421875 31.390625 \n",
-							"Q 30.421875 20.453125 26.78125 9.375 \n",
-							"Q 23.140625 -1.703125 15.828125 -13.1875 \n",
-							"L 8.015625 -13.1875 \n",
-							"Q 14.5 -2 17.703125 9.0625 \n",
-							"Q 20.90625 20.125 20.90625 31.390625 \n",
-							"Q 20.90625 42.671875 17.703125 53.65625 \n",
-							"Q 14.5 64.65625 8.015625 75.875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-41\"/>\n",
-							"     </defs>\n",
-							"     <g transform=\"translate(14.798438 119.240781)rotate(-90)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-67\"/>\n",
-							"      <use x=\"69.824219\" xlink:href=\"#DejaVuSans-78\"/>\n",
-							"      <use x=\"144.628906\" xlink:href=\"#DejaVuSans-47\"/>\n",
-							"      <use x=\"178.320312\" xlink:href=\"#DejaVuSans-100\"/>\n",
-							"      <use x=\"241.796875\" xlink:href=\"#DejaVuSans-40\"/>\n",
-							"      <use x=\"280.810547\" xlink:href=\"#DejaVuSans-114\"/>\n",
-							"      <use x=\"321.923828\" xlink:href=\"#DejaVuSans-47\"/>\n",
-							"      <use x=\"355.615234\" xlink:href=\"#DejaVuSans-82\"/>\n",
-							"      <use x=\"425.097656\" xlink:href=\"#DejaVuSans-41\"/>\n",
-							"      <use x=\"464.111328\" xlink:href=\"#DejaVuSans-32\"/>\n",
-							"      <use x=\"495.898438\" xlink:href=\"#DejaVuSans-91\"/>\n",
-							"      <use x=\"534.912109\" xlink:href=\"#DejaVuSans-45\"/>\n",
-							"      <use x=\"570.996094\" xlink:href=\"#DejaVuSans-93\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"   </g>\n",
-							"   <g id=\"line2d_23\">\n",
-							"    <path clip-path=\"url(#p8be783128f)\" d=\"M 57.615961 162.867273 \n",
-							"L 73.130329 162.867273 \n",
-							"L 88.595884 151.171911 \n",
-							"L 103.963964 136.582959 \n",
-							"L 119.186216 128.50121 \n",
-							"L 126.789514 118.169839 \n",
-							"L 149.002266 112.205287 \n",
-							"L 163.502253 100.652865 \n",
-							"L 182.128357 93.49664 \n",
-							"L 191.458178 83.653816 \n",
-							"L 204.826158 76.590983 \n",
-							"L 217.730961 68.136249 \n",
-							"L 230.131982 59.641225 \n",
-							"L 241.990204 51.447873 \n",
-							"L 253.268316 43.608816 \n",
-							"L 265.136622 37.350186 \n",
-							"L 273.944209 31.231845 \n",
-							"L 283.276935 26.749933 \n",
-							"L 291.899648 23.067887 \n",
-							"L 299.785218 20.936309 \n",
-							"L 306.908834 21.025254 \n",
-							"L 313.248083 23.897405 \n",
-							"L 317.708523 32.26807 \n",
-							"L 323.496225 42.25656 \n",
-							"L 327.372874 57.152832 \n",
-							"L 330.400768 71.901965 \n",
-							"L 332.57038 89.307394 \n",
-							"L 333.874884 109.013764 \n",
-							"L 334.310176 133.255372 \n",
-							"\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"line2d_24\">\n",
-							"    <path clip-path=\"url(#p8be783128f)\" d=\"M 113.392966 134.313 \n",
-							"L 144.141866 114.220659 \n",
-							"L 170.490732 98.795658 \n",
-							"L 223.193874 65.403284 \n",
-							"L 249.545429 43.622354 \n",
-							"L 293.4647 17.970932 \n",
-							"L 306.640477 14.612727 \n",
-							"L 322.012244 34.230749 \n",
-							"L 330.796087 64.226962 \n",
-							"L 334.310176 162.867273 \n",
-							"\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_3\">\n",
-							"    <path d=\"M 43.78125 170.28 \n",
-							"L 43.78125 7.2 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_4\">\n",
-							"    <path d=\"M 348.144886 170.28 \n",
-							"L 348.144886 7.2 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_5\">\n",
-							"    <path d=\"M 43.78125 170.28 \n",
-							"L 348.144886 170.28 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_6\">\n",
-							"    <path d=\"M 43.78125 7.2 \n",
-							"L 348.144886 7.2 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"legend_1\">\n",
-							"    <g id=\"patch_7\">\n",
-							"     <path d=\"M 50.78125 44.55625 \n",
-							"L 134.526563 44.55625 \n",
-							"Q 136.526563 44.55625 136.526563 42.55625 \n",
-							"L 136.526563 14.2 \n",
-							"Q 136.526563 12.2 134.526563 12.2 \n",
-							"L 50.78125 12.2 \n",
-							"Q 48.78125 12.2 48.78125 14.2 \n",
-							"L 48.78125 42.55625 \n",
-							"Q 48.78125 44.55625 50.78125 44.55625 \n",
-							"z\n",
-							"\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_25\">\n",
-							"     <path d=\"M 52.78125 20.298437 \n",
-							"L 72.78125 20.298437 \n",
-							"\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_26\"/>\n",
-							"    <g id=\"text_14\">\n",
-							"     <!-- SHARPy -->\n",
-							"     <defs>\n",
-							"      <path d=\"M 53.515625 70.515625 \n",
-							"L 53.515625 60.890625 \n",
-							"Q 47.90625 63.578125 42.921875 64.890625 \n",
-							"Q 37.9375 66.21875 33.296875 66.21875 \n",
-							"Q 25.25 66.21875 20.875 63.09375 \n",
-							"Q 16.5 59.96875 16.5 54.203125 \n",
-							"Q 16.5 49.359375 19.40625 46.890625 \n",
-							"Q 22.3125 44.4375 30.421875 42.921875 \n",
-							"L 36.375 41.703125 \n",
-							"Q 47.40625 39.59375 52.65625 34.296875 \n",
-							"Q 57.90625 29 57.90625 20.125 \n",
-							"Q 57.90625 9.515625 50.796875 4.046875 \n",
-							"Q 43.703125 -1.421875 29.984375 -1.421875 \n",
-							"Q 24.8125 -1.421875 18.96875 -0.25 \n",
-							"Q 13.140625 0.921875 6.890625 3.21875 \n",
-							"L 6.890625 13.375 \n",
-							"Q 12.890625 10.015625 18.65625 8.296875 \n",
-							"Q 24.421875 6.59375 29.984375 6.59375 \n",
-							"Q 38.421875 6.59375 43.015625 9.90625 \n",
-							"Q 47.609375 13.234375 47.609375 19.390625 \n",
-							"Q 47.609375 24.75 44.3125 27.78125 \n",
-							"Q 41.015625 30.8125 33.5 32.328125 \n",
-							"L 27.484375 33.5 \n",
-							"Q 16.453125 35.6875 11.515625 40.375 \n",
-							"Q 6.59375 45.0625 6.59375 53.421875 \n",
-							"Q 6.59375 63.09375 13.40625 68.65625 \n",
-							"Q 20.21875 74.21875 32.171875 74.21875 \n",
-							"Q 37.3125 74.21875 42.625 73.28125 \n",
-							"Q 47.953125 72.359375 53.515625 70.515625 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-83\"/>\n",
-							"      <path d=\"M 9.8125 72.90625 \n",
-							"L 19.671875 72.90625 \n",
-							"L 19.671875 43.015625 \n",
-							"L 55.515625 43.015625 \n",
-							"L 55.515625 72.90625 \n",
-							"L 65.375 72.90625 \n",
-							"L 65.375 0 \n",
-							"L 55.515625 0 \n",
-							"L 55.515625 34.71875 \n",
-							"L 19.671875 34.71875 \n",
-							"L 19.671875 0 \n",
-							"L 9.8125 0 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-72\"/>\n",
-							"      <path d=\"M 34.1875 63.1875 \n",
-							"L 20.796875 26.90625 \n",
-							"L 47.609375 26.90625 \n",
-							"z\n",
-							"M 28.609375 72.90625 \n",
-							"L 39.796875 72.90625 \n",
-							"L 67.578125 0 \n",
-							"L 57.328125 0 \n",
-							"L 50.6875 18.703125 \n",
-							"L 17.828125 18.703125 \n",
-							"L 11.1875 0 \n",
-							"L 0.78125 0 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-65\"/>\n",
-							"      <path d=\"M 19.671875 64.796875 \n",
-							"L 19.671875 37.40625 \n",
-							"L 32.078125 37.40625 \n",
-							"Q 38.96875 37.40625 42.71875 40.96875 \n",
-							"Q 46.484375 44.53125 46.484375 51.125 \n",
-							"Q 46.484375 57.671875 42.71875 61.234375 \n",
-							"Q 38.96875 64.796875 32.078125 64.796875 \n",
-							"z\n",
-							"M 9.8125 72.90625 \n",
-							"L 32.078125 72.90625 \n",
-							"Q 44.34375 72.90625 50.609375 67.359375 \n",
-							"Q 56.890625 61.8125 56.890625 51.125 \n",
-							"Q 56.890625 40.328125 50.609375 34.8125 \n",
-							"Q 44.34375 29.296875 32.078125 29.296875 \n",
-							"L 19.671875 29.296875 \n",
-							"L 19.671875 0 \n",
-							"L 9.8125 0 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-80\"/>\n",
-							"      <path d=\"M 32.171875 -5.078125 \n",
-							"Q 28.375 -14.84375 24.75 -17.8125 \n",
-							"Q 21.140625 -20.796875 15.09375 -20.796875 \n",
-							"L 7.90625 -20.796875 \n",
-							"L 7.90625 -13.28125 \n",
-							"L 13.1875 -13.28125 \n",
-							"Q 16.890625 -13.28125 18.9375 -11.515625 \n",
-							"Q 21 -9.765625 23.484375 -3.21875 \n",
-							"L 25.09375 0.875 \n",
-							"L 2.984375 54.6875 \n",
-							"L 12.5 54.6875 \n",
-							"L 29.59375 11.921875 \n",
-							"L 46.6875 54.6875 \n",
-							"L 56.203125 54.6875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-121\"/>\n",
-							"     </defs>\n",
-							"     <g transform=\"translate(80.78125 23.798437)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-83\"/>\n",
-							"      <use x=\"63.476562\" xlink:href=\"#DejaVuSans-72\"/>\n",
-							"      <use x=\"138.671875\" xlink:href=\"#DejaVuSans-65\"/>\n",
-							"      <use x=\"207.080078\" xlink:href=\"#DejaVuSans-82\"/>\n",
-							"      <use x=\"276.5625\" xlink:href=\"#DejaVuSans-80\"/>\n",
-							"      <use x=\"336.865234\" xlink:href=\"#DejaVuSans-121\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_27\">\n",
-							"     <path d=\"M 52.78125 34.976562 \n",
-							"L 72.78125 34.976562 \n",
-							"\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_28\"/>\n",
-							"    <g id=\"text_15\">\n",
-							"     <!-- OpenFAST -->\n",
-							"     <defs>\n",
-							"      <path d=\"M 39.40625 66.21875 \n",
-							"Q 28.65625 66.21875 22.328125 58.203125 \n",
-							"Q 16.015625 50.203125 16.015625 36.375 \n",
-							"Q 16.015625 22.609375 22.328125 14.59375 \n",
-							"Q 28.65625 6.59375 39.40625 6.59375 \n",
-							"Q 50.140625 6.59375 56.421875 14.59375 \n",
-							"Q 62.703125 22.609375 62.703125 36.375 \n",
-							"Q 62.703125 50.203125 56.421875 58.203125 \n",
-							"Q 50.140625 66.21875 39.40625 66.21875 \n",
-							"z\n",
-							"M 39.40625 74.21875 \n",
-							"Q 54.734375 74.21875 63.90625 63.9375 \n",
-							"Q 73.09375 53.65625 73.09375 36.375 \n",
-							"Q 73.09375 19.140625 63.90625 8.859375 \n",
-							"Q 54.734375 -1.421875 39.40625 -1.421875 \n",
-							"Q 24.03125 -1.421875 14.8125 8.828125 \n",
-							"Q 5.609375 19.09375 5.609375 36.375 \n",
-							"Q 5.609375 53.65625 14.8125 63.9375 \n",
-							"Q 24.03125 74.21875 39.40625 74.21875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-79\"/>\n",
-							"      <path d=\"M 18.109375 8.203125 \n",
-							"L 18.109375 -20.796875 \n",
-							"L 9.078125 -20.796875 \n",
-							"L 9.078125 54.6875 \n",
-							"L 18.109375 54.6875 \n",
-							"L 18.109375 46.390625 \n",
-							"Q 20.953125 51.265625 25.265625 53.625 \n",
-							"Q 29.59375 56 35.59375 56 \n",
-							"Q 45.5625 56 51.78125 48.09375 \n",
-							"Q 58.015625 40.1875 58.015625 27.296875 \n",
-							"Q 58.015625 14.40625 51.78125 6.484375 \n",
-							"Q 45.5625 -1.421875 35.59375 -1.421875 \n",
-							"Q 29.59375 -1.421875 25.265625 0.953125 \n",
-							"Q 20.953125 3.328125 18.109375 8.203125 \n",
-							"z\n",
-							"M 48.6875 27.296875 \n",
-							"Q 48.6875 37.203125 44.609375 42.84375 \n",
-							"Q 40.53125 48.484375 33.40625 48.484375 \n",
-							"Q 26.265625 48.484375 22.1875 42.84375 \n",
-							"Q 18.109375 37.203125 18.109375 27.296875 \n",
-							"Q 18.109375 17.390625 22.1875 11.75 \n",
-							"Q 26.265625 6.109375 33.40625 6.109375 \n",
-							"Q 40.53125 6.109375 44.609375 11.75 \n",
-							"Q 48.6875 17.390625 48.6875 27.296875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-112\"/>\n",
-							"      <path d=\"M 56.203125 29.59375 \n",
-							"L 56.203125 25.203125 \n",
-							"L 14.890625 25.203125 \n",
-							"Q 15.484375 15.921875 20.484375 11.0625 \n",
-							"Q 25.484375 6.203125 34.421875 6.203125 \n",
-							"Q 39.59375 6.203125 44.453125 7.46875 \n",
-							"Q 49.3125 8.734375 54.109375 11.28125 \n",
-							"L 54.109375 2.78125 \n",
-							"Q 49.265625 0.734375 44.1875 -0.34375 \n",
-							"Q 39.109375 -1.421875 33.890625 -1.421875 \n",
-							"Q 20.796875 -1.421875 13.15625 6.1875 \n",
-							"Q 5.515625 13.8125 5.515625 26.8125 \n",
-							"Q 5.515625 40.234375 12.765625 48.109375 \n",
-							"Q 20.015625 56 32.328125 56 \n",
-							"Q 43.359375 56 49.78125 48.890625 \n",
-							"Q 56.203125 41.796875 56.203125 29.59375 \n",
-							"z\n",
-							"M 47.21875 32.234375 \n",
-							"Q 47.125 39.59375 43.09375 43.984375 \n",
-							"Q 39.0625 48.390625 32.421875 48.390625 \n",
-							"Q 24.90625 48.390625 20.390625 44.140625 \n",
-							"Q 15.875 39.890625 15.1875 32.171875 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-101\"/>\n",
-							"      <path d=\"M 54.890625 33.015625 \n",
-							"L 54.890625 0 \n",
-							"L 45.90625 0 \n",
-							"L 45.90625 32.71875 \n",
-							"Q 45.90625 40.484375 42.875 44.328125 \n",
-							"Q 39.84375 48.1875 33.796875 48.1875 \n",
-							"Q 26.515625 48.1875 22.3125 43.546875 \n",
-							"Q 18.109375 38.921875 18.109375 30.90625 \n",
-							"L 18.109375 0 \n",
-							"L 9.078125 0 \n",
-							"L 9.078125 54.6875 \n",
-							"L 18.109375 54.6875 \n",
-							"L 18.109375 46.1875 \n",
-							"Q 21.34375 51.125 25.703125 53.5625 \n",
-							"Q 30.078125 56 35.796875 56 \n",
-							"Q 45.21875 56 50.046875 50.171875 \n",
-							"Q 54.890625 44.34375 54.890625 33.015625 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-110\"/>\n",
-							"      <path d=\"M 9.8125 72.90625 \n",
-							"L 51.703125 72.90625 \n",
-							"L 51.703125 64.59375 \n",
-							"L 19.671875 64.59375 \n",
-							"L 19.671875 43.109375 \n",
-							"L 48.578125 43.109375 \n",
-							"L 48.578125 34.8125 \n",
-							"L 19.671875 34.8125 \n",
-							"L 19.671875 0 \n",
-							"L 9.8125 0 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-70\"/>\n",
-							"      <path d=\"M -0.296875 72.90625 \n",
-							"L 61.375 72.90625 \n",
-							"L 61.375 64.59375 \n",
-							"L 35.5 64.59375 \n",
-							"L 35.5 0 \n",
-							"L 25.59375 0 \n",
-							"L 25.59375 64.59375 \n",
-							"L -0.296875 64.59375 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-84\"/>\n",
-							"     </defs>\n",
-							"     <g transform=\"translate(80.78125 38.476562)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-79\"/>\n",
-							"      <use x=\"78.710938\" xlink:href=\"#DejaVuSans-112\"/>\n",
-							"      <use x=\"142.1875\" xlink:href=\"#DejaVuSans-101\"/>\n",
-							"      <use x=\"203.710938\" xlink:href=\"#DejaVuSans-110\"/>\n",
-							"      <use x=\"267.089844\" xlink:href=\"#DejaVuSans-70\"/>\n",
-							"      <use x=\"324.46875\" xlink:href=\"#DejaVuSans-65\"/>\n",
-							"      <use x=\"392.876953\" xlink:href=\"#DejaVuSans-83\"/>\n",
-							"      <use x=\"456.353516\" xlink:href=\"#DejaVuSans-84\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"   </g>\n",
-							"  </g>\n",
-							"  <g id=\"axes_2\">\n",
-							"   <g id=\"patch_8\">\n",
-							"    <path d=\"M 409.017614 170.28 \n",
-							"L 713.38125 170.28 \n",
-							"L 713.38125 7.2 \n",
-							"L 409.017614 7.2 \n",
-							"z\n",
-							"\" style=\"fill:#ffffff;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"matplotlib.axis_3\">\n",
-							"    <g id=\"xtick_7\">\n",
-							"     <g id=\"line2d_29\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 422.852324 170.28 \n",
-							"L 422.852324 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_30\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"422.852324\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_16\">\n",
-							"      <!-- 0.0 -->\n",
-							"      <g transform=\"translate(414.900762 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_8\">\n",
-							"     <g id=\"line2d_31\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 478.191167 170.28 \n",
-							"L 478.191167 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_32\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"478.191167\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_17\">\n",
-							"      <!-- 0.2 -->\n",
-							"      <g transform=\"translate(470.239605 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_9\">\n",
-							"     <g id=\"line2d_33\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 533.53001 170.28 \n",
-							"L 533.53001 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_34\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"533.53001\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_18\">\n",
-							"      <!-- 0.4 -->\n",
-							"      <g transform=\"translate(525.578448 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_10\">\n",
-							"     <g id=\"line2d_35\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 588.868853 170.28 \n",
-							"L 588.868853 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_36\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"588.868853\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_19\">\n",
-							"      <!-- 0.6 -->\n",
-							"      <g transform=\"translate(580.917291 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_11\">\n",
-							"     <g id=\"line2d_37\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 644.207696 170.28 \n",
-							"L 644.207696 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_38\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"644.207696\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_20\">\n",
-							"      <!-- 0.8 -->\n",
-							"      <g transform=\"translate(636.256134 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"xtick_12\">\n",
-							"     <g id=\"line2d_39\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 699.546539 170.28 \n",
-							"L 699.546539 7.2 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_40\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"699.546539\" xlink:href=\"#m41855ab76f\" y=\"170.28\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_21\">\n",
-							"      <!-- 1.0 -->\n",
-							"      <g transform=\"translate(691.594977 184.878438)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-49\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"text_22\">\n",
-							"     <!-- r/R [-] -->\n",
-							"     <g transform=\"translate(546.690838 198.556563)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-114\"/>\n",
-							"      <use x=\"41.113281\" xlink:href=\"#DejaVuSans-47\"/>\n",
-							"      <use x=\"74.804688\" xlink:href=\"#DejaVuSans-82\"/>\n",
-							"      <use x=\"144.287109\" xlink:href=\"#DejaVuSans-32\"/>\n",
-							"      <use x=\"176.074219\" xlink:href=\"#DejaVuSans-91\"/>\n",
-							"      <use x=\"215.087891\" xlink:href=\"#DejaVuSans-45\"/>\n",
-							"      <use x=\"251.171875\" xlink:href=\"#DejaVuSans-93\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"   </g>\n",
-							"   <g id=\"matplotlib.axis_4\">\n",
-							"    <g id=\"ytick_6\">\n",
-							"     <g id=\"line2d_41\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 409.017614 162.867273 \n",
-							"L 713.38125 162.867273 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_42\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m9f26eca53c\" y=\"162.867273\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_23\">\n",
-							"      <!-- 0.00 -->\n",
-							"      <g transform=\"translate(379.751989 166.666491)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_7\">\n",
-							"     <g id=\"line2d_43\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 409.017614 138.70809 \n",
-							"L 713.38125 138.70809 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_44\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m9f26eca53c\" y=\"138.70809\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_24\">\n",
-							"      <!-- 0.01 -->\n",
-							"      <g transform=\"translate(379.751989 142.507309)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-49\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_8\">\n",
-							"     <g id=\"line2d_45\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 409.017614 114.548907 \n",
-							"L 713.38125 114.548907 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_46\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m9f26eca53c\" y=\"114.548907\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_25\">\n",
-							"      <!-- 0.02 -->\n",
-							"      <g transform=\"translate(379.751989 118.348126)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-50\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_9\">\n",
-							"     <g id=\"line2d_47\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 409.017614 90.389724 \n",
-							"L 713.38125 90.389724 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_48\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m9f26eca53c\" y=\"90.389724\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_26\">\n",
-							"      <!-- 0.03 -->\n",
-							"      <g transform=\"translate(379.751989 94.188943)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-51\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_10\">\n",
-							"     <g id=\"line2d_49\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 409.017614 66.230541 \n",
-							"L 713.38125 66.230541 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_50\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m9f26eca53c\" y=\"66.230541\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_27\">\n",
-							"      <!-- 0.04 -->\n",
-							"      <g transform=\"translate(379.751989 70.02976)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-52\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_11\">\n",
-							"     <g id=\"line2d_51\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 409.017614 42.071359 \n",
-							"L 713.38125 42.071359 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_52\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m9f26eca53c\" y=\"42.071359\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_28\">\n",
-							"      <!-- 0.05 -->\n",
-							"      <defs>\n",
-							"       <path d=\"M 10.796875 72.90625 \n",
-							"L 49.515625 72.90625 \n",
-							"L 49.515625 64.59375 \n",
-							"L 19.828125 64.59375 \n",
-							"L 19.828125 46.734375 \n",
-							"Q 21.96875 47.46875 24.109375 47.828125 \n",
-							"Q 26.265625 48.1875 28.421875 48.1875 \n",
-							"Q 40.625 48.1875 47.75 41.5 \n",
-							"Q 54.890625 34.8125 54.890625 23.390625 \n",
-							"Q 54.890625 11.625 47.5625 5.09375 \n",
-							"Q 40.234375 -1.421875 26.90625 -1.421875 \n",
-							"Q 22.3125 -1.421875 17.546875 -0.640625 \n",
-							"Q 12.796875 0.140625 7.71875 1.703125 \n",
-							"L 7.71875 11.625 \n",
-							"Q 12.109375 9.234375 16.796875 8.0625 \n",
-							"Q 21.484375 6.890625 26.703125 6.890625 \n",
-							"Q 35.15625 6.890625 40.078125 11.328125 \n",
-							"Q 45.015625 15.765625 45.015625 23.390625 \n",
-							"Q 45.015625 31 40.078125 35.4375 \n",
-							"Q 35.15625 39.890625 26.703125 39.890625 \n",
-							"Q 22.75 39.890625 18.8125 39.015625 \n",
-							"Q 14.890625 38.140625 10.796875 36.28125 \n",
-							"z\n",
-							"\" id=\"DejaVuSans-53\"/>\n",
-							"      </defs>\n",
-							"      <g transform=\"translate(379.751989 45.870577)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-53\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"ytick_12\">\n",
-							"     <g id=\"line2d_53\">\n",
-							"      <path clip-path=\"url(#p12d5b5359b)\" d=\"M 409.017614 17.912176 \n",
-							"L 713.38125 17.912176 \n",
-							"\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
-							"     </g>\n",
-							"     <g id=\"line2d_54\">\n",
-							"      <g>\n",
-							"       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m9f26eca53c\" y=\"17.912176\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"     <g id=\"text_29\">\n",
-							"      <!-- 0.06 -->\n",
-							"      <g transform=\"translate(379.751989 21.711394)scale(0.1 -0.1)\">\n",
-							"       <use xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
-							"       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
-							"       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-54\"/>\n",
-							"      </g>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"text_30\">\n",
-							"     <!-- CT/d(r/R) [-] -->\n",
-							"     <g transform=\"translate(373.672301 118.554063)rotate(-90)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-67\"/>\n",
-							"      <use x=\"69.824219\" xlink:href=\"#DejaVuSans-84\"/>\n",
-							"      <use x=\"130.908203\" xlink:href=\"#DejaVuSans-47\"/>\n",
-							"      <use x=\"164.599609\" xlink:href=\"#DejaVuSans-100\"/>\n",
-							"      <use x=\"228.076172\" xlink:href=\"#DejaVuSans-40\"/>\n",
-							"      <use x=\"267.089844\" xlink:href=\"#DejaVuSans-114\"/>\n",
-							"      <use x=\"308.203125\" xlink:href=\"#DejaVuSans-47\"/>\n",
-							"      <use x=\"341.894531\" xlink:href=\"#DejaVuSans-82\"/>\n",
-							"      <use x=\"411.376953\" xlink:href=\"#DejaVuSans-41\"/>\n",
-							"      <use x=\"450.390625\" xlink:href=\"#DejaVuSans-32\"/>\n",
-							"      <use x=\"482.177734\" xlink:href=\"#DejaVuSans-91\"/>\n",
-							"      <use x=\"521.191406\" xlink:href=\"#DejaVuSans-45\"/>\n",
-							"      <use x=\"557.275391\" xlink:href=\"#DejaVuSans-93\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"   </g>\n",
-							"   <g id=\"line2d_55\">\n",
-							"    <path clip-path=\"url(#p12d5b5359b)\" d=\"M 422.852324 162.867273 \n",
-							"L 438.366693 162.867273 \n",
-							"L 453.832247 116.461385 \n",
-							"L 469.200327 51.390479 \n",
-							"L 484.422579 35.735251 \n",
-							"L 492.025878 30.376504 \n",
-							"L 514.23863 29.182421 \n",
-							"L 528.738616 27.857599 \n",
-							"L 547.364721 27.017047 \n",
-							"L 556.694542 25.895141 \n",
-							"L 570.062522 25.26873 \n",
-							"L 582.967324 24.451694 \n",
-							"L 595.368346 23.675024 \n",
-							"L 607.226568 23.284407 \n",
-							"L 618.50468 23.224124 \n",
-							"L 630.372986 23.493947 \n",
-							"L 639.180573 24.462758 \n",
-							"L 648.513299 26.104406 \n",
-							"L 657.136012 28.94718 \n",
-							"L 665.021582 33.30704 \n",
-							"L 672.145198 39.599483 \n",
-							"L 678.484446 47.306159 \n",
-							"L 682.944886 57.37256 \n",
-							"L 688.732588 66.076657 \n",
-							"L 692.609238 80.996825 \n",
-							"L 695.637132 99.358425 \n",
-							"L 697.806744 119.131088 \n",
-							"L 699.111248 141.548429 \n",
-							"L 699.546539 14.612727 \n",
-							"\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"line2d_56\">\n",
-							"    <path clip-path=\"url(#p12d5b5359b)\" d=\"M 478.629329 46.254888 \n",
-							"L 509.37823 37.342191 \n",
-							"L 535.727095 34.712665 \n",
-							"L 588.430238 35.155534 \n",
-							"L 614.781792 27.571435 \n",
-							"L 658.701064 33.217984 \n",
-							"L 671.876841 41.798541 \n",
-							"L 687.248608 68.661182 \n",
-							"L 696.032451 105.695927 \n",
-							"L 699.546539 162.867273 \n",
-							"\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_9\">\n",
-							"    <path d=\"M 409.017614 170.28 \n",
-							"L 409.017614 7.2 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_10\">\n",
-							"    <path d=\"M 713.38125 170.28 \n",
-							"L 713.38125 7.2 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_11\">\n",
-							"    <path d=\"M 409.017614 170.28 \n",
-							"L 713.38125 170.28 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"patch_12\">\n",
-							"    <path d=\"M 409.017614 7.2 \n",
-							"L 713.38125 7.2 \n",
-							"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
-							"   </g>\n",
-							"   <g id=\"legend_2\">\n",
-							"    <g id=\"patch_13\">\n",
-							"     <path d=\"M 519.326776 165.28 \n",
-							"L 603.072088 165.28 \n",
-							"Q 605.072088 165.28 605.072088 163.28 \n",
-							"L 605.072088 134.92375 \n",
-							"Q 605.072088 132.92375 603.072088 132.92375 \n",
-							"L 519.326776 132.92375 \n",
-							"Q 517.326776 132.92375 517.326776 134.92375 \n",
-							"L 517.326776 163.28 \n",
-							"Q 517.326776 165.28 519.326776 165.28 \n",
-							"z\n",
-							"\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_57\">\n",
-							"     <path d=\"M 521.326776 141.022188 \n",
-							"L 541.326776 141.022188 \n",
-							"\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_58\"/>\n",
-							"    <g id=\"text_31\">\n",
-							"     <!-- SHARPy -->\n",
-							"     <g transform=\"translate(549.326776 144.522188)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-83\"/>\n",
-							"      <use x=\"63.476562\" xlink:href=\"#DejaVuSans-72\"/>\n",
-							"      <use x=\"138.671875\" xlink:href=\"#DejaVuSans-65\"/>\n",
-							"      <use x=\"207.080078\" xlink:href=\"#DejaVuSans-82\"/>\n",
-							"      <use x=\"276.5625\" xlink:href=\"#DejaVuSans-80\"/>\n",
-							"      <use x=\"336.865234\" xlink:href=\"#DejaVuSans-121\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_59\">\n",
-							"     <path d=\"M 521.326776 155.700312 \n",
-							"L 541.326776 155.700312 \n",
-							"\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
-							"    </g>\n",
-							"    <g id=\"line2d_60\"/>\n",
-							"    <g id=\"text_32\">\n",
-							"     <!-- OpenFAST -->\n",
-							"     <g transform=\"translate(549.326776 159.200312)scale(0.1 -0.1)\">\n",
-							"      <use xlink:href=\"#DejaVuSans-79\"/>\n",
-							"      <use x=\"78.710938\" xlink:href=\"#DejaVuSans-112\"/>\n",
-							"      <use x=\"142.1875\" xlink:href=\"#DejaVuSans-101\"/>\n",
-							"      <use x=\"203.710938\" xlink:href=\"#DejaVuSans-110\"/>\n",
-							"      <use x=\"267.089844\" xlink:href=\"#DejaVuSans-70\"/>\n",
-							"      <use x=\"324.46875\" xlink:href=\"#DejaVuSans-65\"/>\n",
-							"      <use x=\"392.876953\" xlink:href=\"#DejaVuSans-83\"/>\n",
-							"      <use x=\"456.353516\" xlink:href=\"#DejaVuSans-84\"/>\n",
-							"     </g>\n",
-							"    </g>\n",
-							"   </g>\n",
-							"  </g>\n",
-							" </g>\n",
-							" <defs>\n",
-							"  <clipPath id=\"p8be783128f\">\n",
-							"   <rect height=\"163.08\" width=\"304.363636\" x=\"43.78125\" y=\"7.2\"/>\n",
-							"  </clipPath>\n",
-							"  <clipPath id=\"p12d5b5359b\">\n",
-							"   <rect height=\"163.08\" width=\"304.363636\" x=\"409.017614\" y=\"7.2\"/>\n",
-							"  </clipPath>\n",
-							" </defs>\n",
-							"</svg>\n"
-						],
-						"text/plain": [
-							"<Figure size 864x216 with 2 Axes>"
-						]
-					},
-					"metadata": {
-						"needs_background": "light"
-					},
-					"output_type": "display_data"
-				}
-			],
-			"source": [
-				"fig, list_plots = plt.subplots(1, 2, figsize=(12, 3))\n",
-				"\n",
-				"list_plots[0].grid()\n",
-				"list_plots[0].set_xlabel(\"r/R [-]\")\n",
-				"list_plots[0].set_ylabel(\"CN/d(r/R) [-]\")\n",
-				"list_plots[0].plot(r[0]/R, CN_drR[0], '-', label='SHARPy')\n",
-				"list_plots[0].plot(of_rR, of_cNdrR, '-', label='OpenFAST')\n",
-				"list_plots[0].legend()\n",
-				"\n",
-				"list_plots[1].grid()\n",
-				"list_plots[1].set_xlabel(\"r/R [-]\")\n",
-				"list_plots[1].set_ylabel(\"CT/d(r/R) [-]\")\n",
-				"list_plots[1].plot(r[0]/R, CTan_drR[0], '-', label='SHARPy')\n",
-				"list_plots[1].plot(of_rR, of_cTdrR, '-', label='OpenFAST')\n",
-				"list_plots[1].legend()\n",
-				"\n",
-				"plt.show()"
-			]
-		},
-		{
-			"cell_type": "markdown",
-			"metadata": {},
-			"source": [
-				"Print the rotor thrust and power coefficients"
-			]
-		},
-		{
-			"cell_type": "code",
-			"execution_count": 16,
-			"metadata": {},
-			"outputs": [
-				{
-					"name": "stdout",
-					"output_type": "stream",
-					"text": [
-						"      OpenFAST SHARPy\n",
-						"Cp[-] 0.49       0.52\n",
-						"Ct[-] 0.70       0.70\n"
-					]
-				}
-			],
-			"source": [
-				"print(\"      OpenFAST SHARPy\")\n",
-				"print(\"Cp[-] %.2f       %.2f\" % (of_cp, Cp))\n",
-				"print(\"Ct[-] %.2f       %.2f\" % (of_ct, Ct))"
-			]
-		}
-	],
-	"metadata": {
-		"kernelspec": {
-			"display_name": "Python 3",
-			"language": "python",
-			"name": "python3"
-		},
-		"language_info": {
-			"codemirror_mode": {
-				"name": "ipython",
-				"version": 3
-			},
-			"file_extension": ".py",
-			"mimetype": "text/x-python",
-			"name": "python",
-			"nbconvert_exporter": "python",
-			"pygments_lexer": "ipython3",
-			"version": "3.7.5"
-		}
-	},
-	"nbformat": 4,
-	"nbformat_minor": 4
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Simulation NREL 5MW wind turbine"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<img src=\"https://raw.githubusercontent.com/ImperialCollegeLondon/sharpy/dev_doc/docs/source/content/example_notebooks/images/turbulence_no_legend.png\" width=\"800\"/>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.Image object>"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "%config InlineBackend.figure_format = 'svg'\n",
+    "from IPython.display import Image\n",
+    "url = 'https://raw.githubusercontent.com/ImperialCollegeLondon/sharpy/dev_doc/docs/source/content/example_notebooks/images/turbulence_no_legend.png'\n",
+    "Image(url=url, width=800)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In this notebook the blade loads on the NREL-5MW reference wind turbine computed with SHARPy and OpenFAST will be compared. However, zero-drag airfoils have been used."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "OpenFAST: _https://openfast.readthedocs.io_"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "NREL-5MW: Jonkman, J.; Butterfield, S.; Musial, W. and Scott, G.. _Definition of a 5-MW Reference Wind Turbine for Offshore System Development_, Technical Report, NREL 2009"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Load the required packages:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Required packages\n",
+    "%matplotlib inline\n",
+    "import numpy as np\n",
+    "import os\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "# Required SHARPy modules\n",
+    "import sharpy.sharpy_main\n",
+    "import sharpy.utils.algebra as algebra\n",
+    "import sharpy.utils.generate_cases as gc\n",
+    "import cases.templates.template_wt as template_wt"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "These are the results from the OpenFAST simulation for comparison: out-of-plane `of_cNdrR` and in-plane `of_cTdrR` coefficients along the blade and thrust `of_ct` and power `of_cp` rotor coefficients"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "of_rR = np.array([0.20158356, 0.3127131, 0.40794048, 0.5984148, 0.6936519, 0.85238045, 0.899999, 0.95555407, 0.98729974, 1.0])\n",
+    "of_cNdrR = np.array([0.08621394, 0.14687876, 0.19345148, 0.2942731, 0.36003628, 0.43748564, 0.44762507, 0.38839236, 0.29782477, 0.0])\n",
+    "of_cTdrR = np.array([0.048268348, 0.051957503, 0.05304592, 0.052862607, 0.056001827, 0.0536646, 0.050112925, 0.038993906, 0.023664437, 0.0])\n",
+    "\n",
+    "of_ct = 0.69787693\n",
+    "of_cp = 0.48813498"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Create SHARPy case"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Definition of parameters"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Mathematical constants\n",
+    "deg2rad = np.pi/180.\n",
+    "\n",
+    "# Case\n",
+    "case = 'rotor'\n",
+    "route = './'\n",
+    "\n",
+    "# Geometry discretization\n",
+    "chord_panels = np.array([8], dtype=int)\n",
+    "revs_in_wake = 5\n",
+    "\n",
+    "# Operation\n",
+    "rotation_velocity = 12.1*2*np.pi/60\n",
+    "pitch_deg = 0. #degrees\n",
+    "\n",
+    "# Wind\n",
+    "WSP = 12.\n",
+    "air_density = 1.225\n",
+    "\n",
+    "# Simulation\n",
+    "dphi = 4.*deg2rad\n",
+    "revs_to_simulate = 5"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Computation of associated parameters"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "dt = dphi/rotation_velocity\n",
+    "time_steps = int(revs_to_simulate*2.*np.pi/dphi)\n",
+    "mstar = int(revs_in_wake*2.*np.pi/dphi)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Generation of the rotor geometry based on the information in the excel file"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\u001b[33mWARNING: The poisson cofficient is assumed equal to 0.3\u001b[0m\n",
+      "\u001b[33mWARNING: Cross-section area is used as shear area\u001b[0m\n",
+      "\u001b[33mWARNING: Using perpendicular axis theorem to compute the inertia around xB\u001b[0m\n",
+      "\u001b[33mWARNING: Replacing node 29 by node 0\u001b[0m\n",
+      "\u001b[33mWARNING: Replacing node 58 by node 0\u001b[0m\n"
+     ]
+    }
+   ],
+   "source": [
+    "op_params = {}                                                                                                                                                                                     \n",
+    "op_params['rotation_velocity'] = rotation_velocity                                                                                                                                                 \n",
+    "op_params['pitch_deg'] = pitch_deg                                                                                                                                                                 \n",
+    "op_params['wsp'] = WSP                                                                                                                                                                             \n",
+    "op_params['dt'] = dt                                                                                                                                                                               \n",
+    "                                                                                                                                                                                                   \n",
+    "geom_params = {}                                                                                                                                                                                   \n",
+    "geom_params['chord_panels'] = chord_panels                                                                                                                                                         \n",
+    "geom_params['tol_remove_points'] = 1e-8                                                                                                                                                            \n",
+    "geom_params['n_points_camber'] = 100                                                                                                                                                               \n",
+    "geom_params['h5_cross_sec_prop'] = None                                                                                                                                                            \n",
+    "geom_params['m_distribution'] = 'uniform'                                                                                                                                                          \n",
+    "                                                                                                                                                                                                   \n",
+    "options = {}                                                                                                                                                                                       \n",
+    "options['camber_effect_on_twist'] = False                                                                                                                                                          \n",
+    "options['user_defined_m_distribution_type'] = None                                                                                                                                                 \n",
+    "options['include_polars'] = False                                                                                                                                                                  \n",
+    "options['separate_blades'] = False                                                                                                                                                                 \n",
+    "                                                                                                                                                                                                   \n",
+    "excel_description = {}                                                                                                                                                                             \n",
+    "excel_description['excel_file_name'] = 'source/type04_db_nrel5mw_oc3_v06.xlsx'                                                                          \n",
+    "excel_description['excel_sheet_parameters'] = 'parameters'                                                                                                                                         \n",
+    "excel_description['excel_sheet_structural_blade'] = 'structural_blade'                                                                                                                             \n",
+    "excel_description['excel_sheet_discretization_blade'] = 'discretization_blade'                                                                                                                     \n",
+    "excel_description['excel_sheet_aero_blade'] = 'aero_blade'                                                                                                                                         \n",
+    "excel_description['excel_sheet_airfoil_info'] = 'airfoil_info'                                                                                                                                     \n",
+    "excel_description['excel_sheet_airfoil_chord'] = 'airfoil_coord'                                                                                                                                   \n",
+    "                                                                                                                                                                                                   \n",
+    "rotor, hub_nodes = template_wt.rotor_from_excel_type03(op_params,                                                                                                                                  \n",
+    "                                            geom_params,                                                                                                                                           \n",
+    "                                            excel_description,                                                                                                                                     \n",
+    "                                            options) "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Define simulation details. The steady simulation is faster than the dynamic simulation. However, the dynamic simulation includes wake self-induction and provides more accurate results."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "steady_simulation = False"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "SimInfo = gc.SimulationInformation()\n",
+    "SimInfo.set_default_values()\n",
+    "\n",
+    "if steady_simulation:\n",
+    "    SimInfo.solvers['SHARPy']['flow'] = ['BeamLoader',\n",
+    "                            'AerogridLoader',\n",
+    "                            'StaticCoupled',\n",
+    "                            'BeamPlot',\n",
+    "                            'AerogridPlot',            \n",
+    "                            'SaveData'] \n",
+    "else:\n",
+    "    SimInfo.solvers['SHARPy']['flow'] = ['BeamLoader',\n",
+    "                            'AerogridLoader',\n",
+    "                            'StaticCoupled',\n",
+    "                            'DynamicCoupled']\n",
+    "                                         \n",
+    "SimInfo.solvers['SHARPy']['case'] = case\n",
+    "SimInfo.solvers['SHARPy']['route'] = route\n",
+    "SimInfo.solvers['SHARPy']['write_log'] = True\n",
+    "SimInfo.set_variable_all_dicts('dt', dt)\n",
+    "SimInfo.set_variable_all_dicts('rho', air_density)\n",
+    "\n",
+    "SimInfo.solvers['SteadyVelocityField']['u_inf'] = WSP\n",
+    "SimInfo.solvers['SteadyVelocityField']['u_inf_direction'] = np.array([0., 0., 1.])\n",
+    "\n",
+    "SimInfo.solvers['BeamLoader']['unsteady'] = 'on'\n",
+    "\n",
+    "SimInfo.solvers['AerogridLoader']['unsteady'] = 'on'\n",
+    "SimInfo.solvers['AerogridLoader']['mstar'] = mstar\n",
+    "SimInfo.solvers['AerogridLoader']['freestream_dir'] = np.array([0.,0.,0.])\n",
+    "SimInfo.solvers['AerogridLoader']['wake_shape_generator'] = 'HelicoidalWake'\n",
+    "SimInfo.solvers['AerogridLoader']['wake_shape_generator_input'] = {'u_inf': WSP,\n",
+    "                                                                   'u_inf_direction': SimInfo.solvers['SteadyVelocityField']['u_inf_direction'],\n",
+    "                                                                   'rotation_velocity': rotation_velocity*np.array([0., 0., 1.]),\n",
+    "                                                                   'dt': dt,\n",
+    "                                                                   'dphi1': dphi,\n",
+    "                                                                   'ndphi1': mstar,\n",
+    "                                                                   'r': 1.,\n",
+    "                                                                   'dphimax': 10*deg2rad}\n",
+    "    \n",
+    "SimInfo.solvers['StaticCoupled']['structural_solver'] = 'RigidDynamicPrescribedStep'\n",
+    "SimInfo.solvers['StaticCoupled']['structural_solver_settings'] = SimInfo.solvers['RigidDynamicPrescribedStep']\n",
+    "SimInfo.solvers['StaticCoupled']['aero_solver'] = 'StaticUvlm'\n",
+    "SimInfo.solvers['StaticCoupled']['aero_solver_settings'] = SimInfo.solvers['StaticUvlm']\n",
+    "\n",
+    "SimInfo.solvers['StaticCoupled']['tolerance'] = 1e-8\n",
+    "SimInfo.solvers['StaticCoupled']['n_load_steps'] = 0\n",
+    "SimInfo.solvers['StaticCoupled']['relaxation_factor'] = 0.\n",
+    "\n",
+    "SimInfo.solvers['StaticUvlm']['num_cores'] = 8\n",
+    "SimInfo.solvers['StaticUvlm']['velocity_field_generator'] = 'SteadyVelocityField'\n",
+    "SimInfo.solvers['StaticUvlm']['velocity_field_input'] = SimInfo.solvers['SteadyVelocityField']\n",
+    "\n",
+    "SimInfo.solvers['SaveData']['compress_float'] = True\n",
+    "                                         \n",
+    "# Only used for steady_simulation = False\n",
+    "SimInfo.solvers['StepUvlm']['convection_scheme'] = 3\n",
+    "SimInfo.solvers['StepUvlm']['num_cores'] = 8\n",
+    "SimInfo.solvers['StepUvlm']['velocity_field_generator'] = 'SteadyVelocityField'\n",
+    "SimInfo.solvers['StepUvlm']['velocity_field_input'] = SimInfo.solvers['SteadyVelocityField']\n",
+    "\n",
+    "SimInfo.solvers['DynamicCoupled']['structural_solver'] = 'RigidDynamicPrescribedStep'\n",
+    "SimInfo.solvers['DynamicCoupled']['structural_solver_settings'] = SimInfo.solvers['RigidDynamicPrescribedStep']\n",
+    "SimInfo.solvers['DynamicCoupled']['aero_solver'] = 'StepUvlm'\n",
+    "SimInfo.solvers['DynamicCoupled']['aero_solver_settings'] = SimInfo.solvers['StepUvlm']\n",
+    "SimInfo.solvers['DynamicCoupled']['postprocessors'] = ['BeamPlot', 'AerogridPlot', 'Cleanup', 'SaveData']\n",
+    "SimInfo.solvers['DynamicCoupled']['postprocessors_settings'] = {'BeamPlot': SimInfo.solvers['BeamPlot'],\n",
+    "                                                             'AerogridPlot': SimInfo.solvers['AerogridPlot'],\n",
+    "                                                             'Cleanup': SimInfo.solvers['Cleanup'],\n",
+    "                                                             'SaveData': SimInfo.solvers['SaveData']}\n",
+    "SimInfo.solvers['DynamicCoupled']['minimum_steps'] = 0\n",
+    "SimInfo.solvers['DynamicCoupled']['include_unsteady_force_contribution'] = True\n",
+    "SimInfo.solvers['DynamicCoupled']['relaxation_factor'] = 0.\n",
+    "SimInfo.solvers['DynamicCoupled']['final_relaxation_factor'] = 0.\n",
+    "SimInfo.solvers['DynamicCoupled']['dynamic_relaxation'] = False\n",
+    "SimInfo.solvers['DynamicCoupled']['relaxation_steps'] = 0\n",
+    "\n",
+    "# Define dynamic simulation (used regardless the value of \"steady_simulation\" variable)\n",
+    "SimInfo.define_num_steps(time_steps)\n",
+    "SimInfo.with_forced_vel = True\n",
+    "SimInfo.for_vel = np.zeros((time_steps,6), dtype=float)\n",
+    "SimInfo.for_vel[:,5] = rotation_velocity\n",
+    "SimInfo.for_acc = np.zeros((time_steps,6), dtype=float)\n",
+    "SimInfo.with_dynamic_forces = True\n",
+    "SimInfo.dynamic_forces = np.zeros((time_steps,rotor.StructuralInformation.num_node,6), dtype=float)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Generate simulation files"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gc.clean_test_files(SimInfo.solvers['SHARPy']['route'], SimInfo.solvers['SHARPy']['case'])\n",
+    "rotor.generate_h5_files(SimInfo.solvers['SHARPy']['route'], SimInfo.solvers['SHARPy']['case'])\n",
+    "SimInfo.generate_solver_file()\n",
+    "SimInfo.generate_dyn_file(time_steps)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Run SHARPy case"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "--------------------------------------------------------------------------------\u001b[0m\n",
+      "            ######  ##     ##    ###    ########  ########  ##    ##\u001b[0m\n",
+      "           ##    ## ##     ##   ## ##   ##     ## ##     ##  ##  ##\u001b[0m\n",
+      "           ##       ##     ##  ##   ##  ##     ## ##     ##   ####\u001b[0m\n",
+      "            ######  ######### ##     ## ########  ########     ##\u001b[0m\n",
+      "                 ## ##     ## ######### ##   ##   ##           ##\u001b[0m\n",
+      "           ##    ## ##     ## ##     ## ##    ##  ##           ##\u001b[0m\n",
+      "            ######  ##     ## ##     ## ##     ## ##           ##\u001b[0m\n",
+      "--------------------------------------------------------------------------------\u001b[0m\n",
+      "Aeroelastics Lab, Aeronautics Department.\u001b[0m\n",
+      "    Copyright (c), Imperial College London.\u001b[0m\n",
+      "    All rights reserved.\u001b[0m\n",
+      "    License available at https://github.com/imperialcollegelondon/sharpy\u001b[0m\n",
+      "\u001b[36mRunning SHARPy from /home/arturo/code/sharpy/docs/source/content/example_notebooks\u001b[0m\n",
+      "\u001b[36mSHARPy being run is in /home/arturo/code/sharpy\u001b[0m\n",
+      "\u001b[36mThe branch being run is dev_blade_pitch_v2\u001b[0m\n",
+      "\u001b[36mThe version and commit hash are: v1.2.1-546-g05602d1f-05602d1f\u001b[0m\n",
+      "SHARPy output folder set\u001b[0m\n",
+      "\u001b[34m\t./output//rotor/\u001b[0m\n",
+      "\u001b[36mGenerating an instance of BeamLoader\u001b[0m\n",
+      "\u001b[36mGenerating an instance of AerogridLoader\u001b[0m\n",
+      "Variable shear_direction has no assigned value in the settings file.\u001b[0m\n",
+      "\u001b[34m    will default to the value: [1. 0. 0.]\u001b[0m\n",
+      "Variable shear_exp has no assigned value in the settings file.\u001b[0m\n",
+      "\u001b[34m    will default to the value: 0.0\u001b[0m\n",
+      "Variable h_ref has no assigned value in the settings file.\u001b[0m\n",
+      "\u001b[34m    will default to the value: 1.0\u001b[0m\n",
+      "Variable h_corr has no assigned value in the settings file.\u001b[0m\n",
+      "\u001b[34m    will default to the value: 1.0\u001b[0m\n",
+      "\u001b[34mThe aerodynamic grid contains 3 surfaces\u001b[0m\n",
+      "\u001b[34m  Surface 0, M=8, N=26\u001b[0m\n",
+      "     Wake 0, M=450, N=26\u001b[0m\n",
+      "\u001b[34m  Surface 1, M=8, N=26\u001b[0m\n",
+      "     Wake 1, M=450, N=26\u001b[0m\n",
+      "\u001b[34m  Surface 2, M=8, N=26\u001b[0m\n",
+      "     Wake 2, M=450, N=26\u001b[0m\n",
+      "  In total: 624 bound panels\u001b[0m\n",
+      "  In total: 35100 wake panels\u001b[0m\n",
+      "  Total number of panels = 35724\u001b[0m\n",
+      "\u001b[36mGenerating an instance of StaticCoupled\u001b[0m\n",
+      "\u001b[36mGenerating an instance of RigidDynamicPrescribedStep\u001b[0m\n",
+      "\u001b[36mGenerating an instance of StaticUvlm\u001b[0m\n",
+      "\u001b[0m\n",
+      "\u001b[0m\n",
+      "\u001b[0m\n",
+      "|=====|=====|============|==========|==========|==========|==========|==========|==========|\u001b[0m\n",
+      "|iter |step | log10(res) |    Fx    |    Fy    |    Fz    |    Mx    |    My    |    Mz    |\u001b[0m\n",
+      "|=====|=====|============|==========|==========|==========|==========|==========|==========|\u001b[0m\n",
+      "|  0  |  0  |  0.00000   | -0.0000  |  0.0000  |21927.8250|  0.0000  | -0.0000  |5962997.5361|\u001b[0m\n",
+      "|  1  |  0  |    -inf    | -0.0000  |  0.0000  |21927.8250|  0.0000  | -0.0000  |5962997.5361|\u001b[0m\n",
+      "\u001b[36mGenerating an instance of DynamicCoupled\u001b[0m\n",
+      "\u001b[36mGenerating an instance of RigidDynamicPrescribedStep\u001b[0m\n",
+      "\u001b[36mGenerating an instance of StepUvlm\u001b[0m\n",
+      "\u001b[36mGenerating an instance of BeamPlot\u001b[0m\n",
+      "\u001b[36mGenerating an instance of AerogridPlot\u001b[0m\n",
+      "\u001b[36mGenerating an instance of Cleanup\u001b[0m\n",
+      "\u001b[36mGenerating an instance of SaveData\u001b[0m\n",
+      "\u001b[0m\n",
+      "\u001b[0m\n",
+      "\u001b[0m\n",
+      "|=======|========|======|==============|==============|==============|==============|==============|\u001b[0m\n",
+      "|  ts   |   t    | iter | struc ratio  |  iter time   | residual vel |  FoR_vel(x)  |  FoR_vel(z)  |\u001b[0m\n",
+      "|=======|========|======|==============|==============|==============|==============|==============|\u001b[0m\n",
+      "|   1   | 0.0551 |  1   |   0.001471   |  11.072773   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   2   | 0.1102 |  1   |   0.001529   |  11.094774   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   3   | 0.1653 |  1   |   0.001487   |  11.017530   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   4   | 0.2204 |  1   |   0.001487   |  11.053551   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   5   | 0.2755 |  1   |   0.001495   |  10.972424   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   6   | 0.3306 |  1   |   0.001496   |  10.951425   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   7   | 0.3857 |  1   |   0.001492   |  11.018625   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   8   | 0.4408 |  1   |   0.001476   |  11.044770   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|   9   | 0.4959 |  1   |   0.001478   |  11.122489   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  10   | 0.5510 |  1   |   0.001500   |  10.997606   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  11   | 0.6061 |  1   |   0.001481   |  11.076450   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  12   | 0.6612 |  1   |   0.001513   |  10.976762   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  13   | 0.7163 |  1   |   0.001489   |  11.056770   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  14   | 0.7713 |  1   |   0.001473   |  11.147662   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  15   | 0.8264 |  1   |   0.001485   |  11.047932   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  16   | 0.8815 |  1   |   0.001500   |  10.984375   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  17   | 0.9366 |  1   |   0.001492   |  10.999334   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  18   | 0.9917 |  1   |   0.001492   |  11.036468   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  19   | 1.0468 |  1   |   0.001490   |  10.989860   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  20   | 1.1019 |  1   |   0.001487   |  10.981977   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  21   | 1.1570 |  1   |   0.001480   |  11.026050   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  22   | 1.2121 |  1   |   0.001501   |  10.964416   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  23   | 1.2672 |  1   |   0.001483   |  11.061231   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  24   | 1.3223 |  1   |   0.001502   |  11.026285   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  25   | 1.3774 |  1   |   0.001497   |  10.937541   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  26   | 1.4325 |  1   |   0.001464   |  11.216671   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  27   | 1.4876 |  1   |   0.001489   |  11.077631   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  28   | 1.5427 |  1   |   0.001487   |  11.029765   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  29   | 1.5978 |  1   |   0.001484   |  11.057365   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  30   | 1.6529 |  1   |   0.001499   |  10.988523   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  31   | 1.7080 |  1   |   0.001480   |  11.082585   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  32   | 1.7631 |  1   |   0.001493   |  11.026814   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  33   | 1.8182 |  1   |   0.001500   |  10.964227   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  34   | 1.8733 |  1   |   0.001496   |  11.070894   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  35   | 1.9284 |  1   |   0.001499   |  10.991359   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  36   | 1.9835 |  1   |   0.001493   |  10.956692   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  37   | 2.0386 |  1   |   0.001489   |  11.022953   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  38   | 2.0937 |  1   |   0.001493   |  11.002933   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  39   | 2.1488 |  1   |   0.001494   |  10.971854   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  40   | 2.2039 |  1   |   0.001499   |  10.956611   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  41   | 2.2590 |  1   |   0.001484   |  11.020658   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  42   | 2.3140 |  1   |   0.001484   |  11.016274   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  43   | 2.3691 |  1   |   0.001490   |  11.171444   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  44   | 2.4242 |  1   |   0.001496   |  10.975332   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  45   | 2.4793 |  1   |   0.001479   |  11.094840   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  46   | 2.5344 |  1   |   0.001484   |  11.060059   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  47   | 2.5895 |  1   |   0.001329   |  12.309849   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  48   | 2.6446 |  1   |   0.001455   |  11.269876   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  49   | 2.6997 |  1   |   0.001489   |  11.076657   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  50   | 2.7548 |  1   |   0.001496   |  10.998456   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  51   | 2.8099 |  1   |   0.001471   |  11.215534   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  52   | 2.8650 |  1   |   0.001494   |  10.981076   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  53   | 2.9201 |  1   |   0.001476   |  11.089418   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  54   | 2.9752 |  1   |   0.001482   |  10.973016   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  55   | 3.0303 |  1   |   0.001469   |  11.115966   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  56   | 3.0854 |  1   |   0.001458   |  11.172810   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  57   | 3.1405 |  1   |   0.001496   |  10.984580   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  58   | 3.1956 |  1   |   0.001451   |  11.196615   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  59   | 3.2507 |  1   |   0.001498   |  10.961545   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  60   | 3.3058 |  1   |   0.001492   |  11.053819   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  61   | 3.3609 |  1   |   0.001492   |  11.066293   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  62   | 3.4160 |  1   |   0.001489   |  11.025009   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  63   | 3.4711 |  1   |   0.001485   |  10.999920   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  64   | 3.5262 |  1   |   0.001505   |  10.973439   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  65   | 3.5813 |  1   |   0.001495   |  10.981763   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  66   | 3.6364 |  1   |   0.001481   |  10.997240   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  67   | 3.6915 |  1   |   0.001489   |  11.030007   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  68   | 3.7466 |  1   |   0.001487   |  10.977346   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  69   | 3.8017 |  1   |   0.001490   |  11.086072   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  70   | 3.8567 |  1   |   0.001478   |  11.027897   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  71   | 3.9118 |  1   |   0.001492   |  10.997195   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  72   | 3.9669 |  1   |   0.001476   |  11.129629   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  73   | 4.0220 |  1   |   0.001491   |  10.996616   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  74   | 4.0771 |  1   |   0.001513   |  10.996785   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  75   | 4.1322 |  1   |   0.001487   |  11.010984   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  76   | 4.1873 |  1   |   0.001504   |  10.960333   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  77   | 4.2424 |  1   |   0.001483   |  11.062480   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  78   | 4.2975 |  1   |   0.001502   |  10.999189   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  79   | 4.3526 |  1   |   0.001504   |  10.989805   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  80   | 4.4077 |  1   |   0.001499   |  10.986292   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  81   | 4.4628 |  1   |   0.001471   |  11.064248   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  82   | 4.5179 |  1   |   0.001478   |  11.030763   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  83   | 4.5730 |  1   |   0.001423   |  11.418318   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  84   | 4.6281 |  1   |   0.001513   |  10.934981   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  85   | 4.6832 |  1   |   0.001477   |  10.947891   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  86   | 4.7383 |  1   |   0.001449   |  11.337449   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  87   | 4.7934 |  1   |   0.001446   |  11.356113   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  88   | 4.8485 |  1   |   0.001493   |  11.006986   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  89   | 4.9036 |  1   |   0.001508   |  10.995290   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  90   | 4.9587 |  1   |   0.001519   |  10.961908   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  91   | 5.0138 |  1   |   0.001511   |  11.004637   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  92   | 5.0689 |  1   |   0.001493   |  11.060139   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  93   | 5.1240 |  1   |   0.001475   |  11.108975   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  94   | 5.1791 |  1   |   0.001501   |  10.946505   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  95   | 5.2342 |  1   |   0.001504   |  10.936386   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  96   | 5.2893 |  1   |   0.001486   |  10.994701   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  97   | 5.3444 |  1   |   0.001483   |  11.023811   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  98   | 5.3994 |  1   |   0.001494   |  10.979126   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  99   | 5.4545 |  1   |   0.001481   |  11.163518   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  100  | 5.5096 |  1   |   0.001479   |  11.047313   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  101  | 5.5647 |  1   |   0.001473   |  11.060119   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  102  | 5.6198 |  1   |   0.001486   |  11.053105   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  103  | 5.6749 |  1   |   0.001486   |  11.092742   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  104  | 5.7300 |  1   |   0.001477   |  11.137425   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  105  | 5.7851 |  1   |   0.001491   |  11.010371   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  106  | 5.8402 |  1   |   0.001496   |  10.990369   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  107  | 5.8953 |  1   |   0.001473   |  11.243003   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  108  | 5.9504 |  1   |   0.001388   |  11.929604   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  109  | 6.0055 |  1   |   0.001458   |  11.222341   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  110  | 6.0606 |  1   |   0.001499   |  11.021925   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  111  | 6.1157 |  1   |   0.001489   |  10.988726   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  112  | 6.1708 |  1   |   0.001464   |  11.127002   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  113  | 6.2259 |  1   |   0.001490   |  10.982098   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  114  | 6.2810 |  1   |   0.001490   |  11.058744   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  115  | 6.3361 |  1   |   0.001501   |  11.036917   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  116  | 6.3912 |  1   |   0.001487   |  11.093127   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  117  | 6.4463 |  1   |   0.001511   |  10.986041   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  118  | 6.5014 |  1   |   0.001473   |  11.067499   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  119  | 6.5565 |  1   |   0.001495   |  10.978576   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  120  | 6.6116 |  1   |   0.001497   |  11.027401   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  121  | 6.6667 |  1   |   0.001487   |  11.056618   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  122  | 6.7218 |  1   |   0.001492   |  10.946566   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  123  | 6.7769 |  1   |   0.001492   |  10.977270   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  124  | 6.8320 |  1   |   0.001466   |  11.212596   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  125  | 6.8871 |  1   |   0.001493   |  10.996106   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  126  | 6.9421 |  1   |   0.001480   |  11.018607   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  127  | 6.9972 |  1   |   0.001509   |  10.976320   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  128  | 7.0523 |  1   |   0.001329   |  12.417034   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  129  | 7.1074 |  1   |   0.001510   |  10.938081   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  130  | 7.1625 |  1   |   0.001496   |  10.964072   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  131  | 7.2176 |  1   |   0.001497   |  11.006588   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  132  | 7.2727 |  1   |   0.001493   |  11.018465   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  133  | 7.3278 |  1   |   0.001493   |  11.030553   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  134  | 7.3829 |  1   |   0.001490   |  11.034491   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  135  | 7.4380 |  1   |   0.001493   |  10.942718   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  136  | 7.4931 |  1   |   0.001485   |  11.063141   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  137  | 7.5482 |  1   |   0.001490   |  10.940797   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  138  | 7.6033 |  1   |   0.001496   |  11.094267   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  139  | 7.6584 |  1   |   0.001476   |  11.092305   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  140  | 7.7135 |  1   |   0.001489   |  10.999871   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  141  | 7.7686 |  1   |   0.001486   |  10.969563   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  142  | 7.8237 |  1   |   0.001485   |  11.045270   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  143  | 7.8788 |  1   |   0.001493   |  10.999192   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  144  | 7.9339 |  1   |   0.001498   |  11.051950   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  145  | 7.9890 |  1   |   0.001489   |  11.134410   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  146  | 8.0441 |  1   |   0.001474   |  11.101941   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  147  | 8.0992 |  1   |   0.001480   |  11.063681   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  148  | 8.1543 |  1   |   0.001486   |  10.946801   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  149  | 8.2094 |  1   |   0.001484   |  11.076774   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  150  | 8.2645 |  1   |   0.001480   |  11.143664   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  151  | 8.3196 |  1   |   0.001509   |  10.947056   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  152  | 8.3747 |  1   |   0.001447   |  11.226169   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  153  | 8.4298 |  1   |   0.001479   |  11.063754   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  154  | 8.4848 |  1   |   0.001484   |  10.961506   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  155  | 8.5399 |  1   |   0.001497   |  11.050401   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  156  | 8.5950 |  1   |   0.001503   |  11.018204   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  157  | 8.6501 |  1   |   0.001472   |  11.145519   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  158  | 8.7052 |  1   |   0.001486   |  11.037257   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  159  | 8.7603 |  1   |   0.001492   |  11.036405   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  160  | 8.8154 |  1   |   0.001480   |  11.015381   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  161  | 8.8705 |  1   |   0.001498   |  10.979052   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  162  | 8.9256 |  1   |   0.001496   |  11.051611   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  163  | 8.9807 |  1   |   0.001486   |  11.052557   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  164  | 9.0358 |  1   |   0.001491   |  11.034617   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  165  | 9.0909 |  1   |   0.001488   |  11.049273   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  166  | 9.1460 |  1   |   0.001491   |  11.085268   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  167  | 9.2011 |  1   |   0.001503   |  10.958939   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  168  | 9.2562 |  1   |   0.001497   |  11.062020   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  169  | 9.3113 |  1   |   0.001518   |  10.996845   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  170  | 9.3664 |  1   |   0.001470   |  11.209611   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  171  | 9.4215 |  1   |   0.001477   |  11.023668   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  172  | 9.4766 |  1   |   0.001481   |  11.090508   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  173  | 9.5317 |  1   |   0.001512   |  10.958598   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  174  | 9.5868 |  1   |   0.001472   |  11.093911   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  175  | 9.6419 |  1   |   0.001495   |  11.022321   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  176  | 9.6970 |  1   |   0.001497   |  10.963686   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  177  | 9.7521 |  1   |   0.001495   |  11.014677   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  178  | 9.8072 |  1   |   0.001494   |  10.971079   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  179  | 9.8623 |  1   |   0.001478   |  11.075295   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  180  | 9.9174 |  1   |   0.001492   |  10.967837   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  181  | 9.9725 |  1   |   0.001502   |  11.002055   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  182  |10.0275 |  1   |   0.001478   |  11.256881   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  183  |10.0826 |  1   |   0.001503   |  10.965836   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  184  |10.1377 |  1   |   0.001492   |  11.003513   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  185  |10.1928 |  1   |   0.001499   |  11.033890   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  186  |10.2479 |  1   |   0.001477   |  11.086396   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  187  |10.3030 |  1   |   0.001494   |  11.022237   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  188  |10.3581 |  1   |   0.001488   |  11.065405   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  189  |10.4132 |  1   |   0.001479   |  11.172747   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  190  |10.4683 |  1   |   0.001488   |  11.135500   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  191  |10.5234 |  1   |   0.001485   |  10.995766   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  192  |10.5785 |  1   |   0.001494   |  10.953639   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  193  |10.6336 |  1   |   0.001492   |  11.006385   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  194  |10.6887 |  1   |   0.001384   |  11.898180   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  195  |10.7438 |  1   |   0.001505   |  10.971906   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  196  |10.7989 |  1   |   0.001506   |  10.982670   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  197  |10.8540 |  1   |   0.001324   |  12.325860   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  198  |10.9091 |  1   |   0.001502   |  11.026861   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  199  |10.9642 |  1   |   0.001505   |  10.987199   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  200  |11.0193 |  1   |   0.001488   |  11.061289   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  201  |11.0744 |  1   |   0.001489   |  11.049199   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  202  |11.1295 |  1   |   0.001501   |  10.973437   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  203  |11.1846 |  1   |   0.001500   |  10.937448   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  204  |11.2397 |  1   |   0.001499   |  10.940185   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  205  |11.2948 |  1   |   0.001506   |  10.956871   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  206  |11.3499 |  1   |   0.001496   |  10.959225   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  207  |11.4050 |  1   |   0.001380   |  11.911324   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  208  |11.4601 |  1   |   0.001505   |  10.983367   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  209  |11.5152 |  1   |   0.001483   |  11.116040   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  210  |11.5702 |  1   |   0.001499   |  10.946843   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  211  |11.6253 |  1   |   0.001495   |  11.007702   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  212  |11.6804 |  1   |   0.001484   |  11.036537   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  213  |11.7355 |  1   |   0.001501   |  10.962850   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  214  |11.7906 |  1   |   0.001458   |  11.231765   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  215  |11.8457 |  1   |   0.001500   |  10.974388   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  216  |11.9008 |  1   |   0.001502   |  10.971881   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  217  |11.9559 |  1   |   0.001484   |  11.094227   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  218  |12.0110 |  1   |   0.001465   |  11.285769   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  219  |12.0661 |  1   |   0.001472   |  11.138884   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  220  |12.1212 |  1   |   0.001462   |  11.085258   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  221  |12.1763 |  1   |   0.001506   |  10.962956   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  222  |12.2314 |  1   |   0.001481   |  11.063845   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  223  |12.2865 |  1   |   0.001490   |  10.940562   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  224  |12.3416 |  1   |   0.001487   |  11.074080   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  225  |12.3967 |  1   |   0.001500   |  10.966088   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  226  |12.4518 |  1   |   0.001503   |  10.940730   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  227  |12.5069 |  1   |   0.001500   |  10.983767   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  228  |12.5620 |  1   |   0.001495   |  11.087621   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  229  |12.6171 |  1   |   0.001491   |  11.030768   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  230  |12.6722 |  1   |   0.001501   |  10.986019   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  231  |12.7273 |  1   |   0.001471   |  11.210606   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  232  |12.7824 |  1   |   0.001496   |  10.989540   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  233  |12.8375 |  1   |   0.001479   |  10.991125   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  234  |12.8926 |  1   |   0.001484   |  10.997315   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  235  |12.9477 |  1   |   0.001495   |  10.981242   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  236  |13.0028 |  1   |   0.001494   |  11.034151   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  237  |13.0579 |  1   |   0.001521   |  11.393696   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  238  |13.1129 |  1   |   0.001483   |  11.187673   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  239  |13.1680 |  1   |   0.001476   |  11.165030   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  240  |13.2231 |  1   |   0.001461   |  11.121420   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  241  |13.2782 |  1   |   0.001497   |  11.077922   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  242  |13.3333 |  1   |   0.001472   |  11.274707   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  243  |13.3884 |  1   |   0.001477   |  11.087600   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  244  |13.4435 |  1   |   0.001469   |  11.061153   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  245  |13.4986 |  1   |   0.001449   |  11.292755   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  246  |13.5537 |  1   |   0.001495   |  11.001245   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  247  |13.6088 |  1   |   0.001493   |  11.024726   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  248  |13.6639 |  1   |   0.001480   |  10.968597   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  249  |13.7190 |  1   |   0.001478   |  11.008988   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  250  |13.7741 |  1   |   0.001464   |  11.120604   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  251  |13.8292 |  1   |   0.001494   |  10.976703   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  252  |13.8843 |  1   |   0.001464   |  11.173856   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  253  |13.9394 |  1   |   0.001478   |  11.182188   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  254  |13.9945 |  1   |   0.001474   |  11.138903   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  255  |14.0496 |  1   |   0.001498   |  10.998538   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  256  |14.1047 |  1   |   0.001490   |  10.959735   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  257  |14.1598 |  1   |   0.001497   |  11.015843   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  258  |14.2149 |  1   |   0.001442   |  11.296236   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  259  |14.2700 |  1   |   0.001470   |  11.035043   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  260  |14.3251 |  1   |   0.001499   |  11.025067   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  261  |14.3802 |  1   |   0.001483   |  11.032883   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  262  |14.4353 |  1   |   0.001450   |  11.225693   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  263  |14.4904 |  1   |   0.001490   |  11.049877   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  264  |14.5455 |  1   |   0.001500   |  10.961913   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  265  |14.6006 |  1   |   0.001468   |  11.227395   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  266  |14.6556 |  1   |   0.001500   |  10.950821   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  267  |14.7107 |  1   |   0.001496   |  11.034819   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  268  |14.7658 |  1   |   0.001478   |  11.039118   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  269  |14.8209 |  1   |   0.001480   |  11.054862   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  270  |14.8760 |  1   |   0.001499   |  10.966170   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  271  |14.9311 |  1   |   0.001492   |  11.013549   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  272  |14.9862 |  1   |   0.001487   |  11.063011   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  273  |15.0413 |  1   |   0.001494   |  11.025787   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  274  |15.0964 |  1   |   0.001492   |  11.056323   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  275  |15.1515 |  1   |   0.001502   |  11.017958   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  276  |15.2066 |  1   |   0.001498   |  10.993303   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  277  |15.2617 |  1   |   0.001492   |  11.045624   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  278  |15.3168 |  1   |   0.001488   |  11.001706   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  279  |15.3719 |  1   |   0.001501   |  11.019076   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  280  |15.4270 |  1   |   0.001482   |  10.980229   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  281  |15.4821 |  1   |   0.001500   |  10.990641   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  282  |15.5372 |  1   |   0.001482   |  11.039660   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  283  |15.5923 |  1   |   0.001506   |  10.960431   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  284  |15.6474 |  1   |   0.001483   |  11.035762   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  285  |15.7025 |  1   |   0.001483   |  10.972536   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  286  |15.7576 |  1   |   0.001497   |  11.078446   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  287  |15.8127 |  1   |   0.001494   |  11.003910   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  288  |15.8678 |  1   |   0.001524   |  10.954572   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  289  |15.9229 |  1   |   0.001468   |  11.170064   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  290  |15.9780 |  1   |   0.001466   |  11.078832   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  291  |16.0331 |  1   |   0.001500   |  10.965774   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  292  |16.0882 |  1   |   0.001492   |  10.988034   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  293  |16.1433 |  1   |   0.001498   |  11.034559   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  294  |16.1983 |  1   |   0.001485   |  10.967131   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  295  |16.2534 |  1   |   0.001480   |  11.102506   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  296  |16.3085 |  1   |   0.001504   |  10.998471   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  297  |16.3636 |  1   |   0.001499   |  10.959420   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  298  |16.4187 |  1   |   0.001483   |  11.099791   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  299  |16.4738 |  1   |   0.001493   |  10.974991   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  300  |16.5289 |  1   |   0.001487   |  10.989717   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  301  |16.5840 |  1   |   0.001484   |  11.069229   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  302  |16.6391 |  1   |   0.001503   |  10.985806   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  303  |16.6942 |  1   |   0.001496   |  11.041107   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  304  |16.7493 |  1   |   0.001487   |  10.991144   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  305  |16.8044 |  1   |   0.001492   |  11.005035   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  306  |16.8595 |  1   |   0.001488   |  11.087163   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  307  |16.9146 |  1   |   0.001491   |  11.002862   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  308  |16.9697 |  1   |   0.001519   |  11.018252   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  309  |17.0248 |  1   |   0.001489   |  11.030986   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  310  |17.0799 |  1   |   0.001509   |  11.001859   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  311  |17.1350 |  1   |   0.001492   |  11.019300   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  312  |17.1901 |  1   |   0.001488   |  11.036436   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  313  |17.2452 |  1   |   0.001493   |  11.046922   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  314  |17.3003 |  1   |   0.001485   |  10.976898   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  315  |17.3554 |  1   |   0.001497   |  10.941875   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  316  |17.4105 |  1   |   0.001497   |  11.056621   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  317  |17.4656 |  1   |   0.001471   |  11.117604   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  318  |17.5207 |  1   |   0.001469   |  11.168160   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  319  |17.5758 |  1   |   0.001476   |  11.020628   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  320  |17.6309 |  1   |   0.001490   |  11.020211   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  321  |17.6860 |  1   |   0.001488   |  11.010496   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  322  |17.7410 |  1   |   0.001475   |  11.125369   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  323  |17.7961 |  1   |   0.001494   |  10.955690   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  324  |17.8512 |  1   |   0.001493   |  11.078510   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  325  |17.9063 |  1   |   0.001362   |  12.022863   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  326  |17.9614 |  1   |   0.001489   |  11.021870   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  327  |18.0165 |  1   |   0.001463   |  11.139775   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  328  |18.0716 |  1   |   0.001475   |  11.015395   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  329  |18.1267 |  1   |   0.001475   |  10.995628   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  330  |18.1818 |  1   |   0.001490   |  11.037015   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  331  |18.2369 |  1   |   0.001489   |  10.994272   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  332  |18.2920 |  1   |   0.001485   |  11.023925   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  333  |18.3471 |  1   |   0.001465   |  11.131615   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  334  |18.4022 |  1   |   0.001481   |  10.996215   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  335  |18.4573 |  1   |   0.001493   |  11.042847   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  336  |18.5124 |  1   |   0.001493   |  11.153712   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  337  |18.5675 |  1   |   0.001497   |  10.981005   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  338  |18.6226 |  1   |   0.001490   |  10.993124   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  339  |18.6777 |  1   |   0.001498   |  10.970379   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  340  |18.7328 |  1   |   0.001492   |  10.992345   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  341  |18.7879 |  1   |   0.001492   |  10.998224   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  342  |18.8430 |  1   |   0.001523   |  10.982035   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  343  |18.8981 |  1   |   0.001485   |  11.054384   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  344  |18.9532 |  1   |   0.001486   |  11.027520   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  345  |19.0083 |  1   |   0.001482   |  11.016985   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  346  |19.0634 |  1   |   0.001484   |  11.169659   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  347  |19.1185 |  1   |   0.001476   |  11.164135   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  348  |19.1736 |  1   |   0.001499   |  10.963815   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  349  |19.2287 |  1   |   0.001481   |  11.041115   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  350  |19.2837 |  1   |   0.001478   |  11.025983   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  351  |19.3388 |  1   |   0.001504   |  10.984140   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  352  |19.3939 |  1   |   0.001478   |  11.033161   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  353  |19.4490 |  1   |   0.001490   |  11.040692   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  354  |19.5041 |  1   |   0.001479   |  11.018249   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  355  |19.5592 |  1   |   0.001471   |  10.995813   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  356  |19.6143 |  1   |   0.001478   |  11.009744   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  357  |19.6694 |  1   |   0.001489   |  11.012060   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  358  |19.7245 |  1   |   0.001487   |  11.043458   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  359  |19.7796 |  1   |   0.001492   |  10.996924   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  360  |19.8347 |  1   |   0.001486   |  10.997914   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  361  |19.8898 |  1   |   0.001462   |  11.193126   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  362  |19.9449 |  1   |   0.001476   |  11.131790   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  363  |20.0000 |  1   |   0.001456   |  11.255347   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  364  |20.0551 |  1   |   0.001443   |  11.262457   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  365  |20.1102 |  1   |   0.001442   |  11.282331   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  366  |20.1653 |  1   |   0.001460   |  11.133270   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  367  |20.2204 |  1   |   0.001461   |  11.137590   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  368  |20.2755 |  1   |   0.001458   |  11.279287   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  369  |20.3306 |  1   |   0.001473   |  11.155934   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  370  |20.3857 |  1   |   0.001480   |  11.140440   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  371  |20.4408 |  1   |   0.001464   |  11.196868   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  372  |20.4959 |  1   |   0.001473   |  11.196430   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  373  |20.5510 |  1   |   0.001467   |  11.166742   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  374  |20.6061 |  1   |   0.001488   |  11.095840   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  375  |20.6612 |  1   |   0.001456   |  11.119288   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  376  |20.7163 |  1   |   0.001514   |  10.997535   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  377  |20.7713 |  1   |   0.001500   |  10.973636   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  378  |20.8264 |  1   |   0.001485   |  11.041631   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  379  |20.8815 |  1   |   0.001474   |  11.054704   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  380  |20.9366 |  1   |   0.001505   |  10.956344   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  381  |20.9917 |  1   |   0.001485   |  11.037928   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  382  |21.0468 |  1   |   0.001494   |  11.004072   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  383  |21.1019 |  1   |   0.001460   |  11.191711   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  384  |21.1570 |  1   |   0.001464   |  11.213192   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  385  |21.2121 |  1   |   0.001297   |  12.715977   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  386  |21.2672 |  1   |   0.001473   |  11.214244   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  387  |21.3223 |  1   |   0.001488   |  11.175076   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  388  |21.3774 |  1   |   0.001477   |  11.140157   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  389  |21.4325 |  1   |   0.001476   |  11.217773   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  390  |21.4876 |  1   |   0.001487   |  11.070076   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  391  |21.5427 |  1   |   0.001476   |  11.079977   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  392  |21.5978 |  1   |   0.001497   |  10.963420   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  393  |21.6529 |  1   |   0.001492   |  10.965270   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  394  |21.7080 |  1   |   0.001499   |  11.031488   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  395  |21.7631 |  1   |   0.001379   |  11.928026   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  396  |21.8182 |  1   |   0.001474   |  11.124487   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  397  |21.8733 |  1   |   0.001482   |  11.037149   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  398  |21.9284 |  1   |   0.001491   |  11.062619   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  399  |21.9835 |  1   |   0.001483   |  11.227740   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  400  |22.0386 |  1   |   0.001460   |  11.253708   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  401  |22.0937 |  1   |   0.001474   |  11.210907   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  402  |22.1488 |  1   |   0.001483   |  11.119041   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  403  |22.2039 |  1   |   0.001490   |  11.014906   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  404  |22.2590 |  1   |   0.001499   |  10.956471   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  405  |22.3140 |  1   |   0.001468   |  11.109550   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  406  |22.3691 |  1   |   0.001490   |  10.982853   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  407  |22.4242 |  1   |   0.001478   |  11.193154   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  408  |22.4793 |  1   |   0.001498   |  11.031459   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  409  |22.5344 |  1   |   0.001508   |  10.978516   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  410  |22.5895 |  1   |   0.001481   |  11.028180   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  411  |22.6446 |  1   |   0.001492   |  11.037275   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  412  |22.6997 |  1   |   0.001483   |  10.967960   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  413  |22.7548 |  1   |   0.001493   |  10.990911   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  414  |22.8099 |  1   |   0.001484   |  11.067482   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  415  |22.8650 |  1   |   0.001486   |  10.987234   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  416  |22.9201 |  1   |   0.001453   |  11.105183   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  417  |22.9752 |  1   |   0.001484   |  11.019325   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  418  |23.0303 |  1   |   0.001489   |  11.033711   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  419  |23.0854 |  1   |   0.001486   |  10.961752   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  420  |23.1405 |  1   |   0.001488   |  11.020402   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  421  |23.1956 |  1   |   0.001485   |  10.985927   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  422  |23.2507 |  1   |   0.001484   |  11.122986   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  423  |23.3058 |  1   |   0.001488   |  11.010117   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  424  |23.3609 |  1   |   0.001494   |  11.027276   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  425  |23.4160 |  1   |   0.001498   |  11.002853   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  426  |23.4711 |  1   |   0.001504   |  10.948009   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  427  |23.5262 |  1   |   0.001537   |  10.965587   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  428  |23.5813 |  1   |   0.001480   |  11.023513   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  429  |23.6364 |  1   |   0.001495   |  11.016430   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  430  |23.6915 |  1   |   0.001498   |  10.990407   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  431  |23.7466 |  1   |   0.001482   |  11.029547   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  432  |23.8017 |  1   |   0.001489   |  11.028503   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  433  |23.8567 |  1   |   0.001494   |  10.994521   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  434  |23.9118 |  1   |   0.001497   |  11.033860   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  435  |23.9669 |  1   |   0.001472   |  11.085127   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  436  |24.0220 |  1   |   0.001519   |  10.940756   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  437  |24.0771 |  1   |   0.001477   |  11.058848   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  438  |24.1322 |  1   |   0.001479   |  11.067911   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  439  |24.1873 |  1   |   0.001488   |  11.029004   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  440  |24.2424 |  1   |   0.001497   |  10.977903   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  441  |24.2975 |  1   |   0.001486   |  11.038936   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  442  |24.3526 |  1   |   0.001492   |  11.042946   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  443  |24.4077 |  1   |   0.001492   |  10.970813   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  444  |24.4628 |  1   |   0.001486   |  11.023437   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  445  |24.5179 |  1   |   0.001504   |  10.981979   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  446  |24.5730 |  1   |   0.001487   |  10.943550   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  447  |24.6281 |  1   |   0.001504   |  10.990585   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  448  |24.6832 |  1   |   0.001488   |  11.020756   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  449  |24.7383 |  1   |   0.001502   |  11.020719   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "|  450  |24.7934 |  1   |   0.001490   |  10.944653   |   0.000000   | 0.000000e+00 | 0.000000e+00 |\u001b[0m\n",
+      "\u001b[34m...Finished\u001b[0m\n",
+      "\u001b[36mFINISHED - Elapsed time = 5192.1956986 seconds\u001b[0m\n",
+      "\u001b[36mFINISHED - CPU process time = 38238.0321676 seconds\u001b[0m\n"
+     ]
+    }
+   ],
+   "source": [
+    "sharpy_output = sharpy.sharpy_main.main(['', SimInfo.solvers['SHARPy']['route'] + SimInfo.solvers['SHARPy']['case'] + '.sharpy'])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Postprocessing"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Read the structural and aerodynamic information of the last time step"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "tstep = sharpy_output.structure.timestep_info[-1]\n",
+    "astep = sharpy_output.aero.timestep_info[-1]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Separate the structure into blades"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Define beams\n",
+    "ielem = 0\n",
+    "nblades = np.max(sharpy_output.structure.beam_number) + 1\n",
+    "nodes_blade = []\n",
+    "first_node = 0\n",
+    "for iblade in range(nblades):\n",
+    "    nodes_blade.append(np.zeros((sharpy_output.structure.num_node,), dtype=bool))\n",
+    "    while sharpy_output.structure.beam_number[ielem] <= iblade:\n",
+    "        ielem += 1\n",
+    "        if ielem == sharpy_output.structure.num_elem:\n",
+    "            break\n",
+    "    nodes_blade[iblade][first_node:sharpy_output.structure.connectivities[ielem-1,1]+1] = True\n",
+    "    first_node = sharpy_output.structure.connectivities[ielem-1,1]+1"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Compute the radial position of the nodes and initialise the rest of the variables"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "r = []\n",
+    "c = []\n",
+    "dr = []\n",
+    "forces = []\n",
+    "CN_drR = []\n",
+    "CTan_drR = []\n",
+    "CP_drR = []\n",
+    "nodes_num = []\n",
+    "for iblade in range(nblades):\n",
+    "    forces.append(tstep.steady_applied_forces[nodes_blade[iblade]].copy())\n",
+    "\n",
+    "    nodes_num.append(np.arange(0, sharpy_output.structure.num_node, 1)[nodes_blade[iblade]])\n",
+    "\n",
+    "    r.append(np.linalg.norm(tstep.pos[nodes_blade[iblade], :], axis=1))\n",
+    "    dr.append(np.zeros(np.sum(nodes_blade[iblade])))\n",
+    "    dr[iblade][0] = 0.5*(r[iblade][1]-r[iblade][0])\n",
+    "    dr[iblade][-1] = 0.5 * (r[iblade][-1] - r[iblade][-2])\n",
+    "    for inode in range(1,len(r[iblade]) - 1):\n",
+    "        dr[iblade][inode] = 0.5*(r[iblade][inode+1] - r[iblade][inode-1])\n",
+    "\n",
+    "    CN_drR.append(np.zeros(len(r[iblade])))\n",
+    "    c.append(np.zeros(len(r[iblade])))\n",
+    "    CTan_drR.append(np.zeros(len(r[iblade])))\n",
+    "    CP_drR.append(np.zeros(len(r[iblade])))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Transform the loads computed by SHARPy into out-of-plane and in-plane components"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "rho = sharpy_output.settings['StaticCoupled']['aero_solver_settings']['rho']\n",
+    "uinf = sharpy_output.settings['StaticCoupled']['aero_solver_settings']['velocity_field_input']['u_inf']\n",
+    "R = np.max(r[0])\n",
+    "Cp = 0\n",
+    "Ct = 0\n",
+    "\n",
+    "global_force_factor = 0.5 * rho * uinf** 2 * np.pi * R**2\n",
+    "global_power_factor = global_force_factor*uinf\n",
+    "for iblade in range(nblades):\n",
+    "    for inode in range(len(r[iblade])):\n",
+    "        forces[iblade][inode, 0] *= 0. # Discard the spanwise component\n",
+    "\n",
+    "        node_global_index = nodes_num[iblade][inode]\n",
+    "        ielem = sharpy_output.structure.node_master_elem[node_global_index, 0]\n",
+    "        inode_in_elem = sharpy_output.structure.node_master_elem[node_global_index, 1]\n",
+    "        CAB = algebra.crv2rotation(tstep.psi[ielem, inode_in_elem, :])\n",
+    "\n",
+    "        c[iblade][inode] = sharpy_output.aero.aero_dict['chord'][ielem,inode_in_elem]\n",
+    "\n",
+    "        forces_AFoR = np.dot(CAB, forces[iblade][inode, 0:3])\n",
+    "\n",
+    "        CN_drR[iblade][inode] = forces_AFoR[2]/dr[iblade][inode]*R / global_force_factor\n",
+    "        CTan_drR[iblade][inode] = np.linalg.norm(forces_AFoR[0:2])/dr[iblade][inode]*R  / global_force_factor\n",
+    "        CP_drR[iblade][inode] = np.linalg.norm(forces_AFoR[0:2])/dr[iblade][inode]*R  * r[iblade][inode]*rotation_velocity / global_power_factor\n",
+    "\n",
+    "    Cp += np.sum(CP_drR[iblade]*dr[iblade]/R)\n",
+    "    Ct += np.sum(CN_drR[iblade]*dr[iblade]/R)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Results"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Plot of the loads along the blade"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/svg+xml": [
+       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
+       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
+       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
+       "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
+       "<svg height=\"207.83625pt\" version=\"1.1\" viewBox=\"0 0 720.58125 207.83625\" width=\"720.58125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
+       " <defs>\n",
+       "  <style type=\"text/css\">\n",
+       "*{stroke-linecap:butt;stroke-linejoin:round;}\n",
+       "  </style>\n",
+       " </defs>\n",
+       " <g id=\"figure_1\">\n",
+       "  <g id=\"patch_1\">\n",
+       "   <path d=\"M 0 207.83625 \n",
+       "L 720.58125 207.83625 \n",
+       "L 720.58125 0 \n",
+       "L 0 0 \n",
+       "z\n",
+       "\" style=\"fill:none;\"/>\n",
+       "  </g>\n",
+       "  <g id=\"axes_1\">\n",
+       "   <g id=\"patch_2\">\n",
+       "    <path d=\"M 43.78125 170.28 \n",
+       "L 348.144886 170.28 \n",
+       "L 348.144886 7.2 \n",
+       "L 43.78125 7.2 \n",
+       "z\n",
+       "\" style=\"fill:#ffffff;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"matplotlib.axis_1\">\n",
+       "    <g id=\"xtick_1\">\n",
+       "     <g id=\"line2d_1\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 57.615961 170.28 \n",
+       "L 57.615961 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_2\">\n",
+       "      <defs>\n",
+       "       <path d=\"M 0 0 \n",
+       "L 0 3.5 \n",
+       "\" id=\"m6e3d9edeb4\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
+       "      </defs>\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"57.615961\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_1\">\n",
+       "      <!-- 0.0 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 31.78125 66.40625 \n",
+       "Q 24.171875 66.40625 20.328125 58.90625 \n",
+       "Q 16.5 51.421875 16.5 36.375 \n",
+       "Q 16.5 21.390625 20.328125 13.890625 \n",
+       "Q 24.171875 6.390625 31.78125 6.390625 \n",
+       "Q 39.453125 6.390625 43.28125 13.890625 \n",
+       "Q 47.125 21.390625 47.125 36.375 \n",
+       "Q 47.125 51.421875 43.28125 58.90625 \n",
+       "Q 39.453125 66.40625 31.78125 66.40625 \n",
+       "z\n",
+       "M 31.78125 74.21875 \n",
+       "Q 44.046875 74.21875 50.515625 64.515625 \n",
+       "Q 56.984375 54.828125 56.984375 36.375 \n",
+       "Q 56.984375 17.96875 50.515625 8.265625 \n",
+       "Q 44.046875 -1.421875 31.78125 -1.421875 \n",
+       "Q 19.53125 -1.421875 13.0625 8.265625 \n",
+       "Q 6.59375 17.96875 6.59375 36.375 \n",
+       "Q 6.59375 54.828125 13.0625 64.515625 \n",
+       "Q 19.53125 74.21875 31.78125 74.21875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-48\"/>\n",
+       "       <path d=\"M 10.6875 12.40625 \n",
+       "L 21 12.40625 \n",
+       "L 21 0 \n",
+       "L 10.6875 0 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-46\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(49.664398 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_2\">\n",
+       "     <g id=\"line2d_3\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 112.954804 170.28 \n",
+       "L 112.954804 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_4\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"112.954804\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_2\">\n",
+       "      <!-- 0.2 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 19.1875 8.296875 \n",
+       "L 53.609375 8.296875 \n",
+       "L 53.609375 0 \n",
+       "L 7.328125 0 \n",
+       "L 7.328125 8.296875 \n",
+       "Q 12.9375 14.109375 22.625 23.890625 \n",
+       "Q 32.328125 33.6875 34.8125 36.53125 \n",
+       "Q 39.546875 41.84375 41.421875 45.53125 \n",
+       "Q 43.3125 49.21875 43.3125 52.78125 \n",
+       "Q 43.3125 58.59375 39.234375 62.25 \n",
+       "Q 35.15625 65.921875 28.609375 65.921875 \n",
+       "Q 23.96875 65.921875 18.8125 64.3125 \n",
+       "Q 13.671875 62.703125 7.8125 59.421875 \n",
+       "L 7.8125 69.390625 \n",
+       "Q 13.765625 71.78125 18.9375 73 \n",
+       "Q 24.125 74.21875 28.421875 74.21875 \n",
+       "Q 39.75 74.21875 46.484375 68.546875 \n",
+       "Q 53.21875 62.890625 53.21875 53.421875 \n",
+       "Q 53.21875 48.921875 51.53125 44.890625 \n",
+       "Q 49.859375 40.875 45.40625 35.40625 \n",
+       "Q 44.1875 33.984375 37.640625 27.21875 \n",
+       "Q 31.109375 20.453125 19.1875 8.296875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-50\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(105.003241 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_3\">\n",
+       "     <g id=\"line2d_5\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 168.293647 170.28 \n",
+       "L 168.293647 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_6\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"168.293647\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_3\">\n",
+       "      <!-- 0.4 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 37.796875 64.3125 \n",
+       "L 12.890625 25.390625 \n",
+       "L 37.796875 25.390625 \n",
+       "z\n",
+       "M 35.203125 72.90625 \n",
+       "L 47.609375 72.90625 \n",
+       "L 47.609375 25.390625 \n",
+       "L 58.015625 25.390625 \n",
+       "L 58.015625 17.1875 \n",
+       "L 47.609375 17.1875 \n",
+       "L 47.609375 0 \n",
+       "L 37.796875 0 \n",
+       "L 37.796875 17.1875 \n",
+       "L 4.890625 17.1875 \n",
+       "L 4.890625 26.703125 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-52\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(160.342084 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_4\">\n",
+       "     <g id=\"line2d_7\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 223.63249 170.28 \n",
+       "L 223.63249 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_8\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"223.63249\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_4\">\n",
+       "      <!-- 0.6 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 33.015625 40.375 \n",
+       "Q 26.375 40.375 22.484375 35.828125 \n",
+       "Q 18.609375 31.296875 18.609375 23.390625 \n",
+       "Q 18.609375 15.53125 22.484375 10.953125 \n",
+       "Q 26.375 6.390625 33.015625 6.390625 \n",
+       "Q 39.65625 6.390625 43.53125 10.953125 \n",
+       "Q 47.40625 15.53125 47.40625 23.390625 \n",
+       "Q 47.40625 31.296875 43.53125 35.828125 \n",
+       "Q 39.65625 40.375 33.015625 40.375 \n",
+       "z\n",
+       "M 52.59375 71.296875 \n",
+       "L 52.59375 62.3125 \n",
+       "Q 48.875 64.0625 45.09375 64.984375 \n",
+       "Q 41.3125 65.921875 37.59375 65.921875 \n",
+       "Q 27.828125 65.921875 22.671875 59.328125 \n",
+       "Q 17.53125 52.734375 16.796875 39.40625 \n",
+       "Q 19.671875 43.65625 24.015625 45.921875 \n",
+       "Q 28.375 48.1875 33.59375 48.1875 \n",
+       "Q 44.578125 48.1875 50.953125 41.515625 \n",
+       "Q 57.328125 34.859375 57.328125 23.390625 \n",
+       "Q 57.328125 12.15625 50.6875 5.359375 \n",
+       "Q 44.046875 -1.421875 33.015625 -1.421875 \n",
+       "Q 20.359375 -1.421875 13.671875 8.265625 \n",
+       "Q 6.984375 17.96875 6.984375 36.375 \n",
+       "Q 6.984375 53.65625 15.1875 63.9375 \n",
+       "Q 23.390625 74.21875 37.203125 74.21875 \n",
+       "Q 40.921875 74.21875 44.703125 73.484375 \n",
+       "Q 48.484375 72.75 52.59375 71.296875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-54\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(215.680927 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_5\">\n",
+       "     <g id=\"line2d_9\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 278.971333 170.28 \n",
+       "L 278.971333 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_10\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"278.971333\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_5\">\n",
+       "      <!-- 0.8 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 31.78125 34.625 \n",
+       "Q 24.75 34.625 20.71875 30.859375 \n",
+       "Q 16.703125 27.09375 16.703125 20.515625 \n",
+       "Q 16.703125 13.921875 20.71875 10.15625 \n",
+       "Q 24.75 6.390625 31.78125 6.390625 \n",
+       "Q 38.8125 6.390625 42.859375 10.171875 \n",
+       "Q 46.921875 13.96875 46.921875 20.515625 \n",
+       "Q 46.921875 27.09375 42.890625 30.859375 \n",
+       "Q 38.875 34.625 31.78125 34.625 \n",
+       "z\n",
+       "M 21.921875 38.8125 \n",
+       "Q 15.578125 40.375 12.03125 44.71875 \n",
+       "Q 8.5 49.078125 8.5 55.328125 \n",
+       "Q 8.5 64.0625 14.71875 69.140625 \n",
+       "Q 20.953125 74.21875 31.78125 74.21875 \n",
+       "Q 42.671875 74.21875 48.875 69.140625 \n",
+       "Q 55.078125 64.0625 55.078125 55.328125 \n",
+       "Q 55.078125 49.078125 51.53125 44.71875 \n",
+       "Q 48 40.375 41.703125 38.8125 \n",
+       "Q 48.828125 37.15625 52.796875 32.3125 \n",
+       "Q 56.78125 27.484375 56.78125 20.515625 \n",
+       "Q 56.78125 9.90625 50.3125 4.234375 \n",
+       "Q 43.84375 -1.421875 31.78125 -1.421875 \n",
+       "Q 19.734375 -1.421875 13.25 4.234375 \n",
+       "Q 6.78125 9.90625 6.78125 20.515625 \n",
+       "Q 6.78125 27.484375 10.78125 32.3125 \n",
+       "Q 14.796875 37.15625 21.921875 38.8125 \n",
+       "z\n",
+       "M 18.3125 54.390625 \n",
+       "Q 18.3125 48.734375 21.84375 45.5625 \n",
+       "Q 25.390625 42.390625 31.78125 42.390625 \n",
+       "Q 38.140625 42.390625 41.71875 45.5625 \n",
+       "Q 45.3125 48.734375 45.3125 54.390625 \n",
+       "Q 45.3125 60.0625 41.71875 63.234375 \n",
+       "Q 38.140625 66.40625 31.78125 66.40625 \n",
+       "Q 25.390625 66.40625 21.84375 63.234375 \n",
+       "Q 18.3125 60.0625 18.3125 54.390625 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-56\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(271.01977 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_6\">\n",
+       "     <g id=\"line2d_11\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 334.310176 170.28 \n",
+       "L 334.310176 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_12\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"334.310176\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_6\">\n",
+       "      <!-- 1.0 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 12.40625 8.296875 \n",
+       "L 28.515625 8.296875 \n",
+       "L 28.515625 63.921875 \n",
+       "L 10.984375 60.40625 \n",
+       "L 10.984375 69.390625 \n",
+       "L 28.421875 72.90625 \n",
+       "L 38.28125 72.90625 \n",
+       "L 38.28125 8.296875 \n",
+       "L 54.390625 8.296875 \n",
+       "L 54.390625 0 \n",
+       "L 12.40625 0 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-49\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(326.358613 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-49\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"text_7\">\n",
+       "     <!-- r/R [-] -->\n",
+       "     <defs>\n",
+       "      <path d=\"M 41.109375 46.296875 \n",
+       "Q 39.59375 47.171875 37.8125 47.578125 \n",
+       "Q 36.03125 48 33.890625 48 \n",
+       "Q 26.265625 48 22.1875 43.046875 \n",
+       "Q 18.109375 38.09375 18.109375 28.8125 \n",
+       "L 18.109375 0 \n",
+       "L 9.078125 0 \n",
+       "L 9.078125 54.6875 \n",
+       "L 18.109375 54.6875 \n",
+       "L 18.109375 46.1875 \n",
+       "Q 20.953125 51.171875 25.484375 53.578125 \n",
+       "Q 30.03125 56 36.53125 56 \n",
+       "Q 37.453125 56 38.578125 55.875 \n",
+       "Q 39.703125 55.765625 41.0625 55.515625 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-114\"/>\n",
+       "      <path d=\"M 25.390625 72.90625 \n",
+       "L 33.6875 72.90625 \n",
+       "L 8.296875 -9.28125 \n",
+       "L 0 -9.28125 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-47\"/>\n",
+       "      <path d=\"M 44.390625 34.1875 \n",
+       "Q 47.5625 33.109375 50.5625 29.59375 \n",
+       "Q 53.5625 26.078125 56.59375 19.921875 \n",
+       "L 66.609375 0 \n",
+       "L 56 0 \n",
+       "L 46.6875 18.703125 \n",
+       "Q 43.0625 26.03125 39.671875 28.421875 \n",
+       "Q 36.28125 30.8125 30.421875 30.8125 \n",
+       "L 19.671875 30.8125 \n",
+       "L 19.671875 0 \n",
+       "L 9.8125 0 \n",
+       "L 9.8125 72.90625 \n",
+       "L 32.078125 72.90625 \n",
+       "Q 44.578125 72.90625 50.734375 67.671875 \n",
+       "Q 56.890625 62.453125 56.890625 51.90625 \n",
+       "Q 56.890625 45.015625 53.6875 40.46875 \n",
+       "Q 50.484375 35.9375 44.390625 34.1875 \n",
+       "z\n",
+       "M 19.671875 64.796875 \n",
+       "L 19.671875 38.921875 \n",
+       "L 32.078125 38.921875 \n",
+       "Q 39.203125 38.921875 42.84375 42.21875 \n",
+       "Q 46.484375 45.515625 46.484375 51.90625 \n",
+       "Q 46.484375 58.296875 42.84375 61.546875 \n",
+       "Q 39.203125 64.796875 32.078125 64.796875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-82\"/>\n",
+       "      <path id=\"DejaVuSans-32\"/>\n",
+       "      <path d=\"M 8.59375 75.984375 \n",
+       "L 29.296875 75.984375 \n",
+       "L 29.296875 69 \n",
+       "L 17.578125 69 \n",
+       "L 17.578125 -6.203125 \n",
+       "L 29.296875 -6.203125 \n",
+       "L 29.296875 -13.1875 \n",
+       "L 8.59375 -13.1875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-91\"/>\n",
+       "      <path d=\"M 4.890625 31.390625 \n",
+       "L 31.203125 31.390625 \n",
+       "L 31.203125 23.390625 \n",
+       "L 4.890625 23.390625 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-45\"/>\n",
+       "      <path d=\"M 30.421875 75.984375 \n",
+       "L 30.421875 -13.1875 \n",
+       "L 9.71875 -13.1875 \n",
+       "L 9.71875 -6.203125 \n",
+       "L 21.390625 -6.203125 \n",
+       "L 21.390625 69 \n",
+       "L 9.71875 69 \n",
+       "L 9.71875 75.984375 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-93\"/>\n",
+       "     </defs>\n",
+       "     <g transform=\"translate(181.454474 198.556563)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-114\"/>\n",
+       "      <use x=\"41.113281\" xlink:href=\"#DejaVuSans-47\"/>\n",
+       "      <use x=\"74.804688\" xlink:href=\"#DejaVuSans-82\"/>\n",
+       "      <use x=\"144.287109\" xlink:href=\"#DejaVuSans-32\"/>\n",
+       "      <use x=\"176.074219\" xlink:href=\"#DejaVuSans-91\"/>\n",
+       "      <use x=\"215.087891\" xlink:href=\"#DejaVuSans-45\"/>\n",
+       "      <use x=\"251.171875\" xlink:href=\"#DejaVuSans-93\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "   </g>\n",
+       "   <g id=\"matplotlib.axis_2\">\n",
+       "    <g id=\"ytick_1\">\n",
+       "     <g id=\"line2d_13\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 43.78125 162.867273 \n",
+       "L 348.144886 162.867273 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_14\">\n",
+       "      <defs>\n",
+       "       <path d=\"M 0 0 \n",
+       "L -3.5 0 \n",
+       "\" id=\"m60ac5f1668\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
+       "      </defs>\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m60ac5f1668\" y=\"162.867273\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_8\">\n",
+       "      <!-- 0.0 -->\n",
+       "      <g transform=\"translate(20.878125 166.666491)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_2\">\n",
+       "     <g id=\"line2d_15\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 43.78125 129.747022 \n",
+       "L 348.144886 129.747022 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_16\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m60ac5f1668\" y=\"129.747022\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_9\">\n",
+       "      <!-- 0.1 -->\n",
+       "      <g transform=\"translate(20.878125 133.546241)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-49\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_3\">\n",
+       "     <g id=\"line2d_17\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 43.78125 96.626771 \n",
+       "L 348.144886 96.626771 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_18\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m60ac5f1668\" y=\"96.626771\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_10\">\n",
+       "      <!-- 0.2 -->\n",
+       "      <g transform=\"translate(20.878125 100.42599)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_4\">\n",
+       "     <g id=\"line2d_19\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 43.78125 63.506521 \n",
+       "L 348.144886 63.506521 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_20\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m60ac5f1668\" y=\"63.506521\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_11\">\n",
+       "      <!-- 0.3 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 40.578125 39.3125 \n",
+       "Q 47.65625 37.796875 51.625 33 \n",
+       "Q 55.609375 28.21875 55.609375 21.1875 \n",
+       "Q 55.609375 10.40625 48.1875 4.484375 \n",
+       "Q 40.765625 -1.421875 27.09375 -1.421875 \n",
+       "Q 22.515625 -1.421875 17.65625 -0.515625 \n",
+       "Q 12.796875 0.390625 7.625 2.203125 \n",
+       "L 7.625 11.71875 \n",
+       "Q 11.71875 9.328125 16.59375 8.109375 \n",
+       "Q 21.484375 6.890625 26.8125 6.890625 \n",
+       "Q 36.078125 6.890625 40.9375 10.546875 \n",
+       "Q 45.796875 14.203125 45.796875 21.1875 \n",
+       "Q 45.796875 27.640625 41.28125 31.265625 \n",
+       "Q 36.765625 34.90625 28.71875 34.90625 \n",
+       "L 20.21875 34.90625 \n",
+       "L 20.21875 43.015625 \n",
+       "L 29.109375 43.015625 \n",
+       "Q 36.375 43.015625 40.234375 45.921875 \n",
+       "Q 44.09375 48.828125 44.09375 54.296875 \n",
+       "Q 44.09375 59.90625 40.109375 62.90625 \n",
+       "Q 36.140625 65.921875 28.71875 65.921875 \n",
+       "Q 24.65625 65.921875 20.015625 65.03125 \n",
+       "Q 15.375 64.15625 9.8125 62.3125 \n",
+       "L 9.8125 71.09375 \n",
+       "Q 15.4375 72.65625 20.34375 73.4375 \n",
+       "Q 25.25 74.21875 29.59375 74.21875 \n",
+       "Q 40.828125 74.21875 47.359375 69.109375 \n",
+       "Q 53.90625 64.015625 53.90625 55.328125 \n",
+       "Q 53.90625 49.265625 50.4375 45.09375 \n",
+       "Q 46.96875 40.921875 40.578125 39.3125 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-51\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(20.878125 67.305739)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-51\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_5\">\n",
+       "     <g id=\"line2d_21\">\n",
+       "      <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 43.78125 30.38627 \n",
+       "L 348.144886 30.38627 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_22\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m60ac5f1668\" y=\"30.38627\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_12\">\n",
+       "      <!-- 0.4 -->\n",
+       "      <g transform=\"translate(20.878125 34.185489)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"text_13\">\n",
+       "     <!-- CN/d(r/R) [-] -->\n",
+       "     <defs>\n",
+       "      <path d=\"M 64.40625 67.28125 \n",
+       "L 64.40625 56.890625 \n",
+       "Q 59.421875 61.53125 53.78125 63.8125 \n",
+       "Q 48.140625 66.109375 41.796875 66.109375 \n",
+       "Q 29.296875 66.109375 22.65625 58.46875 \n",
+       "Q 16.015625 50.828125 16.015625 36.375 \n",
+       "Q 16.015625 21.96875 22.65625 14.328125 \n",
+       "Q 29.296875 6.6875 41.796875 6.6875 \n",
+       "Q 48.140625 6.6875 53.78125 8.984375 \n",
+       "Q 59.421875 11.28125 64.40625 15.921875 \n",
+       "L 64.40625 5.609375 \n",
+       "Q 59.234375 2.09375 53.4375 0.328125 \n",
+       "Q 47.65625 -1.421875 41.21875 -1.421875 \n",
+       "Q 24.65625 -1.421875 15.125 8.703125 \n",
+       "Q 5.609375 18.84375 5.609375 36.375 \n",
+       "Q 5.609375 53.953125 15.125 64.078125 \n",
+       "Q 24.65625 74.21875 41.21875 74.21875 \n",
+       "Q 47.75 74.21875 53.53125 72.484375 \n",
+       "Q 59.328125 70.75 64.40625 67.28125 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-67\"/>\n",
+       "      <path d=\"M 9.8125 72.90625 \n",
+       "L 23.09375 72.90625 \n",
+       "L 55.421875 11.921875 \n",
+       "L 55.421875 72.90625 \n",
+       "L 64.984375 72.90625 \n",
+       "L 64.984375 0 \n",
+       "L 51.703125 0 \n",
+       "L 19.390625 60.984375 \n",
+       "L 19.390625 0 \n",
+       "L 9.8125 0 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-78\"/>\n",
+       "      <path d=\"M 45.40625 46.390625 \n",
+       "L 45.40625 75.984375 \n",
+       "L 54.390625 75.984375 \n",
+       "L 54.390625 0 \n",
+       "L 45.40625 0 \n",
+       "L 45.40625 8.203125 \n",
+       "Q 42.578125 3.328125 38.25 0.953125 \n",
+       "Q 33.9375 -1.421875 27.875 -1.421875 \n",
+       "Q 17.96875 -1.421875 11.734375 6.484375 \n",
+       "Q 5.515625 14.40625 5.515625 27.296875 \n",
+       "Q 5.515625 40.1875 11.734375 48.09375 \n",
+       "Q 17.96875 56 27.875 56 \n",
+       "Q 33.9375 56 38.25 53.625 \n",
+       "Q 42.578125 51.265625 45.40625 46.390625 \n",
+       "z\n",
+       "M 14.796875 27.296875 \n",
+       "Q 14.796875 17.390625 18.875 11.75 \n",
+       "Q 22.953125 6.109375 30.078125 6.109375 \n",
+       "Q 37.203125 6.109375 41.296875 11.75 \n",
+       "Q 45.40625 17.390625 45.40625 27.296875 \n",
+       "Q 45.40625 37.203125 41.296875 42.84375 \n",
+       "Q 37.203125 48.484375 30.078125 48.484375 \n",
+       "Q 22.953125 48.484375 18.875 42.84375 \n",
+       "Q 14.796875 37.203125 14.796875 27.296875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-100\"/>\n",
+       "      <path d=\"M 31 75.875 \n",
+       "Q 24.46875 64.65625 21.28125 53.65625 \n",
+       "Q 18.109375 42.671875 18.109375 31.390625 \n",
+       "Q 18.109375 20.125 21.3125 9.0625 \n",
+       "Q 24.515625 -2 31 -13.1875 \n",
+       "L 23.1875 -13.1875 \n",
+       "Q 15.875 -1.703125 12.234375 9.375 \n",
+       "Q 8.59375 20.453125 8.59375 31.390625 \n",
+       "Q 8.59375 42.28125 12.203125 53.3125 \n",
+       "Q 15.828125 64.359375 23.1875 75.875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-40\"/>\n",
+       "      <path d=\"M 8.015625 75.875 \n",
+       "L 15.828125 75.875 \n",
+       "Q 23.140625 64.359375 26.78125 53.3125 \n",
+       "Q 30.421875 42.28125 30.421875 31.390625 \n",
+       "Q 30.421875 20.453125 26.78125 9.375 \n",
+       "Q 23.140625 -1.703125 15.828125 -13.1875 \n",
+       "L 8.015625 -13.1875 \n",
+       "Q 14.5 -2 17.703125 9.0625 \n",
+       "Q 20.90625 20.125 20.90625 31.390625 \n",
+       "Q 20.90625 42.671875 17.703125 53.65625 \n",
+       "Q 14.5 64.65625 8.015625 75.875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-41\"/>\n",
+       "     </defs>\n",
+       "     <g transform=\"translate(14.798438 119.240781)rotate(-90)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-67\"/>\n",
+       "      <use x=\"69.824219\" xlink:href=\"#DejaVuSans-78\"/>\n",
+       "      <use x=\"144.628906\" xlink:href=\"#DejaVuSans-47\"/>\n",
+       "      <use x=\"178.320312\" xlink:href=\"#DejaVuSans-100\"/>\n",
+       "      <use x=\"241.796875\" xlink:href=\"#DejaVuSans-40\"/>\n",
+       "      <use x=\"280.810547\" xlink:href=\"#DejaVuSans-114\"/>\n",
+       "      <use x=\"321.923828\" xlink:href=\"#DejaVuSans-47\"/>\n",
+       "      <use x=\"355.615234\" xlink:href=\"#DejaVuSans-82\"/>\n",
+       "      <use x=\"425.097656\" xlink:href=\"#DejaVuSans-41\"/>\n",
+       "      <use x=\"464.111328\" xlink:href=\"#DejaVuSans-32\"/>\n",
+       "      <use x=\"495.898438\" xlink:href=\"#DejaVuSans-91\"/>\n",
+       "      <use x=\"534.912109\" xlink:href=\"#DejaVuSans-45\"/>\n",
+       "      <use x=\"570.996094\" xlink:href=\"#DejaVuSans-93\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "   </g>\n",
+       "   <g id=\"line2d_23\">\n",
+       "    <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 57.615961 162.867273 \n",
+       "L 73.130329 162.867273 \n",
+       "L 88.595884 151.198309 \n",
+       "L 103.963964 136.634632 \n",
+       "L 119.186216 128.573349 \n",
+       "L 126.789514 118.267999 \n",
+       "L 149.002266 112.315897 \n",
+       "L 163.502253 100.781432 \n",
+       "L 182.128357 93.633305 \n",
+       "L 191.458178 83.798905 \n",
+       "L 204.826158 76.740354 \n",
+       "L 217.730961 68.28959 \n",
+       "L 230.131982 59.797073 \n",
+       "L 241.990204 51.604997 \n",
+       "L 253.268316 43.766327 \n",
+       "L 265.136622 37.507221 \n",
+       "L 273.944209 31.387125 \n",
+       "L 283.276935 26.902704 \n",
+       "L 291.899648 23.217086 \n",
+       "L 299.785218 21.080717 \n",
+       "L 306.908834 21.163383 \n",
+       "L 313.248083 24.028153 \n",
+       "L 317.708523 32.386809 \n",
+       "L 323.496225 42.364374 \n",
+       "L 327.372874 57.246164 \n",
+       "L 330.400768 71.982645 \n",
+       "L 332.57038 89.376094 \n",
+       "L 333.874884 109.07552 \n",
+       "L 334.310176 133.385298 \n",
+       "\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"line2d_24\">\n",
+       "    <path clip-path=\"url(#p19e32ab1d1)\" d=\"M 113.392966 134.313 \n",
+       "L 144.141866 114.220659 \n",
+       "L 170.490732 98.795658 \n",
+       "L 223.193874 65.403284 \n",
+       "L 249.545429 43.622354 \n",
+       "L 293.4647 17.970932 \n",
+       "L 306.640477 14.612727 \n",
+       "L 322.012244 34.230749 \n",
+       "L 330.796087 64.226962 \n",
+       "L 334.310176 162.867273 \n",
+       "\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_3\">\n",
+       "    <path d=\"M 43.78125 170.28 \n",
+       "L 43.78125 7.2 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_4\">\n",
+       "    <path d=\"M 348.144886 170.28 \n",
+       "L 348.144886 7.2 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_5\">\n",
+       "    <path d=\"M 43.78125 170.28 \n",
+       "L 348.144886 170.28 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_6\">\n",
+       "    <path d=\"M 43.78125 7.2 \n",
+       "L 348.144886 7.2 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"legend_1\">\n",
+       "    <g id=\"patch_7\">\n",
+       "     <path d=\"M 50.78125 44.55625 \n",
+       "L 134.526563 44.55625 \n",
+       "Q 136.526563 44.55625 136.526563 42.55625 \n",
+       "L 136.526563 14.2 \n",
+       "Q 136.526563 12.2 134.526563 12.2 \n",
+       "L 50.78125 12.2 \n",
+       "Q 48.78125 12.2 48.78125 14.2 \n",
+       "L 48.78125 42.55625 \n",
+       "Q 48.78125 44.55625 50.78125 44.55625 \n",
+       "z\n",
+       "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_25\">\n",
+       "     <path d=\"M 52.78125 20.298437 \n",
+       "L 72.78125 20.298437 \n",
+       "\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_26\"/>\n",
+       "    <g id=\"text_14\">\n",
+       "     <!-- SHARPy -->\n",
+       "     <defs>\n",
+       "      <path d=\"M 53.515625 70.515625 \n",
+       "L 53.515625 60.890625 \n",
+       "Q 47.90625 63.578125 42.921875 64.890625 \n",
+       "Q 37.9375 66.21875 33.296875 66.21875 \n",
+       "Q 25.25 66.21875 20.875 63.09375 \n",
+       "Q 16.5 59.96875 16.5 54.203125 \n",
+       "Q 16.5 49.359375 19.40625 46.890625 \n",
+       "Q 22.3125 44.4375 30.421875 42.921875 \n",
+       "L 36.375 41.703125 \n",
+       "Q 47.40625 39.59375 52.65625 34.296875 \n",
+       "Q 57.90625 29 57.90625 20.125 \n",
+       "Q 57.90625 9.515625 50.796875 4.046875 \n",
+       "Q 43.703125 -1.421875 29.984375 -1.421875 \n",
+       "Q 24.8125 -1.421875 18.96875 -0.25 \n",
+       "Q 13.140625 0.921875 6.890625 3.21875 \n",
+       "L 6.890625 13.375 \n",
+       "Q 12.890625 10.015625 18.65625 8.296875 \n",
+       "Q 24.421875 6.59375 29.984375 6.59375 \n",
+       "Q 38.421875 6.59375 43.015625 9.90625 \n",
+       "Q 47.609375 13.234375 47.609375 19.390625 \n",
+       "Q 47.609375 24.75 44.3125 27.78125 \n",
+       "Q 41.015625 30.8125 33.5 32.328125 \n",
+       "L 27.484375 33.5 \n",
+       "Q 16.453125 35.6875 11.515625 40.375 \n",
+       "Q 6.59375 45.0625 6.59375 53.421875 \n",
+       "Q 6.59375 63.09375 13.40625 68.65625 \n",
+       "Q 20.21875 74.21875 32.171875 74.21875 \n",
+       "Q 37.3125 74.21875 42.625 73.28125 \n",
+       "Q 47.953125 72.359375 53.515625 70.515625 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-83\"/>\n",
+       "      <path d=\"M 9.8125 72.90625 \n",
+       "L 19.671875 72.90625 \n",
+       "L 19.671875 43.015625 \n",
+       "L 55.515625 43.015625 \n",
+       "L 55.515625 72.90625 \n",
+       "L 65.375 72.90625 \n",
+       "L 65.375 0 \n",
+       "L 55.515625 0 \n",
+       "L 55.515625 34.71875 \n",
+       "L 19.671875 34.71875 \n",
+       "L 19.671875 0 \n",
+       "L 9.8125 0 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-72\"/>\n",
+       "      <path d=\"M 34.1875 63.1875 \n",
+       "L 20.796875 26.90625 \n",
+       "L 47.609375 26.90625 \n",
+       "z\n",
+       "M 28.609375 72.90625 \n",
+       "L 39.796875 72.90625 \n",
+       "L 67.578125 0 \n",
+       "L 57.328125 0 \n",
+       "L 50.6875 18.703125 \n",
+       "L 17.828125 18.703125 \n",
+       "L 11.1875 0 \n",
+       "L 0.78125 0 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-65\"/>\n",
+       "      <path d=\"M 19.671875 64.796875 \n",
+       "L 19.671875 37.40625 \n",
+       "L 32.078125 37.40625 \n",
+       "Q 38.96875 37.40625 42.71875 40.96875 \n",
+       "Q 46.484375 44.53125 46.484375 51.125 \n",
+       "Q 46.484375 57.671875 42.71875 61.234375 \n",
+       "Q 38.96875 64.796875 32.078125 64.796875 \n",
+       "z\n",
+       "M 9.8125 72.90625 \n",
+       "L 32.078125 72.90625 \n",
+       "Q 44.34375 72.90625 50.609375 67.359375 \n",
+       "Q 56.890625 61.8125 56.890625 51.125 \n",
+       "Q 56.890625 40.328125 50.609375 34.8125 \n",
+       "Q 44.34375 29.296875 32.078125 29.296875 \n",
+       "L 19.671875 29.296875 \n",
+       "L 19.671875 0 \n",
+       "L 9.8125 0 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-80\"/>\n",
+       "      <path d=\"M 32.171875 -5.078125 \n",
+       "Q 28.375 -14.84375 24.75 -17.8125 \n",
+       "Q 21.140625 -20.796875 15.09375 -20.796875 \n",
+       "L 7.90625 -20.796875 \n",
+       "L 7.90625 -13.28125 \n",
+       "L 13.1875 -13.28125 \n",
+       "Q 16.890625 -13.28125 18.9375 -11.515625 \n",
+       "Q 21 -9.765625 23.484375 -3.21875 \n",
+       "L 25.09375 0.875 \n",
+       "L 2.984375 54.6875 \n",
+       "L 12.5 54.6875 \n",
+       "L 29.59375 11.921875 \n",
+       "L 46.6875 54.6875 \n",
+       "L 56.203125 54.6875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-121\"/>\n",
+       "     </defs>\n",
+       "     <g transform=\"translate(80.78125 23.798437)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-83\"/>\n",
+       "      <use x=\"63.476562\" xlink:href=\"#DejaVuSans-72\"/>\n",
+       "      <use x=\"138.671875\" xlink:href=\"#DejaVuSans-65\"/>\n",
+       "      <use x=\"207.080078\" xlink:href=\"#DejaVuSans-82\"/>\n",
+       "      <use x=\"276.5625\" xlink:href=\"#DejaVuSans-80\"/>\n",
+       "      <use x=\"336.865234\" xlink:href=\"#DejaVuSans-121\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_27\">\n",
+       "     <path d=\"M 52.78125 34.976562 \n",
+       "L 72.78125 34.976562 \n",
+       "\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_28\"/>\n",
+       "    <g id=\"text_15\">\n",
+       "     <!-- OpenFAST -->\n",
+       "     <defs>\n",
+       "      <path d=\"M 39.40625 66.21875 \n",
+       "Q 28.65625 66.21875 22.328125 58.203125 \n",
+       "Q 16.015625 50.203125 16.015625 36.375 \n",
+       "Q 16.015625 22.609375 22.328125 14.59375 \n",
+       "Q 28.65625 6.59375 39.40625 6.59375 \n",
+       "Q 50.140625 6.59375 56.421875 14.59375 \n",
+       "Q 62.703125 22.609375 62.703125 36.375 \n",
+       "Q 62.703125 50.203125 56.421875 58.203125 \n",
+       "Q 50.140625 66.21875 39.40625 66.21875 \n",
+       "z\n",
+       "M 39.40625 74.21875 \n",
+       "Q 54.734375 74.21875 63.90625 63.9375 \n",
+       "Q 73.09375 53.65625 73.09375 36.375 \n",
+       "Q 73.09375 19.140625 63.90625 8.859375 \n",
+       "Q 54.734375 -1.421875 39.40625 -1.421875 \n",
+       "Q 24.03125 -1.421875 14.8125 8.828125 \n",
+       "Q 5.609375 19.09375 5.609375 36.375 \n",
+       "Q 5.609375 53.65625 14.8125 63.9375 \n",
+       "Q 24.03125 74.21875 39.40625 74.21875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-79\"/>\n",
+       "      <path d=\"M 18.109375 8.203125 \n",
+       "L 18.109375 -20.796875 \n",
+       "L 9.078125 -20.796875 \n",
+       "L 9.078125 54.6875 \n",
+       "L 18.109375 54.6875 \n",
+       "L 18.109375 46.390625 \n",
+       "Q 20.953125 51.265625 25.265625 53.625 \n",
+       "Q 29.59375 56 35.59375 56 \n",
+       "Q 45.5625 56 51.78125 48.09375 \n",
+       "Q 58.015625 40.1875 58.015625 27.296875 \n",
+       "Q 58.015625 14.40625 51.78125 6.484375 \n",
+       "Q 45.5625 -1.421875 35.59375 -1.421875 \n",
+       "Q 29.59375 -1.421875 25.265625 0.953125 \n",
+       "Q 20.953125 3.328125 18.109375 8.203125 \n",
+       "z\n",
+       "M 48.6875 27.296875 \n",
+       "Q 48.6875 37.203125 44.609375 42.84375 \n",
+       "Q 40.53125 48.484375 33.40625 48.484375 \n",
+       "Q 26.265625 48.484375 22.1875 42.84375 \n",
+       "Q 18.109375 37.203125 18.109375 27.296875 \n",
+       "Q 18.109375 17.390625 22.1875 11.75 \n",
+       "Q 26.265625 6.109375 33.40625 6.109375 \n",
+       "Q 40.53125 6.109375 44.609375 11.75 \n",
+       "Q 48.6875 17.390625 48.6875 27.296875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-112\"/>\n",
+       "      <path d=\"M 56.203125 29.59375 \n",
+       "L 56.203125 25.203125 \n",
+       "L 14.890625 25.203125 \n",
+       "Q 15.484375 15.921875 20.484375 11.0625 \n",
+       "Q 25.484375 6.203125 34.421875 6.203125 \n",
+       "Q 39.59375 6.203125 44.453125 7.46875 \n",
+       "Q 49.3125 8.734375 54.109375 11.28125 \n",
+       "L 54.109375 2.78125 \n",
+       "Q 49.265625 0.734375 44.1875 -0.34375 \n",
+       "Q 39.109375 -1.421875 33.890625 -1.421875 \n",
+       "Q 20.796875 -1.421875 13.15625 6.1875 \n",
+       "Q 5.515625 13.8125 5.515625 26.8125 \n",
+       "Q 5.515625 40.234375 12.765625 48.109375 \n",
+       "Q 20.015625 56 32.328125 56 \n",
+       "Q 43.359375 56 49.78125 48.890625 \n",
+       "Q 56.203125 41.796875 56.203125 29.59375 \n",
+       "z\n",
+       "M 47.21875 32.234375 \n",
+       "Q 47.125 39.59375 43.09375 43.984375 \n",
+       "Q 39.0625 48.390625 32.421875 48.390625 \n",
+       "Q 24.90625 48.390625 20.390625 44.140625 \n",
+       "Q 15.875 39.890625 15.1875 32.171875 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-101\"/>\n",
+       "      <path d=\"M 54.890625 33.015625 \n",
+       "L 54.890625 0 \n",
+       "L 45.90625 0 \n",
+       "L 45.90625 32.71875 \n",
+       "Q 45.90625 40.484375 42.875 44.328125 \n",
+       "Q 39.84375 48.1875 33.796875 48.1875 \n",
+       "Q 26.515625 48.1875 22.3125 43.546875 \n",
+       "Q 18.109375 38.921875 18.109375 30.90625 \n",
+       "L 18.109375 0 \n",
+       "L 9.078125 0 \n",
+       "L 9.078125 54.6875 \n",
+       "L 18.109375 54.6875 \n",
+       "L 18.109375 46.1875 \n",
+       "Q 21.34375 51.125 25.703125 53.5625 \n",
+       "Q 30.078125 56 35.796875 56 \n",
+       "Q 45.21875 56 50.046875 50.171875 \n",
+       "Q 54.890625 44.34375 54.890625 33.015625 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-110\"/>\n",
+       "      <path d=\"M 9.8125 72.90625 \n",
+       "L 51.703125 72.90625 \n",
+       "L 51.703125 64.59375 \n",
+       "L 19.671875 64.59375 \n",
+       "L 19.671875 43.109375 \n",
+       "L 48.578125 43.109375 \n",
+       "L 48.578125 34.8125 \n",
+       "L 19.671875 34.8125 \n",
+       "L 19.671875 0 \n",
+       "L 9.8125 0 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-70\"/>\n",
+       "      <path d=\"M -0.296875 72.90625 \n",
+       "L 61.375 72.90625 \n",
+       "L 61.375 64.59375 \n",
+       "L 35.5 64.59375 \n",
+       "L 35.5 0 \n",
+       "L 25.59375 0 \n",
+       "L 25.59375 64.59375 \n",
+       "L -0.296875 64.59375 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-84\"/>\n",
+       "     </defs>\n",
+       "     <g transform=\"translate(80.78125 38.476562)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-79\"/>\n",
+       "      <use x=\"78.710938\" xlink:href=\"#DejaVuSans-112\"/>\n",
+       "      <use x=\"142.1875\" xlink:href=\"#DejaVuSans-101\"/>\n",
+       "      <use x=\"203.710938\" xlink:href=\"#DejaVuSans-110\"/>\n",
+       "      <use x=\"267.089844\" xlink:href=\"#DejaVuSans-70\"/>\n",
+       "      <use x=\"324.46875\" xlink:href=\"#DejaVuSans-65\"/>\n",
+       "      <use x=\"392.876953\" xlink:href=\"#DejaVuSans-83\"/>\n",
+       "      <use x=\"456.353516\" xlink:href=\"#DejaVuSans-84\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "   </g>\n",
+       "  </g>\n",
+       "  <g id=\"axes_2\">\n",
+       "   <g id=\"patch_8\">\n",
+       "    <path d=\"M 409.017614 170.28 \n",
+       "L 713.38125 170.28 \n",
+       "L 713.38125 7.2 \n",
+       "L 409.017614 7.2 \n",
+       "z\n",
+       "\" style=\"fill:#ffffff;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"matplotlib.axis_3\">\n",
+       "    <g id=\"xtick_7\">\n",
+       "     <g id=\"line2d_29\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 422.852324 170.28 \n",
+       "L 422.852324 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_30\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"422.852324\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_16\">\n",
+       "      <!-- 0.0 -->\n",
+       "      <g transform=\"translate(414.900762 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_8\">\n",
+       "     <g id=\"line2d_31\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 478.191167 170.28 \n",
+       "L 478.191167 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_32\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"478.191167\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_17\">\n",
+       "      <!-- 0.2 -->\n",
+       "      <g transform=\"translate(470.239605 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_9\">\n",
+       "     <g id=\"line2d_33\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 533.53001 170.28 \n",
+       "L 533.53001 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_34\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"533.53001\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_18\">\n",
+       "      <!-- 0.4 -->\n",
+       "      <g transform=\"translate(525.578448 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_10\">\n",
+       "     <g id=\"line2d_35\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 588.868853 170.28 \n",
+       "L 588.868853 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_36\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"588.868853\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_19\">\n",
+       "      <!-- 0.6 -->\n",
+       "      <g transform=\"translate(580.917291 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_11\">\n",
+       "     <g id=\"line2d_37\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 644.207696 170.28 \n",
+       "L 644.207696 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_38\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"644.207696\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_20\">\n",
+       "      <!-- 0.8 -->\n",
+       "      <g transform=\"translate(636.256134 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"xtick_12\">\n",
+       "     <g id=\"line2d_39\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 699.546539 170.28 \n",
+       "L 699.546539 7.2 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_40\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"699.546539\" xlink:href=\"#m6e3d9edeb4\" y=\"170.28\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_21\">\n",
+       "      <!-- 1.0 -->\n",
+       "      <g transform=\"translate(691.594977 184.878438)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-49\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"text_22\">\n",
+       "     <!-- r/R [-] -->\n",
+       "     <g transform=\"translate(546.690838 198.556563)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-114\"/>\n",
+       "      <use x=\"41.113281\" xlink:href=\"#DejaVuSans-47\"/>\n",
+       "      <use x=\"74.804688\" xlink:href=\"#DejaVuSans-82\"/>\n",
+       "      <use x=\"144.287109\" xlink:href=\"#DejaVuSans-32\"/>\n",
+       "      <use x=\"176.074219\" xlink:href=\"#DejaVuSans-91\"/>\n",
+       "      <use x=\"215.087891\" xlink:href=\"#DejaVuSans-45\"/>\n",
+       "      <use x=\"251.171875\" xlink:href=\"#DejaVuSans-93\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "   </g>\n",
+       "   <g id=\"matplotlib.axis_4\">\n",
+       "    <g id=\"ytick_6\">\n",
+       "     <g id=\"line2d_41\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 409.017614 162.867273 \n",
+       "L 713.38125 162.867273 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_42\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m60ac5f1668\" y=\"162.867273\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_23\">\n",
+       "      <!-- 0.00 -->\n",
+       "      <g transform=\"translate(379.751989 166.666491)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_7\">\n",
+       "     <g id=\"line2d_43\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 409.017614 138.65226 \n",
+       "L 713.38125 138.65226 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_44\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m60ac5f1668\" y=\"138.65226\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_24\">\n",
+       "      <!-- 0.01 -->\n",
+       "      <g transform=\"translate(379.751989 142.451479)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-49\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_8\">\n",
+       "     <g id=\"line2d_45\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 409.017614 114.437248 \n",
+       "L 713.38125 114.437248 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_46\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m60ac5f1668\" y=\"114.437248\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_25\">\n",
+       "      <!-- 0.02 -->\n",
+       "      <g transform=\"translate(379.751989 118.236467)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-50\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_9\">\n",
+       "     <g id=\"line2d_47\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 409.017614 90.222236 \n",
+       "L 713.38125 90.222236 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_48\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m60ac5f1668\" y=\"90.222236\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_26\">\n",
+       "      <!-- 0.03 -->\n",
+       "      <g transform=\"translate(379.751989 94.021454)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-51\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_10\">\n",
+       "     <g id=\"line2d_49\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 409.017614 66.007223 \n",
+       "L 713.38125 66.007223 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_50\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m60ac5f1668\" y=\"66.007223\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_27\">\n",
+       "      <!-- 0.04 -->\n",
+       "      <g transform=\"translate(379.751989 69.806442)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-52\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_11\">\n",
+       "     <g id=\"line2d_51\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 409.017614 41.792211 \n",
+       "L 713.38125 41.792211 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_52\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m60ac5f1668\" y=\"41.792211\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_28\">\n",
+       "      <!-- 0.05 -->\n",
+       "      <defs>\n",
+       "       <path d=\"M 10.796875 72.90625 \n",
+       "L 49.515625 72.90625 \n",
+       "L 49.515625 64.59375 \n",
+       "L 19.828125 64.59375 \n",
+       "L 19.828125 46.734375 \n",
+       "Q 21.96875 47.46875 24.109375 47.828125 \n",
+       "Q 26.265625 48.1875 28.421875 48.1875 \n",
+       "Q 40.625 48.1875 47.75 41.5 \n",
+       "Q 54.890625 34.8125 54.890625 23.390625 \n",
+       "Q 54.890625 11.625 47.5625 5.09375 \n",
+       "Q 40.234375 -1.421875 26.90625 -1.421875 \n",
+       "Q 22.3125 -1.421875 17.546875 -0.640625 \n",
+       "Q 12.796875 0.140625 7.71875 1.703125 \n",
+       "L 7.71875 11.625 \n",
+       "Q 12.109375 9.234375 16.796875 8.0625 \n",
+       "Q 21.484375 6.890625 26.703125 6.890625 \n",
+       "Q 35.15625 6.890625 40.078125 11.328125 \n",
+       "Q 45.015625 15.765625 45.015625 23.390625 \n",
+       "Q 45.015625 31 40.078125 35.4375 \n",
+       "Q 35.15625 39.890625 26.703125 39.890625 \n",
+       "Q 22.75 39.890625 18.8125 39.015625 \n",
+       "Q 14.890625 38.140625 10.796875 36.28125 \n",
+       "z\n",
+       "\" id=\"DejaVuSans-53\"/>\n",
+       "      </defs>\n",
+       "      <g transform=\"translate(379.751989 45.59143)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-53\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"ytick_12\">\n",
+       "     <g id=\"line2d_53\">\n",
+       "      <path clip-path=\"url(#p8917949baa)\" d=\"M 409.017614 17.577199 \n",
+       "L 713.38125 17.577199 \n",
+       "\" style=\"fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;\"/>\n",
+       "     </g>\n",
+       "     <g id=\"line2d_54\">\n",
+       "      <g>\n",
+       "       <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"409.017614\" xlink:href=\"#m60ac5f1668\" y=\"17.577199\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "     <g id=\"text_29\">\n",
+       "      <!-- 0.06 -->\n",
+       "      <g transform=\"translate(379.751989 21.376417)scale(0.1 -0.1)\">\n",
+       "       <use xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
+       "       <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
+       "       <use x=\"159.033203\" xlink:href=\"#DejaVuSans-54\"/>\n",
+       "      </g>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"text_30\">\n",
+       "     <!-- CT/d(r/R) [-] -->\n",
+       "     <g transform=\"translate(373.672301 118.554063)rotate(-90)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-67\"/>\n",
+       "      <use x=\"69.824219\" xlink:href=\"#DejaVuSans-84\"/>\n",
+       "      <use x=\"130.908203\" xlink:href=\"#DejaVuSans-47\"/>\n",
+       "      <use x=\"164.599609\" xlink:href=\"#DejaVuSans-100\"/>\n",
+       "      <use x=\"228.076172\" xlink:href=\"#DejaVuSans-40\"/>\n",
+       "      <use x=\"267.089844\" xlink:href=\"#DejaVuSans-114\"/>\n",
+       "      <use x=\"308.203125\" xlink:href=\"#DejaVuSans-47\"/>\n",
+       "      <use x=\"341.894531\" xlink:href=\"#DejaVuSans-82\"/>\n",
+       "      <use x=\"411.376953\" xlink:href=\"#DejaVuSans-41\"/>\n",
+       "      <use x=\"450.390625\" xlink:href=\"#DejaVuSans-32\"/>\n",
+       "      <use x=\"482.177734\" xlink:href=\"#DejaVuSans-91\"/>\n",
+       "      <use x=\"521.191406\" xlink:href=\"#DejaVuSans-45\"/>\n",
+       "      <use x=\"557.275391\" xlink:href=\"#DejaVuSans-93\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "   </g>\n",
+       "   <g id=\"line2d_55\">\n",
+       "    <path clip-path=\"url(#p8917949baa)\" d=\"M 422.852324 162.867273 \n",
+       "L 438.366693 162.867273 \n",
+       "L 453.832247 116.564768 \n",
+       "L 469.200327 51.646525 \n",
+       "L 484.422579 36.028121 \n",
+       "L 492.025878 30.676052 \n",
+       "L 514.23863 29.475378 \n",
+       "L 528.738616 28.128245 \n",
+       "L 547.364721 27.272783 \n",
+       "L 556.694542 26.129473 \n",
+       "L 570.062522 25.488263 \n",
+       "L 582.967324 24.655189 \n",
+       "L 595.368346 23.863476 \n",
+       "L 607.226568 23.459217 \n",
+       "L 618.50468 23.385531 \n",
+       "L 630.372986 23.643781 \n",
+       "L 639.180573 24.599816 \n",
+       "L 648.513299 26.230545 \n",
+       "L 657.136012 29.062176 \n",
+       "L 665.021582 33.411016 \n",
+       "L 672.145198 39.692453 \n",
+       "L 678.484446 47.388722 \n",
+       "L 682.944886 57.442048 \n",
+       "L 688.732588 66.136341 \n",
+       "L 692.609238 81.04617 \n",
+       "L 695.637132 99.399803 \n",
+       "L 697.806744 119.163547 \n",
+       "L 699.111248 141.56949 \n",
+       "L 699.546539 14.612727 \n",
+       "\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"line2d_56\">\n",
+       "    <path clip-path=\"url(#p8917949baa)\" d=\"M 478.629329 45.985408 \n",
+       "L 509.37823 37.052115 \n",
+       "L 535.727095 34.416512 \n",
+       "L 588.430238 34.860405 \n",
+       "L 614.781792 27.25878 \n",
+       "L 658.701064 32.918378 \n",
+       "L 671.876841 41.518763 \n",
+       "L 687.248608 68.443481 \n",
+       "L 696.032451 105.563809 \n",
+       "L 699.546539 162.867273 \n",
+       "\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_9\">\n",
+       "    <path d=\"M 409.017614 170.28 \n",
+       "L 409.017614 7.2 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_10\">\n",
+       "    <path d=\"M 713.38125 170.28 \n",
+       "L 713.38125 7.2 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_11\">\n",
+       "    <path d=\"M 409.017614 170.28 \n",
+       "L 713.38125 170.28 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"patch_12\">\n",
+       "    <path d=\"M 409.017614 7.2 \n",
+       "L 713.38125 7.2 \n",
+       "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
+       "   </g>\n",
+       "   <g id=\"legend_2\">\n",
+       "    <g id=\"patch_13\">\n",
+       "     <path d=\"M 519.326776 165.28 \n",
+       "L 603.072088 165.28 \n",
+       "Q 605.072088 165.28 605.072088 163.28 \n",
+       "L 605.072088 134.92375 \n",
+       "Q 605.072088 132.92375 603.072088 132.92375 \n",
+       "L 519.326776 132.92375 \n",
+       "Q 517.326776 132.92375 517.326776 134.92375 \n",
+       "L 517.326776 163.28 \n",
+       "Q 517.326776 165.28 519.326776 165.28 \n",
+       "z\n",
+       "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_57\">\n",
+       "     <path d=\"M 521.326776 141.022188 \n",
+       "L 541.326776 141.022188 \n",
+       "\" style=\"fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_58\"/>\n",
+       "    <g id=\"text_31\">\n",
+       "     <!-- SHARPy -->\n",
+       "     <g transform=\"translate(549.326776 144.522188)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-83\"/>\n",
+       "      <use x=\"63.476562\" xlink:href=\"#DejaVuSans-72\"/>\n",
+       "      <use x=\"138.671875\" xlink:href=\"#DejaVuSans-65\"/>\n",
+       "      <use x=\"207.080078\" xlink:href=\"#DejaVuSans-82\"/>\n",
+       "      <use x=\"276.5625\" xlink:href=\"#DejaVuSans-80\"/>\n",
+       "      <use x=\"336.865234\" xlink:href=\"#DejaVuSans-121\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_59\">\n",
+       "     <path d=\"M 521.326776 155.700312 \n",
+       "L 541.326776 155.700312 \n",
+       "\" style=\"fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;\"/>\n",
+       "    </g>\n",
+       "    <g id=\"line2d_60\"/>\n",
+       "    <g id=\"text_32\">\n",
+       "     <!-- OpenFAST -->\n",
+       "     <g transform=\"translate(549.326776 159.200312)scale(0.1 -0.1)\">\n",
+       "      <use xlink:href=\"#DejaVuSans-79\"/>\n",
+       "      <use x=\"78.710938\" xlink:href=\"#DejaVuSans-112\"/>\n",
+       "      <use x=\"142.1875\" xlink:href=\"#DejaVuSans-101\"/>\n",
+       "      <use x=\"203.710938\" xlink:href=\"#DejaVuSans-110\"/>\n",
+       "      <use x=\"267.089844\" xlink:href=\"#DejaVuSans-70\"/>\n",
+       "      <use x=\"324.46875\" xlink:href=\"#DejaVuSans-65\"/>\n",
+       "      <use x=\"392.876953\" xlink:href=\"#DejaVuSans-83\"/>\n",
+       "      <use x=\"456.353516\" xlink:href=\"#DejaVuSans-84\"/>\n",
+       "     </g>\n",
+       "    </g>\n",
+       "   </g>\n",
+       "  </g>\n",
+       " </g>\n",
+       " <defs>\n",
+       "  <clipPath id=\"p19e32ab1d1\">\n",
+       "   <rect height=\"163.08\" width=\"304.363636\" x=\"43.78125\" y=\"7.2\"/>\n",
+       "  </clipPath>\n",
+       "  <clipPath id=\"p8917949baa\">\n",
+       "   <rect height=\"163.08\" width=\"304.363636\" x=\"409.017614\" y=\"7.2\"/>\n",
+       "  </clipPath>\n",
+       " </defs>\n",
+       "</svg>\n"
+      ],
+      "text/plain": [
+       "<Figure size 864x216 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fig, list_plots = plt.subplots(1, 2, figsize=(12, 3))\n",
+    "\n",
+    "list_plots[0].grid()\n",
+    "list_plots[0].set_xlabel(\"r/R [-]\")\n",
+    "list_plots[0].set_ylabel(\"CN/d(r/R) [-]\")\n",
+    "list_plots[0].plot(r[0]/R, CN_drR[0], '-', label='SHARPy')\n",
+    "list_plots[0].plot(of_rR, of_cNdrR, '-', label='OpenFAST')\n",
+    "list_plots[0].legend()\n",
+    "\n",
+    "list_plots[1].grid()\n",
+    "list_plots[1].set_xlabel(\"r/R [-]\")\n",
+    "list_plots[1].set_ylabel(\"CT/d(r/R) [-]\")\n",
+    "list_plots[1].plot(r[0]/R, CTan_drR[0], '-', label='SHARPy')\n",
+    "list_plots[1].plot(of_rR, of_cTdrR, '-', label='OpenFAST')\n",
+    "list_plots[1].legend()\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Print the rotor thrust and power coefficients"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "      OpenFAST SHARPy\n",
+      "Cp[-] 0.49       0.52\n",
+      "Ct[-] 0.70       0.70\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(\"      OpenFAST SHARPy\")\n",
+    "print(\"Cp[-] %.2f       %.2f\" % (of_cp, Cp))\n",
+    "print(\"Ct[-] %.2f       %.2f\" % (of_ct, Ct))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
 }
diff --git a/docs/source/content/publications.md b/docs/source/content/publications.md
index 74391fff5..92d2d5f3b 100644
--- a/docs/source/content/publications.md
+++ b/docs/source/content/publications.md
@@ -3,10 +3,24 @@
 SHARPy has been used in many technical papers that have been both published in Journals and presented at conferences.
 Here we present a list of past papers which have used SHARPy for research purposes:
 
+## 2022
+
+* Goizueta, N., Wynn, A., Palacios, R., Drachinsky, A., Raveh, D. E. (2022). Flutter Predictions for Very Flexible Wing Wind Tunnel Test. Journal of Aircraft. Article in Advance. [https://doi.org/10.2514/1.C036710](https://doi.org/10.2514/1.C036710)
+
+* Muñoz-Simón A, Wynn A, Palacios R (2022). Some modelling improvements for prediction of wind turbine rotor loads in turbulent wind. Wind Energy: 25(2), pp. 333-353. [https://doi.org/10.1002/we.2675](https://doi.org/10.1002/we.2675)
+
+* Goizueta, N., Wynn, A., Palacios, R. (2022). Fast flutter evaluation of very flexible wing using interpolation on an optimal training dataset. AIAA SciTech Forum. [https://doi.org/10.2514/6.2022-1345](https://doi.org/10.2514/6.2022-1345)
+
+* Düssler, S., Goizueta, N., Muñoz-Simón, A., &#38; Palacios, R. (2022). Modelling and Numerical Enhancements on a UVLM for Nonlinear Aeroelastic Simulation. AIAA SciTech Forum. [https://doi.org/10.2514/6.2022-2455](https://doi.org/10.2514/6.2022-2455)
+
+* Cea, A., Palacios, R. (2022). Parametric Reduced Order Models for Aeroelastic Design of Very Flexible Aircraft. AIAA SciTech Forum. [https://doi.org/10.2514/6.2022-0727](https://doi.org/10.2514/6.2022-0727)
+
+* Wynn, A., Artola, M., Palacios, R. (2022). Nonlinear optimal control for gust load alleviation with a physics-constrained data-driven internal model. AIAA SciTech Forum. [https://doi.org/10.2514/6.2022-0442](https://doi.org/10.2514/6.2022-0442)
+
 ## 2021
 
 * Artola, M., Goizueta, N., Wynn, A., & Palacios, R. (2021). Aeroelastic Control and Estimation with a Minimal 
-Nonlinear Modal Description. AIAA Journal, 1–17. [https://doi.org/10.2514/1.j060018](https://doi.org/10.2514/1.j060018)
+Nonlinear Modal Description. AIAA Journal: 59(7), pp. 2697–2713. [https://doi.org/10.2514/1.j060018](https://doi.org/10.2514/1.j060018)
 
 * Artola, M., Goizueta, N., Wynn, A., & Palacios, R. (2021). Proof of Concept for a Hardware-in-the-Loop Nonlinear. 
 In AIAA SciTech Forum (pp. 1–26). [https://doi.org/10.2514/6.2021-1392](https://doi.org/10.2514/6.2021-1392)
@@ -53,14 +67,14 @@ rotor loads. In AIAA SciTech Forum. [https://doi.org/10.2514/6.2020-0991](https:
 
 ## 2019
 
-* Carre, A., Muñoz-Simón, A., Goizueta, N., & Palacios, R. (2019). SHARPy : A dynamic aeroelastic simulation toolbox 
+* del Carre, A., Muñoz-Simón, A., Goizueta, N., & Palacios, R. (2019). SHARPy : A dynamic aeroelastic simulation toolbox 
 for very flexible aircraft and wind turbines. Journal of Open Source 
 Software, 4(44), 1885. [https://doi.org/10.21105/joss.01885](https://doi.org/10.21105/joss.01885)
 
-* Del Carre, A., Teixeira, P. C., Palacios, R., & Cesnik, C. E. S. (2019). Nonlinear Response of a Very Flexible 
+* del Carre, A., Teixeira, P. C., Palacios, R., & Cesnik, C. E. S. (2019). Nonlinear Response of a Very Flexible 
 Aircraft Under Lateral Gust. In International Forum on Aeroelasticity and Structural Dynamics.
 
-* Del Carre, A., & Palacios, R. (2019). Efficient Time-Domain Simulations in Nonlinear Aeroelasticity. In AIAA Scitech 
+* del Carre, A., & Palacios, R. (2019). Efficient Time-Domain Simulations in Nonlinear Aeroelasticity. In AIAA Scitech 
 Forum (pp. 1–20). [https://doi.org/10.2514/6.2019-2038](https://doi.org/10.2514/6.2019-2038)
 
 * Maraniello, S., & Palacios, R. (2019). State-Space Realizations and Internal Balancing in Potential-Flow Aerodynamics 
diff --git a/sharpy/aero/models/aerogrid.py b/sharpy/aero/models/aerogrid.py
index ad4acc2f2..0030b56b9 100644
--- a/sharpy/aero/models/aerogrid.py
+++ b/sharpy/aero/models/aerogrid.py
@@ -222,6 +222,10 @@ def generate_zeta_timestep_info(self, structure_tstep, aero_tstep, beam, aero_se
         except KeyError:
             self.aero_dict['sweep'] = np.zeros_like(self.aero_dict['twist'])
 
+        # Define first_twist for backwards compatibility
+        if 'first_twist' not in self.aero_dict:     
+            self.aero_dict['first_twist'] = [True]*self.aero_dict['surface_m'].shape[0]
+        
         # one surface per element
         for i_elem in range(self.n_elem):
             i_surf = self.aero_dict['surface_distribution'][i_elem]
@@ -348,7 +352,8 @@ def generate_zeta_timestep_info(self, structure_tstep, aero_tstep, beam, aero_se
                                    self.airfoil_db,
                                    aero_settings['aligned_grid'],
                                    orientation_in=aero_settings['freestream_dir'],
-                                   calculate_zeta_dot=True))
+                                   calculate_zeta_dot=True,
+                                   first_twist=self.aero_dict['first_twist'][i_surf]))
 
     def generate_zeta(self, beam, aero_settings, ts=-1, beam_ts=-1):
         self.generate_zeta_timestep_info(beam.timestep_info[beam_ts],
@@ -479,7 +484,10 @@ def compute_gamma_dot(dt, tstep, previous_tsteps):
 
 
 
-def generate_strip(node_info, airfoil_db, aligned_grid, orientation_in=np.array([1, 0, 0]), calculate_zeta_dot = False):
+def generate_strip(node_info, airfoil_db, aligned_grid,
+                   orientation_in=np.array([1, 0, 0]),
+                   calculate_zeta_dot = False,
+                   first_twist=True):
     """
     Returns a strip of panels in ``A`` frame of reference, it has to be then rotated to
     simulate angles of attack, etc
@@ -495,11 +503,6 @@ def generate_strip(node_info, airfoil_db, aligned_grid, orientation_in=np.array(
         strip_coordinates_b_frame[1, :] = np.linspace(0.0, 1.0, node_info['M'] + 1)
     elif node_info['M_distribution'] == '1-cos':
         domain = np.linspace(0, 1.0, node_info['M'] + 1)
-        strip_coordinates_b_frame[1, :] = 0.5*(1.0 - np.cos(domain*np.pi))
-    elif node_info['M_distribution'].lower() == 'user_defined':
-        # strip_coordinates_b_frame[1, :-1] = np.linspace(0.0, 1.0 - node_info['last_panel_length'], node_info['M'])
-        # strip_coordinates_b_frame[1,-1] = 1.
-        strip_coordinates_b_frame[1,:] = node_info['user_defined_m_distribution']
     else:
         raise NotImplemented('M_distribution is ' + node_info['M_distribution'] +
                              ' and it is not yet supported')
@@ -567,8 +570,12 @@ def generate_strip(node_info, airfoil_db, aligned_grid, orientation_in=np.array(
 
     # transformation from beam to beam prime (with sweep and twist)
     for i_M in range(node_info['M'] + 1):
-        strip_coordinates_b_frame[:, i_M] = np.dot(c_sweep, np.dot(Crot,
+        if first_twist:
+            strip_coordinates_b_frame[:, i_M] = np.dot(c_sweep, np.dot(Crot,
                                                    np.dot(Ctwist, strip_coordinates_b_frame[:, i_M])))
+        else:
+            strip_coordinates_b_frame[:, i_M] = np.dot(Ctwist, np.dot(Crot,
+                                                   np.dot(c_sweep, strip_coordinates_b_frame[:, i_M])))
         strip_coordinates_a_frame[:, i_M] = np.dot(Cab, strip_coordinates_b_frame[:, i_M])
 
         cs_velocity[:, i_M] = np.dot(Cab, cs_velocity[:, i_M])
diff --git a/sharpy/aero/utils/utils.py b/sharpy/aero/utils/utils.py
index c1f842884..7a2547495 100644
--- a/sharpy/aero/utils/utils.py
+++ b/sharpy/aero/utils/utils.py
@@ -22,7 +22,8 @@ def alpha_beta_to_direction(alpha, beta):
     return direction
 
 
-def magnitude_and_direction_of_relative_velocity(displacement, displacement_vel, for_vel, cga, uext):
+def magnitude_and_direction_of_relative_velocity(displacement, displacement_vel, for_vel, cga, uext,
+                                                 add_rotation=False, rot_vel_g=np.zeros((3)), centre_rot_g=np.zeros((3))):
     r"""
     Calculates the magnitude and direction of the relative velocity ``u_rel`` at a local section of the wing.
 
@@ -39,6 +40,9 @@ def magnitude_and_direction_of_relative_velocity(displacement, displacement_vel,
         for_vel (np.array): ``A`` frame of reference (FoR) velocity. Expressed in A FoR
         cga (np.array): Rotation vector from FoR ``G`` to FoR ``A``
         uext (np.array): Background flow velocity on solid grid nodes
+        add_rotation (bool): Adds rotation velocity. Probalby needed in steady computations
+        rot_vel_g (np.array): Rotation velocity. Only used if add_rotation = True
+        centre_rot_g (np.array): Centre of rotation. Only used if add_rotation = True
 
     Returns:
         tuple: ``u_rel``, ``dir_u_rel`` expressed in the inertial, ``G`` frame.
@@ -49,6 +53,9 @@ def magnitude_and_direction_of_relative_velocity(displacement, displacement_vel,
     urel = -np.dot(cga, urel)
     urel += np.average(uext, axis=1)
 
+    if add_rotation:
+        urel -= algebra.cross3(rot_vel_g,
+                               np.dot(cga, displacement) - centre_rot_g)
     dir_urel = algebra.unit_vector(urel)
 
     return urel, dir_urel
diff --git a/sharpy/cases/templates/template_wt.py b/sharpy/cases/templates/template_wt.py
index e36687d17..f6610da50 100644
--- a/sharpy/cases/templates/template_wt.py
+++ b/sharpy/cases/templates/template_wt.py
@@ -112,11 +112,10 @@ def spar_from_excel_type04(op_params,
     """
 
     # Generate the tower + rotor
-    wt, LC, MB, hub_node = generate_from_excel_type03(op_params,
+    wt, LC, MB, hub_nodes = generate_from_excel_type03(op_params,
                                     geom_params,
                                     excel_description,
                                     options)
-
     # Remove base clam
     wt.StructuralInformation.boundary_conditions[0] = 0
 
@@ -125,113 +124,161 @@ def spar_from_excel_type04(op_params,
     excel_sheet_structural_spar = excel_description['excel_sheet_structural_spar']
     tol_remove_points = geom_params['tol_remove_points']
 
-    # Generate the spar
-    SparHeight = gc.read_column_sheet_type01(excel_file_name,
-                                             excel_sheet_parameters,
-                                             'SparHeight')
-    SparBallastMass = gc.read_column_sheet_type01(excel_file_name,
+    TowerBaseHeight = gc.read_column_sheet_type01(excel_file_name,
                                                   excel_sheet_parameters,
-                                                  'SparBallastMass')
-    SparBallastDepth = gc.read_column_sheet_type01(excel_file_name,
-                                                   excel_sheet_parameters,
-                                                   'SparBallastDepth')
+                                                  'TowerBaseHeight')
 
-    # Read from excel file
-    SparHtFract = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparHtFract')
-    SparMassDen = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparMassDen')
-    SparFAStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparFAStif')
-    SparSSStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparSSStif')
-    SparGJStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparGJStif')
-    SparEAStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparEAStif')
-    SparFAIner = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparFAIner')
-    SparSSIner = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparSSIner')
-    SparFAcgOf = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparFAcgOf')
-    SparSScgOf = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparSScgOf')
-
-    ElevationSpar = SparHtFract*SparHeight
-    spar = gc.AeroelasticInformation()
-    spar.StructuralInformation.num_elem = len(ElevationSpar) - 2
-    spar.StructuralInformation.num_node_elem = 3
-    spar.StructuralInformation.compute_basic_num_node()
+    # Generate the spar
+    if options['concentrate_spar']:
+        mtower = wt.StructuralInformation.mass_db[0, 0, 0]
+
+        PlatformTotalMass = gc.read_column_sheet_type01(excel_file_name,
+                                                 excel_sheet_parameters,
+                                                 'PlatformTotalMass')
+        PlatformIrollCM = gc.read_column_sheet_type01(excel_file_name,
+                                                 excel_sheet_parameters,
+                                                 'PlatformIrollCM')
+        PlatformIpitchCM = gc.read_column_sheet_type01(excel_file_name,
+                                                 excel_sheet_parameters,
+                                                 'PlatformIpitchCM')
+        PlatformIyawCM = gc.read_column_sheet_type01(excel_file_name,
+                                                 excel_sheet_parameters,
+                                                 'PlatformIyawCM')
+        PlatformCMbelowSWL = gc.read_column_sheet_type01(excel_file_name,
+                                                 excel_sheet_parameters,
+                                                 'PlatformCMbelowSWL')
+
+        mpoint = PlatformTotalMass - mtower*TowerBaseHeight
+        IyawPoint = PlatformIyawCM - (1./6)*mtower*TowerBaseHeight**3
+        IpitchPoint = PlatformIpitchCM + PlatformTotalMass*PlatformCMbelowSWL**2 - (1./3)*mtower*TowerBaseHeight**3
+        IrollPoint = PlatformIrollCM + PlatformTotalMass*PlatformCMbelowSWL**2 - (1./3)*mtower*TowerBaseHeight**3
+        xpoint = (PlatformTotalMass*PlatformCMbelowSWL + 0.5*mtower*TowerBaseHeight**2)/mpoint
+
+        iner_mat = np.zeros((6,6))
+        iner_mat[0:3, 0:3] = mpoint*np.eye(3)
+        iner_mat[0:3, 3:6] = -mpoint*algebra.skew(np.array([-xpoint, 0, 0]))
+        iner_mat[3:6, 0:3] = -iner_mat[0:3, 3:6]
+        iner_mat[3, 3] = IyawPoint
+        iner_mat[4, 4] = IpitchPoint
+        iner_mat[5, 5] = IrollPoint
+
+        base_stiffness_top = wt.StructuralInformation.stiffness_db[0, :, :]
+        base_mass_top = wt.StructuralInformation.mass_db[0, :, :]
+        base_stiffness_bot = 100*base_stiffness_top
+        base_mass_bot = base_mass_top
+
+        num_lumped_mass_mat = 1
 
-    # Interpolate excel variables into the correct locations
-    node_r, elem_r = create_node_radial_pos_from_elem_centres(ElevationSpar,
-                                    spar.StructuralInformation.num_node,
-                                    spar.StructuralInformation.num_elem,
-                                    spar.StructuralInformation.num_node_elem)
+    else:
+        SparHeight = gc.read_column_sheet_type01(excel_file_name,
+                                                 excel_sheet_parameters,
+                                                 'SparHeight')
+        SparBallastMass = gc.read_column_sheet_type01(excel_file_name,
+                                                      excel_sheet_parameters,
+                                                      'SparBallastMass')
+        SparBallastDepth = gc.read_column_sheet_type01(excel_file_name,
+                                                       excel_sheet_parameters,
+                                                       'SparBallastDepth')
+
+        # Read from excel file
+        SparHtFract = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparHtFract')
+        SparMassDen = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparMassDen')
+        SparFAStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparFAStif')
+        SparSSStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparSSStif')
+        SparGJStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparGJStif')
+        SparEAStif = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparEAStif')
+        SparFAIner = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparFAIner')
+        SparSSIner = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparSSIner')
+        SparFAcgOf = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparFAcgOf')
+        SparSScgOf = gc.read_column_sheet_type01(excel_file_name, excel_sheet_structural_spar, 'SparSScgOf')
+
+        ElevationSpar = SparHtFract*SparHeight
+        spar = gc.AeroelasticInformation()
+        spar.StructuralInformation.num_elem = len(ElevationSpar) - 2
+        spar.StructuralInformation.num_node_elem = 3
+        spar.StructuralInformation.compute_basic_num_node()
+
+        # Interpolate excel variables into the correct locations
+        node_r, elem_r = create_node_radial_pos_from_elem_centres(ElevationSpar,
+                                        spar.StructuralInformation.num_node,
+                                        spar.StructuralInformation.num_elem,
+                                        spar.StructuralInformation.num_node_elem)
 
-    # Stiffness
-    elem_EA = np.interp(elem_r, ElevationSpar, SparEAStif)
-    elem_EIz = np.interp(elem_r, ElevationSpar, SparSSStif)
-    elem_EIy = np.interp(elem_r, ElevationSpar, SparFAStif)
-    elem_GJ = np.interp(elem_r, ElevationSpar, SparGJStif)
-    # Stiffness: estimate unknown properties
-    cout.cout_wrap.print_file = False
-    cout.cout_wrap('WARNING: The poisson cofficient is assumed equal to 0.3', 3)
-    cout.cout_wrap('WARNING: Cross-section area is used as shear area', 3)
-    poisson_coef = 0.3
-    elem_GAy = elem_EA/2.0/(1.0+poisson_coef)
-    elem_GAz = elem_EA/2.0/(1.0+poisson_coef)
+        # Stiffness
+        elem_EA = np.interp(elem_r, ElevationSpar, SparEAStif)
+        elem_EIz = np.interp(elem_r, ElevationSpar, SparSSStif)
+        elem_EIy = np.interp(elem_r, ElevationSpar, SparFAStif)
+        elem_GJ = np.interp(elem_r, ElevationSpar, SparGJStif)
+        # Stiffness: estimate unknown properties
+        cout.cout_wrap.print_file = False
+        cout.cout_wrap('WARNING: The poisson cofficient is assumed equal to 0.3', 3)
+        cout.cout_wrap('WARNING: Cross-section area is used as shear area', 3)
+        poisson_coef = 0.3
+        elem_GAy = elem_EA/2.0/(1.0+poisson_coef)
+        elem_GAz = elem_EA/2.0/(1.0+poisson_coef)
 
-    # Inertia
-    elem_mass_per_unit_length = np.interp(elem_r, ElevationSpar, SparMassDen)
-    elem_mass_iner_y = np.interp(elem_r, ElevationSpar, SparFAIner)
-    elem_mass_iner_z = np.interp(elem_r, ElevationSpar, SparSSIner)
-    # TODO: check yz axis and Flap-edge
-    elem_pos_cg_B = np.zeros((spar.StructuralInformation.num_elem, 3),)
-    elem_pos_cg_B[:, 1] = np.interp(elem_r, ElevationSpar, SparSScgOf)
-    elem_pos_cg_B[:, 2] = np.interp(elem_r, ElevationSpar, SparFAcgOf)
+        # Inertia
+        elem_mass_per_unit_length = np.interp(elem_r, ElevationSpar, SparMassDen)
+        elem_mass_iner_y = np.interp(elem_r, ElevationSpar, SparFAIner)
+        elem_mass_iner_z = np.interp(elem_r, ElevationSpar, SparSSIner)
+        # TODO: check yz axis and Flap-edge
+        elem_pos_cg_B = np.zeros((spar.StructuralInformation.num_elem, 3),)
+        elem_pos_cg_B[:, 1] = np.interp(elem_r, ElevationSpar, SparSScgOf)
+        elem_pos_cg_B[:, 2] = np.interp(elem_r, ElevationSpar, SparFAcgOf)
 
-    # Stiffness: estimate unknown properties
-    cout.cout_wrap('WARNING: Using perpendicular axis theorem to compute the inertia around xB', 3)
-    elem_mass_iner_x = elem_mass_iner_y + elem_mass_iner_z
+        # Stiffness: estimate unknown properties
+        cout.cout_wrap('WARNING: Using perpendicular axis theorem to compute the inertia around xB', 3)
+        elem_mass_iner_x = elem_mass_iner_y + elem_mass_iner_z
 
-    # Create the tower
-    spar.StructuralInformation.create_mass_db_from_vector(elem_mass_per_unit_length, elem_mass_iner_x, elem_mass_iner_y, elem_mass_iner_z, elem_pos_cg_B)
-    spar.StructuralInformation.create_stiff_db_from_vector(elem_EA, elem_GAy, elem_GAz, elem_GJ, elem_EIy, elem_EIz)
+        # Create the tower
+        spar.StructuralInformation.create_mass_db_from_vector(elem_mass_per_unit_length, elem_mass_iner_x, elem_mass_iner_y, elem_mass_iner_z, elem_pos_cg_B)
+        spar.StructuralInformation.create_stiff_db_from_vector(elem_EA, elem_GAy, elem_GAz, elem_GJ, elem_EIy, elem_EIz)
 
-    coordinates = np.zeros((spar.StructuralInformation.num_node, 3),)
-    coordinates[:, 0] = node_r
+        coordinates = np.zeros((spar.StructuralInformation.num_node, 3),)
+        coordinates[:, 0] = node_r
 
-    spar.StructuralInformation.generate_1to1_from_vectors(
-        num_node_elem=spar.StructuralInformation.num_node_elem,
-        num_node=spar.StructuralInformation.num_node,
-        num_elem=spar.StructuralInformation.num_elem,
-        coordinates=coordinates,
-        stiffness_db=spar.StructuralInformation.stiffness_db,
-        mass_db=spar.StructuralInformation.mass_db,
-        frame_of_reference_delta='y_AFoR',
-        vec_node_structural_twist=np.zeros((spar.StructuralInformation.num_node,),),
-        num_lumped_mass=1)
-
-    spar.StructuralInformation.boundary_conditions[0] = -1
-    spar.StructuralInformation.boundary_conditions[-1] = 1
-
-    # Include ballast mass
-    dist = np.abs(coordinates[:, 0] + SparBallastDepth)
-    min_dist = np.amin(dist)
-    loc_min = np.where(dist == min_dist)[0]
-
-    cout.cout_wrap("Ballast at node %d at position %f" % (loc_min, coordinates[loc_min, 0]), 2)
-
-    spar.StructuralInformation.lumped_mass_nodes[0] = loc_min
-    spar.StructuralInformation.lumped_mass[0] = SparBallastMass
-    spar.StructuralInformation.lumped_mass_inertia[0] = np.zeros((3,3))
-    spar.StructuralInformation.lumped_mass_position[0] = np.zeros((3,))
-
-    spar.AerodynamicInformation.set_to_zero(spar.StructuralInformation.num_node_elem,
-                                        spar.StructuralInformation.num_node,
-                                        spar.StructuralInformation.num_elem)
+        spar.StructuralInformation.generate_1to1_from_vectors(
+            num_node_elem=spar.StructuralInformation.num_node_elem,
+            num_node=spar.StructuralInformation.num_node,
+            num_elem=spar.StructuralInformation.num_elem,
+            coordinates=coordinates,
+            stiffness_db=spar.StructuralInformation.stiffness_db,
+            mass_db=spar.StructuralInformation.mass_db,
+            frame_of_reference_delta='y_AFoR',
+            vec_node_structural_twist=np.zeros((spar.StructuralInformation.num_node,),),
+            num_lumped_mass=1)
+
+        spar.StructuralInformation.boundary_conditions[0] = -1
+        spar.StructuralInformation.boundary_conditions[-1] = 1
+
+        # Include ballast mass
+        dist = np.abs(coordinates[:, 0] + SparBallastDepth)
+        min_dist = np.amin(dist)
+        loc_min = np.where(dist == min_dist)[0]
+
+        cout.cout_wrap("Ballast at node %d at position %f" % (loc_min, coordinates[loc_min, 0]), 2)
+
+        spar.StructuralInformation.lumped_mass_nodes[0] = loc_min
+        spar.StructuralInformation.lumped_mass[0] = SparBallastMass
+        spar.StructuralInformation.lumped_mass_inertia[0] = np.zeros((3,3))
+        spar.StructuralInformation.lumped_mass_position[0] = np.zeros((3,))
+
+        spar.AerodynamicInformation.set_to_zero(spar.StructuralInformation.num_node_elem,
+                                            spar.StructuralInformation.num_node,
+                                            spar.StructuralInformation.num_elem)
+
+        base_stiffness_bot = spar.StructuralInformation.stiffness_db[-1, :, :]
+        base_mass_bot = spar.StructuralInformation.mass_db[-1, :, :]
+        base_stiffness_top = base_stiffness_bot
+        base_mass_top = base_mass_bot
+
+        num_lumped_mass_mat = 0
 
     # Generate tower base
-    TowerBaseHeight = gc.read_column_sheet_type01(excel_file_name,
-                                                  excel_sheet_parameters,
-                                                  'TowerBaseHeight')
     NodesBase = gc.read_column_sheet_type01(excel_file_name,
                                                   excel_sheet_parameters,
                                                   'NodesBase')
 
-
     base = gc.AeroelasticInformation()
     base.StructuralInformation.num_node = NodesBase
     base.StructuralInformation.num_node_elem = 3
@@ -244,17 +291,17 @@ def spar_from_excel_type04(op_params,
     base_mass_db = np.zeros((base.StructuralInformation.num_elem, 6, 6))
     vec_node_structural_twist = np.zeros((base.StructuralInformation.num_node,))
 
-    for ielem in range(base.StructuralInformation.num_elem):
-        base_stiffness_db[ielem, :, :] = spar.StructuralInformation.stiffness_db[-1, :, :]
-        base_mass_db[ielem, :, :] = spar.StructuralInformation.mass_db[-1, :, :]
     # for ielem in range(base.StructuralInformation.num_elem):
-    #     inode_cent = 2*ielem + 1
-    #     rel_dist_to_spar = node_coord[inode_cent, 0]/TowerBaseHeight
-    #     rel_dist_to_base = (node_coord[-1, 0] - node_coord[inode_cent, 0])/TowerBaseHeight
-    #     base_stiffness_db[ielem, :, :] = (spar.StructuralInformation.stiffness_db[0, :, :]*rel_dist_to_base +
-    #                                   wt.StructuralInformation.stiffness_db[0, :, :]*rel_dist_to_spar)
-    #     base_mass_db[ielem, :, :] = (spar.StructuralInformation.mass_db[0, :, :]*rel_dist_to_base +
-    #                                   wt.StructuralInformation.mass_db[0, :, :]*rel_dist_to_spar)
+    #     base_stiffness_db[ielem, :, :] = base_stiffness.copy()
+    #     base_mass_db[ielem, :, :] = base_mass.copy()
+    for ielem in range(base.StructuralInformation.num_elem):
+        inode_cent = 2*ielem + 1
+        rel_dist_to_bot = node_coord[inode_cent, 0]/TowerBaseHeight
+        rel_dist_to_top = (node_coord[-1, 0] - node_coord[inode_cent, 0])/TowerBaseHeight
+        base_stiffness_db[ielem, :, :] = (base_stiffness_bot*rel_dist_to_top +
+                                      base_stiffness_top*rel_dist_to_bot)
+        base_mass_db[ielem, :, :] = (base_mass_bot*rel_dist_to_top +
+                                     base_mass_top*rel_dist_to_bot)
 
     base.StructuralInformation.generate_1to1_from_vectors(
                             base.StructuralInformation.num_node_elem,
@@ -265,7 +312,8 @@ def spar_from_excel_type04(op_params,
                             base_mass_db,
                             'y_AFoR',
                             vec_node_structural_twist,
-                            num_lumped_mass=0)
+                            num_lumped_mass=0,
+                            num_lumped_mass_mat=num_lumped_mass_mat)
 
     base.StructuralInformation.boundary_conditions[0] = 1
     base.StructuralInformation.body_number *= 0
@@ -274,23 +322,46 @@ def spar_from_excel_type04(op_params,
                                         base.StructuralInformation.num_node,
                                         base.StructuralInformation.num_elem)
 
-    # Assembly
-    spar.assembly(base)
-    spar.remove_duplicated_points(1e-6)
-    spar.StructuralInformation.body_number *= 0
-    nodes_spar = spar.StructuralInformation.num_node + 0
-    skip = [hub_node + nodes_spar]
-    wt.StructuralInformation.coordinates[:, 0] += TowerBaseHeight
-    spar.assembly(wt)
-    spar.remove_duplicated_points(1e-6, skip=skip)
-    for ielem in range(spar.StructuralInformation.num_elem):
-        if not spar.StructuralInformation.body_number[ielem] == 0:
-            spar.StructuralInformation.body_number[ielem] -= 1
-
-    # Update Lagrange Constraints and Multibody information
-    LC[0].node_in_body += nodes_spar - 1
+    if options['concentrate_spar']:
+        base.StructuralInformation.lumped_mass_mat_nodes = np.array([0], dtype=int)
+        base.StructuralInformation.lumped_mass_mat = np.zeros((1, 6, 6))
+        base.StructuralInformation.lumped_mass_mat[0, :, :] = iner_mat
+
+        nodes_base = base.StructuralInformation.num_node + 0
+        for inode in range(len(hub_nodes)):
+            hub_nodes[inode] += nodes_base
+        wt.StructuralInformation.coordinates[:, 0] += TowerBaseHeight
+        base.assembly(wt)
+        base.remove_duplicated_points(1e-6, skip=hub_nodes)
+        for ielem in range(base.StructuralInformation.num_elem):
+            if not base.StructuralInformation.body_number[ielem] == 0:
+                base.StructuralInformation.body_number[ielem] -= 1
+        for ilc in range(len(LC)):
+            LC[ilc].node_in_body += nodes_base - 1
+        spar = base # Just a rename for the return
+    else:
+        # Assembly
+        spar.assembly(base)
+        spar.remove_duplicated_points(1e-6)
+        spar.StructuralInformation.body_number *= 0
+        nodes_spar = spar.StructuralInformation.num_node + 0
+        for inode in range(len(hub_nodes)):
+            hub_nodes[inode] += nodes_spar
+
+        wt.StructuralInformation.coordinates[:, 0] += TowerBaseHeight
+        spar.assembly(wt)
+        spar.remove_duplicated_points(1e-6, skip=hub_nodes)
+        for ielem in range(spar.StructuralInformation.num_elem):
+            if not spar.StructuralInformation.body_number[ielem] == 0:
+                spar.StructuralInformation.body_number[ielem] -= 1
+
+        # Update Lagrange Constraints and Multibody information
+        for ilc in range(len(LC)):
+            LC[ilc].node_in_body += nodes_spar - 1
+
     MB[0].FoR_movement = 'free'
-    MB[1].FoR_position[0] += TowerBaseHeight
+    for ibody in range(1, len(MB)):
+        MB[ibody].FoR_position[0] += TowerBaseHeight
 
     return spar, LC, MB
 
@@ -333,6 +404,8 @@ def rotor_from_excel_type03(in_op_params,
     options['camber_effect_on_twist'] = False # When true plain airfoils are used and the blade is twisted and preloaded based on thin airfoil theory
     options['user_defined_m_distribution_type'] = None # type of distribution of the chordwise panels when 'm_distribution' == 'user_defined'
     options['include_polars'] = False #
+    options['separate_blades'] = False # Keep blades as different bodies
+    options['twist_in_aero'] = False # Twist the aerodynamic surface instead of the structure
 
     excel_description = {}
     excel_description['excel_file_name'] = 'database_excel_type02.xlsx'
@@ -517,7 +590,7 @@ def rotor_from_excel_type03(in_op_params,
             stiffness_db=blade.StructuralInformation.stiffness_db,
             mass_db=blade.StructuralInformation.mass_db,
             frame_of_reference_delta='y_AFoR',
-            vec_node_structural_twist=node_twist,
+            vec_node_structural_twist=np.zeros_like(node_twist) if options['twist_in_aero'] else node_twist,
             num_lumped_mass=0)
 
     # Boundary conditions
@@ -606,11 +679,11 @@ def rotor_from_excel_type03(in_op_params,
     else:
         udmd_by_nodes = None
 
-    node_twist = np.zeros_like(node_chord)
+    node_twist_aero = np.zeros_like(node_chord)
     if camber_effect_on_twist:
         cout.cout_wrap("WARNING: The steady applied Mx should be manually multiplied by the density", 3)
         for inode in range(blade.StructuralInformation.num_node):
-            node_twist[inode] = gc.get_aoacl0_from_camber(airfoils[inode, :, 0], airfoils[inode, :, 1])
+            node_twist_aero[inode] = gc.get_aoacl0_from_camber(airfoils[inode, :, 0], airfoils[inode, :, 1])
             mu0 = gc.get_mu0_from_camber(airfoils[inode, :, 0], airfoils[inode, :, 1])
             r = np.linalg.norm(blade.StructuralInformation.coordinates[inode, :])
             vrel = np.sqrt(rotation_velocity**2*r**2 + wsp**2)
@@ -621,15 +694,15 @@ def rotor_from_excel_type03(in_op_params,
             else:
                 dr = 0.5*np.linalg.norm(blade.StructuralInformation.coordinates[inode + 1, :] - blade.StructuralInformation.coordinates[inode - 1, :])
             moment_factor = 0.5*vrel**2*node_chord[inode]**2*dr
-            # print("node", inode, "mu0", mu0, "CMc/4", 2.*mu0 + np.pi/2*node_twist[inode])
-            blade.StructuralInformation.app_forces[inode, 3] = (2.*mu0 + np.pi/2*node_twist[inode])*moment_factor
+            # print("node", inode, "mu0", mu0, "CMc/4", 2.*mu0 + np.pi/2*node_twist_struct[inode])
+            blade.StructuralInformation.app_forces[inode, 3] = (2.*mu0 + np.pi/2*node_twist_aero[inode])*moment_factor
             airfoils[inode, :, 1] *= 0.
 
     # Write SHARPy format
     blade.AerodynamicInformation.create_aerodynamics_from_vec(blade.StructuralInformation,
                                                             aero_node,
                                                             node_chord,
-                                                            node_twist,
+                                                            (node_twist + node_twist_aero) if options['twist_in_aero'] else node_twist_aero,
                                                             np.pi*np.ones_like(node_chord),
                                                             chord_panels,
                                                             surface_distribution,
@@ -637,7 +710,8 @@ def rotor_from_excel_type03(in_op_params,
                                                             node_ElAxisAftLEc,
                                                             airfoil_distribution,
                                                             airfoils,
-                                                            udmd_by_nodes)
+                                                            udmd_by_nodes,
+                                                            first_twist=False)
 
     # Read the polars of the pure airfoils
     if include_polars:
@@ -685,20 +759,23 @@ def rotor_from_excel_type03(in_op_params,
 
     # Build the whole rotor
     rotor = blade.copy()
+    hub_nodes = [0]
     for iblade in range(numberOfBlades-1):
+        hub_nodes.append((iblade + 1)*blade.StructuralInformation.num_node)
         blade2 = blade.copy()
         blade2.StructuralInformation.rotate_around_origin(np.array([0., 0., 1.]), (iblade + 1)*(360.0/numberOfBlades)*deg2rad)
         rotor.assembly(blade2)
         blade2 = None
 
-    rotor.remove_duplicated_points(tol_remove_points)
+    if not options['separate_blades']:
+        rotor.remove_duplicated_points(tol_remove_points)
+        hub_nodes = [0]
+        rotor.StructuralInformation.body_number *= 0
 
     # Apply tilt
     rotor.StructuralInformation.rotate_around_origin(np.array([0., 1., 0.]), tilt)
 
-    rotor.StructuralInformation.body_number *= 0
-
-    return rotor
+    return rotor, hub_nodes
 
 
 def generate_from_excel_type03(op_params,
@@ -721,10 +798,10 @@ def generate_from_excel_type03(op_params,
     Returns:
         wt (sharpy.utils.generate_cases.AeroelasticInfromation): Aeroelastic information of the wind turbine (tower + rotor)
     """
-    rotor = rotor_from_excel_type03(op_params,
-                                    geom_params,
-                                    excel_description,
-                                    options)
+    rotor, hub_nodes = rotor_from_excel_type03(op_params,
+                                               geom_params,
+                                               excel_description,
+                                               options)
 
 
     excel_file_name = excel_description['excel_file_name']
@@ -812,8 +889,7 @@ def generate_from_excel_type03(op_params,
     tower.StructuralInformation.boundary_conditions = np.zeros((tower.StructuralInformation.num_node), dtype = int)
     tower.StructuralInformation.boundary_conditions[0] = 1
 
-    # Read overhang and nacelle properties from excel file
-    overhang_len = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'overhang')
+    # Nacelle properties from excel file
     NacelleMass = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'NacMass')
     NacelleMass_x = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'NacMass_x')
     NacelleMass_z = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'NacMass_z')
@@ -827,41 +903,43 @@ def generate_from_excel_type03(op_params,
     else:
         cout.cout_wrap('WARNING: Nacelle mass placed at tower top', 3)
 
-
     tower.AerodynamicInformation.set_to_zero(tower.StructuralInformation.num_node_elem,
                                             tower.StructuralInformation.num_node,
                                             tower.StructuralInformation.num_elem)
 
-    # Assembly overhang with the tower
-    # numberOfBlades = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'NumBl')
+    # Overhang
     tilt = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'ShftTilt')*deg2rad
-    # cone = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'Cone')*deg2rad
-    HubMass = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'HubMass')
-
-    overhang = gc.AeroelasticInformation()
-    overhang.StructuralInformation.num_node = 3
-    overhang.StructuralInformation.num_node_elem = 3
-    overhang.StructuralInformation.compute_basic_num_elem()
-    node_pos = np.zeros((overhang.StructuralInformation.num_node, 3), )
-    node_pos[:, 0] += tower.StructuralInformation.coordinates[-1, 0]
-    node_pos[:, 0] += np.linspace(0., -overhang_len*np.sin(tilt*deg2rad), overhang.StructuralInformation.num_node)
-    node_pos[:, 2] = np.linspace(0., overhang_len*np.cos(tilt*deg2rad), overhang.StructuralInformation.num_node)
-    # TODO: change the following by real values
-    # Same properties as the last element of the tower
-    cout.cout_wrap("WARNING: Using the structural properties of the last tower section for the overhang", 3)
-    oh_mass_per_unit_length = tower.StructuralInformation.mass_db[-1, 0, 0]
-    oh_mass_iner = tower.StructuralInformation.mass_db[-1, 3, 3]
-    oh_EA = tower.StructuralInformation.stiffness_db[-1, 0, 0]
-    oh_GA = tower.StructuralInformation.stiffness_db[-1, 1, 1]
-    oh_GJ = tower.StructuralInformation.stiffness_db[-1, 3, 3]
-    oh_EI = tower.StructuralInformation.stiffness_db[-1, 4, 4]
-    if not HubMass is None:
-        num_lumped_mass_overhang = 1
+    if not tilt == 0.:
+        raise NonImplementedError("Non-zero tilt not supported")
+    NodesOverhang = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'NodesOverhang')
+    overhang_len = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'overhang')
+    if NodesOverhang == 0:
+        with_overhang = False
     else:
-        cout.cout_wrap('WARNING: HubMass not found', 3)
-        num_lumped_mass_overhang = 0
-
-    overhang.StructuralInformation.generate_uniform_sym_beam(node_pos,
+        with_overhang = True
+
+        overhang = gc.AeroelasticInformation()
+        overhang.StructuralInformation.num_node = NodesOverhang
+        overhang.StructuralInformation.num_node_elem = 3
+        overhang.StructuralInformation.compute_basic_num_elem()
+        node_pos = np.zeros((overhang.StructuralInformation.num_node, 3), )
+        node_pos[:, 0] += tower.StructuralInformation.coordinates[-1, 0]
+        node_pos[:, 0] += np.linspace(0., -overhang_len*np.sin(tilt*deg2rad), overhang.StructuralInformation.num_node)
+        node_pos[:, 2] = np.linspace(0., overhang_len*np.cos(tilt*deg2rad), overhang.StructuralInformation.num_node)
+        # TODO: change the following by real values
+        # Same properties as the last element of the tower
+        # cout.cout_wrap("WARNING: Using the structural properties of the last tower section for the overhang", 3)
+        # oh_mass_per_unit_length = tower.StructuralInformation.mass_db[-1, 0, 0]
+        # oh_mass_iner = tower.StructuralInformation.mass_db[-1, 3, 3]
+        cout.cout_wrap("WARNING: Using the structural properties (*0.1) of the last tower section for the overhang", 3)
+        oh_mass_per_unit_length = tower.StructuralInformation.mass_db[-1, 0, 0]/10.
+        oh_mass_iner = tower.StructuralInformation.mass_db[-1, 3, 3]/10.
+        oh_EA = tower.StructuralInformation.stiffness_db[-1, 0, 0]
+        oh_GA = tower.StructuralInformation.stiffness_db[-1, 1, 1]
+        oh_GJ = tower.StructuralInformation.stiffness_db[-1, 3, 3]
+        oh_EI = tower.StructuralInformation.stiffness_db[-1, 4, 4]
+
+        overhang.StructuralInformation.generate_uniform_sym_beam(node_pos,
                                                             oh_mass_per_unit_length,
                                                             oh_mass_iner,
                                                             oh_EA,
@@ -870,24 +948,38 @@ def generate_from_excel_type03(op_params,
                                                             oh_EI,
                                                             num_node_elem=3,
                                                             y_BFoR='y_AFoR',
-                                                            num_lumped_mass=num_lumped_mass_overhang)
+                                                            num_lumped_mass=0)
 
-    overhang.StructuralInformation.boundary_conditions = np.zeros((overhang.StructuralInformation.num_node), dtype=int)
-    overhang.StructuralInformation.boundary_conditions[-1] = -1
+        overhang.StructuralInformation.boundary_conditions[-1] = -1
 
-    if not HubMass is None:
-        # Include hub mass
-        overhang.StructuralInformation.lumped_mass_nodes = np.array([overhang.StructuralInformation.num_node - 1], dtype=int)
-        overhang.StructuralInformation.lumped_mass = np.array([HubMass], dtype=float)
-
-    overhang.AerodynamicInformation.set_to_zero(overhang.StructuralInformation.num_node_elem,
+        overhang.AerodynamicInformation.set_to_zero(overhang.StructuralInformation.num_node_elem,
                                                 overhang.StructuralInformation.num_node,
                                                 overhang.StructuralInformation.num_elem)
 
-    tower.assembly(overhang)
-    tower.remove_duplicated_points(tol_remove_points)
-    hub_node = tower.StructuralInformation.num_node
-    tower.StructuralInformation.body_number *= 0
+        tower.assembly(overhang)
+        tower.remove_duplicated_points(tol_remove_points)
+        tower.StructuralInformation.body_number *= 0
+
+    # Hub mass
+    HubMass = gc.read_column_sheet_type01(excel_file_name, excel_sheet_parameters, 'HubMass')
+    if HubMass is not None:
+        if with_overhang:
+            tower.StructuralInformation.add_lumped_mass(tower.StructuralInformation.num_node -1,
+                                  HubMass,
+                                  inertia=np.zeros((3, 3)),
+                                  pos=np.zeros((3)))
+        else:
+            n_hub_nodes = len(hub_nodes)
+            for inode_hub in range(n_hub_nodes):
+                rotor.StructuralInformation.add_lumped_mass(hub_nodes[inode_hub],
+                                      HubMass/n_hub_nodes,
+                                      inertia=np.zeros((3, 3)),
+                                      pos=np.zeros((3)))
+    else:
+        cout.cout_wrap('WARNING: HubMass not found', 3)
+
+    for inode in range(len(hub_nodes)):
+        hub_nodes[inode] += tower.StructuralInformation.num_node
 
     ######################################################################
     ##  WIND TURBINE
@@ -895,28 +987,32 @@ def generate_from_excel_type03(op_params,
     # Assembly the whole case
     wt = tower.copy()
     hub_position = tower.StructuralInformation.coordinates[-1, :]
+    if not with_overhang:
+        hub_position += np.array([0., 0., overhang_len])
     rotor.StructuralInformation.coordinates += hub_position
     wt.assembly(rotor)
 
-    # Redefine the body numbers
-    wt.StructuralInformation.body_number *= 0
-    wt.StructuralInformation.body_number[tower.StructuralInformation.num_elem:wt.StructuralInformation.num_elem] += 1
-
     ######################################################################
     ## MULTIBODY
     ######################################################################
-    # Define the boundary condition between the rotor and the tower tip
-    LC1 = gc.LagrangeConstraint()
-    LC1.behaviour = 'hinge_node_FoR_constant_vel'
-    LC1.node_in_body = tower.StructuralInformation.num_node - 1
-    LC1.body = 0
-    LC1.body_FoR = 1
-    LC1.rot_vect = np.array([-1., 0., 0.])*rotation_velocity
-
     LC = []
-    LC.append(LC1)
+    for iblade in range(len(hub_nodes)):
+        # Define the boundary condition between the rotor and the tower tip
+        LC1 = gc.LagrangeConstraint()
+        LC1.behaviour = 'hinge_node_FoR_constant_vel'
+        LC1.node_in_body = tower.StructuralInformation.num_node - 1
+        LC1.body = 0
+        LC1.body_FoR = iblade + 1
+        if with_overhang:
+            LC1.rot_vect = np.array([-1., 0., 0.])*rotation_velocity
+            LC1.rel_posB = np.zeros((3))
+        else:
+            LC1.rot_vect = np.array([0., 0., 1.])*rotation_velocity
+            LC1.rel_posB = np.array([0., 0., overhang_len])
+        LC.append(LC1)
 
     # Define the multibody infromation for the tower and the rotor
+    MB = []
     MB1 = gc.BodyInformation()
     MB1.body_number = 0
     MB1.FoR_position = np.zeros((6,),)
@@ -924,23 +1020,24 @@ def generate_from_excel_type03(op_params,
     MB1.FoR_acceleration = np.zeros((6,),)
     MB1.FoR_movement = 'prescribed'
     MB1.quat = np.array([1.0, 0.0, 0.0, 0.0])
-
-    MB2 = gc.BodyInformation()
-    MB2.body_number = 1
-    MB2.FoR_position = np.array([rotor.StructuralInformation.coordinates[0, 0], rotor.StructuralInformation.coordinates[0, 1], rotor.StructuralInformation.coordinates[0, 2], 0.0, 0.0, 0.0])
-    MB2.FoR_velocity = np.array([0., 0., 0., 0., 0., rotation_velocity])
-    MB2.FoR_acceleration = np.zeros((6,),)
-    MB2.FoR_movement = 'free'
-    MB2.quat = algebra.euler2quat(np.array([0.0, tilt, 0.0]))
-
-    MB = []
     MB.append(MB1)
-    MB.append(MB2)
+
+    numberOfBlades = len(hub_nodes)
+    for iblade in range(numberOfBlades):
+        MB2 = gc.BodyInformation()
+        MB2.body_number = iblade + 1
+        MB2.FoR_position = np.concatenate((hub_position, np.zeros((3))))
+        MB2.FoR_velocity = np.array([0., 0., 0., 0., 0., rotation_velocity])
+        MB2.FoR_acceleration = np.zeros((6,),)
+        MB2.FoR_movement = 'free'
+        blade_azimuth = (iblade*(360.0/numberOfBlades)*deg2rad)
+        MB2.quat = algebra.euler2quat(np.array([0.0, tilt, blade_azimuth]))
+        MB.append(MB2)
 
     ######################################################################
     ## RETURN
     ######################################################################
-    return wt, LC, MB, hub_node
+    return wt, LC, MB, hub_nodes
 
 
 ######################################################################
@@ -987,6 +1084,7 @@ def rotor_from_excel_type02(chord_panels,
     options['camber_effect_on_twist'] = camber_effect_on_twist
     options['user_defined_m_distribution_type'] = user_defined_m_distribution_type
     options['include_polars'] = False
+    options['twist_in_aero'] = False
 
     excel_description = {}
     excel_description['excel_file_name'] = excel_file_name
diff --git a/sharpy/controllers/bladepitchpid.py b/sharpy/controllers/bladepitchpid.py
new file mode 100644
index 000000000..92f3c6a2c
--- /dev/null
+++ b/sharpy/controllers/bladepitchpid.py
@@ -0,0 +1,460 @@
+import numpy as np
+import os
+from control import ss, forced_response, TransferFunction
+
+import sharpy.utils.controller_interface as controller_interface
+import sharpy.utils.settings as settings
+import sharpy.utils.control_utils as control_utils
+import sharpy.utils.cout_utils as cout
+import sharpy.utils.algebra as algebra
+from sharpy.utils.constants import deg2rad
+
+
+@controller_interface.controller
+class BladePitchPid(controller_interface.BaseController):
+    r"""
+
+
+    """
+    controller_id = 'BladePitchPid'
+
+    settings_types = dict()
+    settings_default = dict()
+    settings_description = dict()
+    settings_options = dict()
+
+    # PID parameters
+    settings_types['P'] = 'float'
+    settings_default['P'] = None
+    settings_description['P'] = 'Proportional gain of the controller'
+
+    settings_types['I'] = 'float'
+    settings_default['I'] = 0.0
+    settings_description['I'] = 'Integral gain of the controller'
+
+    settings_types['D'] = 'float'
+    settings_default['D'] = 0.0
+    settings_description['D'] = 'Differential gain of the controller'
+
+    # Filter
+    settings_types['lp_cut_freq'] = 'float'
+    settings_default['lp_cut_freq'] = 0.
+    settings_description['lp_cut_freq'] = 'Cutting frequency of the low pass filter of the process value in Hz. Choose 0 for no filter'
+
+    settings_types['anti_windup_lim'] = 'list(float)'
+    settings_default['anti_windup_lim'] = [-1., -1.]
+    settings_description['anti_windup_lim'] = ('Limits of actuation to apply anti windup.' +
+                                              'Use the same number to deactivate.')
+
+    # Set point parameters
+    settings_types['sp_type'] = 'str'
+    settings_default['sp_type'] = None
+    settings_description['sp_type'] = (
+            'Quantity used to define the' +
+            ' set point')
+    settings_options['sp_type'] = ['rbm', 'pitch', 'gen_vel']
+
+    settings_types['sp_source'] = 'str'
+    settings_default['sp_source'] = None
+    settings_description['sp_source'] = (
+            'Source used to define the' +
+            ' set point')
+    settings_options['sp_source'] = ['file', 'const']
+
+    settings_types['sp_time_history_file'] = 'str'
+    settings_default['sp_time_history_file'] = ''
+    settings_description['sp_time_history_file'] = ('Route and file name of the time ' +
+                                                    'history of the desired set point.' +
+                                                    'Used for ``sp_source = file``')
+
+    settings_types['sp_const'] = 'float'
+    settings_default['sp_const'] = 0.
+    settings_description['sp_const'] = 'Constant set point. Only used for ``sp_source`` = `const ``'
+
+    # Other parameters
+    settings_types['dt'] = 'float'
+    settings_default['dt'] = None
+    settings_description['dt'] = 'Time step of the simulation'
+
+    settings_types['ntime_steps'] = 'int'
+    settings_default['ntime_steps'] = None
+    settings_description['ntime_steps'] = 'Number of time steps'
+
+    #settings_types['tower_body'] = 'int'
+    #settings_default['tower_body'] = 0
+    #settings_description['tower_body'] = 'Body number of the tower'
+
+    #settings_types['tower_top_node'] = 'int'
+    #settings_default['tower_top_node'] = 0
+    #settings_description['tower_top_node'] = 'Global node number of the tower top'
+
+    settings_types['blade_num_body'] = 'list(int)'
+    settings_default['blade_num_body'] = [0,]
+    settings_description['blade_num_body'] = 'Body number of the blade(s) to pitch'
+
+    settings_types['max_pitch_rate'] = 'float'
+    settings_default['max_pitch_rate'] = 0.1396
+    settings_description['max_pitch_rate'] = 'Maximum pitch rate [rad/s]'
+
+    settings_types['pitch_sp'] = 'float'
+    settings_default['pitch_sp'] = 0.
+    settings_description['pitch_sp'] = 'Pitch set point [rad]'
+
+    settings_types['initial_pitch'] = 'float'
+    settings_default['initial_pitch'] = 0.
+    settings_description['initial_pitch'] = 'Initial pitch [rad]'
+
+    settings_types['initial_rotor_vel'] = 'float'
+    settings_default['initial_rotor_vel'] = 0.
+    settings_description['initial_rotor_vel'] = 'Initial rotor velocity [rad/s]'
+
+    settings_types['min_pitch'] = 'float'
+    settings_default['min_pitch'] = 0.
+    settings_description['min_pitch'] = 'Minimum pitch [rad]'
+
+    settings_types['max_pitch'] = 'float'
+    settings_default['max_pitch'] = 1.5707963267948966
+    settings_description['max_pitch'] = 'Maximum pitch [rad]'
+
+    settings_types['nocontrol_steps'] = 'int'
+    settings_default['nocontrol_steps'] = -1
+    settings_description['nocontrol_steps'] = 'Time steps without control action'
+
+    # Generator and drive train model
+    settings_types['gen_model_const_var'] = 'str'
+    settings_default['gen_model_const_var'] = ''
+    settings_description['gen_model_const_var'] = 'Generator metric to be kept constant at a value `target_gen_value`'
+    settings_options['gen_model_const_var'] = ['power', 'torque']
+
+    settings_types['gen_model_const_value'] = 'float'
+    settings_default['gen_model_const_value'] = 3945990.325
+    settings_description['gen_model_const_value'] = 'Constant value of the generator metric to be kept constant '
+
+    settings_types['GBR'] = 'float'
+    settings_default['GBR'] = 97.
+    settings_description['GBR'] = 'Gear box ratio'
+
+    settings_types['inertia_dt'] = 'float'
+    settings_default['inertia_dt'] = 43776046.25
+    settings_description['inertia_dt'] = 'Drive train inertia'
+
+    settings_types['newmark_damp'] = 'float'
+    settings_default['newmark_damp'] = 1e-4
+    settings_description['newmark_damp'] = 'Damping of the time integration newmark-beta scheme'
+
+    # Output parameters
+    settings_types['write_controller_log'] = 'bool'
+    settings_default['write_controller_log'] = True
+    settings_description['write_controller_log'] = (
+            'Write a time history of input, required input, ' +
+            'and control')
+
+    settings_table = settings.SettingsTable()
+    __doc__ += settings_table.generate(settings_types,
+                                       settings_default,
+                                       settings_description)
+
+    def __init__(self):
+        self.in_dict = None
+        self.data = None
+        self.settings = None
+
+        self.prescribed_sp_time_history = None
+        self.prescribed_sp = list()
+        self.system_pv = list()
+
+        self.controller_implementation = None
+
+        self.log_fname = None
+
+    def initialise(self, data, in_dict, controller_id=None, restart=False):
+        self.in_dict = in_dict
+        settings.to_custom_types(self.in_dict,
+                                 self.settings_types,
+                                 self.settings_default,
+                                 no_ctype=True)
+
+        self.settings = self.in_dict
+        self.newmark_beta = 0.5 + self.settings['newmark_damp']
+
+        if self.settings['write_controller_log']:
+            folder = data.output_folder + '/controllers/'
+            if not os.path.exists(folder):
+                os.makedirs(folder)
+            self.log_fname = (folder + self.controller_id + ".dat")
+            fid = open(self.log_fname, 'a')
+            fid.write(('#'+ 1*'{:>2} ' + 10*'{:>12} ' + '{:>12}\n').
+                    format('tstep', 'time', 'ref_state', 'state', 'Pcontrol', 'Icontrol', 'Dcontrol', 'control', 'gen_torque', 'rotor_vel', 'pitch_vel', 'pitch'))
+            fid.close()
+
+        # save input time history
+        if self.settings['sp_source'] == 'file':
+            self.prescribed_sp_time_history = np.loadtxt(self.settings['sp_time_history_file'])
+        # Init PID controller
+        self.controller_implementation = control_utils.PID(self.settings['P'],
+                                                           self.settings['I'],
+                                                           self.settings['D'],
+                                                           self.settings['dt'])
+
+        if not self.settings['anti_windup_lim'][0] == self.settings['anti_windup_lim'][1]:
+                self.controller_implementation.set_anti_windup_lim(self.settings['anti_windup_lim'])
+
+        if self.settings['lp_cut_freq'] == 0.:
+            self.filter_pv = False
+        else:
+            self.filter_pv = True
+            w0 = self.settings['lp_cut_freq']*2*np.pi
+            self.filter = TransferFunction(np.array([w0]), np.array([1., w0]))
+            self.min_it_filter = int(1./(self.settings['lp_cut_freq']*self.settings['dt']))
+
+        self.pitch = self.settings['initial_pitch']
+        self.rotor_vel = self.settings['initial_rotor_vel']
+        self.rotor_acc = 0.
+
+    def control(self, data, controlled_state):
+        r"""
+        Main routine of the controller.
+        Input is `data` (the self.data in the solver), and
+        `currrent_state` which is a dictionary with ['structural', 'aero']
+        time steps for the current iteration.
+
+        :param data: problem data containing all the information.
+        :param controlled_state: `dict` with two vars: `structural` and `aero`
+            containing the `timestep_info` that will be returned with the
+            control variables.
+
+        :returns: A `dict` with `structural` and `aero` time steps and control
+            input included.
+        """
+        # TODO: move this to the initialisation with restart
+        if len(self.system_pv) == 0:
+            for it in range(data.ts - 1):
+                self.system_pv.append(0.)
+                self.prescribed_sp.append(0.)
+
+        struct_tstep = controlled_state['structural']
+        aero_tstep = controlled_state['aero']
+        if not "info" in controlled_state:
+            controlled_state['info'] = dict()
+
+        time = self.settings['dt']*data.ts
+
+        # Compute the rotor velocity
+        aero_torque = self.compute_aero_torque(data.structure, struct_tstep)
+        # if self.settings['variable_speed']:
+        if True:
+            #ielem, inode_in_elem = data.structure.node_master_elem[self.settings['tower_top_node']
+            #node_cga = ag.quat2rotation(struct_tstep.mb_quat[self.settings['tower_body'], :])
+            #cab = ag.crv2rotation(struct_tstep.psi[ielem, inode_in_elem, :])
+            #FoR_cga = ag.quat2rotation(struct_tstep.mb_quat[self.settings['blade_num_body'][0], :])
+
+            #ini_rotor_vel = ag.multiply_matrices(cab.T, node_cga.T, FoR_cga,
+            #                                     struct_tstep.mb_FoR_vel[self.settings['blade_num_body'][0], 3:6])[2]
+            #ini_rotor_acc = ag.multiply_matrices(cab.T, node_cga.T, FoR_cga,
+            #                                     struct_tstep.mb_FoR_acc[self.settings['blade_num_body'][0], 3:6])[2]
+            self.rotor_vel, self.rotor_acc = self.drive_train_model(aero_torque,
+                                                                    self.rotor_vel,
+                                                                    self.rotor_acc)
+        else:
+            self.rotor_vel = self.settings['sp_const']
+            self.rotor_acc = 0.
+
+        # System set point
+        prescribed_sp = self.compute_prescribed_sp(time)
+        # System process value
+        sys_pv = self.compute_system_pv(struct_tstep,
+                                        data.structure,
+                                        gen_vel=self.rotor_vel*self.settings['GBR'])
+
+        if data.ts < self.settings['nocontrol_steps']:
+            sys_pv = prescribed_sp
+            self.system_pv[-1] = sys_pv
+            return controlled_state
+        else:
+            controlled_state['info']['rotor_vel'] = self.rotor_vel
+
+        # Apply filter
+        # Filter only after five periods of the cutoff frequency
+        if self.filter_pv and (len(self.system_pv) > self.min_it_filter):
+            nit = len(self.system_pv)
+            time = np.linspace(0, (nit - 1)*self.settings['dt'], nit)
+            # print(time.shape, len(self.system_pv))
+            T, filtered_pv, xout = forced_response(self.filter,
+                                        T=time,
+                                        U=self.system_pv)
+        else:
+            filtered_pv = self.system_pv
+
+        # get current state input
+        delta_pitch_ref, detail = self.controller_wrapper(
+                required_input=self.prescribed_sp,
+                current_input=filtered_pv,
+                control_param={'P': self.settings['P'],
+                               'I': self.settings['I'],
+                               'D': self.settings['D']},
+                i_current=data.ts)
+        # NREL controller does error = state - reference. Here is done the other way
+        delta_pitch_ref *= -1.
+        # Limit pitch and pitch rate
+        target_pitch = delta_pitch_ref + self.settings['pitch_sp']
+        pitch_rate = (target_pitch - self.pitch)/self.settings['dt']
+        if pitch_rate < -self.settings['max_pitch_rate']:
+            pitch_rate = -self.settings['max_pitch_rate']
+        elif pitch_rate > self.settings['max_pitch_rate']:
+            pitch_rate = self.settings['max_pitch_rate']
+
+        next_pitch = self.pitch + pitch_rate*self.settings['dt']
+        if next_pitch < self.settings['min_pitch']:
+            pitch_rate = 0.
+            next_pitch = self.settings['min_pitch']
+        if next_pitch > self.settings['max_pitch']:
+            pitch_rate = 0.
+            next_pitch = self.settings['max_pitch']
+
+        self.pitch = next_pitch
+
+        controlled_state['info']['pitch_vel'] = -pitch_rate
+
+        # Apply control order
+        change_quat = False
+        if change_quat:
+            for ibody in self.settings['blade_num_body']:
+                quat = algebra.rotate_quaternion(struct_tstep.mb_quat[ibody, :],
+                                                 delta_pitch*np.array([1., 0., 0.]))
+                struct_tstep.mb_quat[ibody, :] = quat.copy()
+                if ibody == 0:
+                    struct_tstep.quat = quat.copy()
+        change_vel = False
+        if change_vel:
+            for ibody in self.settings['blade_num_body']:
+                struct_tstep.mb_FoR_vel[ibody, 3] = pitch_rate
+                struct_tstep.mb_FoR_acc[ibody, 3] = (data.structure.timestep_info[data.ts - 1].mb_FoR_vel[ibody, 3] -
+                                                     struct_tstep.mb_FoR_vel[ibody, 3])/self.settings['dt']
+                if ibody == 0:
+                    struct_tstep.for_vel[3] = struct_tstep.mb_FoR_vel[ibody, 3]
+                    struct_tstep.for_acc[3] = struct_tstep.mb_FoR_acc[ibody, 3]
+
+            data.structure.dynamic_input[data.ts - 1]['for_vel'] = struct_tstep.for_vel.copy()
+            data.structure.dynamic_input[data.ts - 1]['for_acc'] = struct_tstep.for_acc.copy()
+
+        if False:
+            data.aero.generate_zeta_timestep_info(struct_tstep,
+                                              aero_tstep,
+                                              data.structure,
+                                              data.aero.aero_settings,
+                                              dt=self.settings['dt'])
+
+        fid = open(self.log_fname, 'a')
+        fid.write(('{:>6d} '
+                        + 10*'{:>12.6f} '
+                        + '{:>12.6f}\n').format(data.ts,
+                                                data.ts*self.settings['dt'],
+                                                self.prescribed_sp[-1],
+                                                self.system_pv[-1],
+                                                detail[0],
+                                                detail[1],
+                                                detail[2],
+                                                delta_pitch_ref,
+                                                aero_torque/self.settings['GBR'],
+                                                self.rotor_vel,
+                                                pitch_rate,
+                                                self.pitch))
+        fid.close()
+        return controlled_state
+
+
+    def compute_prescribed_sp(self, time):
+        """
+            Compute the set point relevant for the controller
+        """
+        if self.settings['sp_source'] == 'file':
+            sp = np.interp(time,
+                           self.prescribed_sp_time_history[:, 0],
+                           self.prescribed_sp_time_history[:, 1])
+            self.prescribed_sp.append(sp)
+        elif self.settings['sp_source'] == 'const':
+            self.prescribed_sp.append(self.settings['sp_const'])
+
+        return self.prescribed_sp[-1]
+
+
+    def compute_system_pv(self, struct_tstep, beam, **kwargs):
+        """
+            Compute the process value relevant for the controller
+        """
+        if self.settings['sp_type'] == 'pitch':
+            pitch = algebra.quat2euler(struct_tstep.mb_quat[self.settings['blade_num_body'][0]])[0]
+            self.system_pv.append(pitch)
+        elif self.settings['sp_type'] == 'rbm':
+            steady, unsteady, grav = struct_tstep.extract_resultants(beam, force_type=['steady', 'unsteady', 'gravity'],
+                                                                                       ibody=0)
+            rbm = steady[4] + unsteady[4] + grav[4]
+            self.system_pv.append(rbm)
+        elif self.settings['sp_type'] == 'gen_vel':
+            self.system_pv.append(kwargs['gen_vel'])
+
+        return self.system_pv[-1]
+
+    def controller_wrapper(self,
+                           required_input,
+                           current_input,
+                           control_param,
+                           i_current):
+        self.controller_implementation.set_point(required_input[i_current - 1])
+        control_param, detailed_control_param = self.controller_implementation(current_input[-1])
+        return (control_param, detailed_control_param)
+
+    def __exit__(self, *args):
+        # self.log.close()
+        pass
+
+    def drive_train_model(self, aero_torque, ini_rot_vel, ini_rot_acc):
+
+        # Assuming contant generator torque demand
+        if self.settings['gen_model_const_var'] == 'power':
+            gen_torque = self.settings['gen_model_const_value']/self.settings['GBR']/ini_rot_vel
+        elif self.settings['gen_model_const_var'] == 'torque':
+            gen_torque = self.settings['gen_model_const_value']
+
+        rot_acc = (aero_torque - self.settings['GBR']*gen_torque)/self.settings['inertia_dt']
+        rot_vel = ini_rot_vel + rot_acc*self.settings['dt']
+
+        return rot_vel, rot_acc
+
+    def compute_aero_torque(self, beam, struct_tstep):
+        # Compute total forces
+        total_forces = np.zeros((6))
+        for ibody in self.settings['blade_num_body']:
+            steady, unsteady, grav = struct_tstep.extract_resultants(beam,
+                                                      force_type=['steady', 'unsteady', 'grav'],
+                                                      ibody=ibody)
+            # total_forces += steady + unsteady + grav
+            total_forces += steady + unsteady
+
+        # Compute equivalent forces at hub position
+        hub_elem = np.where(beam.body_number == self.settings['blade_num_body'][0])[0][0]
+        hub_node = beam.connectivities[hub_elem, 0]
+        hub_pos = struct_tstep.pos[hub_node, :]
+
+        hub_forces = np.zeros((6))
+        hub_forces[0:3] = total_forces[0:3].copy()
+        hub_forces[3:6] = total_forces[3:6] - np.cross(hub_pos, total_forces[0:3])
+
+        return hub_forces[5]
+
+    @staticmethod
+    def compute_blade_pitch(beam, struct_tstep, tower_ibody=0, blade_ibody=1):
+        # Tower top
+        tt_elem = np.where(beam.body_number == tower_ibody)[0][-1]
+        tt_node = beam.connectivities[tt_elem, 1]
+        ielem, inode_in_elem = beam.node_master_elem[tt_node]
+        ca0b = algebra.crv2rotation(struct_tstep.psi[ielem, inode_in_elem, :])
+        cga0 = algebra.quat2rotation(struct_tstep.mb_quat[tower_ibody, :])
+        zg_tower_top = algebra.multiply_matrices(cga0, ca0b, np.array([0., 0., 1.]))
+
+        # blade root
+        cga = algebra.quat2rotation(struct_tstep.mb_quat[blade_ibody, :])
+        zg_hub = algebra.multiply_matrices(cga, np.array([0., 0., 1.]))
+
+        pitch = algebra.angle_between_vectors(zg_tower_top, zg_hub)
+        return pitch
diff --git a/sharpy/controllers/controlsurfacepidcontroller.py b/sharpy/controllers/controlsurfacepidcontroller.py
index fe0ee53d5..e30098660 100644
--- a/sharpy/controllers/controlsurfacepidcontroller.py
+++ b/sharpy/controllers/controlsurfacepidcontroller.py
@@ -1,4 +1,5 @@
 import numpy as np
+import os
 
 import sharpy.utils.controller_interface as controller_interface
 import sharpy.utils.settings as settings
@@ -61,11 +62,6 @@ class ControlSurfacePidController(controller_interface.BaseController):
             'Write a time history of input, required input, ' +
             'and control')
 
-    settings_types['controller_log_route'] = 'str'
-    settings_default['controller_log_route'] = './output/'
-    settings_description['controller_log_route'] = (
-            'Directory where the log will be stored')
-
     supported_input_types = ['pitch', 'roll', 'pos_']
 
     settings_table = settings.SettingsTable()
@@ -96,7 +92,7 @@ def __init__(self):
 
         self.log = None
 
-    def initialise(self, in_dict, controller_id=None):
+    def initialise(self, data, in_dict, controller_id=None, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict,
                                  self.settings_types,
@@ -120,7 +116,10 @@ def initialise(self, in_dict, controller_id=None):
             raise NotImplementedError()
 
         if self.settings['write_controller_log']:
-            self.log = open(self.settings['controller_log_route'] + '/' + self.controller_id + '.log.csv', 'w+')
+            folder = data.output_folder + '/controllers/'
+            if not os.path.exists(folder):
+                os.makedirs(folder)
+            self.log = open(folder + self.controller_id + ".log.csv", "w+")
             self.log.write(('#'+ 1*'{:>2},' + 6*'{:>12},' + '{:>12}\n').
                     format('tstep', 'time', 'Ref. state', 'state', 'Pcontrol', 'Icontrol', 'Dcontrol', 'control'))
             self.log.flush()
diff --git a/sharpy/controllers/takeofftrajectorycontroller.py b/sharpy/controllers/takeofftrajectorycontroller.py
index ba9a95c47..80b1112e0 100644
--- a/sharpy/controllers/takeofftrajectorycontroller.py
+++ b/sharpy/controllers/takeofftrajectorycontroller.py
@@ -1,5 +1,6 @@
 import ctypes as ct
 import numpy as np
+import os
 import scipy.interpolate as interpolate
 
 import sharpy.utils.controller_interface as controller_interface
@@ -87,7 +88,7 @@ def __init__(self):
 
         self.log = None
 
-    def initialise(self, in_dict, controller_id=None):
+    def initialise(self, data, in_dict, controller_id=None, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict,
                                  self.settings_types,
@@ -98,8 +99,10 @@ def initialise(self, in_dict, controller_id=None):
 
         if self.settings['write_controller_log']:
             # TODO substitute for table writer in cout_utils.
-            self.log = open(self.settings['controller_log_route'] +
-                            '/' + self.controller_id + '.log.csv', 'w+')
+            folder = data.output_folder + '/controllers/'
+            if not os.path.exists(folder):
+                os.makedirs(folder)
+            self.log = open(folder + self.controller_id + ".log.csv", "w+")
             self.log.write(('#'+ 1*'{:>2},' + 6*'{:>12},' + '{:>12}\n').
                     format('tstep', 'time', 'Ref. state', 'state', 'Pcontrol', 'Icontrol', 'Dcontrol', 'control'))
             self.log.flush()
diff --git a/sharpy/generators/bumpvelocityfield.py b/sharpy/generators/bumpvelocityfield.py
index b34d0dba5..347103dd7 100644
--- a/sharpy/generators/bumpvelocityfield.py
+++ b/sharpy/generators/bumpvelocityfield.py
@@ -78,7 +78,7 @@ def __init__(self):
         self.u_inf = 0.
         self.u_inf_direction = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, BumpVelocityField.settings_types, BumpVelocityField.settings_default)
         self.settings = self.in_dict
diff --git a/sharpy/generators/dynamiccontrolsurface.py b/sharpy/generators/dynamiccontrolsurface.py
index 470c31cdf..f2017ad8f 100644
--- a/sharpy/generators/dynamiccontrolsurface.py
+++ b/sharpy/generators/dynamiccontrolsurface.py
@@ -68,7 +68,7 @@ def __init__(self):
         self.deflection = None
         self.deflection_dot = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, self.settings_types, self.settings_default, no_ctype=True)
 
diff --git a/sharpy/generators/floatingforces.py b/sharpy/generators/floatingforces.py
index d850c38d6..c296d97f7 100644
--- a/sharpy/generators/floatingforces.py
+++ b/sharpy/generators/floatingforces.py
@@ -145,12 +145,9 @@ def quasisteady_mooring(xf, zf, l, w, EA, cb, hf0=None, vf0=None):
         inv_J_est = np.linalg.inv(J_est)
         hf_est += inv_J_est[0, 0]*(xf - xf_est) + inv_J_est[0, 1]*(zf - zf_est)
         vf_est += inv_J_est[1, 0]*(xf - xf_est) + inv_J_est[1, 1]*(zf - zf_est)
-        # hf += (xf - xf_est)/J[0, 0] + (zf - zf_est)/J[1, 0]
-        # vf += (xf - xf_est)/J[0, 1] + (zf - zf_est)/J[1, 1]
 
         xf_est, zf_est = compute_xf_zf(hf_est, vf_est, l, w, EA, cb)
         error = np.maximum(np.abs(xf - xf_est), np.abs(zf - zf_est))
-        # print(error)
         it += 1
     if ((it == max_iter) and (error > tol)):
         cout.cout_wrap(("Mooring system did not converge. error %f" % error), 4)
@@ -187,30 +184,6 @@ def change_of_to_sharpy(matrix_of):
     return matrix_sharpy
 
 
-# def interp_1st_dim_matrix(A, vec, value):
-#
-#     # Make sure vec is ordered in strictly ascending order
-#     if (np.diff(vec) <= 0).any():
-#         cout.cout_wrap("ERROR: vec should be in strictly increasing order", 4)
-#     if not A.shape[0] == vec.shape[0]:
-#         cout.cout_wrap("ERROR: Incoherent vector and matrix size", 4)
-#
-#     # Compute the positions to interpolate
-#     if value <= vec[0]:
-#         return A[0, ...]
-#     elif ((value >= vec[-1]) or (value > vec[-2] and np.isinf(vec[-1]))):
-#         return A[-1, ...]
-#     else:
-#         i = 0
-#         while value > vec[i]:
-#             i += 1
-#         dist = vec[i] - vec[i - 1]
-#         rel_dist_to_im1 = (value - vec[i - 1])/dist
-#         rel_dist_to_i = (vec[i] - value)/dist
-#
-#     return A[i - 1, ...]*rel_dist_to_i + A[i, ...]*rel_dist_to_im1
-
-
 def rfval(num, den, z):
     """
         Evaluate a rational function given by the coefficients of the numerator (num) and
@@ -247,7 +220,6 @@ def response_freq_dep_matrix(H, omega_H, q, it_, dt):
 
     # Compute the constant component
     if type(H) is np.ndarray:
-        # H_omega = interp_1st_dim_matrix(H, omega_H, omega_fft[0])
         interp_H = interp1d(omega_H, H, axis=0)
         H_omega = interp_H(omega_fft[0])
     elif type(H) is tuple:
@@ -269,8 +241,6 @@ def response_freq_dep_matrix(H, omega_H, q, it_, dt):
     # Compute the inverse Fourier tranform
     f[:] = np.real(ifft(fourier_f, axis=0)[it_, :])
 
-    # (T, yout, xout) = lsim(H, q[:it_ + 1, :], T, X0=X0)
-
     return f
 
 
@@ -357,53 +327,9 @@ def noise_freq_1s(w):
         u2w = u2[iomega]
         wn[iomega] = np.sqrt(-2.*np.log(u1w))*(np.cos(2*np.pi*u2w) +
                              1j*np.sin(2*np.pi*u2w))
-        # wn[iomega] = 1. + 0j
     return wn*sigma
 
 
-def time_wave_forces(Tp, Hs, dt, time, xi, w_xi):
-    """
-    Compute the time evolution of wave forces
-    """
-    # Compute time and frequency discretisations
-    ntime_steps = time.shape[0]
-
-    nomega = ntime_steps//2 + 1
-    w = np.zeros((nomega))
-    w_temp = np.fft.fftfreq(ntime_steps, d=dt)*2.*np.pi
-    w[:ntime_steps//2] = w_temp[:ntime_steps//2]
-    if ntime_steps%2 == 0:
-        w[-1] = -1*w_temp[ntime_steps//2]
-    else:
-        w[-1] = w_temp[ntime_steps//2]
-    nomega_2s = ntime_steps
-
-    # Compute the one-sided spectrums
-    noise_freq = noise_freq_1s(w)
-    jonswap_1s = jonswap_spectrum(Tp, Hs, w)*2.*np.pi
-    jonswap_freq = np.sqrt(2*ntime_steps/dt*jonswap_1s/2) + 0j
-    jonswap_freq[0] = np.sqrt(ntime_steps/dt*jonswap_1s[0]/2) + 0j # The DC values does not have the 2
-
-    # Compute the two-sided spectrum
-    force_freq_2s = np.zeros((nomega_2s, 6), dtype=np.complex)
-    for idim in range(6):
-        for iomega in range(nomega):
-            xi_interp = np.interp(w[iomega], w_xi, xi[:, idim])
-            force_freq_2s[iomega, idim] = (noise_freq[iomega]*
-                                           0.5*jonswap_freq[iomega]*
-                                           xi_interp)
-            if not iomega == 0:
-                if not ((iomega == nomega - 1) and (nomega_2s%2 == 0)):
-                    force_freq_2s[-iomega, idim] = (np.conj(noise_freq[iomega])*
-                                                    0.5*jonswap_freq[iomega]*
-                                                    np.conj(xi_interp))
-
-    # Compute the inverse Fourier transform
-    force_waves = ifft(force_freq_2s, axis=0)
-
-    return force_waves
-
-
 @generator_interface.generator
 class FloatingForces(generator_interface.BaseGenerator):
     r"""
@@ -446,6 +372,10 @@ class FloatingForces(generator_interface.BaseGenerator):
     settings_default['water_density'] = 1025 # kg/m3
     settings_description['water_density'] = 'Water density'
 
+    settings_types['gravity_on'] = 'bool'
+    settings_default['gravity_on'] = True
+    settings_description['gravity_on'] = 'Flag to include gravitational forces'
+
     settings_types['gravity'] = 'float'
     settings_default['gravity'] = 9.81
     settings_description['gravity'] = 'Gravity'
@@ -458,6 +388,18 @@ class FloatingForces(generator_interface.BaseGenerator):
     settings_default['floating_file_name'] = './oc3.floating.h5'
     settings_description['floating_file_name'] = 'File containing the information about the floating dynamics'
 
+    settings_types['cd_multiplier'] = 'float'
+    settings_default['cd_multiplier'] = 1.
+    settings_description['cd_multiplier'] = 'Multiply the drag coefficient by this number to increase dissipation'
+
+    settings_types['add_damp_diag'] = 'list(float)'
+    settings_default['add_damp_diag'] = [0., 0., 0., 0., 0., 0.]
+    settings_description['add_damp_diag'] = 'Diagonal terms to include in the additional damping matrix'
+
+    settings_types['add_damp_ts'] = 'int'
+    settings_default['add_damp_ts'] = 0
+    settings_description['add_damp_ts'] = 'Timesteps in which ``add_damp_diag`` will be used'
+
     settings_types['method_matrices_freq'] = 'str'
     settings_default['method_matrices_freq'] = 'constant'
     settings_description['method_matrices_freq'] = 'Method to compute frequency-dependent matrices'
@@ -475,6 +417,10 @@ class FloatingForces(generator_interface.BaseGenerator):
     settings_default['added_mass_in_mass_matrix'] = True
     settings_description['added_mass_in_mass_matrix'] = 'Include the platform added mass in the mass matrix of the system'
 
+    settings_types['concentrate_spar'] = 'bool'
+    settings_default['concentrate_spar'] = False
+    settings_description['concentrate_spar'] = 'Compute CD as if the spar properties were concentrated at the base'
+
     settings_types['method_wave'] = 'str'
     settings_default['method_wave'] = 'sin'
     settings_description['method_wave'] = 'Method to compute wave forces'
@@ -545,7 +491,7 @@ def __init__(self):
         self.added_mass_in_mass_matrix = None
 
 
-    def initialise(self, in_dict=None, data=None):
+    def initialise(self, in_dict=None, data=None, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict,
                                  self.settings_types,
@@ -559,9 +505,15 @@ def initialise(self, in_dict=None, data=None):
         self.gravity_dir = self.settings['gravity_dir']
 
         # Platform dofs
-        self.q = np.zeros((self.settings['n_time_steps'] + 1, 6))
-        self.qdot = np.zeros_like(self.q)
-        self.qdotdot = np.zeros_like(self.q)
+        if not restart:
+            self.q = np.zeros((self.settings['n_time_steps'] + 1, 6))
+            self.qdot = np.zeros_like(self.q)
+            self.qdotdot = np.zeros_like(self.q)
+        else:
+            increase_ts = self.settings['n_time_steps'] + 1 - self.q.shape[0]
+            self.q = np.concatenate((self.q, np.zeros((increase_ts, 6))), axis=0)
+            self.qdot = np.concatenate((self.qdot, np.zeros((increase_ts, 6))), axis=0)
+            self.qdotdot = np.concatenate((self.qdotdot, np.zeros((increase_ts, 6))), axis=0)
 
         # Read the file with the floating information
         fid = h5.File(self.settings['floating_file_name'], 'r')
@@ -573,18 +525,20 @@ def initialise(self, in_dict=None, data=None):
         self.n_mooring_lines = self.floating_data['mooring']['n_lines']
         self.anchor_pos = np.zeros((self.n_mooring_lines, 3))
         self.fairlead_pos_A = np.zeros((self.n_mooring_lines, 3))
-        self.hf_prev = [None]*self.n_mooring_lines
-        self.vf_prev = [None]*self.n_mooring_lines
-
-        theta = 2.*np.pi/self.n_mooring_lines
-        R = algebra.rotation3d_x(theta)
-        self.anchor_pos[0, 0] = -self.floating_data['mooring']['anchor_depth']
-        self.anchor_pos[0, 2] = self.floating_data['mooring']['anchor_radius']
-        self.fairlead_pos_A[0, 0] = -self.floating_data['mooring']['fairlead_depth']
-        self.fairlead_pos_A[0, 2] = self.floating_data['mooring']['fairlead_radius']
-        for imoor in range(1, self.n_mooring_lines):
-            self.anchor_pos[imoor, :] = np.dot(R, self.anchor_pos[imoor - 1, :])
-            self.fairlead_pos_A[imoor, :] = np.dot(R, self.fairlead_pos_A[imoor - 1, :])
+        if not restart:
+            self.hf_prev = [None]*self.n_mooring_lines
+            self.vf_prev = [None]*self.n_mooring_lines
+
+        if self.n_mooring_lines > 0:
+            theta = 2.*np.pi/self.n_mooring_lines
+            R = algebra.rotation3d_x(theta)
+            self.anchor_pos[0, 0] = -self.floating_data['mooring']['anchor_depth']
+            self.anchor_pos[0, 2] = self.floating_data['mooring']['anchor_radius']
+            self.fairlead_pos_A[0, 0] = -self.floating_data['mooring']['fairlead_depth']
+            self.fairlead_pos_A[0, 2] = self.floating_data['mooring']['fairlead_radius']
+            for imoor in range(1, self.n_mooring_lines):
+                self.anchor_pos[imoor, :] = np.dot(R, self.anchor_pos[imoor - 1, :])
+                self.fairlead_pos_A[imoor, :] = np.dot(R, self.fairlead_pos_A[imoor - 1, :])
 
         # Hydrostatics
         self.buoyancy_node = self.floating_data['hydrostatics']['node']
@@ -595,15 +549,8 @@ def initialise(self, in_dict=None, data=None):
         self.buoy_rest_mat = self.floating_data['hydrostatics']['buoyancy_restoring_matrix']
 
         # hydrodynamics
+        self.cd = self.floating_data['hydrodynamics']['CD']*self.settings['cd_multiplier']
         if self.settings['method_matrices_freq'] == 'constant':
-            # self.hd_added_mass_const = interp_1st_dim_matrix(self.floating_data['hydrodynamics']['added_mass_matrix'],
-            #                             self.floating_data['hydrodynamics']['ab_freq_rads'],
-            #                             self.settings['matrices_freq'])
-
-            # self.hd_damping_const = interp_1st_dim_matrix(self.floating_data['hydrodynamics']['damping_matrix'],
-            #                             self.floating_data['hydrodynamics']['ab_freq_rads'],
-            #                             self.settings['matrices_freq'])
-
             interp_am = interp1d(self.floating_data['hydrodynamics']['ab_freq_rads'],
                                  self.floating_data['hydrodynamics']['added_mass_matrix'],
                                  axis=0)
@@ -613,13 +560,20 @@ def initialise(self, in_dict=None, data=None):
                                axis=0)
             self.hd_damping_const = interp_d(self.settings['matrices_freq'])
 
-
         elif self.settings['method_matrices_freq'] == 'rational_function':
             self.hd_added_mass_const = self.floating_data['hydrodynamics']['added_mass_matrix'][-1, :, :]
             self.hd_damping_const = self.floating_data['hydrodynamics']['damping_matrix'][-1, :, :]
 
         self.added_mass_in_mass_matrix = self.settings['added_mass_in_mass_matrix']
-        if self.added_mass_in_mass_matrix:
+        if ((self.added_mass_in_mass_matrix) and (not restart)):
+            cout.cout_wrap(("Including added mass in mass matrix"), 2)
+            if data.structure.lumped_mass_mat is None:
+                data.structure.lumped_mass_mat_nodes = np.array([self.buoyancy_node])
+                data.structure.lumped_mass_mat = np.array([self.hd_added_mass_const])
+            else:
+                data.structure.lumped_mass_mat_nodes = np.concatenate((data.structure.lumped_mass_mat_nodes, np.array([self.buoyancy_node])), axis=0)
+                data.structure.lumped_mass_mat = np.concatenate((data.structure.lumped_mass_mat, np.array([self.hd_added_mass_const])), axis=0)
+
             data.structure.add_lumped_mass_to_element(self.buoyancy_node,
                                                       self.hd_added_mass_const)
             data.structure.generate_fortran()
@@ -640,20 +594,16 @@ def initialise(self, in_dict=None, data=None):
             self.hd_K = TransferFunction(hd_K_num, hd_K_den)
             self.ab_freq_rads = self.floating_data['hydrodynamics']['ab_freq_rads']
 
-            self.x0_K = [None]*(self.settings['n_time_steps'] + 1)
-            self.x0_K[0] = 0.
+            if restart:
+                self.x0_K.extend([None]*increase_ts)
+            else:
+                self.x0_K = [None]*(self.settings['n_time_steps'] + 1)
+                self.x0_K[0] = 0.
 
 
         # Wave forces
         self.wave_forces_node = self.floating_data['wave_forces']['node']
         if self.settings['method_wave'] == 'sin':
-            # xi_matrix2 = interp_1st_dim_matrix(self.floating_data['wave_forces']['xi'],
-            #                                 self.floating_data['wave_forces']['xi_freq_rads'],
-            #                                 self.settings['wave_freq'])
-            # xi = interp_1st_dim_matrix(xi_matrix2,
-            #                                 self.floating_data['wave_forces']['xi_beta_deg']*deg2rad,
-            #                                 self.settings['wave_incidence'])
-
             interp_x1 = interp1d(self.floating_data['wave_forces']['xi_freq_rads'],
                                  self.floating_data['wave_forces']['xi'],
                                  axis=0,
@@ -661,20 +611,10 @@ def initialise(self, in_dict=None, data=None):
                                  fill_value=(self.floating_data['wave_forces']['xi'][0, ...],
                                              self.floating_data['wave_forces']['xi'][-1, ...]))
             xi_matrix2 = interp_x1(self.settings['wave_freq'])
-            # xi_matrix2 = interp_x1(self.floating_data['wave_forces']['xi_freq_rads'][2:4])
             interp_x2 = interp1d(self.floating_data['wave_forces']['xi_beta_deg']*deg2rad,
                                  xi_matrix2,
                                  axis=0)
-            xi = interp_x2(self.settings['wave_incidence'])
-            # xi = interp_x2(self.floating_data['wave_forces']['xi_beta_deg'][5]*deg2rad)
-            # print(xi[0, :])
-            # print(self.floating_data['wave_forces']['xi'][2, 5, :])
-            # print(xi[0, :] - self.floating_data['wave_forces']['xi'][2, 5, :])
-
-            phase = self.settings['wave_freq']*np.arange(self.settings['n_time_steps'] + 1)*self.settings['dt']
-            self.wave_forces_g = np.zeros((self.settings['n_time_steps'] + 1, 6))
-            for idim in range(6):
-                self.wave_forces_g[:, idim] = np.real(self.settings['wave_amplitude']*xi[idim]*(np.cos(phase) + 1j*np.sin(phase)))
+            self.xi_interp = interp_x2(self.settings['wave_incidence'])
 
         elif self.settings['method_wave'] == 'jonswap':
 
@@ -683,12 +623,12 @@ def initialise(self, in_dict=None, data=None):
                                  axis=1)
             xi_matrix = interp_x1(self.settings['wave_incidence'])
 
-            self.wave_forces_g = np.real(time_wave_forces(self.settings['wave_Tp'],
-                                                  self.settings['wave_Hs'],
-                                                  self.settings['dt'],
-                                                  np.arange(self.settings['n_time_steps'] + 1)*self.settings['dt'],
-                                                  xi_matrix,
-                                                  self.floating_data['wave_forces']['xi_freq_rads']))
+            self.freq_wave_forces_variables(self.settings['wave_Tp'],
+                                       self.settings['wave_Hs'],
+                                       self.settings['dt'],
+                                       np.arange(self.settings['n_time_steps'] + 1)*self.settings['dt'],
+                                       xi_matrix,
+                                       self.floating_data['wave_forces']['xi_freq_rads'])
 
         # Log file
         if not os.path.exists(self.settings['folder']):
@@ -700,7 +640,7 @@ def initialise(self, in_dict=None, data=None):
 
 
     def write_output(self, ts, k, mooring, mooring_yaw, hydrostatic,
-                     hydrodynamic_qdot, hydrodynamic_qdotdot, hd_correct_grav, waves):
+                     hydrodynamic_qdot, hydrodynamic_qdotdot, hd_correct_grav, drag, waves):
 
         output = dict()
         output['ts'] = ts
@@ -714,6 +654,7 @@ def write_output(self, ts, k, mooring, mooring_yaw, hydrostatic,
         output['hydrodynamic_qdot'] = hydrodynamic_qdot
         output['hydrodynamic_qdotdot'] = hydrodynamic_qdotdot
         output['hydrodynamic_correct_grav'] = hd_correct_grav
+        output['drag'] = drag
         output['waves'] = waves
 
         fid = h5.File(self.log_filename, 'a')
@@ -737,6 +678,7 @@ def write_output(self, ts, k, mooring, mooring_yaw, hydrostatic,
             print("hydrodynamic_qdot: ", hydrodynamic_qdot)
             print("hydrodynamic_qdotdot: ", hydrodynamic_qdotdot)
             print("hydrodynamic_correct_grav: ", hd_correct_grav)
+            print("drag: ", drag)
             print("waves: ", waves)
 
         return
@@ -764,11 +706,72 @@ def update_dof_vector(self, beam, struct_tstep, it, k):
         return
 
 
+    def freq_wave_forces_variables(self, Tp, Hs, dt, time, xi, w_xi):
+        """
+        Compute the frequency arrays needed for wave forces
+        """
+        # Compute time and frequency discretisations
+        ntime_steps = time.shape[0]
+
+        nomega = ntime_steps//2 + 1
+        w = np.zeros((nomega))
+        w_temp = np.fft.fftfreq(ntime_steps, d=dt)*2.*np.pi
+        w[:ntime_steps//2] = w_temp[:ntime_steps//2]
+        if ntime_steps%2 == 0:
+            w[-1] = -1*w_temp[ntime_steps//2]
+        else:
+            w[-1] = w_temp[ntime_steps//2]
+        nomega_2s = ntime_steps
+
+        # Compute the one-sided spectrums
+        noise_freq = noise_freq_1s(w)
+        jonswap_1s = jonswap_spectrum(Tp, Hs, w)*2.*np.pi
+        jonswap_freq = np.sqrt(2*ntime_steps/dt*jonswap_1s/2) + 0j
+        jonswap_freq[0] = np.sqrt(ntime_steps/dt*jonswap_1s[0]/2) + 0j # The DC values does not have the 2
+
+        self.noise_freq = noise_freq
+        self.jonswap_freq = jonswap_freq
+        self.omega = w
+        self.nomega_2s = nomega_2s
+
+        self.xi_interp = np.zeros((nomega, 6), dtype=np.complex)
+        for iomega in range(nomega):
+            for idim in range(6):
+                self.xi_interp[iomega, idim] = np.interp(self.omega[iomega], w_xi, xi[:, idim])
+
+
+    def time_wave_forces(self, dx, grav):
+        """
+        Compute the time evolution of wave forces
+        """
+
+        # Compute the two-sided spectrum
+        force_freq_2s = np.zeros((self.nomega_2s, 6), dtype=np.complex)
+        for idim in range(6):
+            for iomega in range(self.omega.shape[0]):
+                k = self.omega[iomega]**2/grav
+                force_freq_2s[iomega, idim] = (self.noise_freq[iomega]*
+                                               0.5*self.jonswap_freq[iomega]*
+                                               self.xi_interp[iomega, idim]*
+                                               np.exp(-1j*k*dx))
+                if not iomega == 0:
+                    if not ((iomega == self.omega.shape[0] - 1) and (self.nomega_2s%2 == 0)):
+                        force_freq_2s[-iomega, idim] = (np.conj(self.noise_freq[iomega])*
+                                                        0.5*self.jonswap_freq[iomega]*
+                                                        np.conj(self.xi_interp[iomega, idim])*
+                                                        np.exp(1j*k*dx))
+
+        # Compute the inverse Fourier transform
+        force_waves = ifft(force_freq_2s, axis=0)
+
+        return np.real(force_waves)
+
+
     def generate(self, params):
         # Renaming for convenience
         data = params['data']
         struct_tstep = params['struct_tstep']
-        force_coeff = params['force_coeff']
+        aero_tstep = params['aero_tstep']
         k = params['fsi_substep']
 
         # Update dof vector
@@ -817,78 +820,90 @@ def generate(self, params):
             r_fairlead_G = fairlead_pos_G - mooring_node_pos_G
             force_cl[3:6] = np.cross(r_fairlead_G, force_fl)
 
-            struct_tstep.runtime_generated_forces[self.mooring_node, 0:3] += np.dot(cbg, force_cl[0:3])
-            struct_tstep.runtime_generated_forces[self.mooring_node, 3:6] += np.dot(cbg, force_cl[3:6])
+            struct_tstep.runtime_unsteady_forces[self.mooring_node, 0:3] += np.dot(cbg, force_cl[0:3])
+            struct_tstep.runtime_unsteady_forces[self.mooring_node, 3:6] += np.dot(cbg, force_cl[3:6])
 
         # Yaw moment generated by the mooring system
         yaw = np.array([self.q[data.ts, 3], 0., 0.])
         mooring_yaw = -self.floating_data['mooring']['yaw_spring_stif']*yaw
-        struct_tstep.runtime_generated_forces[self.mooring_node, 3:6] += np.dot(cbg,
+        struct_tstep.runtime_unsteady_forces[self.mooring_node, 3:6] += np.dot(cbg,
                                                                       mooring_yaw)
 
         # Hydrostatic model
-        hs_f_g = self.buoy_F0 - np.dot(self.buoy_rest_mat, self.q[data.ts, :])
-
-        if not force_coeff == 0.:
-            hd_f_qdot_g = -np.dot(self.floating_data['hydrodynamics']['additional_damping'], self.qdot[data.ts, :])
-
-            if ((self.settings['method_matrices_freq'] == 'constant') or
-                 (data.ts < self.settings['steps_constant_matrices'])):
-                hd_f_qdot_g -= np.dot(self.hd_damping_const, self.qdot[data.ts, :])
-                hd_f_qdotdot_g = np.zeros((6))
-
-            elif self.settings['method_matrices_freq'] == 'rational_function':
-                # Damping
-                (T, yout, xout) = forced_response(self.hd_K,
-                                                  T=[0, self.settings['dt']],
-                                                  U=self.qdot[data.ts-1:data.ts+1, :].T,
-                                                  X0=self.x0_K[data.ts-1])
-                                                  # transpose=True)
-                self.x0_K[data.ts] = xout[:, 1]
-                hd_f_qdot_g -= yout[:, 1]
-                hd_f_qdotdot_g = np.zeros((6))
+        ielem, inode_in_elem = data.structure.node_master_elem[self.buoyancy_node]
+        cab = algebra.crv2rotation(struct_tstep.psi[ielem, inode_in_elem])
+        cbg = np.dot(cab.T, cga.T)
 
-            else:
-                cout.cout_wrap(("ERROR: Unknown method_matrices_freq %s" % self.settings['method_matrices_freq']), 4)
-
-            # Correct gravity forces if needed
-            if self.added_mass_in_mass_matrix:
-                # Correct unreal gravity forces from added mass
-                gravity_b = np.zeros((6,),)
-                gravity_b[0:3] = np.dot(cbg, -self.settings['gravity_dir'])*self.settings['gravity']
-                hd_correct_grav = -np.dot(self.hd_added_mass_const, gravity_b)
-                struct_tstep.runtime_generated_forces[self.buoyancy_node, :] += hd_correct_grav
-            else:
-                hd_correct_grav = np.zeros((6))
+        hs_f_g = - np.dot(self.buoy_rest_mat, self.q[data.ts, :])
 
-        else:
-            hd_f_qdot_g = np.zeros((6))
+        add_damp = self.floating_data['hydrodynamics']['additional_damping'].copy()
+        if data.ts < self.settings['add_damp_ts']:
+            add_damp += np.diag(self.settings['add_damp_diag'])
+        hd_f_qdot_g = -np.dot(add_damp, self.qdot[data.ts, :])
+
+        if ((self.settings['method_matrices_freq'] == 'constant') or
+             (data.ts < self.settings['steps_constant_matrices'])):
+            hd_f_qdot_g -= np.dot(self.hd_damping_const, self.qdot[data.ts, :])
+            hd_f_qdotdot_g = -np.dot(self.hd_added_mass_const, self.qdotdot[data.ts, :])
+
+        elif self.settings['method_matrices_freq'] == 'rational_function':
+            # Damping
+            (T, yout, xout) = forced_response(self.hd_K,
+                                              T=[0, self.settings['dt']],
+                                              U=self.qdot[data.ts-1:data.ts+1, :].T,
+                                              X0=self.x0_K[data.ts-1])
+                                              # transpose=True)
+            self.x0_K[data.ts] = xout[:, 1]
+            hd_f_qdot_g -= yout[:, 1]
             hd_f_qdotdot_g = np.zeros((6))
+
+        else:
+            cout.cout_wrap(("ERROR: Unknown method_matrices_freq %s" % self.settings['method_matrices_freq']), 4)
+
+        # Correct gravity forces if needed
+        if self.added_mass_in_mass_matrix and self.settings['gravity_on']:
+            # Correct unreal gravity forces from added mass
+            gravity_b = np.zeros((6,),)
+            gravity_b[0:3] = np.dot(cbg, -self.settings['gravity_dir'])*self.settings['gravity']
+            hd_correct_grav = -np.dot(self.hd_added_mass_const, gravity_b)
+            struct_tstep.runtime_steady_forces[self.buoyancy_node, :] += hd_correct_grav
+        else:
             hd_correct_grav = np.zeros((6))
 
-        ielem, inode_in_elem = data.structure.node_master_elem[self.buoyancy_node]
-        cab = algebra.crv2rotation(struct_tstep.psi[ielem, inode_in_elem])
-        cbg = np.dot(cab.T, cga.T)
-        struct_tstep.runtime_generated_forces[self.buoyancy_node, 0:3] += np.dot(cbg, hs_f_g[0:3] + force_coeff*(hd_f_qdot_g[0:3] + hd_f_qdotdot_g[0:3]))
-        struct_tstep.runtime_generated_forces[self.buoyancy_node, 3:6] += np.dot(cbg, hs_f_g[3:6] + force_coeff*(hd_f_qdot_g[3:6] + hd_f_qdotdot_g[3:6]))
+        struct_tstep.runtime_steady_forces[self.buoyancy_node, 0:3] += np.dot(cbg, self.buoy_F0[0:3] + hs_f_g[0:3])
+        struct_tstep.runtime_steady_forces[self.buoyancy_node, 3:6] += np.dot(cbg, self.buoy_F0[3:6] + hs_f_g[3:6])
+        struct_tstep.runtime_unsteady_forces[self.buoyancy_node, 0:3] += np.dot(cbg, hd_f_qdot_g[0:3] + hd_f_qdotdot_g[0:3])
+        struct_tstep.runtime_unsteady_forces[self.buoyancy_node, 3:6] += np.dot(cbg, hd_f_qdot_g[3:6] + hd_f_qdotdot_g[3:6])
 
         # Nonlinear drag coefficeint
-        for inode in range(self.floating_data['hydrodynamics']['CD_first_node'], self.floating_data['hydrodynamics']['CD_last_node'] + 1):
+        if self.settings['concentrate_spar']:
+            spar_node_pos = np.zeros((100, 3)) + struct_tstep.pos[self.floating_data['hydrodynamics']['CD_node'], :]
+            spar_node_pos[:, 0] += np.linspace(-self.floating_data['hydrodynamics']['CD_spar_length'], 0, 100)
+            spar_node_pos_dot = np.zeros((100, 3))
+        else:
+            spar_node_pos = struct_tstep.pos[self.floating_data['hydrodynamics']['CD_first_node'] : self.floating_data['hydrodynamics']['CD_last_node'] + 1, :]
+            spar_node_pos_dot = struct_tstep.pos_dot[self.floating_data['hydrodynamics']['CD_first_node'] : self.floating_data['hydrodynamics']['CD_last_node'] + 1, :]
+
+        total_drag_force = np.zeros((6))
+        for inode in range(len(spar_node_pos)):
 
-            ielem, inode_in_elem = data.structure.node_master_elem[inode]
+            if self.settings['concentrate_spar']:
+                ielem, inode_in_elem = data.structure.node_master_elem[self.floating_data['hydrodynamics']['CD_node']]
+            else:
+                ielem, inode_in_elem = data.structure.node_master_elem[inode + self.floating_data['hydrodynamics']['CD_first_node']]
             cab = algebra.crv2rotation(struct_tstep.psi[ielem, inode_in_elem])
             cbg = np.dot(cab.T, cga.T)
 
             if inode == 0:
-                delta_x = 0.5*np.linalg.norm(struct_tstep.pos[1, :] - struct_tstep.pos[0, :])
-            elif inode == data.structure.num_node - 1:
-                delta_x = 0.5*np.linalg.norm(struct_tstep.pos[inode, :] - struct_tstep.pos[inode - 1, :])
+                delta_x = 0.5*np.linalg.norm(spar_node_pos[1, :] - spar_node_pos[0, :])
+            elif inode == len(spar_node_pos) - 1:
+                delta_x = 0.5*np.linalg.norm(spar_node_pos[inode, :] - spar_node_pos[inode - 1, :])
             else:
-                delta_x = 0.5*np.linalg.norm(struct_tstep.pos[inode + 1, :] - struct_tstep.pos[inode - 1, :])
+                delta_x = 0.5*np.linalg.norm(spar_node_pos[inode + 1, :] - spar_node_pos[inode - 1, :])
 
             vel_a = (struct_tstep.for_vel[0:3] +
-                     np.cross(struct_tstep.for_vel[3:6], struct_tstep.pos[inode, :]) +
-                     struct_tstep.pos_dot[inode, :])
+                     np.cross(struct_tstep.for_vel[3:6], spar_node_pos[inode, :]) +
+                     spar_node_pos_dot[inode, :])
 
             # Remove velocity along the x axis
             vel_b = np.dot(cab.T, vel_a)
@@ -897,19 +912,42 @@ def generate(self, params):
 
             drag_force = (-0.5*self.water_density*np.linalg.norm(vel_g)*vel_g*delta_x*
                           self.floating_data['hydrodynamics']['spar_diameter']*
-                          self.floating_data['hydrodynamics']['CD'])
+                          self.cd)
 
-            struct_tstep.runtime_generated_forces[inode, 0:3] += np.dot(cbg, drag_force)
+            if self.settings['concentrate_spar']:
+                r = spar_node_pos[inode, :] - struct_tstep.pos[self.floating_data['hydrodynamics']['CD_node'], :]
+            else:
+                r = spar_node_pos[inode, :] - struct_tstep.pos[self.floating_data['hydrostatics']['node'], :]
+            drag_moment = np.cross(r, drag_force)
+            total_drag_force[0:3] += drag_force
+            total_drag_force[3:6] += drag_moment
+            if self.settings['concentrate_spar']:
+                struct_tstep.runtime_unsteady_forces[self.floating_data['hydrodynamics']['CD_node'], 0:3] += np.dot(cbg, drag_force)
+                struct_tstep.runtime_unsteady_forces[self.floating_data['hydrodynamics']['CD_node'], 3:6] += np.dot(cbg, drag_moment)
+            else:
+                struct_tstep.runtime_unsteady_forces[inode + self.floating_data['hydrodynamics']['CD_first_node'], 0:3] += np.dot(cbg, drag_force)
 
         # Wave loading
         ielem, inode_in_elem = data.structure.node_master_elem[self.wave_forces_node]
         cab = algebra.crv2rotation(struct_tstep.psi[ielem, inode_in_elem])
         cbg = np.dot(cab.T, cga.T)
 
-        struct_tstep.runtime_generated_forces[self.wave_forces_node, 0:3] += np.dot(cbg, force_coeff*self.wave_forces_g[data.ts, 0:3])
-        struct_tstep.runtime_generated_forces[self.wave_forces_node, 3:6] += np.dot(cbg, force_coeff*self.wave_forces_g[data.ts, 3:6])
+        wave_node_pos = struct_tstep.for_pos[0:3] + np.dot(cga, struct_tstep.pos[self.wave_forces_node, :])
+        dx = (wave_node_pos[1]*np.sin(self.settings['wave_incidence']) +
+              wave_node_pos[2]*np.cos(self.settings['wave_incidence']))
+        wave_forces_g = np.zeros((6))
+        if self.settings['method_wave'] == 'sin':
+            phase = (self.settings['wave_freq']*data.ts*self.settings['dt'] +
+                     dx*self.settings['wave_freq']**2/self.settings['gravity'])
+            for idim in range(6):
+                wave_forces_g[idim] = np.real(self.settings['wave_amplitude']*self.xi_interp[idim]*(np.cos(phase) + 1j*np.sin(phase)))
+        elif self.settings['method_wave'] == 'jonswap':
+            wave_forces_g = self.time_wave_forces(dx, self.settings['gravity'])[data.ts, :]
+
+        struct_tstep.runtime_unsteady_forces[self.wave_forces_node, 0:3] += np.dot(cbg, wave_forces_g[0:3])
+        struct_tstep.runtime_unsteady_forces[self.wave_forces_node, 3:6] += np.dot(cbg, wave_forces_g[3:6])
 
         # Write output
         if self.settings['write_output']:
             self.write_output(data.ts, k, mooring_forces, mooring_yaw, hs_f_g,
-                     hd_f_qdot_g, hd_f_qdotdot_g, hd_correct_grav, self.wave_forces_g[data.ts, :])
+                     hd_f_qdot_g, hd_f_qdotdot_g, hd_correct_grav, total_drag_force, wave_forces_g)
diff --git a/sharpy/generators/gridbox.py b/sharpy/generators/gridbox.py
index 4a9d0fecb..3f60de320 100644
--- a/sharpy/generators/gridbox.py
+++ b/sharpy/generators/gridbox.py
@@ -46,7 +46,7 @@ def __init__(self):
         self.in_dict = dict()
         self.settings = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, self.settings_types, self.settings_default)
         self.settings = copy.deepcopy(self.in_dict)
diff --git a/sharpy/generators/gustvelocityfield.py b/sharpy/generators/gustvelocityfield.py
index 8a5fb0d8b..2e8b579e7 100644
--- a/sharpy/generators/gustvelocityfield.py
+++ b/sharpy/generators/gustvelocityfield.py
@@ -92,7 +92,7 @@ class one_minus_cos(BaseGust):
     __doc__ += setting_table.generate(settings_types, settings_default, settings_description,
                                       header_line=doc_settings_description)
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -139,7 +139,7 @@ class DARPA(BaseGust):
     __doc__ += setting_table.generate(settings_types, settings_default, settings_description,
                                       header_line=doc_settings_description)
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -184,7 +184,7 @@ class continuous_sin(BaseGust):
     __doc__ += setting_table.generate(settings_types, settings_default, settings_description,
                                       header_line=doc_settings_description)
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -223,7 +223,7 @@ class lateral_one_minus_cos(BaseGust):
     __doc__ += setting_table.generate(settings_types, settings_default, settings_description,
                                       header_line=doc_settings_description)
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -267,7 +267,7 @@ def __init__(self):
 
         self.file_info = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -312,7 +312,7 @@ def __init__(self):
 
         self.file_info = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -366,7 +366,7 @@ class span_sine(BaseGust):
     __doc__ += setting_table.generate(settings_types, settings_default, settings_description,
                                       header_line=doc_settings_description)
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -448,7 +448,7 @@ def __init__(self):
 
         self.implemented_gusts = dict_of_gusts
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.settings = in_dict
         settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
@@ -465,7 +465,7 @@ def initialise(self, in_dict):
         self.gust.u_inf = self.u_inf
         self.gust.u_inf_direction = self.u_inf_direction
 
-        self.gust.initialise(self.settings['gust_parameters'])
+        self.gust.initialise(self.settings['gust_parameters'], restart=restart)
 
     def generate(self, params, uext):
         zeta = params['zeta']
diff --git a/sharpy/generators/helicoidalwake.py b/sharpy/generators/helicoidalwake.py
index fc7744fe2..fd3328217 100644
--- a/sharpy/generators/helicoidalwake.py
+++ b/sharpy/generators/helicoidalwake.py
@@ -95,7 +95,7 @@ def __init__(self):
         self.h_ref = None
         self.h_corr = None
 
-    def initialise(self, data, in_dict):
+    def initialise(self, data, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, self.settings_types, self.settings_default,  no_ctype=True)
 
diff --git a/sharpy/generators/polaraeroforces.py b/sharpy/generators/polaraeroforces.py
index 5bf451642..c68d78880 100644
--- a/sharpy/generators/polaraeroforces.py
+++ b/sharpy/generators/polaraeroforces.py
@@ -71,6 +71,18 @@ class PolarCorrection(generator_interface.BaseGenerator):
                                                 'Else, it will add the polar Cm to the moment already computed by ' \
                                                 'SHARPy.'
 
+    settings_types['add_rotation'] = 'bool'
+    settings_default['add_rotation'] = False
+    settings_description['add_rotation'] = 'Add rotation velocity. Probably needed in steady computations'
+
+    settings_types['rot_vel_g'] = 'list(float)'
+    settings_default['rot_vel_g'] = [0., 0., 0.] 
+    settings_description['rot_vel_g'] = 'Rotation velocity in G FoR. Only used if add_rotation = True'
+
+    settings_types['centre_rot_g'] = 'list(float)'
+    settings_default['centre_rot_g'] = [0., 0., 0.] 
+    settings_description['centre_rot_g'] = 'Centre of rotation in G FoR. Only used if add_rotation = True'
+
     settings_table = settings.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options,
                                        header_line='This generator takes in the following settings.')
@@ -147,7 +159,10 @@ def generate(self, **params):
                                                                               structural_kstep.pos_dot[inode, :],
                                                                               structural_kstep.for_vel[:],
                                                                               cga,
-                                                                              aero_kstep.u_ext[isurf][:, :, i_n])
+                                                                              aero_kstep.u_ext[isurf][:, :, i_n],
+                                                                              self.settings['add_rotation'],
+                                                                              self.settings['rot_vel_g'],
+                                                                              self.settings['centre_rot_g'],)
 
                 # Coefficient to change from aerodynamic coefficients to forces (and viceversa)
                 coef = 0.5 * rho * np.linalg.norm(urel) ** 2 * chord * span
@@ -188,28 +203,29 @@ def generate(self, **params):
                 new_struct_forces[inode, 0:3] = c_bs.dot(forces_s)
 
                 # Pitching moment
-                # The panels are shifted by 0.25 of a panel aft from the leading edge
-                panel_shift = 0.25 * (aero_kstep.zeta[isurf][:, 1, i_n] - aero_kstep.zeta[isurf][:, 0, i_n])
-                ref_point = aero_kstep.zeta[isurf][:, 0, i_n] + 0.25 * chord * dir_chord - panel_shift
-
-                # viscous contribution (pure moment)
-                moment_s[1] += cm * coef * chord
-
-                # moment due to drag
-                arm = cgb.T.dot(ref_point - pos_g[inode])  # in B frame
-                moment_polar_drag = algebra.cross3(c_bs.T.dot(arm), cd * dir_urel * coef)  # in S frame
-                moment_s += moment_polar_drag
-
-                # moment due to lift (if corrected)
-                if correct_lift and moment_from_polar:
-                    # add moment from scratch: cm_polar + cm_drag_polar + cl_lift_polar
-                    moment_s = np.zeros(3)
-                    moment_s[1] = cm * coef * chord
+                if moment_from_polar:
+                    # The panels are shifted by 0.25 of a panel aft from the leading edge
+                    panel_shift = 0.25 * (aero_kstep.zeta[isurf][:, 1, i_n] - aero_kstep.zeta[isurf][:, 0, i_n])
+                    ref_point = aero_kstep.zeta[isurf][:, 0, i_n] + 0.25 * chord * dir_chord - panel_shift
+
+                    # viscous contribution (pure moment)
+                    moment_s[1] += cm * coef * chord
+
+                    # moment due to drag
+                    arm = cgb.T.dot(ref_point - pos_g[inode])  # in B frame
+                    moment_polar_drag = algebra.cross3(c_bs.T.dot(arm), cd * dir_urel * coef)  # in S frame
                     moment_s += moment_polar_drag
-                    moment_polar_lift = algebra.cross3(c_bs.T.dot(arm), forces_s[2] * np.array([0, 0, 1]))
-                    moment_s += moment_polar_lift
 
-                new_struct_forces[inode, 3:6] = c_bs.dot(moment_s)
+                    # moment due to lift (if corrected)
+                    if correct_lift and moment_from_polar:
+                        # add moment from scratch: cm_polar + cm_drag_polar + cl_lift_polar
+                        moment_s = np.zeros(3)
+                        moment_s[1] = cm * coef * chord
+                        moment_s += moment_polar_drag
+                        moment_polar_lift = algebra.cross3(c_bs.T.dot(arm), forces_s[2] * np.array([0, 0, 1]))
+                        moment_s += moment_polar_lift
+
+                    new_struct_forces[inode, 3:6] = c_bs.dot(moment_s)
 
         return new_struct_forces
 
diff --git a/sharpy/generators/shearvelocityfield.py b/sharpy/generators/shearvelocityfield.py
index 470c2a363..564959e17 100644
--- a/sharpy/generators/shearvelocityfield.py
+++ b/sharpy/generators/shearvelocityfield.py
@@ -61,7 +61,7 @@ def __init__(self):
         self.h_ref = None
         self.h_corr = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, self.settings_types, self.settings_default)
 
diff --git a/sharpy/generators/steadyvelocityfield.py b/sharpy/generators/steadyvelocityfield.py
index 3e49f2d9d..419c33f71 100644
--- a/sharpy/generators/steadyvelocityfield.py
+++ b/sharpy/generators/steadyvelocityfield.py
@@ -53,7 +53,7 @@ def __init__(self):
         self.u_inf = 0.
         self.u_inf_direction = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict,
                                  self.settings_types,
diff --git a/sharpy/generators/straightwake.py b/sharpy/generators/straightwake.py
index b9bc7e5fe..095f76a30 100644
--- a/sharpy/generators/straightwake.py
+++ b/sharpy/generators/straightwake.py
@@ -67,7 +67,7 @@ def __init__(self):
         self.u_inf_direction = None
         self.dt = None
 
-    def initialise(self, data, in_dict=None):
+    def initialise(self, data, in_dict=None, restart=False):
         self.in_dict = in_dict
 
         # For backwards compatibility
@@ -86,9 +86,9 @@ def initialise(self, data, in_dict=None):
             elif 'StaticCoupled' in data.settings:
                 aero_solver_name = data.settings['StaticCoupled']['aero_solver']
                 aero_solver_settings = data.settings['StaticCoupled']['aero_solver_settings']
-            elif 'StaticCoupledRBM' in data.settings:
-                aero_solver_name = data.settings['StaticCoupledRBM']['aero_solver']
-                aero_solver_settings = data.settings['StaticCoupledRBM']['aero_solver_settings']
+            elif 'StaticCoupled' in data.settings:
+                aero_solver_name = data.settings['StaticCoupled']['aero_solver']
+                aero_solver_settings = data.settings['StaticCoupled']['aero_solver_settings']
             elif 'DynamicCoupled' in data.settings:
                 aero_solver_name = data.settings['DynamicCoupled']['aero_solver']
                 aero_solver_settings = data.settings['DynamicCoupled']['aero_solver_settings']
diff --git a/sharpy/generators/trajectorygenerator.py b/sharpy/generators/trajectorygenerator.py
index 4e694980b..a8c7550f5 100644
--- a/sharpy/generators/trajectorygenerator.py
+++ b/sharpy/generators/trajectorygenerator.py
@@ -87,7 +87,7 @@ def __init__(self):
         self.implemented_accelerations = ["constant", "linear"]
 
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, self.settings_types, self.settings_default)
 
diff --git a/sharpy/generators/turbvelocityfield.py b/sharpy/generators/turbvelocityfield.py
index 9ab86099a..c2969cc2f 100644
--- a/sharpy/generators/turbvelocityfield.py
+++ b/sharpy/generators/turbvelocityfield.py
@@ -106,7 +106,7 @@ def __init__(self):
         self.vel_holder0 = 3*[None]
         self.vel_holder1 = 3*[None]
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, self.settings_types, self.settings_default)
         self.settings = self.in_dict
diff --git a/sharpy/generators/turbvelocityfieldbts.py b/sharpy/generators/turbvelocityfieldbts.py
index f66a64bfb..61a6d1cb0 100644
--- a/sharpy/generators/turbvelocityfieldbts.py
+++ b/sharpy/generators/turbvelocityfieldbts.py
@@ -162,7 +162,7 @@ def __init__(self):
         self.gird_size_vec = None
         self.grid_size_ufed_dir = None
 
-    def initialise(self, in_dict):
+    def initialise(self, in_dict, restart=False):
         self.in_dict = in_dict
         settings.to_custom_types(self.in_dict, self.settings_types, self.settings_default, no_ctype=True)
         self.settings = self.in_dict
diff --git a/sharpy/linear/assembler/linearbeam.py b/sharpy/linear/assembler/linearbeam.py
index e98d8efb6..8e9c8e50c 100644
--- a/sharpy/linear/assembler/linearbeam.py
+++ b/sharpy/linear/assembler/linearbeam.py
@@ -245,7 +245,10 @@ def assemble(self, t_ref=None):
     def remove_rigid_states(self):
         if self.sys.clamped:
             return
-        num_rig_dof = 9
+        if self.settings['use_euler']:
+            num_rig_dof = 9
+        else:
+            num_rig_dof = 10
         if self.sys.modal:
 
             self.ss.A = self.ss.A[num_rig_dof:, num_rig_dof:]
diff --git a/sharpy/linear/src/libss.py b/sharpy/linear/src/libss.py
index 4df2428be..75641a951 100644
--- a/sharpy/linear/src/libss.py
+++ b/sharpy/linear/src/libss.py
@@ -945,6 +945,65 @@ def solve_step(self, xn, un):
         return xn1, yn
 
 
+    def get_mats(self):
+        
+        A = np.zeros((self.states, self.states))
+        B = np.zeros((self.states, self.inputs))
+        C = np.zeros((self.outputs, self.states))
+        D = np.zeros((self.outputs, self.inputs))
+        
+        iloc = 0
+        for i in range(self.blocks_x):
+            jloc = 0
+            for j in range(self.blocks_x):
+                if not self.A[i][j] is None:
+                    if type(self.A[i][j]) == libsp.csc_matrix:
+                        A[iloc:iloc+self.S_x[i], jloc:jloc+self.S_x[j]] = self.A[i][j].todense()
+                    else:
+                        A[iloc:iloc+self.S_x[i], jloc:jloc+self.S_x[j]] = self.A[i][j].copy()
+                jloc += self.S_x[j]
+            iloc += self.S_x[i]
+        
+        iloc = 0
+        for i in range(self.blocks_x):
+            jloc = 0
+            for j in range(self.blocks_u):
+                if not self.B[i][j] is None:
+                    # print(i, j, iloc, jloc, self.S_x[i], self.S_u[j], self.B[i][j].shape)
+                    # print(iloc, iloc+self.S_x[i], jloc, jloc+self.S_u[j])
+                    if type(self.B[i][j]) == libsp.csc_matrix:
+                        B[iloc:iloc+self.S_x[i], jloc:jloc+self.S_u[j]] = self.B[i][j].todense()
+                    else:
+                        B[iloc:iloc+self.S_x[i], jloc:jloc+self.S_u[j]] = self.B[i][j].copy()
+                jloc += self.S_u[j]
+            iloc += self.S_x[i]
+
+        iloc = 0
+        for i in range(self.blocks_y):
+            jloc = 0
+            for j in range(self.blocks_x):
+                if not self.C[i][j] is None:
+                    if type(self.C[i][j]) == libsp.csc_matrix:
+                        C[iloc:iloc+self.S_y[i], jloc:jloc+self.S_x[j]] = self.C[i][j].todense()
+                    else:
+                        C[iloc:iloc+self.S_y[i], jloc:jloc+self.S_x[j]] = self.C[i][j].copy()
+                jloc += self.S_x[j]
+            iloc += self.S_y[i]
+        
+        iloc = 0
+        for i in range(self.blocks_y):
+            jloc = 0
+            for j in range(self.blocks_u):
+                if not self.D[i][j] is None:
+                    if type(self.D[i][j]) == libsp.csc_matrix:
+                        D[iloc:iloc+self.S_y[i], jloc:jloc+self.S_u[j]] = self.D[i][j].todense()
+                    else:
+                        D[iloc:iloc+self.S_y[i], jloc:jloc+self.S_u[j]] = self.D[i][j].copy()
+                jloc += self.S_u[j]
+            iloc += self.S_y[i]
+
+        return A, B, C, D
+
 # ---------------------------------------- Methods for state-space manipulation
 def project(ss_here, WT, V):
     """
diff --git a/sharpy/linear/src/lin_aeroelastic.py b/sharpy/linear/src/lin_aeroelastic.py
index ea2c49928..3a1244532 100644
--- a/sharpy/linear/src/lin_aeroelastic.py
+++ b/sharpy/linear/src/lin_aeroelastic.py
@@ -56,7 +56,8 @@ def __init__(self, data, custom_settings_linear=None, uvlm_block=False, chosen_t
 
         sharpy.utils.settings.to_custom_types(settings_here,
                                               linuvlm.settings_types_dynamic,
-                                              linuvlm.settings_default_dynamic)
+                                              linuvlm.settings_default_dynamic,
+                                              no_ctype=True)
 
         if chosen_ts is None:
             self.chosen_ts = self.data.ts
@@ -69,6 +70,8 @@ def __init__(self, data, custom_settings_linear=None, uvlm_block=False, chosen_t
         except KeyError:
             self.rigid_body_motions = False
 
+        print("rbm:", self.rigid_body_motions)
+
         try:
             self.use_euler = settings_here['use_euler']
         except KeyError:
@@ -102,7 +105,7 @@ def __init__(self, data, custom_settings_linear=None, uvlm_block=False, chosen_t
             if type(rho) == str:
                 rho = np.float(rho)
             if hasattr(rho, 'value'):
-                rho = rho.value
+                rho = rho
         self.tsaero.rho = rho
         # --- backward compatibility
 
diff --git a/sharpy/linear/src/linuvlm.py b/sharpy/linear/src/linuvlm.py
index 69435ded7..ab2163022 100644
--- a/sharpy/linear/src/linuvlm.py
+++ b/sharpy/linear/src/linuvlm.py
@@ -91,7 +91,8 @@ def __init__(self, tsdata, custom_settings=None, for_vel=np.zeros((6,))):
 
         settings.to_custom_types(settings_here,
                                  settings_types_static,
-                                 settings_default_static)
+                                 settings_default_static,
+                                 no_ctype=True)
 
         self.vortex_radius = settings_here['vortex_radius']
         self.cfl1 = settings_here['cfl1']
diff --git a/sharpy/postproc/aeroforcescalculator.py b/sharpy/postproc/aeroforcescalculator.py
index 0e74b722f..0e44bc621 100644
--- a/sharpy/postproc/aeroforcescalculator.py
+++ b/sharpy/postproc/aeroforcescalculator.py
@@ -3,7 +3,7 @@
 
 import sharpy.utils.cout_utils as cout
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 import sharpy.aero.utils.mapping as mapping
 
@@ -54,7 +54,7 @@ class AeroForcesCalculator(BaseSolver):
     settings_default['c_ref'] = 1
     settings_description['c_ref'] = 'Reference chord'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -68,11 +68,11 @@ def __init__(self):
 
         self.table = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         self.settings = data.settings[self.solver_id]
         self.ts_max = len(self.data.structure.timestep_info)
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
         self.caller = caller
 
         self.folder = data.output_folder + '/forces/'
@@ -87,7 +87,9 @@ def initialise(self, data, custom_settings=None, caller=None):
                 self.table = cout.TablePrinter(7, field_length=12, field_types=['g'] + 6 * ['e'])
                 self.table.print_header(['tstep', 'fx_g', 'fy_g', 'fz_g', 'mx_g', 'my_g', 'mz_g'])
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+
+        online = su.set_value_or_default(kwargs, 'online', False)
 
         if online:
             self.ts_max = len(self.data.structure.timestep_info)
@@ -137,11 +139,11 @@ def calculate_forces(self, ts):
         except KeyError:
             unsteady_forces_b = self.map_forces_beam_dof(ts, unsteady_force)
 
-        steady_forces_a = self.data.structure.nodal_b_for_2_a_for(steady_forces_b,
-                                                                  self.data.structure.timestep_info[ts])
+        steady_forces_a = self.data.structure.timestep_info[ts].nodal_b_for_2_a_for(steady_forces_b,
+                                                                                    self.data.structure)
 
-        unsteady_forces_a = self.data.structure.nodal_b_for_2_a_for(unsteady_forces_b,
-                                                                    self.data.structure.timestep_info[ts])
+        unsteady_forces_a = self.data.structure.timestep_info[ts].nodal_b_for_2_a_for(unsteady_forces_b,
+                                                                                      self.data.structure)
 
         # Express total forces in A frame
         moment_reference_location = np.array([0., 0., 0.])
diff --git a/sharpy/postproc/aerogridplot.py b/sharpy/postproc/aerogridplot.py
index 4ae1b4519..ea925dfe7 100644
--- a/sharpy/postproc/aerogridplot.py
+++ b/sharpy/postproc/aerogridplot.py
@@ -7,7 +7,7 @@
 import sharpy.utils.cout_utils as cout
 from sharpy.utils.settings import str2bool
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.aero.utils.uvlmlib as uvlmlib
 from sharpy.utils.constants import vortex_radius_def
 
@@ -73,7 +73,15 @@ class AerogridPlot(BaseSolver):
     settings_default['vortex_radius'] = vortex_radius_def
     settings_description['vortex_radius'] = 'Distance below which inductions are not computed'
 
-    table = settings.SettingsTable()
+    settings_types['stride'] = 'int'
+    settings_default['stride'] = 1
+    settings_description['stride'] = 'Number of steps between the execution calls when run online'
+    
+    settings_types['save_wake'] = 'bool'
+    settings_default['save_wake'] = True
+    settings_description['save_wake'] = 'Plot the wake'
+    
+    table = su.SettingsTable()
     __doc__ += table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -86,13 +94,13 @@ def __init__(self):
         self.ts_max = 0
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
         self.ts_max = self.data.ts + 1
         # create folder for containing files if necessary
         self.folder = data.output_folder + '/aero/'
@@ -108,20 +116,25 @@ def initialise(self, data, custom_settings=None, caller=None):
                               self.data.settings['SHARPy']['case'])
         self.caller = caller
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+    
+        online = su.set_value_or_default(kwargs, 'online', False)
+
         # TODO: Create a dictionary to plot any variable as in beamplot
         if not online:
             for self.ts in range(self.ts_max):
                 if self.data.structure.timestep_info[self.ts] is not None:
                     self.plot_body()
-                    self.plot_wake()
+                    if self.settings['save_wake']:
+                        self.plot_wake()
             cout.cout_wrap('...Finished', 1)
-        else:
+        elif (self.data.ts % self.settings['stride'] == 0):
             aero_tsteps = len(self.data.aero.timestep_info) - 1
             struct_tsteps = len(self.data.structure.timestep_info) - 1
             self.ts = np.max((aero_tsteps, struct_tsteps))
             self.plot_body()
-            self.plot_wake()
+            if self.settings['save_wake']:
+                self.plot_wake()
         return self.data
 
     def plot_body(self):
@@ -141,8 +154,9 @@ def plot_body(self):
         for i_surf in range(aero_tstep.n_surf):
             filename = (self.body_filename +
                         '_' +
-                        '%02u_' % i_surf +
-                        '%06u' % self.ts)
+                        ('%02u_' % i_surf) +
+                        ('%06u' % self.ts) +
+                        '.vtu')
 
             dims = aero_tstep.dimensions[i_surf, :]
             point_data_dim = (dims[0]+1)*(dims[1]+1)  # + (dims_star[0]+1)*(dims_star[1]+1)
@@ -261,8 +275,9 @@ def plot_wake(self):
         for i_surf in range(self.data.aero.timestep_info[self.ts].n_surf):
             filename = (self.wake_filename +
                         '_' +
-                        '%02u_' % i_surf +
-                        '%06u' % self.ts)
+                        ('%02u_' % i_surf) +
+                        ('%06u' % self.ts) +
+                        '.vtu')
 
             dims_star = self.data.aero.timestep_info[self.ts].dimensions_star[i_surf, :].copy()
             dims_star[0] -= self.settings['minus_m_star']
diff --git a/sharpy/postproc/asymptoticstability.py b/sharpy/postproc/asymptoticstability.py
index 72e842bdd..7fabf4c87 100644
--- a/sharpy/postproc/asymptoticstability.py
+++ b/sharpy/postproc/asymptoticstability.py
@@ -2,7 +2,7 @@
 import warnings
 import numpy as np
 import scipy.linalg as sclalg
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.solver_interface import solver, BaseSolver, initialise_solver
 import sharpy.utils.cout_utils as cout
 import sharpy.utils.algebra as algebra
@@ -89,9 +89,8 @@ class AsymptoticStability(BaseSolver):
     settings_description['modes_to_plot'] = 'List of mode numbers to plot. Plots the 0, 45, 90 and 135' \
                                             'degree phases.'
 
-    settings_table = settings.SettingsTable()
-    __doc__ += settings_table.generate(settings_types, settings_default, settings_description,
-                                       settings_options=settings_options)
+    settings_table = su.SettingsTable()
+    __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.settings = None
@@ -106,7 +105,7 @@ def __init__(self):
         self.with_postprocessors = False
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
 
         if custom_settings is None:
@@ -114,9 +113,8 @@ def initialise(self, data, custom_settings=None, caller=None):
         else:
             self.settings = custom_settings
 
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default,
-                                 options=self.settings_options,
-                                 no_ctype=True)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default, 
+                           options=self.settings_options, no_ctype=True)
 
         self.num_evals = self.settings['num_evals']
 
@@ -139,7 +137,7 @@ def initialise(self, data, custom_settings=None, caller=None):
 
         self.caller = caller
 
-    def run(self, online=False):
+    def run(self, **kwargs):
         """
         Computes the eigenvalues and eigenvectors
 
@@ -148,6 +146,7 @@ def run(self, online=False):
             eigenvectors (np.ndarray): Corresponding mode shapes
 
         """
+        online = su.set_value_or_default(kwargs, 'online', False)
 
         # if the system is scaled, only one system can be analysed
         if self.settings['reference_velocity'] != 1. and self.data.linear.linear_system.uvlm.scaled:
diff --git a/sharpy/postproc/beamloads.py b/sharpy/postproc/beamloads.py
index 9eedbe92c..b2291307a 100644
--- a/sharpy/postproc/beamloads.py
+++ b/sharpy/postproc/beamloads.py
@@ -2,7 +2,7 @@
 import numpy as np
 import os
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.structure.utils.xbeamlib as xbeamlib
 
 
@@ -27,7 +27,7 @@ class BeamLoads(BaseSolver):
     settings_default['output_file_name'] = 'beam_loads'
     settings_description['output_file_name'] = 'Output file name'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -38,20 +38,23 @@ def __init__(self):
         self.folder = None
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
         self.caller = caller
 
         self.folder = data.output_folder + '/beam/'
         if not os.path.isdir(self.folder):
             os.makedirs(self.folder)
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+
+        online = su.set_value_or_default(kwargs, 'online', False)
+
         self.calculate_loads(online)
         if self.settings['csv_output']:
             self.print_loads(online)
diff --git a/sharpy/postproc/beamplot.py b/sharpy/postproc/beamplot.py
index e4b7bb0bf..5e892170e 100644
--- a/sharpy/postproc/beamplot.py
+++ b/sharpy/postproc/beamplot.py
@@ -5,7 +5,7 @@
 
 import sharpy.utils.cout_utils as cout
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 
 
@@ -45,7 +45,7 @@ class BeamPlot(BaseSolver):
     settings_default['output_rbm'] = True
     settings_description['output_rbm'] = 'Write ``csv`` file with rigid body motion data'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -58,13 +58,13 @@ def __init__(self):
         self.filename_for = ''
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
         # create folder for containing files if necessary
         self.folder = data.output_folder + '/beam/'
         if not os.path.exists(self.folder):
@@ -79,7 +79,10 @@ def initialise(self, data, custom_settings=None, caller=None):
                              self.data.settings['SHARPy']['case'])
         self.caller = caller
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+
+        online = su.set_value_or_default(kwargs, 'online', False)
+
         self.plot(online)
         if not online:
             self.write()
@@ -112,7 +115,8 @@ def plot(self, online):
 
     def write_beam(self, it):
         it_filename = (self.filename +
-                       '%06u' % it)
+                       ('%06u' % it) +
+                       '.vtu')
         num_nodes = self.data.structure.num_node
         num_elem = self.data.structure.num_elem
 
diff --git a/sharpy/postproc/cleanup.py b/sharpy/postproc/cleanup.py
index 83ab85ea0..34312f454 100644
--- a/sharpy/postproc/cleanup.py
+++ b/sharpy/postproc/cleanup.py
@@ -5,7 +5,7 @@
 
 import sharpy.utils.cout_utils as cout
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 import sharpy.structure.utils.xbeamlib as xbeamlib
 
@@ -34,7 +34,7 @@ class Cleanup(BaseSolver):
     settings_default['remaining_steps'] = 10
     settings_description['remaining_steps'] = 'The last `remaining_steps` are not cleaned up'
 
-    table = settings.SettingsTable()
+    table = su.SettingsTable()
     __doc__ += table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -42,18 +42,21 @@ def __init__(self):
         self.data = None
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default)
         self.caller = caller
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+        
+        online = su.set_value_or_default(kwargs, 'online', False)
+
         if self.settings['clean_structure']:
             self.clean(self.data.structure.timestep_info, self.settings['remaining_steps'])
         if self.settings['clean_aero']:
diff --git a/sharpy/postproc/frequencyresponse.py b/sharpy/postproc/frequencyresponse.py
index 65834ebbf..a560a269b 100644
--- a/sharpy/postproc/frequencyresponse.py
+++ b/sharpy/postproc/frequencyresponse.py
@@ -2,7 +2,7 @@
 import time
 import os
 import sharpy.utils.solver_interface as solver_interface
-import sharpy.utils.settings as settings_utils
+import sharpy.utils.settings as su
 import sharpy.utils.cout_utils as cout
 import warnings
 import sharpy.linear.src.libss as libss
@@ -92,10 +92,10 @@ class FrequencyResponse(solver_interface.BaseSolver):
     settings_default['quick_plot'] = False
     settings_description['quick_plot'] = 'Produce array of ``.png`` plots showing response. Requires matplotlib.'
 
-    settings_table = settings_utils.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options)
 
-    scaling_table = settings_utils.SettingsTable()
+    scaling_table = su.SettingsTable()
     __doc__ += scaling_table.generate(scaling_types, scaling_default, scaling_description,
                                       header_line='The scaling dictionary takes the following entries:')
 
@@ -111,7 +111,7 @@ def __init__(self):
         self.wv = None
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
 
         self.data = data
 
@@ -119,9 +119,11 @@ def initialise(self, data, custom_settings=None, caller=None):
             self.settings = self.data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings_utils.to_custom_types(self.settings, self.settings_types, self.settings_default,
-                                       self.settings_options,
-                                       no_ctype=True)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           self.settings_options,
+                           no_ctype=True)
 
         self.print_info = self.settings['print_info']
 
@@ -131,7 +133,7 @@ def initialise(self, data, custom_settings=None, caller=None):
                 scaling = self.data.linear.linear_system.uvlm.sys.ScalingFacts
             else:
                 scaling = self.settings['frequency_scaling']
-                settings_utils.to_custom_types(scaling, self.scaling_types, self.scaling_default,
+                su.to_custom_types(scaling, self.scaling_types, self.scaling_default,
                                                no_ctype=True)
             self.w_to_k = scaling['length'] / scaling['speed']
         else:
@@ -154,7 +156,8 @@ def initialise(self, data, custom_settings=None, caller=None):
             os.makedirs(self.folder)
         self.caller = caller
 
-    def run(self, ss=None, online=False):
+
+    def run(self, **kwargs):
         """
         Computes the frequency response of the linear state-space.
 
@@ -163,7 +166,8 @@ def run(self, ss=None, online=False):
               If not given, the response for the previously assembled systems and specified in ``target_system`` will
               be performed.
         """
-        # TODO: This postproc does not have an standard call. Maybe a @staticmethod might help
+        online = su.set_value_or_default(kwargs, 'online', False)
+        ss = su.set_value_or_default(kwargs, 'ss', None)
 
         if ss is None:
             ss_list = [find_target_system(self.data, system_name) for system_name in self.settings['target_system']]
diff --git a/sharpy/postproc/liftdistribution.py b/sharpy/postproc/liftdistribution.py
index 963aee9b7..2eb03611c 100644
--- a/sharpy/postproc/liftdistribution.py
+++ b/sharpy/postproc/liftdistribution.py
@@ -2,19 +2,22 @@
 
 import numpy as np
 
+import sharpy.utils.cout_utils as cout
+import sharpy.utils.algebra as algebra
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
+from sharpy.utils.datastructures import init_matrix_structure, standalone_ctypes_pointer
+import sharpy.aero.utils.uvlmlib as uvlmlib
 import sharpy.aero.utils.mapping as mapping
-import sharpy.utils.algebra as algebra
 import sharpy.aero.utils.utils as aeroutils
 
 
 @solver
 class LiftDistribution(BaseSolver):
     """LiftDistribution
-    
+
     Calculates and exports the lift distribution on lifting surfaces
-    
+
     """
     solver_id = 'LiftDistribution'
     solver_classification = 'post-processor'
@@ -35,7 +38,7 @@ class LiftDistribution(BaseSolver):
     settings_default['rho'] = 1.225
     settings_description['rho'] = 'Reference freestream density [kg/m³]'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -44,18 +47,30 @@ def __init__(self):
         self.folder = None
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
-        self.settings = data.settings[self.solver_id]
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        if custom_settings is None:
+            self.settings = data.settings[self.solver_id]
+        else:
+            self.settings = custom_settings
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        self.ts_max = len(self.data.structure.timestep_info)
         self.caller = caller
         self.folder = data.output_folder
         if not os.path.exists(self.folder):
             os.makedirs(self.folder)
 
-    def run(self, online=False):
-        self.lift_distribution(self.data.structure.timestep_info[self.data.ts],
-                               self.data.aero.timestep_info[self.data.ts])
+    def run(self, **kwargs):
+
+        online = su.set_value_or_default(kwargs, 'online', False)
+
+        if not online:
+            for self.ts in range(self.ts_max):
+                self.lift_distribution()
+            cout.cout_wrap('...Finished', 1)
+        else:
+            self.ts = len(self.data.structure.timestep_info) - 1
+            self.lift_distribution()
         return self.data
 
     def lift_distribution(self, struct_tstep, aero_tstep):
@@ -70,7 +85,7 @@ def lift_distribution(self, struct_tstep, aero_tstep):
             self.data.structure.connectivities,
             struct_tstep.cag(),
             self.data.aero.aero_dict)
-        # Prepare output matrix and file 
+        # Prepare output matrix and file
         N_nodes = self.data.structure.num_node
         numb_col = 4
         header = "x,y,z,fz"
@@ -89,7 +104,7 @@ def lift_distribution(self, struct_tstep, aero_tstep):
                 local_node = self.data.aero.struct2aero_mapping[inode][0]["i_n"]
                 ielem, inode_in_elem = self.data.structure.node_master_elem[inode]
                 i_surf = int(self.data.aero.surface_distribution[ielem])
-                # get c_gb                
+                # get c_gb
                 cab = algebra.crv2rotation(struct_tstep.psi[ielem, inode_in_elem, :])
                 cgb = np.dot(cga, cab)
                 # Get c_bs
diff --git a/sharpy/postproc/pickledata.py b/sharpy/postproc/pickledata.py
index 2f6b536e2..386c0b43f 100644
--- a/sharpy/postproc/pickledata.py
+++ b/sharpy/postproc/pickledata.py
@@ -6,7 +6,7 @@
 import sharpy
 import sharpy.utils.cout_utils as cout
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.h5utils as h5utils
 
 
@@ -27,6 +27,17 @@ class PickleData(BaseSolver):
     solver_id = 'PickleData'
     solver_classification = 'post-processor'
 
+    settings_types = dict()
+    settings_default = dict()
+    settings_description = dict()
+
+    settings_types['stride'] = 'int'
+    settings_default['stride'] = 1
+    settings_description['stride'] = 'Number of steps between the execution calls when run online'
+
+    settings_table = su.SettingsTable()
+    __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
+
     def __init__(self):
         import sharpy
 
@@ -35,17 +46,30 @@ def __init__(self):
         self.folder = None
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
+        if custom_settings is None:
+            self.settings = data.settings[self.solver_id]
+        else:
+            self.settings = custom_settings
+
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default)
 
         self.folder = data.output_folder
         self.filename = self.folder + self.data.settings['SHARPy']['case']+'.pkl'
         self.caller = caller
 
-    def run(self, online=False):
-        for it in range(len(self.data.structure.timestep_info)):
-            tstep_p = self.data.structure.timestep_info[it]
-        with open(self.filename, 'wb') as f:
-            pickle.dump(self.data, f, protocol=pickle.HIGHEST_PROTOCOL)
+
+    def run(self, **kwargs):
+        
+        online = su.set_value_or_default(kwargs, 'online', False)
+        solvers = su.set_value_or_default(kwargs, 'solvers', None)
+        
+        if ((online and (self.data.ts % self.settings['stride'] == 0)) or (not online)):
+            with open(self.filename, 'wb') as f:
+                pickle.dump(self.data, f, protocol=pickle.HIGHEST_PROTOCOL)
+                pickle.dump(solvers, f, protocol=pickle.HIGHEST_PROTOCOL)
 
         return self.data
diff --git a/sharpy/postproc/plotflowfield.py b/sharpy/postproc/plotflowfield.py
index ee4f6c060..b688e16af 100644
--- a/sharpy/postproc/plotflowfield.py
+++ b/sharpy/postproc/plotflowfield.py
@@ -3,7 +3,7 @@
 from tvtk.api import tvtk, write_data
 from sharpy.utils.solver_interface import solver, BaseSolver
 import sharpy.utils.generator_interface as gen_interface
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.aero.utils.uvlmlib as uvlmlib
 import ctypes as ct
 from sharpy.utils.constants import vortex_radius_def
@@ -63,7 +63,7 @@ class PlotFlowField(BaseSolver):
     settings_default['vortex_radius'] = vortex_radius_def
     settings_description['vortex_radius'] = 'Distance below which inductions are not computed.'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options)
 
     def __init__(self):
@@ -72,14 +72,16 @@ def __init__(self):
         self.folder = None
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default,
-                                 self.settings_options)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           self.settings_options)
 
         self.folder = data.output_folder + '/' + 'GenerateFlowField/'
         if not os.path.isdir(self.folder):
@@ -89,13 +91,13 @@ def initialise(self, data, custom_settings=None, caller=None):
         velocity_generator_type = gen_interface.generator_from_string(
             self.settings['velocity_field_generator'])
         self.velocity_generator = velocity_generator_type()
-        self.velocity_generator.initialise(self.settings['velocity_field_input'])
+        self.velocity_generator.initialise(self.settings['velocity_field_input'], restart=restart)
 
         # init postproc grid generator
         postproc_grid_generator_type = gen_interface.generator_from_string(
             self.settings['postproc_grid_generator'])
         self.postproc_grid_generator = postproc_grid_generator_type()
-        self.postproc_grid_generator.initialise(self.settings['postproc_grid_input'])
+        self.postproc_grid_generator.initialise(self.settings['postproc_grid_input'], restart=restart)
         self.caller = caller
 
     def output_velocity_field(self, ts):
@@ -180,7 +182,10 @@ def output_velocity_field(self, ts):
         filename = self.folder + "VelocityField_" + '%06u' % ts + ".vtk"
         write_data(vtk_info, filename)
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+
+        online = su.set_value_or_default(kwargs, 'online', False)
+
         if online:
             if divmod(self.data.ts, self.settings['stride'])[1] == 0:
                 self.output_velocity_field(len(self.data.structure.timestep_info) - 1)
diff --git a/sharpy/postproc/savedata.py b/sharpy/postproc/savedata.py
index 360393064..8d06fa85a 100644
--- a/sharpy/postproc/savedata.py
+++ b/sharpy/postproc/savedata.py
@@ -4,7 +4,7 @@
 import sharpy
 import sharpy.utils.cout_utils as cout
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.h5utils as h5utils
 from sharpy.presharpy.presharpy import PreSharpy
 
@@ -90,7 +90,11 @@ class SaveData(BaseSolver):
     settings_description['format'] = 'Save linear state space to hdf5 ``.h5`` or Matlab ``.mat`` format.'
     settings_options['format'] = ['h5', 'mat']
 
-    settings_table = settings.SettingsTable()
+    settings_types['stride'] = 'int'
+    settings_default['stride'] = 1
+    settings_description['stride'] = 'Number of steps between the execution calls when run online'
+
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description,
                                        settings_options=settings_options)
 
@@ -109,15 +113,17 @@ def __init__(self):
         # see initialise and add_as_grp
         self.ClassesToSave = (PreSharpy,)
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
 
-        settings.to_custom_types(self.settings,
-                                 self.settings_types, self.settings_default, options=self.settings_options)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           options=self.settings_options)
 
         # Add these anyway - therefore if you add your own skip_attr you don't have to retype all of these
         self.settings['skip_attr'].extend(['fortran',
@@ -182,111 +188,113 @@ def initialise(self, data, custom_settings=None, caller=None):
                                        sharpy.linear.assembler.linearaeroelastic.LinearAeroelastic,
                                        sharpy.linear.assembler.linearbeam.LinearBeam,
                                        sharpy.linear.assembler.linearuvlm.LinearUVLM,
-                                       sharpy.linear.src.libss.ss_block,
+                                       sharpy.linear.src.libss.StateSpace,
                                        sharpy.linear.src.lingebm.FlexDynamic,)
 
             if self.settings['save_linear_uvlm']:
                 self.ClassesToSave += (sharpy.solvers.linearassembler.Linear, sharpy.linear.src.libss.ss_block)
         self.caller = caller
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+
+        online = su.set_value_or_default(kwargs, 'online', False)
 
         # Use the following statement in case the ct types are not defined and
         # you need them on uvlm3d
         # self.data.aero.timestep_info[-1].generate_ctypes_pointers()
 
-        if self.settings['format'] == 'h5':
-            file_exists = os.path.isfile(self.filename)
-            hdfile = h5py.File(self.filename, 'a')
-
-            if (online and file_exists):
-                self.save_timestep(self.data, self.settings, self.data.ts, hdfile)
-            else:
-                skip_attr_init = copy.deepcopy(self.settings['skip_attr'])
-                skip_attr_init.append('timestep_info')
-
-                h5utils.add_as_grp(self.data, hdfile, grpname='data',
-                                   ClassesToSave=self.ClassesToSave, SkipAttr=skip_attr_init,
-                                   compress_float=self.settings['compress_float'])
-
-                if self.settings['save_struct']:
-                    h5utils.add_as_grp(list(),
-                               hdfile['data']['structure'],
-                               grpname='timestep_info')
-                if self.settings['save_aero']:
-                    h5utils.add_as_grp(list(),
-                               hdfile['data']['aero'],
-                               grpname='timestep_info')
-
-                for it in range(len(self.data.structure.timestep_info)):
-                    tstep_p = self.data.structure.timestep_info[it]
-                    if tstep_p is not None:
-                        self.save_timestep(self.data, self.settings, it, hdfile)
-
-            hdfile.close()
+        if ((online and (self.data.ts % self.settings['stride'] == 0)) or (not online)):
+            if self.settings['format'] == 'h5':
+                file_exists = os.path.isfile(self.filename)
+                hdfile = h5py.File(self.filename, 'a')
 
-            if self.settings['save_linear_uvlm']:
-                linhdffile = h5py.File(self.filename.replace('.data.h5', '.uvlmss.h5'), 'a')
-                h5utils.add_as_grp(self.data.linear.linear_system.uvlm.ss, linhdffile, grpname='ss',
-                                   ClassesToSave=self.ClassesToSave, SkipAttr=self.settings['skip_attr'],
-                                   compress_float=self.settings['compress_float'])
-                h5utils.add_as_grp(self.data.linear.linear_system.linearisation_vectors, linhdffile,
-                                   grpname='linearisation_vectors',
-                                   ClassesToSave=self.ClassesToSave, SkipAttr=self.settings['skip_attr'],
-                                   compress_float=self.settings['compress_float'])
-                linhdffile.close()
+                if (online and file_exists):
+                    self.save_timestep(self.data, self.settings, self.data.ts, hdfile)
+                else:
+                    skip_attr_init = copy.deepcopy(self.settings['skip_attr'])
+                    skip_attr_init.append('timestep_info')
 
-            if self.settings['save_linear']:
-                with h5py.File(self.filename_linear, 'a') as linfile:
-                    h5utils.add_as_grp(self.data.linear.linear_system.linearisation_vectors, linfile,
-                                       grpname='linearisation_vectors',
+                    h5utils.add_as_grp(self.data, hdfile, grpname='data',
+                                       ClassesToSave=self.ClassesToSave, SkipAttr=skip_attr_init,
+                                       compress_float=self.settings['compress_float'])
+
+                    if self.settings['save_struct']:
+                        h5utils.add_as_grp(list(),
+                                   hdfile['data']['structure'],
+                                   grpname='timestep_info')
+                    if self.settings['save_aero']:
+                        h5utils.add_as_grp(list(),
+                                   hdfile['data']['aero'],
+                                   grpname='timestep_info')
+
+                    for it in range(len(self.data.structure.timestep_info)):
+                        tstep_p = self.data.structure.timestep_info[it]
+                        if tstep_p is not None:
+                            self.save_timestep(self.data, self.settings, it, hdfile)
+
+                hdfile.close()
+
+                if self.settings['save_linear_uvlm']:
+                    linhdffile = h5py.File(self.filename.replace('.data.h5', '.uvlmss.h5'), 'a')
+                    h5utils.add_as_grp(self.data.linear.linear_system.uvlm.ss, linhdffile, grpname='ss',
                                        ClassesToSave=self.ClassesToSave, SkipAttr=self.settings['skip_attr'],
                                        compress_float=self.settings['compress_float'])
-                    h5utils.add_as_grp(self.data.linear.ss, linfile, grpname='ss',
+                    h5utils.add_as_grp(self.data.linear.linear_system.linearisation_vectors, linhdffile,
+                                       grpname='linearisation_vectors',
                                        ClassesToSave=self.ClassesToSave, SkipAttr=self.settings['skip_attr'],
                                        compress_float=self.settings['compress_float'])
-
-            if self.settings['save_rom']:
-                try:
-                    for k, rom in self.data.linear.linear_system.uvlm.rom.items():
-                        rom.save(self.filename.replace('.data.h5', '_{:s}.rom.h5'.format(k.lower())))
-                except AttributeError:
-                    cout.cout_wrap('Could not locate a reduced order model to save')
-
-        elif self.settings['format'] == 'mat':
-            from scipy.io import savemat
-            if self.settings['save_linear']:
-                # reference-forces
-                linearisation_vectors = self.data.linear.linear_system.linearisation_vectors
-
-                matfilename = self.filename.replace('.data.h5', '.linss.mat')
-                A, B, C, D = self.data.linear.ss.get_mats()
-                savedict = {'A': A,
-                            'B': B,
-                            'C': C,
-                            'D': D}
-                for k, v in linearisation_vectors.items():
-                    savedict[k] = v
-                dt = self.data.linear.ss.dt
-                if dt is not None:
-                    savedict['dt'] = dt
-                savemat(matfilename, savedict)
-
-            if self.settings['save_linear_uvlm']:
-                matfilename = self.filename.replace('.data.h5', '.uvlmss.mat')
-                linearisation_vectors = self.data.linear.linear_system.uvlm.linearisation_vectors
-                A, B, C, D = self.data.linear.linear_system.uvlm.ss.get_mats()
-
-                savedict = {'A': A,
-                            'B': B,
-                            'C': C,
-                            'D': D}
-                for k, v in linearisation_vectors.items():
-                    savedict[k] = v
-                dt = self.data.linear.linear_system.uvlm.ss.dt
-                if dt is not None:
-                    savedict['dt'] = dt
-                savemat(matfilename, savedict)
+                    linhdffile.close()
+
+                if self.settings['save_linear']:
+                    with h5py.File(self.filename_linear, 'a') as linfile:
+                        h5utils.add_as_grp(self.data.linear.linear_system.linearisation_vectors, linfile,
+                                           grpname='linearisation_vectors',
+                                           ClassesToSave=self.ClassesToSave, SkipAttr=self.settings['skip_attr'],
+                                           compress_float=self.settings['compress_float'])
+                        h5utils.add_as_grp(self.data.linear.ss, linfile, grpname='ss',
+                                           ClassesToSave=self.ClassesToSave, SkipAttr=self.settings['skip_attr'],
+                                           compress_float=self.settings['compress_float'])
+
+                if self.settings['save_rom']:
+                    try:
+                        for k, rom in self.data.linear.linear_system.uvlm.rom.items():
+                            rom.save(self.filename.replace('.data.h5', '_{:s}.rom.h5'.format(k.lower())))
+                    except AttributeError:
+                        cout.cout_wrap('Could not locate a reduced order model to save')
+
+            elif self.settings['format'] == 'mat':
+                from scipy.io import savemat
+                if self.settings['save_linear']:
+                    # reference-forces
+                    linearisation_vectors = self.data.linear.linear_system.linearisation_vectors
+
+                    matfilename = self.filename.replace('.data.h5', '.linss.mat')
+                    A, B, C, D = self.data.linear.ss.get_mats()
+                    savedict = {'A': A,
+                                'B': B,
+                                'C': C,
+                                'D': D}
+                    for k, v in linearisation_vectors.items():
+                        savedict[k] = v
+                    dt = self.data.linear.ss.dt
+                    if dt is not None:
+                        savedict['dt'] = dt
+                    savemat(matfilename, savedict)
+
+                if self.settings['save_linear_uvlm']:
+                    matfilename = self.filename.replace('.data.h5', '.uvlmss.mat')
+                    linearisation_vectors = self.data.linear.linear_system.uvlm.linearisation_vectors
+                    A, B, C, D = self.data.linear.linear_system.uvlm.ss.get_mats()
+                    savedict = {'A': A,
+                                'B': B,
+                                'C': C,
+                                'D': D}
+                    for k, v in linearisation_vectors.items():
+                        savedict[k] = v
+                    dt = self.data.linear.linear_system.uvlm.ss.dt
+                    if dt is not None:
+                        savedict['dt'] = dt
+                    savemat(matfilename, savedict)
 
         return self.data
 
diff --git a/sharpy/postproc/saveparametriccase.py b/sharpy/postproc/saveparametriccase.py
index f348f3a6d..a61508a47 100644
--- a/sharpy/postproc/saveparametriccase.py
+++ b/sharpy/postproc/saveparametriccase.py
@@ -1,5 +1,5 @@
 from sharpy.utils.solver_interface import solver, BaseSolver, initialise_solver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import configobj
 import os
 import sharpy.utils.cout_utils as cout
@@ -71,7 +71,7 @@ class SaveParametricCase(BaseSolver):
                                                    'the M, C, K matrices. The setting ``save_pmor_items`` ' \
                                                    'should be set to `on`'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -80,7 +80,7 @@ def __init__(self):
         self.folder = None
         self.case_name = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
 
         if custom_settings is None:
@@ -88,15 +88,17 @@ def initialise(self, data, custom_settings=None):
         else:
             self.settings = custom_settings
 
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default
-                                 )
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default)
 
         self.folder = data.output_folder
         self.case_name = self.data.settings['SHARPy']['case']
 
-    def run(self):
+    def run(self, **kwargs):
+        
+        online = su.set_value_or_default(kwargs, 'online', False)
+        restart = su.set_value_or_default(kwargs, 'restart', False)
 
         config = configobj.ConfigObj()
         file_name = self.folder + '/' + self.data.settings['SHARPy']['case'] + '.pmor.sharpy'
@@ -114,7 +116,7 @@ def run(self):
                           'attributes individually',
                           DeprecationWarning)
             pickle_solver = initialise_solver('PickleData')
-            pickle_solver.initialise(self.data)
+            pickle_solver.initialise(self.data, restart=restart)
             self.data = pickle_solver.run()
             sim_info['path_to_data'] = os.path.abspath(self.folder)
 
diff --git a/sharpy/postproc/stabilityderivatives.py b/sharpy/postproc/stabilityderivatives.py
index b2c8782d6..8da5857c9 100644
--- a/sharpy/postproc/stabilityderivatives.py
+++ b/sharpy/postproc/stabilityderivatives.py
@@ -2,7 +2,8 @@
 import os
 import numpy as np
 import sharpy.utils.cout_utils as cout
-import sharpy.utils.settings as settings
+import sharpy.utils.algebra as algebra
+import sharpy.utils.settings as su
 from sharpy.linear.utils.derivatives import Derivatives, DerivativeSet
 
 
@@ -40,7 +41,7 @@ class StabilityDerivatives(solver_interface.BaseSolver):
     settings_default['c_ref'] = 1.
     settings_description['c_ref'] = 'Reference chord'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -57,7 +58,7 @@ def __init__(self):
 
         self.coefficients = dict  # type: dict # name: scaling coefficient
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
 
         if custom_settings:
@@ -65,9 +66,11 @@ def initialise(self, data, custom_settings=None, caller=None):
         else:
             self.settings = self.data.settings[self.solver_id]
 
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default,
-                                 options=self.settings_options,
-                                 no_ctype=True)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           options=self.settings_options,
+                           no_ctype=True)
         self.caller = caller
         self.folder = data.output_folder + '/derivatives/'
         if not os.path.isdir(self.folder):
@@ -101,7 +104,10 @@ def initialise(self, data, custom_settings=None, caller=None):
                                                                   static_state=self.steady_aero_forces(),
                                                                   target_system='aeroelastic')
 
-    def run(self, online=False):
+
+    def run(self, **kwargs):
+        
+        online = su.set_value_or_default(kwargs, 'online', False)
 
         # TODO: consider running all required solvers inside this one to keep the correct settings
         # i.e: run Modal, Linear Assembly
diff --git a/sharpy/postproc/stallcheck.py b/sharpy/postproc/stallcheck.py
index b283dd4af..f88fc29fa 100644
--- a/sharpy/postproc/stallcheck.py
+++ b/sharpy/postproc/stallcheck.py
@@ -1,7 +1,7 @@
 import numpy as np
 import sharpy.utils.cout_utils as cout
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.datastructures import init_matrix_structure, standalone_ctypes_pointer
 import sharpy.aero.utils.uvlmlib as uvlmlib
 
@@ -43,7 +43,7 @@ class StallCheck(BaseSolver):
     settings_default['output_degrees'] = False
     settings_description['output_degrees'] = 'Output incidence angles in degrees vs radians'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -55,17 +55,20 @@ def __init__(self):
         self.ts = None
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
         self.ts_max = len(self.data.structure.timestep_info)
         self.caller = caller
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+    
+        online = su.set_value_or_default(kwargs, 'online', False)
+
         if not online:
             for self.ts in range(self.ts_max):
                 self.check_stall()
diff --git a/sharpy/postproc/udpout.py b/sharpy/postproc/udpout.py
index 86a91dbd2..fb5d52639 100644
--- a/sharpy/postproc/udpout.py
+++ b/sharpy/postproc/udpout.py
@@ -1,5 +1,5 @@
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.io.network_interface as network_interface
 import sharpy.utils.cout_utils as cout
 
@@ -33,7 +33,7 @@ class UDPout(BaseSolver):
     del settings_default['send_output_to_all_clients']
     del settings_description['send_output_to_all_clients']
 
-    table = settings.SettingsTable()
+    table = su.SettingsTable()
     __doc__ += table.generate(settings_types, settings_default, settings_description,
                               header_line='This post-processor takes in the following settings, for a more '
                                           'detailed description see '
@@ -51,7 +51,7 @@ def __init__(self):
 
         self.caller = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
@@ -69,7 +69,9 @@ def initialise(self, data, custom_settings=None, caller=None):
 
         self.caller = caller
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+        
+        online = su.set_value_or_default(kwargs, 'online', False)
 
         if online:
             self.set_of_variables.get_value(self.data)
diff --git a/sharpy/postproc/writevariablestime.py b/sharpy/postproc/writevariablestime.py
index 17b6355d4..5be78a963 100644
--- a/sharpy/postproc/writevariablestime.py
+++ b/sharpy/postproc/writevariablestime.py
@@ -1,7 +1,7 @@
 import os
 import numpy as np
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 
 
 @solver
@@ -92,7 +92,7 @@ class WriteVariablesTime(BaseSolver):
     settings_default['vel_field_points'] = np.array([0., 0., 0.])
     settings_description['vel_field_points'] = 'List of coordinates of the control points as x1, y1, z1, x2, y2, z2 ...'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -105,13 +105,13 @@ def __init__(self):
         self.caller = None
         self.velocity_generator = None
 
-    def initialise(self, data, custom_settings=None, caller=None):
+    def initialise(self, data, custom_settings=None, caller=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         self.folder = data.output_folder + '/WriteVariablesTime/'
         if not os.path.isdir(self.folder):
@@ -193,7 +193,9 @@ def initialise(self, data, custom_settings=None, caller=None):
                 # For coupled solvers
                 self.velocity_generator = self.caller.aero_solver.velocity_generator
 
-    def run(self, online=False):
+    def run(self, **kwargs):
+    
+        online = su.set_value_or_default(kwargs, 'online', False)
 
         if online:
             self.data = self.write(-1)
diff --git a/sharpy/sharpy_main.py b/sharpy/sharpy_main.py
index 046ce9cc1..41d77a331 100644
--- a/sharpy/sharpy_main.py
+++ b/sharpy/sharpy_main.py
@@ -84,18 +84,32 @@ def main(args=None, sharpy_input_dict=None):
         if args.input_filename == '':
             parser.error('input_filename is a required argument of SHARPy.')
         settings = input_arg.read_settings(args)
+        missing_solvers = False
         if args.restart is None:
             # run preSHARPy
             data = PreSharpy(settings)
+            solvers = dict()
+            restart = False
         else:
             try:
                 with open(args.restart, 'rb') as restart_file:
                     data = pickle.load(restart_file)
+                    try:
+                        solvers = pickle.load(restart_file)
+                    except EOFError:
+                        # For backwards compatibility
+                        missing_solvers = True
+                        solvers = dict()
+                        cout.cout_wrap('Solvers not found in Pickle file. Using the settings in *.sharpy file.')
+                    if "UpdatePickle" in solvers.keys():
+                        # For backwards compatibility
+                        missing_solvers = True
+                        solvers = dict()
             except FileNotFoundError:
                 raise FileNotFoundError('The file specified for the snapshot \
                     restart (-r) does not exist. Please check.')
 
-
+            restart = True
             # update the settings
             data.update_settings(settings)
 
@@ -108,11 +122,22 @@ def main(args=None, sharpy_input_dict=None):
             # for it in range(self.num_steps):
             #     data.structure.dynamic_input.append(dict())
 
+            # Restart the solvers
+            old_solvers_list = list(solvers.keys())
+            for old_solver_name in old_solvers_list:
+                if old_solver_name not in settings['SHARPy']['flow']:
+                    del solvers[old_solver_name] 
+
         # Loop for the solvers specified in *.sharpy['SHARPy']['flow']
         for solver_name in settings['SHARPy']['flow']:
-            solver = solver_interface.initialise_solver(solver_name)
-            solver.initialise(data)
-            data = solver.run()
+            if (args.restart is None) or (solver_name not in solvers.keys()) or (missing_solvers):
+                solvers[solver_name] = solver_interface.initialise_solver(solver_name)
+            if missing_solvers:
+                solvers[solver_name].initialise(data, restart=False)
+            else:
+                solvers[solver_name].initialise(data, restart=restart)
+            data = solvers[solver_name].run(solvers=solvers)
+            solvers[solver_name].teardown()
 
         cpu_time = time.process_time() - t
         wall_time = time.perf_counter() - t0_wall
diff --git a/sharpy/solvers/_basestructural.py b/sharpy/solvers/_basestructural.py
index 279bf0858..3f56f4f07 100644
--- a/sharpy/solvers/_basestructural.py
+++ b/sharpy/solvers/_basestructural.py
@@ -1,5 +1,4 @@
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
 import sharpy.utils.cout_utils as cout
 
 @solver
@@ -68,8 +67,8 @@ class _BaseStructural(BaseSolver):
     settings_types['num_steps'] = 'int'
     settings_default['num_steps'] = 500
 
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         pass
 
-    def run(self):
+    def run(self, **kwargs):
         pass
diff --git a/sharpy/solvers/aerogridloader.py b/sharpy/solvers/aerogridloader.py
index 0f6db5350..99fe104d3 100644
--- a/sharpy/solvers/aerogridloader.py
+++ b/sharpy/solvers/aerogridloader.py
@@ -3,7 +3,7 @@
 
 from sharpy.utils.solver_interface import solver, BaseSolver
 import sharpy.aero.models.aerogrid as aerogrid
-import sharpy.utils.settings as settings_utils
+import sharpy.utils.settings as su
 import sharpy.utils.h5utils as h5utils
 import sharpy.utils.generator_interface as gen_interface
 
@@ -84,7 +84,7 @@ class AerogridLoader(BaseSolver):
     settings_default['wake_shape_generator_input'] = dict()
     settings_description['wake_shape_generator_input'] = 'Dictionary of inputs needed by the wake shape generator'
 
-    settings_table = settings_utils.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description,
                                        settings_options=settings_options)
 
@@ -100,14 +100,14 @@ def __init__(self):
 
         self.wake_shape_generator = None
 
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         self.data = data
         self.settings = data.settings[self.solver_id]
 
         # init settings
-        settings_utils.to_custom_types(self.settings,
-                                       self.settings_types,
-                                       self.settings_default, options=self.settings_options)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default, options=self.settings_options)
 
         # read input file (aero)
         self.read_files()
@@ -116,7 +116,8 @@ def initialise(self, data):
             self.settings['wake_shape_generator'])
         self.wake_shape_generator = wake_shape_generator_type()
         self.wake_shape_generator.initialise(data,
-                                             self.settings['wake_shape_generator_input'])
+                                             self.settings['wake_shape_generator_input'],
+                                             restart=restart)
 
     def read_files(self):
         # open aero file
@@ -134,7 +135,7 @@ def read_files(self):
             # store files in dictionary
             self.aero_data_dict = h5utils.load_h5_in_dict(aero_file_handle)
 
-    def run(self):
+    def run(self, **kwargs):
         self.data.aero = aerogrid.Aerogrid()
         self.data.aero.generate(self.aero_data_dict,
                                 self.data.structure,
diff --git a/sharpy/solvers/beamloader.py b/sharpy/solvers/beamloader.py
index 95b92e66f..07673b627 100644
--- a/sharpy/solvers/beamloader.py
+++ b/sharpy/solvers/beamloader.py
@@ -3,7 +3,7 @@
 
 from sharpy.utils.solver_interface import solver, BaseSolver
 import sharpy.structure.models.beam as beam
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.h5utils as h5utils
 import os
 
@@ -60,7 +60,7 @@ class BeamLoader(BaseSolver):
     settings_default['for_pos'] = [0., 0, 0]
     settings_description['for_pos'] = 'Initial position of the A FoR.'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -76,12 +76,12 @@ def __init__(self):
         # structure storage
         self.structure = None
 
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         self.data = data
         self.settings = data.settings[self.solver_id]
 
         # init settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         # read input files (fem and dyn)
         self.read_files()
@@ -131,7 +131,7 @@ def validate_fem_file(self):
     def validate_dyn_file(self):
         raise NotImplementedError('validation of the dyn file in beamloader is not yet implemented!')
 
-    def run(self):
+    def run(self, **kwargs):
         self.data.structure = beam.Beam()
         self.data.structure.ini_mb_dict = self.mb_data_dict
         self.data.structure.generate(self.fem_data_dict, self.settings)
diff --git a/sharpy/solvers/dynamiccoupled.py b/sharpy/solvers/dynamiccoupled.py
index 59f404750..44ed0a308 100644
--- a/sharpy/solvers/dynamiccoupled.py
+++ b/sharpy/solvers/dynamiccoupled.py
@@ -13,7 +13,7 @@
 import sharpy.utils.solver_interface as solver_interface
 import sharpy.utils.controller_interface as controller_interface
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 import sharpy.utils.exceptions as exc
 import sharpy.io.network_interface as network_interface
@@ -178,7 +178,7 @@ class DynamicCoupled(BaseSolver):
                                                  'The dictionary values are dictionaries with the settings ' \
                                                  'needed by each generator.'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options)
 
     def __init__(self):
@@ -243,7 +243,7 @@ def set_rho(self, new_rho):
         """
         self.aero_solver.settings['rho'] = ct.c_double(new_rho)
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         """
         Controls the initialisation process of the solver, including processing
         the settings and initialising the aero and structural solvers, postprocessors
@@ -254,10 +254,10 @@ def initialise(self, data, custom_settings=None):
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default,
-                                 options=self.settings_options)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           options=self.settings_options)
 
         self.original_settings = copy.deepcopy(self.settings)
 
@@ -272,38 +272,58 @@ def initialise(self, data, custom_settings=None):
             # timestep_info[0] and remove the rest
             self.cleanup_timestep_info()
 
-        self.structural_solver = solver_interface.initialise_solver(
-            self.settings['structural_solver'])
+        if not restart:
+            self.structural_solver = solver_interface.initialise_solver(
+                self.settings['structural_solver'])
+            self.aero_solver = solver_interface.initialise_solver(
+                self.settings['aero_solver'])
         self.structural_solver.initialise(
-            self.data, self.settings['structural_solver_settings'])
-        self.aero_solver = solver_interface.initialise_solver(
-            self.settings['aero_solver'])
+            self.data, self.settings['structural_solver_settings'],
+            restart=restart)
         self.aero_solver.initialise(self.structural_solver.data,
-                                    self.settings['aero_solver_settings'])
+                                    self.settings['aero_solver_settings'],
+                                    restart=restart)
         self.data = self.aero_solver.data
 
         # initialise postprocessors
-        self.postprocessors = dict()
         if self.settings['postprocessors']:
             self.with_postprocessors = True
+            # Remove previous postprocessors not required on restart
+            old_list = list(self.postprocessors.keys())
+            for old_list_name in old_list:
+                if old_list_name not in self.settings['postprocessors']:
+                    del self.postprocessors[old_list_name] 
         for postproc in self.settings['postprocessors']:
-            self.postprocessors[postproc] = solver_interface.initialise_solver(
-                postproc)
+            if not postproc in self.postprocessors.keys():
+                self.postprocessors[postproc] = solver_interface.initialise_solver(
+                    postproc)
             self.postprocessors[postproc].initialise(
-                self.data, self.settings['postprocessors_settings'][postproc], caller=self)
+                self.data, self.settings['postprocessors_settings'][postproc], caller=self,
+                restart=restart)
 
         # initialise controllers
-        self.controllers = dict()
         self.with_controllers = False
         if self.settings['controller_id']:
             self.with_controllers = True
+            # Remove previous controllers not required on restart
+            if self.controllers is not None:
+                old_list = list(self.controllers.keys())
+                for old_list_name in old_list:
+                    if old_list_name not in self.settings['controller_id']:
+                        del self.controllers[old_list_name] 
         for controller_id, controller_type in self.settings['controller_id'].items():
-            self.controllers[controller_id] = (
-                controller_interface.initialise_controller(controller_type))
-            self.controllers[controller_id].initialise(
+            if self.controllers is not None:
+                if not controller_id in self.controllers.keys():
+                    self.controllers[controller_id] = (
+                        controller_interface.initialise_controller(controller_type))
+            else:
+                self.controllers = dict()
+                self.controllers[controller_id] = (
+                       controller_interface.initialise_controller(controller_type))
+            self.controllers[controller_id].initialise(self.data,
                     self.settings['controller_settings'][controller_id],
-                    controller_id)
-
+                    controller_id, restart=restart)
+        
         # print information header
         if self.print_info:
             self.residual_table = cout.TablePrinter(8, 12, ['g', 'f', 'g', 'f', 'f', 'f', 'e', 'e'])
@@ -329,13 +349,18 @@ def initialise(self, data, custom_settings=None):
             self.network_loader.initialise(in_settings=self.settings['network_settings'])
 
         # initialise runtime generators
-        self.runtime_generators = dict()
         if self.settings['runtime_generators']:
             self.with_runtime_generators = True
-            for id, param in self.settings['runtime_generators'].items():
-                gen = gen_interface.generator_from_string(id)
-                self.runtime_generators[id] = gen()
-                self.runtime_generators[id].initialise(param, data=self.data)
+            # Remove previous runtime generators not required on restart
+            old_list = list(self.runtime_generators.keys())
+            for old_list_name in old_list:
+                if old_list_name not in self.settings['runtime_generators']:
+                    del self.runtime_generators[old_list_name] 
+        for rg_id, param in self.settings['runtime_generators'].items():
+            if not rg_id in self.runtime_generators.keys():
+                gen = gen_interface.generator_from_string(rg_id)
+                self.runtime_generators[rg_id] = gen()
+            self.runtime_generators[rg_id].initialise(param, data=self.data, restart=restart)
 
     def cleanup_timestep_info(self):
         if max(len(self.data.aero.timestep_info), len(self.data.structure.timestep_info)) > 1:
@@ -393,21 +418,31 @@ def process_controller_output(self, controlled_state):
                             self.settings['dt']/(
                                 self.settings['structural_substeps'] + 1))
 
-                if info_k == 'structural_solver':
+                elif info_k == 'structural_solver':
                     if info_v is not None:
                         self.structural_solver = solver_interface.initialise_solver(
                             info['structural_solver'])
                         self.structural_solver.initialise(
                             self.data, self.settings['structural_solver_settings'])
 
+            elif info_k == 'rotor_vel':
+                for lc in self.structural_solver.lc_list:
+                    if lc._lc_id == 'hinge_node_FoR_pitch':
+                        lc.set_rotor_vel(info_v)
+
+            elif info_k == 'pitch_vel':
+                for lc in self.structural_solver.lc_list:
+                    if lc._lc_id == 'hinge_node_FoR_pitch':
+                        lc.set_pitch_vel(info_v)
+
         return controlled_state['structural'], controlled_state['aero']
 
-    def run(self):
+    def run(self, **kwargs):
         """
         Run the time stepping procedure with controllers and postprocessors
         included.
         """
-
+        solvers = su.set_value_or_default(kwargs, 'solvers', None)
         if self.network_loader is not None:
             self.set_of_variables = self.network_loader.get_inout_variables()
 
@@ -417,7 +452,7 @@ def run(self):
             finish_event = threading.Event()
             with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
                 netloop = executor.submit(self.network_loop, incoming_queue, outgoing_queue, finish_event)
-                timeloop = executor.submit(self.time_loop, incoming_queue, outgoing_queue, finish_event)
+                timeloop = executor.submit(self.time_loop, incoming_queue, outgoing_queue, finish_event, solvers)
 
                 # TODO: improve exception handling to get exceptions when they happen from each thread
                 for t1 in [netloop, timeloop]:
@@ -428,7 +463,7 @@ def run(self):
                         raise Exception
 
         else:
-            self.time_loop()
+            self.time_loop(solvers=solvers)
 
         if self.print_info:
             cout.cout_wrap('...Finished', 1)
@@ -471,7 +506,7 @@ def network_loop(self, in_queue, out_queue, finish_event):
         in_network.close()
         out_network.close()
 
-    def time_loop(self, in_queue=None, out_queue=None, finish_event=None):
+    def time_loop(self, in_queue=None, out_queue=None, finish_event=None, solvers=None):
         self.logger.debug('Inside time loop')
         # dynamic simulations start at tstep == 1, 0 is reserved for the initial state
         for self.data.ts in range(
@@ -501,25 +536,14 @@ def time_loop(self, in_queue=None, out_queue=None, finish_event=None):
                     structural_kstep, aero_kstep = self.process_controller_output(
                         state)
 
-            k = 0
-            # compute unsteady contribution
-            force_coeff = 0.0
-            unsteady_contribution = False
-            if self.settings['include_unsteady_force_contribution']:
-                if self.data.ts > self.settings['steps_without_unsteady_force']:
-                    unsteady_contribution = True
-                    if 0 < self.settings['pseudosteps_ramp_unsteady_force']:
-                        force_coeff = k/self.settings['pseudosteps_ramp_unsteady_force']
-                    else:
-                        force_coeff = 1.
             # Add external forces
             if self.with_runtime_generators:
-                structural_kstep.runtime_generated_forces.fill(0.)
+                structural_kstep.runtime_steady_forces.fill(0.)
+                structural_kstep.runtime_unsteady_forces.fill(0.)
                 params = dict()
                 params['data'] = self.data
                 params['struct_tstep'] = structural_kstep
                 params['aero_tstep'] = aero_kstep
-                params['force_coeff'] = force_coeff
                 params['fsi_substep'] = -1
                 for id, runtime_generator in self.runtime_generators.items():
                     runtime_generator.generate(params)
@@ -560,31 +584,34 @@ def time_loop(self, in_queue=None, out_queue=None, finish_event=None):
                         else:
                             force_coeff = 1.
 
-                previous_runtime_generated_forces = structural_kstep.runtime_generated_forces.astype(dtype=ct.c_double, order='F', copy=True)
+                previous_runtime_steady_forces = structural_kstep.runtime_steady_forces.astype(dtype=ct.c_double, order='F', copy=True)
+                previous_runtime_unsteady_forces = structural_kstep.runtime_unsteady_forces.astype(dtype=ct.c_double, order='F', copy=True)
                 # Add external forces
                 if self.with_runtime_generators:
-                    structural_kstep.runtime_generated_forces.fill(0.)
+                    structural_kstep.runtime_steady_forces.fill(0.)
+                    structural_kstep.runtime_unsteady_forces.fill(0.)
                     params = dict()
                     params['data'] = self.data
                     params['struct_tstep'] = structural_kstep
                     params['aero_tstep'] = aero_kstep
-                    params['force_coeff'] = force_coeff
                     params['fsi_substep'] = k
                     for id, runtime_generator in self.runtime_generators.items():
                         runtime_generator.generate(params)
 
                 # run the solver
                 ini_time_aero = time.perf_counter()
-                self.data = self.aero_solver.run(aero_kstep,
-                                                 structural_kstep,
+                self.data = self.aero_solver.run(aero_step=aero_kstep,
+                                                 structural_step=structural_kstep,
                                                  convect_wake=True,
                                                  unsteady_contribution=unsteady_contribution)
                 self.time_aero += time.perf_counter() - ini_time_aero
 
                 previous_kstep = structural_kstep.copy()
                 structural_kstep = controlled_structural_kstep.copy()
-                structural_kstep.runtime_generated_forces = previous_kstep.runtime_generated_forces.astype(dtype=ct.c_double, order='F', copy=True)
-                previous_kstep.runtime_generated_forces = previous_runtime_generated_forces.astype(dtype=ct.c_double, order='F', copy=True)
+                structural_kstep.runtime_steady_forces = previous_kstep.runtime_steady_forces.astype(dtype=ct.c_double, order='F', copy=True)
+                structural_kstep.runtime_unsteady_forces = previous_kstep.runtime_unsteady_forces.astype(dtype=ct.c_double, order='F', copy=True)
+                previous_kstep.runtime_steady_forces = previous_runtime_steady_forces.astype(dtype=ct.c_double, order='F', copy=True)
+                previous_kstep.runtime_unsteady_forces = previous_runtime_unsteady_forces.astype(dtype=ct.c_double, order='F', copy=True)
 
                 # move the aerodynamic surface according the the structural one
                 self.aero_solver.update_custom_grid(structural_kstep,
@@ -632,8 +659,8 @@ def time_loop(self, in_queue=None, out_queue=None, finish_event=None):
                 if self.convergence(k,
                                     structural_kstep,
                                     previous_kstep,
-                                    self.settings['structural_solver'].lower(),
-                                    self.settings['aero_solver'].lower(),
+                                    self.structural_solver,
+                                    self.aero_solver,
                                     self.with_runtime_generators):
                     # move the aerodynamic surface according to the structural one
                     self.aero_solver.update_custom_grid(
@@ -663,11 +690,13 @@ def time_loop(self, in_queue=None, out_queue=None, finish_event=None):
                                                 structural_kstep.for_vel[2],
                                                 np.sum(structural_kstep.steady_applied_forces[:, 0]),
                                                 np.sum(structural_kstep.steady_applied_forces[:, 2])])
-            self.structural_solver.extract_resultants()
+            (self.data.structure.timestep_info[self.data.ts].total_forces[0:3],
+             self.data.structure.timestep_info[self.data.ts].total_forces[3:6]) = (
+                        self.structural_solver.extract_resultants(self.data.structure.timestep_info[self.data.ts]))
             # run postprocessors
             if self.with_postprocessors:
                 for postproc in self.postprocessors:
-                    self.data = self.postprocessors[postproc].run(online=True)
+                    self.data = self.postprocessors[postproc].run(online=True, solvers=solvers)
 
             # network only
             # put result back in queue
@@ -711,13 +740,14 @@ def convergence(self, k, tstep, previous_tstep,
             if self.base_dqdt == 0:
                 self.base_dqdt = 1.
             if with_runtime_generators:
-                self.base_res_forces = np.linalg.norm(tstep.runtime_generated_forces)
+                self.base_res_forces = np.linalg.norm(tstep.runtime_steady_forces +
+                                                      tstep.runtime_unsteady_forces)
                 if self.base_res_forces == 0:
                     self.base_res_forces = 1.
             return False
 
         # Check the special case of no aero and no runtime generators
-        if aero_solver.lower() == "noaero" and not with_runtime_generators:
+        if aero_solver.solver_id.lower() == "noaero" and not with_runtime_generators:
             return True
 
         # relative residuals
@@ -729,9 +759,11 @@ def convergence(self, k, tstep, previous_tstep,
                          self.base_dqdt)
 
         if with_runtime_generators:
-            res_forces = (np.linalg.norm(tstep.runtime_generated_forces -
-                                        previous_tstep.runtime_generated_forces)/
-                         self.base_res_forces)
+            res_forces = (np.linalg.norm(tstep.runtime_steady_forces -
+                                        previous_tstep.runtime_steady_forces +
+                                        tstep.runtime_unsteady_forces -
+                                        previous_tstep.runtime_unsteady_forces)/
+                                        self.base_res_forces)
         else:
             res_forces = 0.
 
@@ -742,8 +774,16 @@ def convergence(self, k, tstep, previous_tstep,
                 return False
 
         # convergence
-        return k > self.settings['minimum_steps'] - 1 and \
-            all(x < self.settings['fsi_tolerance'] for x in (self.res, self.res_dqdt, res_forces))
+        rigid_solver = False
+        if "rigid" in struct_solver.solver_id.lower():
+            rigid_solver = True
+        elif "NonLinearDynamicMultibody" == struct_solver.solver_id.lower() and struct_solver.settings['rigid_bodies']:
+            rigid_solver = True
+        if k > self.settings['minimum_steps'] - 1:
+            if self.res < self.settings['fsi_tolerance'] or rigid_solver:
+                if self.res_dqdt < self.settings['fsi_tolerance']:
+                    if res_forces < self.settings['fsi_tolerance']:
+                        return True
 
 
     def map_forces(self, aero_kstep, structural_kstep, unsteady_forces_coeff=1.0):
@@ -762,7 +802,7 @@ def map_forces(self, aero_kstep, structural_kstep, unsteady_forces_coeff=1.0):
             self.data.structure.connectivities,
             structural_kstep.cag(),
             self.data.aero.aero_dict)
-        dynamic_struct_forces = unsteady_forces_coeff*mapping.aero2struct_force_mapping(
+        dynamic_struct_forces = mapping.aero2struct_force_mapping(
             aero_kstep.dynamic_forces,
             self.data.aero.struct2aero_mapping,
             aero_kstep.zeta,
@@ -783,18 +823,18 @@ def map_forces(self, aero_kstep, structural_kstep, unsteady_forces_coeff=1.0):
         structural_kstep.postproc_node['aero_steady_forces'] = struct_forces
         structural_kstep.postproc_node['aero_unsteady_forces'] = dynamic_struct_forces
 
-        # prescribed forces + aero forces
-        structural_kstep.steady_applied_forces = (
-            (struct_forces + self.data.structure.ini_info.steady_applied_forces).
-            astype(dtype=ct.c_double, order='F', copy=True))
-        try:
-            structural_kstep.unsteady_applied_forces = (
-                (dynamic_struct_forces + self.data.structure.dynamic_input[max(self.data.ts - 1, 0)]['dynamic_forces'] +
-                 structural_kstep.runtime_generated_forces).
-                astype(dtype=ct.c_double, order='F', copy=True))
-        except KeyError:
-            structural_kstep.unsteady_applied_forces = (dynamic_struct_forces +
-                                                        structural_kstep.runtime_generated_forces)
+        # prescribed forces + aero forces + runtime generated
+        structural_kstep.steady_applied_forces += struct_forces
+        structural_kstep.steady_applied_forces += self.data.structure.ini_info.steady_applied_forces
+        structural_kstep.steady_applied_forces += structural_kstep.runtime_steady_forces
+
+        structural_kstep.unsteady_applied_forces += dynamic_struct_forces
+        if len(self.data.structure.dynamic_input) > 0:
+            structural_kstep.unsteady_applied_forces += self.data.structure.dynamic_input[max(self.data.ts - 1, 0)]['dynamic_forces']
+        structural_kstep.unsteady_applied_forces += structural_kstep.runtime_unsteady_forces
+
+        # Apply unsteady force coefficient
+        structural_kstep.unsteady_applied_forces *= unsteady_forces_coeff
 
     def relaxation_factor(self, k):
         initial = self.settings['relaxation_factor']
@@ -845,14 +885,30 @@ def interpolate_timesteps(step0, step1, out_step, coeff):
 
         return out_step
 
+    def teardown(self):
+        
+        self.structural_solver.teardown()
+        self.aero_solver.teardown()
+        if self.with_postprocessors:
+            for pp in self.postprocessors.values():
+                pp.teardown()
+        if self.with_controllers:
+            for cont in self.controllers.values():
+                cont.teardown()
+        if self.with_runtime_generators:
+            for rg in self.runtime_generators.values():
+                rg.teardown()
+
 
 def relax(beam, timestep, previous_timestep, coeff):
     timestep.steady_applied_forces = ((1.0 - coeff)*timestep.steady_applied_forces +
             coeff*previous_timestep.steady_applied_forces)
     timestep.unsteady_applied_forces = ((1.0 - coeff)*timestep.unsteady_applied_forces +
             coeff*previous_timestep.unsteady_applied_forces)
-    timestep.runtime_generated_forces = ((1.0 - coeff)*timestep.runtime_generated_forces +
-            coeff*previous_timestep.runtime_generated_forces)
+    timestep.runtime_steady_forces = ((1.0 - coeff)*timestep.runtime_steady_forces +
+            coeff*previous_timestep.runtime_steady_forces)
+    timestep.runtime_unsteady_forces = ((1.0 - coeff)*timestep.runtime_unsteady_forces +
+            coeff*previous_timestep.runtime_unsteady_forces)
 
 
 def normalise_quaternion(tstep):
diff --git a/sharpy/solvers/dynamicuvlm.py b/sharpy/solvers/dynamicuvlm.py
index 6fc505cf5..c0a2be909 100644
--- a/sharpy/solvers/dynamicuvlm.py
+++ b/sharpy/solvers/dynamicuvlm.py
@@ -9,7 +9,7 @@
 
 import sharpy.utils.solver_interface as solver_interface
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.cout_utils as cout
 
 @solver
@@ -74,7 +74,7 @@ class DynamicUVLM(BaseSolver):
     settings_default['postprocessors_settings'] = dict()
     settings_description['postprocessors_settings'] = 'Dictionary with the applicable settings for every ``psotprocessor``. Every ``postprocessor`` needs its entry, even if empty'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
 
@@ -90,7 +90,7 @@ def __init__(self):
         self.postprocessors = dict()
         self.with_postprocessors = False
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
 
         if custom_settings is None:
@@ -98,12 +98,12 @@ def initialise(self, data, custom_settings=None):
         else:
             self.settings = custom_settings
 
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
         self.dt = self.settings['dt']
         self.print_info = self.settings['print_info']
 
         self.aero_solver = solver_interface.initialise_solver(self.settings['aero_solver'])
-        self.aero_solver.initialise(self.data, self.settings['aero_solver_settings'])
+        self.aero_solver.initialise(self.data, self.settings['aero_solver_settings'], restart=False)
         self.data = self.aero_solver.data
 
         # initialise postprocessors
@@ -113,13 +113,13 @@ def initialise(self, data, custom_settings=None):
         for postproc in self.settings['postprocessors']:
             self.postprocessors[postproc] = solver_interface.initialise_solver(postproc)
             self.postprocessors[postproc].initialise(
-                self.data, self.settings['postprocessors_settings'][postproc], caller=self)
+                self.data, self.settings['postprocessors_settings'][postproc], caller=self, restart=False)
 
         if self.print_info:
             self.residual_table = cout.TablePrinter(2, 14, ['g', 'f'])
             self.residual_table.print_header(['ts', 't'])
 
-    def run(self):
+    def run(self, **kwargs):
 
         # struct info - only for orientation, no structural solution is performed
         struct_ini_step = self.data.structure.timestep_info[-1]
diff --git a/sharpy/solvers/initialaeroelasticloader.py b/sharpy/solvers/initialaeroelasticloader.py
new file mode 100644
index 000000000..41064711b
--- /dev/null
+++ b/sharpy/solvers/initialaeroelasticloader.py
@@ -0,0 +1,117 @@
+import numpy as np
+import h5py as h5
+
+from sharpy.utils.solver_interface import solver, BaseSolver
+import sharpy.utils.settings as su
+import sharpy.utils.algebra as algebra
+import sharpy.utils.h5utils as h5utils
+import sharpy.utils.exceptions as exceptions
+
+
+@solver
+class InitialAeroelasticLoader(BaseSolver):
+    r"""
+        This solver prescribes pos, pos_dot, psi, psi_dot and for_vel
+        at each time step from a .h5 file
+    """
+    solver_id = 'InitialAeroelasticLoader'
+    solver_classification = 'loader'
+
+    settings_types = dict()
+    settings_default = dict()
+    settings_description = dict()
+
+    settings_types['input_file'] = 'str'
+    settings_default['input_file'] = None
+    settings_description['input_file'] = 'Input file containing the simulation data'
+
+    settings_types['include_forces'] = 'bool'
+    settings_default['include_forces'] = True
+    settings_description['include_forces'] = 'Map the forces'
+
+    settings_types['generate_aero'] = 'bool'
+    settings_default['generate_aero'] = False
+    settings_description['generate_aero'] = 'Generate the aerodynamics grids from scratch'
+
+    settings_table = su.SettingsTable()
+    __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
+
+    def __init__(self):
+        self.data = None
+        self.settings = None
+        self.file_info = None
+
+    def initialise(self, data, custom_settings=None, restart=False):
+
+        self.data = data
+        if custom_settings is None:
+            self.settings = data.settings[self.solver_id]
+        else:
+            self.settings = custom_settings
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           no_ctype=True)
+        # Load simulation data
+        self.file_info = h5utils.readh5(self.settings['input_file'])
+
+    def run(self, **kwargs):
+
+        aero_step = su.set_value_or_default(kwargs, 'aero_step', self.data.aero.timestep_info[-1])
+        structural_step = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        
+        # Copy structural information
+        attributes = ['pos', 'pos_dot', 'pos_ddot',
+                      'psi', 'psi_dot', 'psi_ddot',
+                      'for_pos', 'for_vel', 'for_acc', 'quat',
+                      'mb_FoR_pos', 'mb_FoR_vel', 'mb_FoR_acc', 'mb_quat']
+
+        if self.settings['include_forces']:
+            attributes.extend(['runtime_steady_forces',
+                      'runtime_unsteady_forces',
+                      'steady_applied_forces',
+                      'unsteady_applied_forces'])
+
+        for att in attributes:
+            new_attr = getattr(structural_step, att)
+            db_attr = getattr(self.file_info.structure, att)
+            if new_attr.shape == db_attr.shape:
+                new_attr[...] = db_attr
+            else:
+                error_msg = "Non matching shapes in attribute %s" % att
+                exceptions.NotValidInputFile(error_msg)
+
+        # Copy aero information
+        if self.settings['generate_aero']:
+            # Generate aerodynamic surface
+            self.data.aero.generate_zeta_timestep_info(structural_step,
+                                                       aero_step,
+                                                       self.data.structure,
+                                                       self.data.aero.aero_settings)
+            # generate the wake because the solid shape might change
+            self.data.aero.wake_shape_generator.generate({'zeta': aero_step.zeta,
+                                            'zeta_star': aero_step.zeta_star,
+                                            'gamma': aero_step.gamma,
+                                            'gamma_star': aero_step.gamma_star,
+                                            'dist_to_orig': aero_step.dist_to_orig})
+
+        else:
+            attributes = ['zeta', 'zeta_star', 'normals',
+                          'gamma', 'gamma_star',
+                          'u_ext', 'u_ext_star',]
+                          # 'dist_to_orig', 'gamma_dot', 'zeta_dot',
+
+            if self.settings['include_forces']:
+                attributes.extend(['dynamic_forces', 'forces',])
+
+            for att in attributes:
+                for isurf in range(aero_step.n_surf):
+                    new_attr = getattr(aero_step, att)[isurf]
+                    db_attr = getattr(self.file_info.aero, att)[isurf]
+                    if new_attr.shape == db_attr.shape:
+                        new_attr[...] = db_attr
+                    else:
+                        error_msg = "Non matching shapes in attribute %s" % att
+                        exceptions.NotValidInputFile(error_msg)
+
+        return self.data
diff --git a/sharpy/solvers/lindynamicsim.py b/sharpy/solvers/lindynamicsim.py
index b28771191..27e5a5a8f 100644
--- a/sharpy/solvers/lindynamicsim.py
+++ b/sharpy/solvers/lindynamicsim.py
@@ -2,7 +2,7 @@
 import os
 import h5py as h5
 from sharpy.utils.solver_interface import solver, BaseSolver, initialise_solver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.linear.src.libss as libss
 import scipy.linalg as sclalg
 import sharpy.utils.h5utils as h5utils
@@ -73,7 +73,7 @@ class LinDynamicSim(BaseSolver):
     settings_types['postprocessors_settings'] = 'dict'
     settings_default['postprocessors_settings'] = dict()
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -88,14 +88,14 @@ def __init__(self):
 
         self.folder = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
 
         self.data = data
         if custom_settings:
             self.settings = custom_settings
         else:
             self.settings = data.settings[self.solver_id]
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default, no_ctype=True)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default, no_ctype=True)
 
         # Read initial state and input data and store in dictionary
         self.read_files()
@@ -112,7 +112,7 @@ def initialise(self, data, custom_settings=None):
         for postproc in self.settings['postprocessors']:
             self.postprocessors[postproc] = initialise_solver(postproc)
             self.postprocessors[postproc].initialise(
-                self.data, self.settings['postprocessors_settings'][postproc], caller=self)
+                self.data, self.settings['postprocessors_settings'][postproc], caller=self, restart=False)
 
     def input_vector(self, ss):
         """
@@ -149,7 +149,7 @@ def input_vector(self, ss):
 
         return u_vect
 
-    def run(self):
+    def run(self, **kwargs):
 
         ss = self.data.linear.ss
 
diff --git a/sharpy/solvers/linearassembler.py b/sharpy/solvers/linearassembler.py
index e65a97bed..b9dce02bd 100644
--- a/sharpy/solvers/linearassembler.py
+++ b/sharpy/solvers/linearassembler.py
@@ -5,7 +5,7 @@
 from sharpy.utils.solver_interface import solver, BaseSolver
 
 import sharpy.linear.utils.ss_interface as ss_interface
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.h5utils as h5
 import sharpy.utils.cout_utils as cout
 
@@ -105,7 +105,7 @@ class LinearAssembler(BaseSolver):
     settings_default['recover_accelerations'] = False
     settings_description['recover_accelerations'] = 'Recover structural system accelerations as additional outputs.'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options)
 
     def __init__(self):
@@ -113,7 +113,7 @@ def __init__(self):
         self.settings = dict()
         self.data = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
 
         self.data = data
         if custom_settings:
@@ -123,8 +123,11 @@ def initialise(self, data, custom_settings=None):
 
         else:
             self.settings = data.settings[self.solver_id]
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default,
-                                 options=self.settings_options, no_ctype=True)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           options=self.settings_options,
+                           no_ctype=True)
 
         # Get consistent linearisation timestep
         ii_step = self.settings['linearisation_tstep']
@@ -151,7 +154,7 @@ def initialise(self, data, custom_settings=None):
         lsys.initialise(data)
         self.data.linear.linear_system = lsys
 
-    def run(self):
+    def run(self, **kwargs):
 
         self.data.linear.ss = self.data.linear.linear_system.assemble()
 
diff --git a/sharpy/solvers/modal.py b/sharpy/solvers/modal.py
index a9c5ea69e..76a462038 100644
--- a/sharpy/solvers/modal.py
+++ b/sharpy/solvers/modal.py
@@ -6,7 +6,7 @@
 import warnings
 import sharpy.structure.utils.xbeamlib as xbeamlib
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 import sharpy.utils.cout_utils as cout
 import sharpy.structure.utils.modalutils as modalutils
@@ -95,7 +95,7 @@ class Modal(BaseSolver):
     settings_default['rigid_modes_cg'] = False
     settings_description['rigid_modes_cg'] = 'Not implemente yet'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -109,15 +109,15 @@ def __init__(self):
         self.filename_shapes = None
         self.rigid_body_motion = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default)
 
         self.rigid_body_motion = self.settings['rigid_body_modes']
 
@@ -151,7 +151,7 @@ def initialise(self, data, custom_settings=None):
             self.eigenvalue_table = modalutils.EigenvalueTable(filename=eigenvalue_filename)
             self.eigenvalue_table.print_header(self.eigenvalue_table.headers)
 
-    def run(self):
+    def run(self, **kwargs):
         r"""
         Extracts the eigenvalues and eigenvectors of the clamped structure.
 
@@ -236,7 +236,7 @@ def run(self):
                 # full_matrix_settings = self.data.settings['DynamicCoupled']['structural_solver_settings']
             import sharpy.solvers._basestructural as basestructuralsolver
             full_matrix_settings = basestructuralsolver._BaseStructural().settings_default
-            settings.to_custom_types(full_matrix_settings, basestructuralsolver._BaseStructural().settings_types, full_matrix_settings)
+            su.to_custom_types(full_matrix_settings, basestructuralsolver._BaseStructural().settings_types, full_matrix_settings)
 
 
             # Obtain the tangent mass, damping and stiffness matrices
diff --git a/sharpy/solvers/noaero.py b/sharpy/solvers/noaero.py
index e952bb253..ae1760b17 100644
--- a/sharpy/solvers/noaero.py
+++ b/sharpy/solvers/noaero.py
@@ -1,4 +1,4 @@
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.solver_interface import solver, BaseSolver
 
 
@@ -28,38 +28,37 @@ class NoAero(BaseSolver):
     settings_default['update_grid'] = True
     settings_description['update_grid'] = 'Update aerodynamic grid as the structure deforms.'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.data = None
         self.settings = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default,
-                                 no_ctype=True)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           no_ctype=True)
 
         if len(self.data.aero.timestep_info) == 0:  # initialise with zero timestep for static sims
             self.update_step()
 
-    def run(self,
-            aero_tstep=None,
-            structure_tstep=None,
-            convect_wake=True,
-            dt=None,
-            t=None,
-            unsteady_contribution=False):
+    def run(self, **kwargs):
+
+        aero_tstep = su.set_value_or_default(kwargs, 'aero_step', self.data.aero.timestep_info[-1])
+        structure_tstep = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        convect_wake = su.set_value_or_default(kwargs, 'convect_wake', True)
+        dt= su.set_value_or_default(kwargs, 'dt', self.settings['dt'])                                                                                                                             
+        t = su.set_value_or_default(kwargs, 't', self.data.ts*dt)
+        unsteady_contribution = su.set_value_or_default(kwargs, 'unsteady_contribution', False)
 
         # generate the wake because the solid shape might change
-        if aero_tstep is None:
-            aero_tstep = self.data.aero.timestep_info[self.data.ts]
         self.data.aero.wake_shape_generator.generate({'zeta': aero_tstep.zeta,
                                             'zeta_star': aero_tstep.zeta_star,
                                             'gamma': aero_tstep.gamma,
diff --git a/sharpy/solvers/nonlineardynamic.py b/sharpy/solvers/nonlineardynamic.py
index 03faf9001..97200336e 100644
--- a/sharpy/solvers/nonlineardynamic.py
+++ b/sharpy/solvers/nonlineardynamic.py
@@ -8,7 +8,7 @@
 import sharpy.structure.utils.xbeamlib as xbeamlib
 from sharpy.utils.settings import str2bool
 from sharpy.utils.solver_interface import solver, BaseSolver, solver_from_string
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.cout_utils as cout
 
 _BaseStructural = solver_from_string('_BaseStructural')
@@ -38,17 +38,17 @@ class NonLinearDynamic(_BaseStructural):
     settings_types['gravity_dir'] = 'list(float)'
     settings_default['gravity_dir'] = [0, 0, 1]
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.data = None
         self.settings = None
 
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         self.data = data
         self.settings = data.settings[self.solver_id]
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         # load info from dyn dictionary
         self.data.structure.add_unsteady_information(self.data.structure.dyn_dict, self.settings['num_steps'])
@@ -61,7 +61,7 @@ def initialise(self, data):
             self.data.structure.timestep_info[i].steady_applied_forces[:] = self.data.structure.ini_info.steady_applied_forces
 
 
-    def run(self):
+    def run(self, **kwargs):
         prescribed_motion = False
         try:
             prescribed_motion = self.settings['prescribed_motion']
diff --git a/sharpy/solvers/nonlineardynamiccoupledstep.py b/sharpy/solvers/nonlineardynamiccoupledstep.py
index aa17366d7..80da34353 100644
--- a/sharpy/solvers/nonlineardynamiccoupledstep.py
+++ b/sharpy/solvers/nonlineardynamiccoupledstep.py
@@ -8,7 +8,7 @@
 import sharpy.structure.utils.xbeamlib as xbeamlib
 from sharpy.utils.settings import str2bool
 from sharpy.utils.solver_interface import solver, BaseSolver, solver_from_string
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 import sharpy.utils.cout_utils as cout
 
@@ -50,20 +50,20 @@ class NonLinearDynamicCoupledStep(_BaseStructural):
     settings_default['relaxation_factor'] = 0.3
     settings_description['relaxation factor'] = 'Relaxation factor'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.data = None
         self.settings = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         # load info from dyn dictionary
         self.data.structure.add_unsteady_information(self.data.structure.dyn_dict, self.settings['num_steps'])
@@ -77,9 +77,12 @@ def initialise(self, data, custom_settings=None):
         # generate q, dqdt and dqddt
         xbeamlib.xbeam_solv_disp2state(self.data.structure, self.data.structure.timestep_info[-1])
 
-    def run(self, structural_step, previous_structural_step=None, dt=None):
-        if dt is None:
-            dt = self.settings['dt']
+    def run(self, **kwargs):
+
+        structural_step = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        # TODO: previous_structural_step never used
+        previous_structural_step = su.set_value_or_default(kwargs, 'previous_structural_step', self.data.structure.timestep_info[-1])
+        dt= su.set_value_or_default(kwargs, 'dt', self.settings['dt'])
 
         xbeamlib.xbeam_step_couplednlndyn(self.data.structure,
                                           self.settings,
@@ -97,21 +100,10 @@ def add_step(self):
     def next_step(self):
         pass
 
-    def extract_resultants(self, step=None):
-        if step is None:
-            step = self.data.structure.timestep_info[-1]
-        applied_forces = self.data.structure.nodal_b_for_2_a_for(step.steady_applied_forces + step.unsteady_applied_forces,
-                                                                 step)
-
-        applied_forces_copy = applied_forces.copy()
-        gravity_forces_copy = step.gravity_forces.copy()
-        for i_node in range(self.data.structure.num_node):
-            applied_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               applied_forces_copy[i_node, 0:3])
-            gravity_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               gravity_forces_copy[i_node, 0:3])
-
-        totals = np.sum(applied_forces_copy + gravity_forces_copy, axis=0)
-        step.total_forces = np.sum(applied_forces_copy, axis=0)
-        step.total_gravity_forces = np.sum(gravity_forces_copy, axis=0)
+    def extract_resultants(self, tstep=None):
+        if tstep is None:
+            tstep = self.data.structure.timestep_info[self.data.ts]
+        steady, unsteady, grav = tstep.extract_resultants(self.data.structure, force_type=['steady', 'unsteady', 'grav'])
+        totals = steady + unsteady + grav
         return totals[0:3], totals[3:6]
+
diff --git a/sharpy/solvers/nonlineardynamicmultibody.py b/sharpy/solvers/nonlineardynamicmultibody.py
index a1fd04eb7..fb45e24ac 100644
--- a/sharpy/solvers/nonlineardynamicmultibody.py
+++ b/sharpy/solvers/nonlineardynamicmultibody.py
@@ -3,12 +3,13 @@
 import os
 
 from sharpy.utils.solver_interface import solver, BaseSolver, solver_from_string
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.solver_interface as solver_interface
 
 import sharpy.utils.cout_utils as cout
 import sharpy.structure.utils.xbeamlib as xbeamlib
 import sharpy.utils.multibody as mb
+import sharpy.utils.algebra as algebra
 import sharpy.structure.utils.lagrangeconstraints as lagrangeconstraints
 import sharpy.utils.exceptions as exc
 
@@ -35,7 +36,7 @@ class NonLinearDynamicMultibody(_BaseStructural):
     settings_types['time_integrator'] = 'str'
     settings_default['time_integrator'] = 'NewmarkBeta'
     settings_description['time_integrator'] = 'Method to perform time integration'
-    settings_options['time_integrator'] = ['NewmarkBeta']
+    settings_options['time_integrator'] = ['NewmarkBeta', 'GeneralisedAlpha']
 
     settings_types['time_integrator_settings'] = 'dict'
     settings_default['time_integrator_settings'] = dict()
@@ -49,7 +50,19 @@ class NonLinearDynamicMultibody(_BaseStructural):
     settings_default['relax_factor_lm'] = 0.
     settings_description['relax_factor_lm'] = 'Relaxation factor for Lagrange Multipliers. 0 no relaxation. 1 full relaxation'
 
-    settings_table = settings.SettingsTable()
+    settings_types['allow_skip_step'] = 'bool'
+    settings_default['allow_skip_step'] = False
+    settings_description['allow_skip_step'] = 'Allow skip step when NaN is found while solving the system'
+
+    settings_types['rigid_bodies'] = 'bool'
+    settings_default['rigid_bodies'] = False
+    settings_description['rigid_bodies'] = 'Set to zero the changes in flexible degrees of freedom (not very efficient)'
+
+    settings_types['zero_ini_dot_ddot'] = 'bool'
+    settings_default['zero_ini_dot_ddot'] = False
+    settings_description['zero_ini_dot_ddot'] = 'Set to zero the position and crv derivatives at the first time step'
+
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -73,25 +86,23 @@ def __init__(self):
 
         self.out_files = None  # dict: containing output_variable:file_path if desired to write output
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
 
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default, no_ctype=True)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           self.settings_options,
+                           no_ctype=True)
 
         # load info from dyn dictionary
         self.data.structure.add_unsteady_information(
             self.data.structure.dyn_dict, self.settings['num_steps'])
 
-        # Initialise time integrator
-        self.time_integrator = solver_interface.initialise_solver(
-            self.settings['time_integrator'])
-        self.time_integrator.initialise(
-            self.data, self.settings['time_integrator_settings'])
-
         # Define the number of equations
         self.lc_list = lagrangeconstraints.initialize_constraints(self.data.structure.ini_mb_dict)
         self.num_LM_eq = lagrangeconstraints.define_num_LM_eq(self.lc_list)
@@ -123,10 +134,11 @@ def initialise(self, data, custom_settings=None):
         self.settings['time_integrator_settings']['num_LM_eq'] = self.num_LM_eq
 
         # Initialise time integrator
-        self.time_integrator = solver_interface.initialise_solver(
-            self.settings['time_integrator'])
+        if not restart:
+            self.time_integrator = solver_interface.initialise_solver(
+                self.settings['time_integrator'])
         self.time_integrator.initialise(
-            self.data, self.settings['time_integrator_settings'])
+            self.data, self.settings['time_integrator_settings'], restart=restart)
 
     def add_step(self):
         self.data.structure.next_step()
@@ -148,6 +160,20 @@ def define_sys_size(self):
             if (MBdict['body_%02d' % ibody]['FoR_movement'] == 'free'):
                 self.sys_size += 10
 
+    def define_rigid_dofs(self, MB_beam):
+
+        self.n_rigid_dofs = 0
+        self.rigid_dofs = []
+
+        first_dof = 0
+        for ibody in range(len(MB_beam)):
+            last_dof = first_dof + MB_beam[ibody].num_dof.value
+            if MB_beam[ibody].FoR_movement == 'free':
+                self.n_rigid_dofs += 10
+                self.rigid_dofs += (np.arange(10, dtype=int) + last_dof).tolist()
+                last_dof += 10
+            first_dof = last_dof + 0
+
     def assembly_MB_eq_system(self, MB_beam, MB_tstep, ts, dt, Lambda, Lambda_dot, MBdict):
         """
         This function generates the matrix and vector associated to the linear system to solve a structural iteration
@@ -170,7 +196,6 @@ def assembly_MB_eq_system(self, MB_beam, MB_tstep, ts, dt, Lambda, Lambda_dot, M
             MB_Asys (np.ndarray): Matrix of the systems of equations
             MB_Q (np.ndarray): Vector of the systems of equations
         """
-        self.num_LM_eq = lagrangeconstraints.define_num_LM_eq(self.lc_list)
 
         MB_M = np.zeros((self.sys_size, self.sys_size), dtype=ct.c_double, order='F')
         MB_C = np.zeros((self.sys_size, self.sys_size), dtype=ct.c_double, order='F')
@@ -257,9 +282,9 @@ def integrate_position(self, MB_beam, MB_tstep, dt):
             else:
                 MB_tstep[ibody].for_pos[0:3] += dt*np.dot(MB_tstep[ibody].cga(),MB_tstep[ibody].for_vel[0:3])
 
-    def extract_resultants(self):
+    def extract_resultants(self, tstep):
         # TODO: code
-        pass
+        return np.zeros((3)), np.zeros((3))
 
     def compute_forces_constraints(self, MB_beam, MB_tstep, ts, dt, Lambda, Lambda_dot):
         """
@@ -322,49 +347,49 @@ def write_lm_cond_num(self, iteration, Lambda, Lambda_dot, Lambda_ddot, cond_num
             fid.write(f'{self.data.ts:g} {iteration:g} ')
             fid.write(f'{cond_num:e} {cond_num_lm:e} \n')
 
-    def run(self, structural_step=None, dt=None):
-        if structural_step is None:
-            structural_step = self.data.structure.timestep_info[-1]
+
+
+    def run(self, **kwargs):
+        structural_step = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        dt= su.set_value_or_default(kwargs, 'dt', self.settings['dt'])
 
         if structural_step.mb_dict is not None:
             MBdict = structural_step.mb_dict
         else:
             MBdict = self.data.structure.ini_mb_dict
 
-        if dt is None:
-            dt = self.settings['dt']
-        else:
-            self.settings['dt'] = dt
-
-        if self.data.structure.ini_info.in_global_AFoR:
-            self.data.structure.ini_info.whole_structure_to_local_AFoR(self.data.structure)
-
-        if structural_step.in_global_AFoR:
-            structural_step.whole_structure_to_local_AFoR(self.data.structure)
-
-        self.num_LM_eq = lagrangeconstraints.define_num_LM_eq(self.lc_list)
-
         MB_beam, MB_tstep = mb.split_multibody(
             self.data.structure,
             structural_step,
             MBdict,
             self.data.ts)
 
-        # Lagrange multipliers parameters
+        self.define_rigid_dofs(MB_beam)
         num_LM_eq = self.num_LM_eq
 
-        # Initialize
-        q = np.zeros((self.sys_size + num_LM_eq,), dtype=ct.c_double, order='F')
-        dqdt = np.zeros((self.sys_size + num_LM_eq,), dtype=ct.c_double, order='F')
-        dqddt = np.zeros((self.sys_size + num_LM_eq,), dtype=ct.c_double, order='F')
+        if self.data.ts == 1 and self.settings['zero_ini_dot_ddot']:
+            for ibody in range(len(MB_tstep)):
+                MB_beam[ibody].ini_info.pos_dot *= 0.
+                MB_beam[ibody].ini_info.pos_ddot *= 0.
+                MB_beam[ibody].ini_info.psi_dot *= 0.
+                MB_beam[ibody].ini_info.psi_dot_local *= 0.
+                MB_beam[ibody].ini_info.psi_ddot *= 0.
+                MB_tstep[ibody].pos_dot *= 0.
+                MB_tstep[ibody].pos_ddot *= 0.
+                MB_tstep[ibody].psi_dot *= 0.
+                MB_tstep[ibody].psi_dot_local *= 0.
+                MB_tstep[ibody].psi_ddot *= 0.
 
+        # Initialize
+        # TODO: i belive this can move into disp_and_accel2 state as self.Lambda, self.Lambda_dot
         if not num_LM_eq == 0:
             Lambda = self.Lambda.astype(dtype=ct.c_double, copy=True, order='F')
             Lambda_dot = self.Lambda_dot.astype(dtype=ct.c_double, copy=True, order='F')
             Lambda_ddot = self.Lambda_ddot.astype(dtype=ct.c_double, copy=True, order='F')
         else:
-            Lambda = 0
-            Lambda_dot = 0
+            Lambda = np.zeros((1,))
+            Lambda_dot = np.zeros((1,))
+            Lambda_ddot = np.zeros((1,))
 
         # Predictor step
         q, dqdt, dqddt = mb.disp_and_accel2state(MB_beam, MB_tstep, Lambda, Lambda_dot, self.sys_size, num_LM_eq)
@@ -375,7 +400,7 @@ def run(self, structural_step=None, dt=None):
         LM_old_Dq = 1.0
 
         converged = False
-
+        skip_step = False
         for iteration in range(self.settings['max_iterations']):
             # Check if the maximum of iterations has been reached
             if iteration == self.settings['max_iterations'] - 1:
@@ -385,6 +410,7 @@ def run(self, structural_step=None, dt=None):
 
             # Update positions and velocities
             Lambda, Lambda_dot = mb.state2disp_and_accel(q, dqdt, dqddt, MB_beam, MB_tstep, num_LM_eq)
+
             if self.settings['write_lm'] and iteration:
                 self.write_lm_cond_num(iteration, Lambda, Lambda_dot, Lambda_ddot, cond_num, cond_num_lm)
 
@@ -403,19 +429,17 @@ def run(self, structural_step=None, dt=None):
                 cond_num = np.linalg.cond(Asys[:self.sys_size, :self.sys_size])
                 cond_num_lm = np.linalg.cond(Asys)
 
-            Dq = np.linalg.solve(Asys, -Q)
+            if self.settings['rigid_bodies']:
+                rigid_LM_dofs = self.rigid_dofs + (np.arange(self.num_LM_eq, dtype=int) + self.sys_size).tolist()
 
-            # Evaluate convergence
-            if iteration:
-                res = np.max(np.abs(Dq[0:self.sys_size]))/old_Dq
-                if np.isnan(res):
-                    raise exc.NotConvergedSolver('Multibody res = NaN')
-                if num_LM_eq:
-                    LM_res = np.max(np.abs(Dq[self.sys_size:self.sys_size+num_LM_eq]))/LM_old_Dq
-                else:
-                    LM_res = 0.0
-                if (res < self.settings['min_delta']) and (LM_res < self.settings['min_delta']):
-                    converged = True
+                rigid_Asys = Asys[np.ix_(rigid_LM_dofs, rigid_LM_dofs)].copy()
+                rigid_Q = Q[rigid_LM_dofs].copy()
+                rigid_Dq = np.linalg.solve(rigid_Asys, -rigid_Q)
+                Dq = np.zeros((self.sys_size + self.num_LM_eq))
+                Dq[rigid_LM_dofs] = rigid_Dq.copy()
+
+            else:
+                Dq = np.linalg.solve(Asys, -Q)
 
             # Relaxation
             relax_Dq = np.zeros_like(Dq)
@@ -427,19 +451,57 @@ def run(self, structural_step=None, dt=None):
             # Corrector step
             self.time_integrator.corrector(q, dqdt, dqddt, relax_Dq)
 
-            if converged:
-                break
-
-            if not iteration:
+            # Reference values for convergence
+            if iteration == 0:
                 old_Dq = np.max(np.abs(Dq[0:self.sys_size]))
                 if num_LM_eq:
                     LM_old_Dq = np.max(np.abs(Dq[self.sys_size:self.sys_size+num_LM_eq]))
+                else:
+                    LM_old_Dq = 0.
+                # Change the reference values
+                if old_Dq == 0:
+                    old_Dq = 1.
+                if LM_old_Dq == 0:
+                    LM_old_Dq = 1.
+
+            # Evaluate convergence
+            res = np.max(np.abs(Dq[0:self.sys_size]))/old_Dq
+            if np.isnan(res):
+                print(old_Dq)
+                if self.settings['allow_skip_step']:
+                    skip_step = True
+                    cout.cout_wrap("Skipping step", 3)
+                    break
+                else:
+                    raise exc.NotConvergedSolver('Multibody Dq = NaN')
+            if num_LM_eq:
+                LM_res = np.max(np.abs(Dq[self.sys_size:self.sys_size+num_LM_eq]))/LM_old_Dq
+            else:
+                LM_res = 0.0
+
+            if (res < self.settings['min_delta']) and (LM_res < self.settings['min_delta']):
+            # if (res < self.settings['min_delta']):
+                converged = True
+                break
 
         Lambda, Lambda_dot = mb.state2disp_and_accel(q, dqdt, dqddt, MB_beam, MB_tstep, num_LM_eq)
         if self.settings['write_lm']:
             self.write_lm_cond_num(iteration, Lambda, Lambda_dot, Lambda_ddot, cond_num, cond_num_lm)
         # end: comment time stepping
 
+        if skip_step:
+            # Use the original time step
+            MB_beam, MB_tstep = mb.split_multibody(
+                self.data.structure,
+                structural_step,
+                MBdict,
+                self.data.ts)
+            # Perform rigid body motions
+            self.integrate_position(MB_beam, MB_tstep, dt)
+            for ibody in range(0, len(MB_tstep)):
+                Temp = np.linalg.inv(np.eye(4) + 0.25*algebra.quadskew(MB_tstep[ibody].for_vel[3:6])*dt)
+                MB_tstep[ibody].quat = np.dot(Temp, np.dot(np.eye(4) - 0.25*algebra.quadskew(MB_tstep[ibody].for_vel[3:6])*dt, MB_tstep[ibody].quat))
+
         # End of Newmark-beta iterations
         # self.integrate_position(MB_beam, MB_tstep, dt)
         lagrangeconstraints.postprocess(self.lc_list, MB_beam, MB_tstep, "dynamic")
@@ -449,9 +511,6 @@ def run(self, structural_step=None, dt=None):
                 xbeamlib.cbeam3_correct_gravity_forces(MB_beam[ibody], MB_tstep[ibody], self.settings)
         mb.merge_multibody(MB_tstep, MB_beam, self.data.structure, structural_step, MBdict, dt)
 
-        if not structural_step.in_global_AFoR:
-            structural_step.whole_structure_to_global_AFoR(self.data.structure)
-
         self.Lambda = Lambda.astype(dtype=ct.c_double, copy=True, order='F')
         self.Lambda_dot = Lambda_dot.astype(dtype=ct.c_double, copy=True, order='F')
         self.Lambda_ddot = Lambda_ddot.astype(dtype=ct.c_double, copy=True, order='F')
diff --git a/sharpy/solvers/nonlineardynamicprescribedstep.py b/sharpy/solvers/nonlineardynamicprescribedstep.py
index 3d415e1f3..f68c3762d 100644
--- a/sharpy/solvers/nonlineardynamicprescribedstep.py
+++ b/sharpy/solvers/nonlineardynamicprescribedstep.py
@@ -8,7 +8,7 @@
 import sharpy.structure.utils.xbeamlib as xbeamlib
 from sharpy.utils.settings import str2bool
 from sharpy.utils.solver_interface import solver, BaseSolver, solver_from_string
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.cout_utils as cout
 import sharpy.utils.algebra as algebra
 
@@ -34,30 +34,28 @@ class NonLinearDynamicPrescribedStep(_BaseStructural):
     settings_default = _BaseStructural.settings_default.copy()
     settings_description = _BaseStructural.settings_description.copy()
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.data = None
         self.settings = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         # load info from dyn dictionary
         self.data.structure.add_unsteady_information(self.data.structure.dyn_dict, self.settings['num_steps'])
 
 
-    def run(self, structural_step=None, dt=None):
-        if dt is None:
-            dt = self.settings['dt']
-        if structural_step is None:
-            structural_step = self.data.structure.timestep_info[-1]
+    def run(self, **kwargs):
+        structural_step = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        dt = su.set_value_or_default(kwargs, 'dt', self.settings['dt'])  
 
         if self.data.ts > 0:
             try:
@@ -88,25 +86,15 @@ def next_step(self):
         #     self.data.structure.timestep_info[ts].for_acc[:] = self.data.structure.dynamic_input[ts - 1]['for_acc']
         #     self.data.structure.timestep_info[ts].unsteady_applied_forces[:] = self.data.structure.dynamic_input[ts - 1]['dynamic_forces']
 
-    def extract_resultants(self, step=None):
-        if step is None:
-            step = self.data.structure.timestep_info[-1]
-        applied_forces = self.data.structure.nodal_b_for_2_a_for(step.steady_applied_forces + step.unsteady_applied_forces,
-                                                                 step)
-
-        applied_forces_copy = applied_forces.copy()
-        gravity_forces_copy = step.gravity_forces.copy()
-        for i_node in range(self.data.structure.num_node):
-            applied_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               applied_forces_copy[i_node, 0:3])
-            gravity_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               gravity_forces_copy[i_node, 0:3])
-
-        totals = np.sum(applied_forces_copy + gravity_forces_copy, axis=0)
-        step.total_forces = np.sum(applied_forces_copy, axis=0)
-        step.total_gravity_forces = np.sum(gravity_forces_copy, axis=0)
+
+    def extract_resultants(self, tstep=None):
+        if tstep is None:
+            tstep = self.data.structure.timestep_info[self.data.ts]
+        steady, unsteady, grav = tstep.extract_resultants(self.data.structure, force_type=['steady', 'unsteady', 'grav'])
+        totals = steady + unsteady + grav
         return totals[0:3], totals[3:6]
 
+
     def update(self, tstep=None):
         self.create_q_vector(tstep)
 
diff --git a/sharpy/solvers/nonlinearstatic.py b/sharpy/solvers/nonlinearstatic.py
index 08c2c6f29..0575391b2 100644
--- a/sharpy/solvers/nonlinearstatic.py
+++ b/sharpy/solvers/nonlinearstatic.py
@@ -2,7 +2,7 @@
 
 import sharpy.structure.utils.xbeamlib as xbeamlib
 import sharpy.utils.cout_utils as cout
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.solver_interface import solver, BaseSolver, solver_from_string
 import sharpy.utils.algebra as algebra
 
@@ -30,24 +30,28 @@ class NonLinearStatic(_BaseStructural):
 
     settings_types['initial_position'] = 'list(float)'
     settings_default['initial_position'] = np.array([0.0, 0.0, 0.0])
+    
+    settings_types['initial_velocity'] = 'list(float)'
+    settings_default['initial_velocity'] = np.array([0., 0., 0., 0., 0., 0.])
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.data = None
         self.settings = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default, no_ctype=True)
 
-    def run(self):
+    def run(self, **kwargs):
         self.data.structure.timestep_info[self.data.ts].for_pos[0:3] = self.settings['initial_position']
+        self.data.structure.timestep_info[self.data.ts].for_vel = self.settings['initial_velocity'].copy()
         xbeamlib.cbeam3_solv_nlnstatic(self.data.structure, self.settings, self.data.ts)
         self.extract_resultants()
         return self.data
@@ -58,18 +62,8 @@ def next_step(self):
     def extract_resultants(self, tstep=None):
         if tstep is None:
             tstep = self.data.structure.timestep_info[self.data.ts]
-        applied_forces = self.data.structure.nodal_b_for_2_a_for(tstep.steady_applied_forces,
-                                                                 tstep)
-
-        applied_forces_copy = applied_forces.copy()
-        gravity_forces_copy = tstep.gravity_forces.copy()
-        for i_node in range(self.data.structure.num_node):
-            applied_forces_copy[i_node, 3:6] += algebra.cross3(tstep.pos[i_node, :],
-                                                               applied_forces_copy[i_node, 0:3])
-            gravity_forces_copy[i_node, 3:6] += algebra.cross3(tstep.pos[i_node, :],
-                                                               gravity_forces_copy[i_node, 0:3])
-
-        totals = np.sum(applied_forces_copy + gravity_forces_copy, axis=0)
+        steady, grav = tstep.extract_resultants(self.data.structure, force_type=['steady', 'grav'])
+        totals = steady + grav
         return totals[0:3], totals[3:6]
 
     def update(self, tstep=None):
diff --git a/sharpy/solvers/nostructural.py b/sharpy/solvers/nostructural.py
new file mode 100644
index 000000000..661b9fdbf
--- /dev/null
+++ b/sharpy/solvers/nostructural.py
@@ -0,0 +1,72 @@
+import numpy as np
+
+import sharpy.utils.cout_utils as cout
+import sharpy.utils.settings as su
+from sharpy.utils.solver_interface import solver, BaseSolver, solver_from_string
+
+_BaseStructural = solver_from_string('_BaseStructural')
+
+@solver
+class NoStructural(_BaseStructural):
+    """
+    Structural solver used for the static simulation of free-flying structures.
+
+    This solver provides an interface to the structural library (``xbeam``) and updates the structural parameters
+    for every k-th step of the FSI iteration.
+
+    This solver can be called as part of a standalone structural simulation or as the structural solver of a coupled
+    static aeroelastic simulation.
+
+    """
+    solver_id = 'NoStructural'
+    solver_classification = 'structural'
+
+    # settings list
+    settings_types = _BaseStructural.settings_types.copy()
+    settings_default = _BaseStructural.settings_default.copy()
+    settings_description = _BaseStructural.settings_description.copy()
+
+    settings_types['initial_position'] = 'list(float)'
+    settings_default['initial_position'] = np.array([0.0, 0.0, 0.0])
+
+    settings_table = su.SettingsTable()
+    __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
+
+    def __init__(self):
+        self.data = None
+        self.settings = None
+
+    def initialise(self, data, custom_settings=None, restart=False):
+        self.data = data
+        if custom_settings is None:
+            self.settings = data.settings[self.solver_id]
+        else:
+            self.settings = custom_settings
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
+
+    def run(self, **kwargs):
+        self.data.structure.timestep_info[self.data.ts].for_pos[0:3] = self.settings['initial_position']
+        self.extract_resultants()
+        return self.data
+
+    def next_step(self):
+        self.data.structure.next_step()
+
+    def extract_resultants(self, tstep=None):
+        if tstep is None:
+            tstep = self.data.structure.timestep_info[self.data.ts]
+        steady, grav = tstep.extract_resultants(self.data.structure, force_type=['steady', 'grav'])
+        totals = steady + grav
+        return totals[0:3], totals[3:6]
+
+    def update(self, tstep=None):
+        self.create_q_vector(tstep)
+
+    def create_q_vector(self, tstep=None):
+        import sharpy.structure.utils.xbeamlib as xb
+        if tstep is None:
+            tstep = self.data.structure.timestep_info[-1]
+
+        xb.xbeam_solv_disp2state(self.data.structure, tstep)
+
+
diff --git a/sharpy/solvers/prescribeduvlm.py b/sharpy/solvers/prescribeduvlm.py
index a3a46e228..c02340ef8 100644
--- a/sharpy/solvers/prescribeduvlm.py
+++ b/sharpy/solvers/prescribeduvlm.py
@@ -2,7 +2,7 @@
 import numpy as np
 
 import sharpy.utils.algebra as algebra
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.solver_interface import solver, BaseSolver
 import sharpy.utils.solver_interface as solver_interface
 import sharpy.utils.cout_utils as cout
@@ -70,7 +70,7 @@ class PrescribedUvlm(BaseSolver):
     settings_default['vortex_radius_wake_ind'] = vortex_radius_def
     settings_description['vortex_radius_wake_ind'] = 'Distance between points below which induction is not computed in the wake convection'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -85,10 +85,10 @@ def __init__(self):
         self.postprocessors = dict()
         self.with_postprocessors = False
 
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         self.data = data
         self.settings = data.settings[self.solver_id]
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
         self.dt = self.settings['dt']
 
         self.aero_solver = solver_interface.initialise_solver(self.settings['aero_solver'])
@@ -106,7 +106,8 @@ def initialise(self, data):
         for postproc in self.settings['postprocessors']:
             self.postprocessors[postproc] = solver_interface.initialise_solver(postproc)
             self.postprocessors[postproc].initialise(
-                self.data, self.settings['postprocessors_settings'][postproc], caller=self)
+                self.data, self.settings['postprocessors_settings'][postproc], caller=self,
+                restart=restart)
 
         self.residual_table = cout.TablePrinter(2, 14, ['g', 'f'])
         self.residual_table.field_length[0] = 6
@@ -127,7 +128,7 @@ def increase_ts(self):
         self.data.structure.next_step()
         self.aero_solver.add_step()
 
-    def run(self):
+    def run(self, **kwargs):
         structural_kstep = self.data.structure.ini_info.copy()
 
         # dynamic simulations start at tstep == 1, 0 is reserved for the initial state
diff --git a/sharpy/solvers/rigiddynamiccoupledstep.py b/sharpy/solvers/rigiddynamiccoupledstep.py
index 4c6edfcf1..f39c90eb9 100644
--- a/sharpy/solvers/rigiddynamiccoupledstep.py
+++ b/sharpy/solvers/rigiddynamiccoupledstep.py
@@ -4,7 +4,7 @@
 import sharpy.structure.utils.xbeamlib as xbeamlib
 from sharpy.utils.settings import str2bool
 from sharpy.utils.solver_interface import solver, BaseSolver, solver_from_string
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 import sharpy.utils.cout_utils as cout
 
@@ -37,20 +37,20 @@ class RigidDynamicCoupledStep(_BaseStructural):
     settings_default['relaxation_factor'] = 0.3
     settings_description['relaxation factor'] = 'Relaxation factor'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.data = None
         self.settings = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         # load info from dyn dictionary
         self.data.structure.add_unsteady_information(self.data.structure.dyn_dict, self.settings['num_steps'])
@@ -58,15 +58,18 @@ def initialise(self, data, custom_settings=None):
         # generate q, dqdt and dqddt
         xbeamlib.xbeam_solv_disp2state(self.data.structure, self.data.structure.timestep_info[-1])
 
-    def run(self, structural_step, previous_structural_step=None, dt=None):
-        if dt is None:
-            dt = self.settings['dt']
+    def run(self, **kwargs):
+
+        structural_step = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        # TODO: previous_structural_step never used
+        previous_structural_step = su.set_value_or_default(kwargs, 'previous_structural_step', self.data.structure.timestep_info[-1])
+        dt= su.set_value_or_default(kwargs, 'dt', self.settings['dt'])  
 
         xbeamlib.xbeam_step_coupledrigid(self.data.structure,
-                                          self.settings,
-                                          self.data.ts,
-                                          structural_step,
-                                          dt=dt)
+                                         self.settings,
+                                         self.data.ts,
+                                         structural_step,
+                                         dt=dt)
         self.extract_resultants(structural_step)
         self.data.structure.integrate_position(structural_step, dt)
 
@@ -78,21 +81,10 @@ def add_step(self):
     def next_step(self):
         pass
 
-    def extract_resultants(self, step=None):
-        if step is None:
-            step = self.data.structure.timestep_info[-1]
-        applied_forces = self.data.structure.nodal_b_for_2_a_for(step.steady_applied_forces + step.unsteady_applied_forces,
-                                                                 step)
-
-        applied_forces_copy = applied_forces.copy()
-        gravity_forces_copy = step.gravity_forces.copy()
-        for i_node in range(self.data.structure.num_node):
-            applied_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               applied_forces_copy[i_node, 0:3])
-            gravity_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               gravity_forces_copy[i_node, 0:3])
-
-        totals = np.sum(applied_forces_copy + gravity_forces_copy, axis=0)
-        step.total_forces = np.sum(applied_forces_copy, axis=0)
-        step.total_gravity_forces = np.sum(gravity_forces_copy, axis=0)
+    def extract_resultants(self, tstep=None):
+        if tstep is None:
+            tstep = self.data.structure.timestep_info[self.data.ts]
+        steady, unsteady, grav = tstep.extract_resultants(self.data.structure, force_type=['steady', 'unsteady', 'grav'])
+        totals = steady + unsteady + grav
         return totals[0:3], totals[3:6]
+
diff --git a/sharpy/solvers/rigiddynamicprescribedstep.py b/sharpy/solvers/rigiddynamicprescribedstep.py
index 8c53d39f2..f13764b57 100644
--- a/sharpy/solvers/rigiddynamicprescribedstep.py
+++ b/sharpy/solvers/rigiddynamicprescribedstep.py
@@ -8,7 +8,7 @@
 import sharpy.structure.utils.xbeamlib as xbeamlib
 # from sharpy.utils.settings import str2bool
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.cout_utils as cout
 import sharpy.utils.algebra as algebra
 from sharpy.utils.solver_interface import solver_from_string
@@ -33,31 +33,28 @@ class RigidDynamicPrescribedStep(BaseSolver):
     settings_default['num_steps'] = 500
     settings_description['num_steps'] = 'Number of timesteps to be run'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
         self.data = None
         self.settings = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
 
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         # load info from dyn dictionary
         self.data.structure.add_unsteady_information(self.data.structure.dyn_dict, self.settings['num_steps'])
 
-    def run(self, structural_step=None, dt=None):
-
-        if structural_step is None:
-            structural_step = self.data.structure.timestep_info[-1]
-        if dt is None:
-            dt = self.settings['dt']
+    def run(self, **kwargs):
+        structural_step = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        dt= su.set_value_or_default(kwargs, 'dt', self.settings['dt'])  
 
         if self.data.ts > 0:
             try:
@@ -93,25 +90,14 @@ def next_step(self):
         #     self.data.structure.timestep_info[ts].for_acc[:] = self.data.structure.dynamic_input[ts - 1]['for_acc']
         #     self.data.structure.timestep_info[ts].unsteady_applied_forces[:] = self.data.structure.dynamic_input[ts - 1]['dynamic_forces']
 
-    def extract_resultants(self, step=None):
-        if step is None:
-            step = self.data.structure.timestep_info[-1]
-        applied_forces = self.data.structure.nodal_b_for_2_a_for(step.steady_applied_forces + step.unsteady_applied_forces,
-                                                                 step)
-
-        applied_forces_copy = applied_forces.copy()
-        gravity_forces_copy = step.gravity_forces.copy()
-        for i_node in range(self.data.structure.num_node):
-            applied_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               applied_forces_copy[i_node, 0:3])
-            gravity_forces_copy[i_node, 3:6] += algebra.cross3(step.pos[i_node, :],
-                                                               gravity_forces_copy[i_node, 0:3])
-
-        totals = np.sum(applied_forces_copy + gravity_forces_copy, axis=0)
-        step.total_forces = np.sum(applied_forces_copy, axis=0)
-        step.total_gravity_forces = np.sum(gravity_forces_copy, axis=0)
+    def extract_resultants(self, tstep=None):
+        if tstep is None:
+            tstep = self.data.structure.timestep_info[self.data.ts]
+        steady, unsteady, grav = tstep.extract_resultants(self.data.structure, force_type=['steady', 'unsteady', 'grav'])
+        totals = steady + unsteady + grav
         return totals[0:3], totals[3:6]
 
+
     def update(self, tstep=None):
         self.create_q_vector(tstep)
 
diff --git a/sharpy/solvers/staticcoupled.py b/sharpy/solvers/staticcoupled.py
index c8bf1dc82..a36a2e2fd 100644
--- a/sharpy/solvers/staticcoupled.py
+++ b/sharpy/solvers/staticcoupled.py
@@ -6,7 +6,7 @@
 import sharpy.utils.cout_utils as cout
 import sharpy.utils.solver_interface as solver_interface
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 import sharpy.utils.generator_interface as gen_interface
 
@@ -76,7 +76,7 @@ class StaticCoupled(BaseSolver):
                                                  'The dictionary values are dictionaries with the settings ' \
                                                  'needed by each generator.'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options)
 
     def __init__(self):
@@ -96,23 +96,24 @@ def __init__(self):
         self.runtime_generators = dict()
         self.with_runtime_generators = False
 
-    def initialise(self, data, input_dict=None):
+    def initialise(self, data, input_dict=None, restart=False):
         self.data = data
         if input_dict is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = input_dict
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default,
-                                 options=self.settings_options)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           options=self.settings_options,
+                           no_ctype=True)
 
         self.print_info = self.settings['print_info']
 
         self.structural_solver = solver_interface.initialise_solver(self.settings['structural_solver'])
-        self.structural_solver.initialise(self.data, self.settings['structural_solver_settings'])
+        self.structural_solver.initialise(self.data, self.settings['structural_solver_settings'], restart=restart)
         self.aero_solver = solver_interface.initialise_solver(self.settings['aero_solver'])
-        self.aero_solver.initialise(self.structural_solver.data, self.settings['aero_solver_settings'])
+        self.aero_solver.initialise(self.structural_solver.data, self.settings['aero_solver_settings'], restart=restart)
         self.data = self.aero_solver.data
 
         if self.print_info:
@@ -136,10 +137,10 @@ def initialise(self, data, input_dict=None):
         self.runtime_generators = dict()
         if self.settings['runtime_generators']:
             self.with_runtime_generators = True
-            for id, param in self.settings['runtime_generators'].items():
-                gen = gen_interface.generator_from_string(id)
-                self.runtime_generators[id] = gen()
-                self.runtime_generators[id].initialise(param, data=self.data)
+            for rg_id, param in self.settings['runtime_generators'].items():
+                gen = gen_interface.generator_from_string(rg_id)
+                self.runtime_generators[rg_id] = gen()
+                self.runtime_generators[rg_id].initialise(param, data=self.data, restart=restart)
 
     def increase_ts(self):
         self.data.ts += 1
@@ -159,7 +160,7 @@ def cleanup_timestep_info(self):
 
         self.data.ts = 0
 
-    def run(self):
+    def run(self, **kwargs):
         for i_step in range(self.settings['n_load_steps'] + 1):
             if (i_step == self.settings['n_load_steps'] and
                     self.settings['n_load_steps'] > 0):
@@ -200,17 +201,18 @@ def run(self):
                 
                 # Add external forces
                 if self.with_runtime_generators:
-                    self.data.structure.timestep_info[self.data.ts].runtime_generated_forces.fill(0.)
+                    self.data.structure.timestep_info[self.data.ts].runtime_steady_forces.fill(0.)
+                    self.data.structure.timestep_info[self.data.ts].runtime_unsteady_forces.fill(0.)
                     params = dict()
                     params['data'] = self.data
                     params['struct_tstep'] = self.data.structure.timestep_info[self.data.ts]
                     params['aero_tstep'] = self.data.aero.timestep_info[self.data.ts]
-                    params['force_coeff'] = 0.
                     params['fsi_substep'] = -i_iter
                     for id, runtime_generator in self.runtime_generators.items():
                         runtime_generator.generate(params)
 
-                    struct_forces += self.data.structure.timestep_info[self.data.ts].runtime_generated_forces
+                    struct_forces += self.data.structure.timestep_info[self.data.ts].runtime_steady_forces
+                    struct_forces += self.data.structure.timestep_info[self.data.ts].runtime_unsteady_forces
 
                 if not self.settings['relaxation_factor'] == 0.:
                     if i_iter == 0:
@@ -350,3 +352,14 @@ def change_trim(self, alpha, thrust, thrust_nodes, tail_deflection, tail_cs_inde
 
     def extract_resultants(self, tstep=None):
         return self.structural_solver.extract_resultants(tstep)
+    
+
+    def teardown(self):
+        
+        self.structural_solver.teardown()
+        self.aero_solver.teardown()
+        if self.with_runtime_generators:
+            for rg in self.runtime_generators.values():
+                rg.teardown()
+
+
diff --git a/sharpy/solvers/staticcoupledrbm.py b/sharpy/solvers/staticcoupledrbm.py
deleted file mode 100644
index 9ef1a9b97..000000000
--- a/sharpy/solvers/staticcoupledrbm.py
+++ /dev/null
@@ -1,343 +0,0 @@
-import ctypes as ct
-
-import numpy as np
-
-import sharpy.aero.utils.mapping as mapping
-import sharpy.utils.cout_utils as cout
-import sharpy.utils.solver_interface as solver_interface
-from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
-import sharpy.utils.algebra as algebra
-import sharpy.utils.generator_interface as gen_utils
-
-
-@solver
-class StaticCoupledRBM(BaseSolver):
-    """
-    Steady coupled solver including rigid body motions
-    """
-
-    solver_id = 'StaticCoupledRBM'
-    solver_classification = 'coupled'
-
-    settings_types = dict()
-    settings_default = dict()
-    settings_description = dict()
-    settings_options = dict()
-
-    settings_types['print_info'] = 'bool'
-    settings_default['print_info'] = True
-    settings_description['print_info'] = 'Output run-time information'
-
-    settings_types['structural_solver'] = 'str'
-    settings_default['structural_solver'] = None
-    settings_description['structural_solver'] = 'Name of the structural solver used in the computation'
-
-    settings_types['structural_solver_settings'] = 'dict'
-    settings_default['structural_solver_settings'] = None
-    settings_description['structural_solver_settings'] = 'Dictionary os settings needed by the structural solver'
-
-    settings_types['aero_solver'] = 'str'
-    settings_default['aero_solver'] = None
-    settings_description['aero_solver'] = 'Name of the aerodynamic solver used in the computation'
-
-    settings_types['aero_solver_settings'] = 'dict'
-    settings_default['aero_solver_settings'] = None
-    settings_description['aero_solver_settings'] = 'Dictionary os settings needed by the aerodynamic solver'
-
-    settings_types['max_iter'] = 'int'
-    settings_default['max_iter'] = 100
-    settings_description['max_iter'] = 'Maximum numeber of FSI iterations'
-
-    settings_types['n_load_steps'] = 'int'
-    settings_default['n_load_steps'] = 1
-    settings_description['n_load_steps'] = 'Number of steps to ramp up the application of loads'
-
-    settings_types['tolerance'] = 'float'
-    settings_default['tolerance'] = 1e-5
-    settings_description['tolerance'] = 'FSI tolerance'
-
-    settings_types['relaxation_factor'] = 'float'
-    settings_default['relaxation_factor'] = 0.
-    settings_description['relaxation_factor'] = 'Relaxation factor'
-
-    settings_types['correct_forces_method'] = 'str'
-    settings_default['correct_forces_method'] = ''
-    settings_description['correct_forces_method'] = 'Function used to correct aerodynamic forces. ' \
-                                                    'See :py:mod:`sharpy.generators.polaraeroforces`'
-    settings_options['correct_forces_method'] = ['EfficiencyCorrection', 'PolarCorrection']
-
-    settings_types['correct_forces_settings'] = 'dict'
-    settings_default['correct_forces_settings'] = {}
-    settings_description['correct_forces_settings'] = 'Settings for corrected forces evaluation'
-
-    settings_table = settings.SettingsTable()
-    __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options)
-
-    def __init__(self):
-
-        self.data = None
-        self.settings = None
-        self.structural_solver = None
-        self.aero_solver = None
-
-        self.previous_force = None
-
-        self.correct_forces = False
-        self.correct_forces_generator = None
-
-    def initialise(self, data, input_dict=None):
-        self.data = data
-        if input_dict is None:
-            self.settings = data.settings[self.solver_id]
-        else:
-            self.settings = input_dict
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default,
-                                 options=self.settings_options)
-
-        self.structural_solver = solver_interface.initialise_solver(self.settings['structural_solver'])
-        self.structural_solver.initialise(self.data, self.settings['structural_solver_settings'])
-        self.aero_solver = solver_interface.initialise_solver(self.settings['aero_solver'])
-        self.aero_solver.initialise(self.structural_solver.data, self.settings['aero_solver_settings'])
-        self.data = self.aero_solver.data
-
-        # load info from dyn dictionary
-        self.data.structure.add_unsteady_information(self.data.structure.dyn_dict, 1)
-
-        # Define the function to correct aerodynamic forces
-        if self.settings['correct_forces_method'] is not '':
-            self.correct_forces = True
-            self.correct_forces_generator = gen_utils.generator_from_string(self.settings['correct_forces_method'])()
-            self.correct_forces_generator.initialise(in_dict=self.settings['correct_forces_settings'],
-                                                     aero=self.data.aero,
-                                                     structure=self.data.structure,
-                                                     rho=self.settings['aero_solver_settings']['rho'],
-                                                     vortex_radius=self.settings['aero_solver_settings']['vortex_radius'])
-
-    def increase_ts(self):
-        self.data.ts += 1
-        self.structural_solver.next_step()
-        self.aero_solver.next_step()
-
-    def cleanup_timestep_info(self):
-        if max(len(self.data.aero.timestep_info), len(self.data.structure.timestep_info)) > 1:
-            # copy last info to first
-            self.data.aero.timestep_info[0] = self.data.aero.timestep_info[-1].copy()
-            self.data.structure.timestep_info[0] = self.data.structure.timestep_info[-1].copy()
-            # delete all the rest
-            while len(self.data.aero.timestep_info) - 1:
-                del self.data.aero.timestep_info[-1]
-            while len(self.data.structure.timestep_info) - 1:
-                del self.data.structure.timestep_info[-1]
-
-        self.data.ts = 0
-
-    def run(self):
-
-        # Include the rbm
-         # print("ts", self.data.ts)
-        self.data.structure.timestep_info[-1].for_vel = self.data.structure.dynamic_input[0]['for_vel']
-
-        for i_step in range(self.settings['n_load_steps'] + 1):
-            if (i_step == self.settings['n_load_steps'] and
-                    self.settings['n_load_steps'] > 0):
-                break
-            # load step coefficient
-            if not self.settings['n_load_steps'] == 0:
-                load_step_multiplier = (i_step + 1.0)/self.settings['n_load_steps']
-            else:
-                load_step_multiplier = 1.0
-
-            # new storage every load step
-            if i_step > 0:
-                self.increase_ts()
-
-            for i_iter in range(self.settings['max_iter']):
-                if self.settings['print_info']:
-                    cout.cout_wrap('i_step: %u, i_iter: %u' % (i_step, i_iter))
-
-                # run aero
-                self.data = self.aero_solver.run()
-
-                # map force
-                struct_forces = mapping.aero2struct_force_mapping(
-                    self.data.aero.timestep_info[self.data.ts].forces,
-                    self.data.aero.struct2aero_mapping,
-                    self.data.aero.timestep_info[self.data.ts].zeta,
-                    self.data.structure.timestep_info[self.data.ts].pos,
-                    self.data.structure.timestep_info[self.data.ts].psi,
-                    self.data.structure.node_master_elem,
-                    self.data.structure.connectivities,
-                    self.data.structure.timestep_info[self.data.ts].cag(),
-                    self.data.aero.aero_dict)
-
-                if self.correct_forces:
-                    struct_forces = \
-                        self.correct_forces_generator.generate(aero_kstep=self.data.aero.timestep_info[self.data.ts],
-                                                               structural_kstep=self.data.structure.timestep_info[self.data.ts],
-                                                               struct_forces=struct_forces)
-
-                self.data.aero.timestep_info[self.data.ts].postproc_node['aero_steady_forces'] = struct_forces
-
-                if not self.settings['relaxation_factor'] == 0.:
-                    if i_iter == 0:
-                        self.previous_force = struct_forces.copy()
-
-                    temp = struct_forces.copy()
-                    struct_forces = ((1.0 - self.settings['relaxation_factor'])*struct_forces +
-                                     self.settings['relaxation_factor']*self.previous_force)
-                    self.previous_force = temp
-
-                # copy force in beam
-                with_gravity_setting = True
-                try:
-                    old_g = self.structural_solver.settings['gravity']
-                    self.structural_solver.settings['gravity'] = old_g*load_step_multiplier
-                except KeyError:
-                    with_gravity_setting = False
-                temp1 = load_step_multiplier*(struct_forces + self.data.structure.ini_info.steady_applied_forces)
-                self.data.structure.timestep_info[self.data.ts].steady_applied_forces[:] = temp1
-                # run beam
-                prev_quat = self.data.structure.timestep_info[self.data.ts].quat.copy()
-                self.data = self.structural_solver.run()
-                # The following line removes the rbm
-                self.data.structure.timestep_info[self.data.ts].quat = prev_quat.copy()
-                if with_gravity_setting:
-                    self.structural_solver.settings['gravity'] = ct.c_double(old_g)
-
-                # update grid
-                self.aero_solver.update_step()
-
-                # print("psi[-1]", self.data.structure.timestep_info[-1].psi[-1,1,:])
-                # convergence
-                if self.convergence(i_iter):
-                    # create q and dqdt vectors
-                    self.structural_solver.update(self.data.structure.timestep_info[self.data.ts])
-                    self.data = self.aero_solver.run()
-                    self.cleanup_timestep_info()
-                    break
-
-        if self.settings['print_info']:
-            resultants = self.extract_resultants()
-            cout.cout_wrap('Resultant forces and moments: ' + str(resultants))
-        return self.data
-
-    def convergence(self, i_iter):
-        if i_iter == self.settings['max_iter'] - 1:
-            cout.cout_wrap('StaticCoupled did not converge!', 0)
-            # quit(-1)
-
-        # Avoid rerunning UVLM if the structural solver is rigid
-        if "rigid" in self.settings['structural_solver'].lower():
-            return True
-
-        if i_iter == 0:
-            self.initial_pos = self.data.structure.timestep_info[self.data.ts].pos.copy()
-            self.initial_psi = self.data.structure.timestep_info[self.data.ts].psi.copy()
-
-            self.prev_pos = self.initial_pos.copy()
-            self.prev_psi = self.initial_psi.copy()
-
-            for i,j in np.ndindex(self.initial_pos.shape):
-                if np.abs(self.initial_pos[i,j]) < 1.:
-                    self.initial_pos[i,j] = 1.
-            for i,j,k in np.ndindex(self.initial_psi.shape):
-                if np.abs(self.initial_psi[i,j,k]) < 1.:
-                    self.initial_psi[i,j,k] = 1.
-            return False
-
-        res_pos = np.amax(np.abs((self.data.structure.timestep_info[self.data.ts].pos - self.prev_pos)/self.initial_pos))
-        res_psi = np.amax(np.abs((self.data.structure.timestep_info[self.data.ts].psi - self.prev_psi)/self.initial_psi))
-        res_pos_dot = np.amax(np.abs(self.data.structure.timestep_info[self.data.ts].pos_dot))
-        res_psi_dot = np.amax(np.abs(self.data.structure.timestep_info[self.data.ts].psi_dot))
-
-        self.prev_pos = self.data.structure.timestep_info[self.data.ts].pos.copy()
-        self.prev_psi = self.data.structure.timestep_info[self.data.ts].psi.copy()
-
-        if self.settings['print_info']:
-            cout.cout_wrap('Pos res     = %8e. Psi res     = %8e.' % (res_pos, res_psi), 2)
-            cout.cout_wrap('Pos_dot res = %8e. Psi_dot res = %8e.' % (res_pos_dot, res_psi_dot), 2)
-
-        if res_pos < self.settings['tolerance']:
-            if res_psi < self.settings['tolerance']:
-                if res_pos_dot < self.settings['tolerance']:
-                    if res_psi_dot < self.settings['tolerance']:
-                        return True
-
-        return False
-
-        # return_value = None
-        # if i_iter == 0:
-        #     self.initial_residual = np.linalg.norm(self.data.structure.timestep_info[self.data.ts].pos)
-        #     self.previous_residual = self.initial_residual
-        #     self.current_residual = self.initial_residual
-        #     return False
-        #
-        # self.current_residual = np.linalg.norm(self.data.structure.timestep_info[self.data.ts].pos)
-        # if self.settings['print_info'].value:
-        #     cout.cout_wrap('Res = %8e' % (np.abs(self.current_residual - self.previous_residual)/self.previous_residual), 2)
-        #
-        # if return_value is None:
-        #     if np.abs(self.current_residual - self.previous_residual)/self.initial_residual < self.settings['tolerance']:
-        #         return_value = True
-        #     else:
-        #         self.previous_residual = self.current_residual
-        #         return_value = False
-        #
-        # if return_value is None:
-        #     return_value = False
-        #
-        # return return_value
-
-    def change_trim(self, alpha, thrust, thrust_nodes, tail_deflection, tail_cs_index):
-        # self.cleanup_timestep_info()
-        self.data.structure.timestep_info = []
-        self.data.structure.timestep_info.append(self.data.structure.ini_info.copy())
-        aero_copy = self.data.aero.timestep_info[-1]
-        self.data.aero.timestep_info = []
-        self.data.aero.timestep_info.append(aero_copy)
-        self.data.ts = 0
-        # alpha
-        orientation_quat = algebra.euler2quat(np.array([0.0, alpha, 0.0]))
-        self.data.structure.timestep_info[0].quat[:] = orientation_quat[:]
-
-        try:
-            self.force_orientation
-        except AttributeError:
-            self.force_orientation = np.zeros((len(thrust_nodes), 3))
-            for i_node, node in enumerate(thrust_nodes):
-                self.force_orientation[i_node, :] = (
-                    algebra.unit_vector(self.data.structure.ini_info.steady_applied_forces[node, 0:3]))
-            # print(self.force_orientation)
-
-        # thrust
-        # thrust is scaled so that the direction of the forces is conserved
-        # in all nodes.
-        # the `thrust` parameter is the force PER node.
-        # if there are two or more nodes in thrust_nodes, the total forces
-        # is n_nodes_in_thrust_nodes*thrust
-        # thrust forces have to be indicated in structure.ini_info
-        # print(algebra.unit_vector(self.data.structure.ini_info.steady_applied_forces[0, 0:3])*thrust)
-        for i_node, node in enumerate(thrust_nodes):
-            # self.data.structure.ini_info.steady_applied_forces[i_node, 0:3] = (
-            #     algebra.unit_vector(self.data.structure.ini_info.steady_applied_forces[i_node, 0:3])*thrust)
-            self.data.structure.ini_info.steady_applied_forces[node, 0:3] = (
-                    self.force_orientation[i_node, :]*thrust)
-            self.data.structure.timestep_info[0].steady_applied_forces[node, 0:3] = (
-                    self.force_orientation[i_node, :]*thrust)
-
-        # tail deflection
-        try:
-            self.data.aero.aero_dict['control_surface_deflection'][tail_cs_index] = tail_deflection
-        except KeyError:
-            raise Exception('This model has no control surfaces')
-        except IndexError:
-            raise Exception('The tail control surface index > number of surfaces')
-
-        # update grid
-        self.aero_solver.update_step()
-
-    def extract_resultants(self, tstep=None):
-        return self.structural_solver.extract_resultants(tstep)
diff --git a/sharpy/solvers/statictrim.py b/sharpy/solvers/statictrim.py
index 15406987c..d98881d0a 100644
--- a/sharpy/solvers/statictrim.py
+++ b/sharpy/solvers/statictrim.py
@@ -3,7 +3,7 @@
 import sharpy.utils.cout_utils as cout
 import sharpy.utils.solver_interface as solver_interface
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import os
 
 
@@ -90,7 +90,7 @@ class StaticTrim(BaseSolver):
     settings_default['save_info'] = False
     settings_description['save_info'] = 'Save trim results to text file'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -114,13 +114,13 @@ def __init__(self):
         self.table = None
         self.folder = None
 
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         self.data = data
         self.settings = data.settings[self.solver_id]
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         self.solver = solver_interface.initialise_solver(self.settings['solver'])
-        self.solver.initialise(self.data, self.settings['solver_settings'])
+        self.solver.initialise(self.data, self.settings['solver_settings'], restart=restart)
 
         self.folder = data.output_folder + '/statictrim/'
         if not os.path.exists(self.folder):
@@ -135,7 +135,7 @@ def increase_ts(self):
         self.structural_solver.next_step()
         self.aero_solver.next_step()
 
-    def run(self):
+    def run(self, **kwargs):
 
         # In the event the modal solver has been run prior to StaticCoupled (i.e. to get undeformed modes), copy
         # results and then attach to the resulting timestep
diff --git a/sharpy/solvers/staticuvlm.py b/sharpy/solvers/staticuvlm.py
index f924525bb..61eb21e0b 100644
--- a/sharpy/solvers/staticuvlm.py
+++ b/sharpy/solvers/staticuvlm.py
@@ -4,10 +4,11 @@
 import sharpy.utils.algebra as algebra
 import sharpy.aero.utils.uvlmlib as uvlmlib
 import sharpy.utils.cout_utils as cout
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.solver_interface import solver, BaseSolver
 import sharpy.utils.generator_interface as gen_interface
 from sharpy.utils.constants import vortex_radius_def
+import sharpy.aero.utils.mapping as mapping
 
 
 @solver
@@ -51,7 +52,7 @@ class StaticUvlm(BaseSolver):
     settings_description['num_cores'] = 'Number of cores to use in the VLM lib'
 
     settings_types['n_rollup'] = 'int'
-    settings_default['n_rollup'] = 1
+    settings_default['n_rollup'] = 0
     settings_description['n_rollup'] = 'Number of rollup iterations for free wake. Use at least ``n_rollup > 1.1*m_star``'
 
     settings_types['rollup_dt'] = 'float'
@@ -110,7 +111,11 @@ class StaticUvlm(BaseSolver):
     settings_default['centre_rot_g'] = [0., 0., 0.]
     settings_description['centre_rot_g'] = 'Centre of rotation in G FoR around which ``rbm_vel_g`` is applied'
 
-    settings_table = settings.SettingsTable()
+    settings_types['map_forces_on_struct'] = 'bool'
+    settings_default['map_forces_on_struct'] = False
+    settings_description['map_forces_on_struct'] = 'Maps the forces on the structure at the end of the timestep. Only usefull if the solver is used outside StaticCoupled'
+
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -119,13 +124,13 @@ def __init__(self):
         self.settings = None
         self.velocity_generator = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         self.data = data
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default, no_ctype=True)
 
         self.update_step()
 
@@ -133,14 +138,38 @@ def initialise(self, data, custom_settings=None):
         velocity_generator_type = gen_interface.generator_from_string(
             self.settings['velocity_field_generator'])
         self.velocity_generator = velocity_generator_type()
-        self.velocity_generator.initialise(self.settings['velocity_field_input'])
+        self.velocity_generator.initialise(self.settings['velocity_field_input'], restart=restart)
+
+    def add_step(self):
+        self.data.aero.add_timestep()
+
+    def update_grid(self, beam):
+        self.data.aero.generate_zeta(beam,
+                                     self.data.aero.aero_settings,
+                                     -1,
+                                     beam_ts=-1)
 
-    def run(self):
-        if not self.data.aero.timestep_info[self.data.ts].zeta:
+    def update_custom_grid(self, structure_tstep, aero_tstep):
+        self.data.aero.generate_zeta_timestep_info(structure_tstep,
+                                                   aero_tstep,
+                                                   self.data.structure,
+                                                   self.data.aero.aero_settings,
+                                                   dt=self.settings['rollup_dt'])
+
+    def run(self, **kwargs):
+
+        aero_tstep = su.set_value_or_default(kwargs, 'aero_step', self.data.aero.timestep_info[-1])
+        structure_tstep = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        dt = su.set_value_or_default(kwargs, 'dt', self.settings['rollup_dt'])
+        t = su.set_value_or_default(kwargs, 't', self.data.ts*dt)
+
+        unsteady_contribution = False
+        convect_wake = False
+
+        if not aero_tstep.zeta:
             return self.data
 
         # generate the wake because the solid shape might change
-        aero_tstep = self.data.aero.timestep_info[self.data.ts]
         self.data.aero.wake_shape_generator.generate({'zeta': aero_tstep.zeta,
                                             'zeta_star': aero_tstep.zeta_star,
                                             'gamma': aero_tstep.gamma,
@@ -148,14 +177,26 @@ def run(self):
                                             'dist_to_orig': aero_tstep.dist_to_orig})
 
         # generate uext
-        self.velocity_generator.generate({'zeta': self.data.aero.timestep_info[self.data.ts].zeta,
+        self.velocity_generator.generate({'zeta': aero_tstep.zeta,
                                           'override': True,
-                                          'for_pos': self.data.structure.timestep_info[self.data.ts].for_pos[0:3]},
-                                         self.data.aero.timestep_info[self.data.ts].u_ext)
+                                          'for_pos': structure_tstep.for_pos[0:3]},
+                                          aero_tstep.u_ext)
         # grid orientation
-        uvlmlib.vlm_solver(self.data.aero.timestep_info[self.data.ts],
+        uvlmlib.vlm_solver(aero_tstep,
                            self.settings)
 
+        if self.settings['map_forces_on_struct']:
+            structure_tstep.steady_applied_forces[:] = mapping.aero2struct_force_mapping(
+                    aero_tstep.forces,
+                    self.data.aero.struct2aero_mapping,
+                    self.data.aero.timestep_info[self.data.ts].zeta,
+                    structure_tstep.pos,
+                    structure_tstep.psi,
+                    self.data.structure.node_master_elem,
+                    self.data.structure.connectivities,
+                    structure_tstep.cag(),
+                    self.data.aero.aero_dict)
+
         return self.data
 
     def next_step(self):
diff --git a/sharpy/solvers/steplinearuvlm.py b/sharpy/solvers/steplinearuvlm.py
index fff9bbd0c..af2edaa3c 100644
--- a/sharpy/solvers/steplinearuvlm.py
+++ b/sharpy/solvers/steplinearuvlm.py
@@ -5,7 +5,7 @@
 """
 from sharpy.utils.solver_interface import BaseSolver, solver
 import numpy as np
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.generator_interface as gen_interface
 import sharpy.utils.algebra as algebra
 import sharpy.linear.src.linuvlm as linuvlm
@@ -113,7 +113,7 @@ class StepLinearUVLM(BaseSolver):
     settings_default['cfl1'] = True
     settings_description['cfl1'] = 'If it is ``True``, it assumes that the discretisation complies with CFL=1'
     
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     scaling_settings_types = dict()
@@ -143,7 +143,7 @@ def __init__(self):
         self.lin_uvlm_system = None
         self.velocity_generator = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         r"""
         Initialises the Linear UVLM aerodynamic solver and the chosen velocity generator.
 
@@ -171,14 +171,14 @@ def initialise(self, data, custom_settings=None):
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default, no_ctype=True)
-        settings.to_custom_types(self.settings['ScalingDict'], self.scaling_settings_types,
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default, no_ctype=True)
+        su.to_custom_types(self.settings['ScalingDict'], self.scaling_settings_types,
                                  self.scaling_settings_default, no_ctype=True)
 
         # Initialise velocity generator
         velocity_generator_type = gen_interface.generator_from_string(self.settings['velocity_field_generator'])
         self.velocity_generator = velocity_generator_type()
-        self.velocity_generator.initialise(self.settings['velocity_field_input'])
+        self.velocity_generator.initialise(self.settings['velocity_field_input'], restart=restart)
 
         # Check whether linear UVLM has been initialised
         try:
@@ -268,13 +268,7 @@ def initialise(self, data, custom_settings=None):
             # aero_tstep.linear.u = u_0
             # aero_tstep.linear.y = f_0
 
-    def run(self,
-            aero_tstep,
-            structure_tstep,
-            convect_wake=False,
-            dt=None,
-            t=None,
-            unsteady_contribution=False):
+    def run(self, **kwargs):
         r"""
         Solve the linear aerodynamic UVLM model at the current time step ``n``. The step increment is solved as:
 
@@ -328,14 +322,12 @@ def run(self,
 
         """
 
-        if aero_tstep is None:
-            aero_tstep = self.data.aero.timestep_info[-1]
-        if structure_tstep is None:
-            structure_tstep = self.data.structure.timestep_info[-1]
-        if dt is None:
-            dt = self.settings['dt']
-        if t is None:
-            t = self.data.ts*dt
+        aero_tstep = su.set_value_or_default(kwargs, 'aero_step', self.data.aero.timestep_info[-1])
+        structure_tstep = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        convect_wake = su.set_value_or_default(kwargs, 'convect_wake', False)
+        dt= su.set_value_or_default(kwargs, 'dt', self.settings['dt'])                                                                                                    
+        t = su.set_value_or_default(kwargs, 't', self.data.ts*dt)
+        unsteady_contribution = su.set_value_or_default(kwargs, 'unsteady_contribution', False)
 
         integr_order = self.settings['integr_order']
 
diff --git a/sharpy/solvers/stepuvlm.py b/sharpy/solvers/stepuvlm.py
index 566cc8325..c17e3cf2b 100644
--- a/sharpy/solvers/stepuvlm.py
+++ b/sharpy/solvers/stepuvlm.py
@@ -5,7 +5,7 @@
 
 import sharpy.utils.algebra as algebra
 import sharpy.aero.utils.uvlmlib as uvlmlib
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.solver_interface import solver, BaseSolver
 import sharpy.utils.generator_interface as gen_interface
 import sharpy.utils.cout_utils as cout
@@ -133,7 +133,7 @@ class StepUvlm(BaseSolver):
     settings_default['quasi_steady'] = False
     settings_description['quasi_steady'] = 'Use quasi-steady approximation in UVLM'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description, settings_options)
 
     def __init__(self):
@@ -141,7 +141,7 @@ def __init__(self):
         self.settings = None
         self.velocity_generator = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         """
         To be called just once per simulation.
         """
@@ -150,10 +150,10 @@ def initialise(self, data, custom_settings=None):
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default,
-                                 self.settings_options)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           self.settings_options)
 
         self.data.structure.add_unsteady_information(
             self.data.structure.dyn_dict,
@@ -181,27 +181,21 @@ def initialise(self, data, custom_settings=None):
             self.settings['velocity_field_generator'])
         self.velocity_generator = velocity_generator_type()
         self.velocity_generator.initialise(
-            self.settings['velocity_field_input'])
-
-    def run(self,
-            aero_tstep=None,
-            structure_tstep=None,
-            convect_wake=True,
-            dt=None,
-            t=None,
-            unsteady_contribution=False):
+            self.settings['velocity_field_input'],
+            restart=restart)
+
+    def run(self, **kwargs):
         """
         Runs a step of the aerodynamics as implemented in UVLM.
         """
 
-        if aero_tstep is None:
-            aero_tstep = self.data.aero.timestep_info[-1]
-        if structure_tstep is None:
-            structure_tstep = self.data.structure.timestep_info[-1]
-        if dt is None:
-            dt = self.settings['dt']
-        if t is None:
-            t = self.data.ts*dt
+        # Default values
+        aero_tstep = su.set_value_or_default(kwargs, 'aero_step', self.data.aero.timestep_info[-1])
+        structure_tstep = su.set_value_or_default(kwargs, 'structural_step', self.data.structure.timestep_info[-1])
+        convect_wake = su.set_value_or_default(kwargs, 'convect_wake', True)
+        dt= su.set_value_or_default(kwargs, 'dt', self.settings['dt'])
+        t = su.set_value_or_default(kwargs, 't', self.data.ts*dt)
+        unsteady_contribution = su.set_value_or_default(kwargs, 'unsteady_contribution', False)
 
         if not aero_tstep.zeta:
             return self.data
diff --git a/sharpy/solvers/timeintegrators.py b/sharpy/solvers/timeintegrators.py
index 66f4be694..c60d08cc3 100644
--- a/sharpy/solvers/timeintegrators.py
+++ b/sharpy/solvers/timeintegrators.py
@@ -1,7 +1,7 @@
 import numpy as np
 import ctypes as ct
 
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 from sharpy.utils.solver_interface import solver
 
 
@@ -23,7 +23,7 @@ def __init__(self):
         pass
 
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
         pass
 
 
@@ -75,16 +75,16 @@ def __init__(self):
         self.beta = None
         self.gamma = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
 
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings,
-                                 self.settings_types,
-                                 self.settings_default,
-                                 no_ctype=True)
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           no_ctype=True)
 
         self.dt = self.settings['dt']
         self.gamma = 0.5 + self.settings['newmark_damp']
@@ -174,13 +174,13 @@ def __init__(self):
         self.gamma = None
         self.beta = None
 
-    def initialise(self, data, custom_settings=None):
+    def initialise(self, data, custom_settings=None, restart=False):
 
         if custom_settings is None:
             self.settings = data.settings[self.solver_id]
         else:
             self.settings = custom_settings
-        settings.to_custom_types(self.settings,
+        su.to_custom_types(self.settings,
                                  self.settings_types,
                                  self.settings_default,
                                  no_ctype=True)
diff --git a/sharpy/solvers/trim.py b/sharpy/solvers/trim.py
index 199ed138b..af8dcaaeb 100644
--- a/sharpy/solvers/trim.py
+++ b/sharpy/solvers/trim.py
@@ -7,7 +7,7 @@
 import sharpy.utils.cout_utils as cout
 import sharpy.utils.solver_interface as solver_interface
 from sharpy.utils.solver_interface import solver, BaseSolver
-import sharpy.utils.settings as settings
+import sharpy.utils.settings as su
 import sharpy.utils.algebra as algebra
 
 
@@ -86,7 +86,7 @@ class Trim(BaseSolver):
     settings_default['refine_solution'] = False
     settings_description['refine_solution'] = 'If ``True`` and the optimiser routine allows for it, the optimiser will try to improve the solution with hybrid methods'
 
-    settings_table = settings.SettingsTable()
+    settings_table = su.SettingsTable()
     __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
 
     def __init__(self):
@@ -99,13 +99,13 @@ def __init__(self):
 
         self.with_special_case = False
 
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         self.data = data
         self.settings = data.settings[self.solver_id]
-        settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
+        su.to_custom_types(self.settings, self.settings_types, self.settings_default)
 
         self.solver = solver_interface.initialise_solver(self.settings['solver'])
-        self.solver.initialise(self.data, self.settings['solver_settings'])
+        self.solver.initialise(self.data, self.settings['solver_settings'], restart=restart)
 
         # generate x_info (which elements of the x array are what)
         counter = 0
diff --git a/sharpy/solvers/updatepickle.py b/sharpy/solvers/updatepickle.py
new file mode 100644
index 000000000..a3ca40f04
--- /dev/null
+++ b/sharpy/solvers/updatepickle.py
@@ -0,0 +1,47 @@
+import numpy as np
+import sharpy.utils.settings as su
+from sharpy.utils.solver_interface import solver, BaseSolver
+
+
+@solver
+class UpdatePickle(BaseSolver):
+    """
+
+    """
+    solver_id = 'UpdatePickle'
+
+    settings_types = dict()
+    settings_default = dict()
+    settings_description = dict()
+
+    settings_table = su.SettingsTable()
+    __doc__ += settings_table.generate(settings_types, settings_default, settings_description)
+
+    def __init__(self):
+        self.data = None
+        self.settings = None
+
+    def initialise(self, data, custom_settings=None, restart=False):
+        self.data = data
+        if custom_settings is None:
+            self.settings = data.settings[self.solver_id]
+        else:
+            self.settings = custom_settings
+        su.to_custom_types(self.settings,
+                           self.settings_types,
+                           self.settings_default,
+                           no_ctype=True)
+
+    def run(self, **kwargs):
+
+        for sts in self.data.structure.timestep_info:
+            if sts is not None:
+                sts.in_global_AFoR = True
+                sts.runtime_steady_forces = np.zeros_like(sts.steady_applied_forces)
+                sts.runtime_unsteady_forces = np.zeros_like(sts.steady_applied_forces)
+                sts.psi_local = sts.psi.copy()
+                sts.psi_dot_local = sts.psi_dot.copy()
+                sts.mb_dquatdt = np.zeros_like(sts.mb_quat)
+
+        return self.data
+
diff --git a/sharpy/structure/models/beam.py b/sharpy/structure/models/beam.py
index 7b167da68..5cfba2d1a 100644
--- a/sharpy/structure/models/beam.py
+++ b/sharpy/structure/models/beam.py
@@ -112,8 +112,8 @@ def generate(self, in_data, settings):
         # connectivity information
         self.connectivities = in_data['connectivities'].astype(dtype=ct.c_int, order='F')
 
-        self.global_nodes_num = list(set(self.connectivities.reshape(-1)))
-        self.global_elems_num = np.arange(0, self.num_elem, 1)
+        self.global_elems_num = np.arange(self.num_elem)
+        self.global_nodes_num = np.arange(self.num_node)
 
         # stiffness data
         self.elem_stiffness = in_data['elem_stiffness'].copy()
@@ -451,7 +451,7 @@ def generate_fortran(self):
         for elem in self.elements:
             for inode in range(elem.n_nodes):
                 if elem.rbmass is not None:
-                    rbmass_temp[elem.ielem, inode, :, :] = elem.rbmass[inode, :, :]
+                    rbmass_temp[elem.ielem, inode, :, :] += elem.rbmass[inode, :, :]
         self.fortran['rbmass'] = rbmass_temp.astype(dtype=ct.c_double, order='F')
 
         if self.settings['unsteady']:
@@ -489,34 +489,6 @@ def integrate_position(self, ts, dt):
                 dt*np.dot(self.timestep_info[ts].cga(),
                           self.timestep_info[ts].for_vel[0:3]))
 
-    def nodal_b_for_2_a_for(self, nodal, tstep, filter=np.array([True]*6)):
-        """
-        Projects a nodal variable from the local, body-attached frame (B) to the reference A frame.
-
-        Args:
-            nodal (np.array): Nodal variable of size ``(num_node, 6)``
-            tstep (sharpy.datastructures.StructTimeStepInfo): structural time step info.
-            filter (np.array): optional argument that filters and does not convert a specific degree of
-              freedom. Defaults to ``np.array([True, True, True, True, True, True])``.
-
-        Returns:
-            np.array: the ``nodal`` argument projected onto the reference ``A`` frame.
-        """
-        nodal_a = nodal.copy(order='F')
-        for i_node in range(self.num_node):
-            # get master elem and i_local_node
-            i_master_elem, i_local_node = self.node_master_elem[i_node, :]
-            crv = tstep.psi[i_master_elem, i_local_node, :]
-            cab = algebra.crv2rotation(crv)
-            temp = np.zeros((6,))
-            temp[0:3] = np.dot(cab, nodal[i_node, 0:3])
-            temp[3:6] = np.dot(cab, nodal[i_node, 3:6])
-            for i in range(6):
-                if filter[i]:
-                    nodal_a[i_node, i] = temp[i]
-
-        return nodal_a
-
     def nodal_premultiply_inv_T_transpose(self, nodal, tstep, filter=np.array([True]*6)):
         # nodal_t = np.zeros_like(nodal, dtype=ct.c_double, order='F')
         nodal_t = nodal.copy(order='F')
@@ -608,6 +580,18 @@ def get_body(self, ibody):
                         ibody_beam.lumped_mass_position = np.concatenate((ibody_beam.lumped_mass_position ,np.array([self.lumped_mass_position[inode]])), axis=0)
                         ibody_beam.n_lumped_mass += 1
 
+        if not self.lumped_mass_mat is None:
+            is_first = True
+            for inode in range(len(self.lumped_mass_mat_nodes)):
+                if self.lumped_mass_mat_nodes[inode] in ibody_nodes:
+                    if is_first:
+                        is_first = False
+                        ibody_beam.lumped_mass_mat_nodes = int_list_nodes[ibody_nodes == self.lumped_mass_mat_nodes[inode]]
+                        ibody_beam.lumped_mass_mat = np.array([self.lumped_mass_mat[inode, :, :]])
+                    else:
+                        ibody_beam.lumped_mass_mat_nodes = np.concatenate((ibody_beam.lumped_mass_mat_nodes , int_list_nodes[ibody_nodes == self.lumped_mass_mat_nodes[inode]]), axis=0)
+                        ibody_beam.lumped_mass_mat = np.concatenate((ibody_beam.lumped_mass_mat ,np.array([self.lumped_mass_mat[inode, :, :]])), axis=0)
+
         ibody_beam.steady_app_forces = self.steady_app_forces[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
 
         ibody_beam.num_bodies = 1
@@ -641,7 +625,7 @@ def get_body(self, ibody):
 
         ibody_beam.generate_master_structure()
 
-        if ibody_beam.lumped_mass is not None:
+        if ibody_beam.lumped_mass is not None or ibody_beam.lumped_mass_mat is not None:
             ibody_beam.lump_masses()
 
         ibody_beam.generate_fortran()
diff --git a/sharpy/structure/utils/lagrangeconstraints.py b/sharpy/structure/utils/lagrangeconstraints.py
index f1e6e5170..9ca9e34ab 100644
--- a/sharpy/structure/utils/lagrangeconstraints.py
+++ b/sharpy/structure/utils/lagrangeconstraints.py
@@ -40,6 +40,7 @@
 import ctypes as ct
 import numpy as np
 import sharpy.utils.algebra as ag
+from sharpy.utils.settings import set_value_or_default
 
 ###############################################################################
 # Basic structures
@@ -224,13 +225,6 @@ def define_FoR_dof(MB_beam, FoR_body):
     return FoR_dof
 
 
-def set_value_or_default(dictionary, key, default_val):
-    try:
-        value = dictionary[key]
-    except KeyError:
-        value = default_val
-    return value
-
 ################################################################################
 # Equations
 ################################################################################
@@ -246,7 +240,11 @@ def equal_pos_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, inode_in_body, no
         node_dof (int): position of the first degree of freedom associated to the "node"
         FoR_body (int): body number of the "FoR"
         FoR_dof (int): position of the first degree of freedom associated to the "FoR"
+
+    Note: this equation constitutes a holonomic constraint which is not currently supported. Check ``equal_lin_vel_node_FoR``
     """
+    cout.cout_wrap("WARNING: this equation constitutes a holonomic constraint which is not currently supported. Check ``equal_lin_vel_node_FoR``", 3)
+
     num_LM_eq_specific = 3
     Bnh = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
     B = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
@@ -299,7 +297,7 @@ def equal_pos_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, inode_in_body, no
     return ieq
 
 
-def equal_lin_vel_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, scalingFactor, penaltyFactor, ieq, LM_K, LM_C, LM_Q):
+def equal_lin_vel_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, scalingFactor, penaltyFactor, ieq, LM_K, LM_C, LM_Q, rel_posB = np.zeros((3))):
     """
     This function generates the stiffness and damping matrices and the independent vector associated to a constraint that
     imposes equal linear velocities between a node and a frame of reference
@@ -313,6 +311,7 @@ def equal_lin_vel_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, node_number,
         node_dof (int): position of the first degree of freedom associated to the "node"
         FoR_body (int): body number of the "FoR"
         FoR_dof (int): position of the first degree of freedom associated to the "FoR"
+        rel_posB (float np.array): relative position between the node and the FoR (in the node B FoR)
     """
 
     num_LM_eq_specific = 3
@@ -323,9 +322,13 @@ def equal_lin_vel_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, node_number,
     node_cga = MB_tstep[node_body].cga()
     node_FoR_va = MB_tstep[node_body].for_vel[0:3]
     node_FoR_wa = MB_tstep[node_body].for_vel[3:6]
-    node_Ra = MB_tstep[node_body].pos[node_number,:]
-    node_dot_Ra = MB_tstep[node_body].pos_dot[node_number,:]
 
+    ielem, inode_in_elem = MB_beam[node_body].node_master_elem[node_number]
+    psi = MB_tstep[node_body].psi[ielem, inode_in_elem, :]
+    node_cab = ag.crv2rotation(psi)
+    node_Ra = MB_tstep[node_body].pos[node_number,:] + np.dot(node_cab, rel_posB)
+
+    node_dot_Ra = MB_tstep[node_body].pos_dot[node_number,:]
     FoR_cga = MB_tstep[FoR_body].cga()
     FoR_va = MB_tstep[FoR_body].for_vel[0:3]
 
@@ -409,6 +412,65 @@ def equal_lin_vel_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, node_number,
     return ieq
 
 
+def rel_rot_vel_node_FoR(MB_tstep, MB_beam, FoR_body, node_body, node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, scalingFactor, penaltyFactor, ieq, LM_K, LM_C, LM_Q, rel_vel=np.zeros((3))):
+    """
+    This function generates the stiffness and damping matrices and the independent vector associated to a constraint that
+    imposes equal rotation velocities between a node and a frame of reference
+
+    See ``LagrangeConstraints`` for the description of variables
+
+    Args:
+        node_number (int): number of the "node" within its own body
+        node_body (int): body number of the "node"
+        node_FoR_dof (int): position of the first degree of freedom of the FoR to which the "node" belongs
+        node_dof (int): position of the first degree of freedom associated to the "node"
+        FoR_body (int): body number of the "FoR"
+        FoR_dof (int): position of the first degree of freedom associated to the "FoR"
+        rel_vel (np.array): relative velocity FoR-node
+    """
+
+    num_LM_eq_specific = 3
+    Bnh = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
+
+    # Simplify notation
+    ielem, inode_in_elem = MB_beam[node_body].node_master_elem[node_number]
+    node_cga = MB_tstep[node_body].cga()
+    node_FoR_wa = MB_tstep[node_body].for_vel[3:6]
+    psi = MB_tstep[node_body].psi[ielem,inode_in_elem,:]
+    cab = ag.crv2rotation(psi)
+    tan = ag.crv2tan(psi)
+
+    FoR_cga = MB_tstep[FoR_body].cga()
+    FoR_wa = MB_tstep[FoR_body].for_vel[3:6]
+
+    Bnh[:, node_dof+3:node_dof+6] += tan.copy()
+    Bnh[:, FoR_dof+3:FoR_dof+6] -= ag.multiply_matrices(cab.T, node_cga.T, FoR_cga)
+    if MB_beam[node_body].FoR_movement == 'free':
+        Bnh[:, node_FoR_dof+3:node_FoR_dof+6] += cab.T
+
+    LM_C[sys_size+ieq:sys_size+ieq+num_LM_eq_specific,:sys_size] += scalingFactor*Bnh
+    LM_C[:sys_size,sys_size+ieq:sys_size+ieq+num_LM_eq_specific] += scalingFactor*np.transpose(Bnh)
+
+    LM_Q[:sys_size] += scalingFactor*np.dot(np.transpose(Bnh), Lambda_dot[ieq:ieq+num_LM_eq_specific])
+    LM_Q[sys_size+ieq:sys_size+ieq+num_LM_eq_specific] += scalingFactor*(np.dot(tan, MB_tstep[node_body].psi_dot[ielem, inode_in_elem, :]) +
+                                                                         np.dot(cab.T, node_FoR_wa) -
+                                                                         ag.multiply_matrices(cab.T, node_cga.T, FoR_cga, FoR_wa) + rel_vel)
+
+    LM_K[node_dof+3:node_dof+6, node_dof+3:node_dof+6] += scalingFactor*ag.der_TanT_by_xv(psi, Lambda_dot[ieq:ieq+num_LM_eq_specific])
+    if MB_beam[node_body].FoR_movement == 'free':
+        LM_K[node_FoR_dof+3:node_FoR_dof+6, node_dof+3:node_dof+6] += scalingFactor*ag.der_Ccrv_by_v(psi, Lambda_dot[ieq:ieq+num_LM_eq_specific])
+
+    LM_K[FoR_dof+3:FoR_dof+6, node_dof+3:node_dof+6] -= scalingFactor*ag.der_Ccrv_by_v(psi,
+                                                                                       ag.multiply_matrices(node_cga, FoR_cga.T, Lambda_dot[ieq:ieq+num_LM_eq_specific]))
+
+    LM_C[FoR_dof+3:FoR_dof+6, node_FoR_dof+6:node_FoR_dof+10] -= scalingFactor*np.dot(cab, ag.der_Cquat_by_v(MB_tstep[node_body].quat,
+                                                                                                 np.dot(FoR_cga.T, Lambda_dot[ieq:ieq+num_LM_eq_specific])))
+    LM_C[FoR_dof+3:FoR_dof+6, FoR_dof+6:FoR_dof+10] -= scalingFactor*ag.multiply_matrices(cab, node_cga, ag.der_CquatT_by_v(MB_tstep[FoR_body].quat,
+                                                                                                               Lambda_dot[ieq:ieq+num_LM_eq_specific]))
+
+    ieq += 3
+    return ieq
+
 def def_rot_axis_FoR_wrt_node_general(MB_tstep, MB_beam, FoR_body, node_body, node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, rot_axisB, scalingFactor, penaltyFactor, ieq, LM_K, LM_C, LM_Q, indep):
     """
     This function generates the stiffness and damping matrices and the independent vector associated to a joint that
@@ -426,7 +488,10 @@ def def_rot_axis_FoR_wrt_node_general(MB_tstep, MB_beam, FoR_body, node_body, no
         node_dof (int): position of the first degree of freedom associated to the "node"
         FoR_body (int): body number of the "FoR"
         FoR_dof (int): position of the first degree of freedom associated to the "FoR"
+
+    Notes: this function is missing the contribution of the rotation velocity of the reference node. See ``def_rot_axis_FoR_wrt_node_general``
     """
+    cout.cout_wrap("WARNING: this function is missing the contribution of the rotation velocity of the reference node. See ``def_rot_axis_FoR_wrt_node_general``", 3)
 
     ielem, inode_in_elem = MB_beam[node_body].node_master_elem[node_number]
 
@@ -447,17 +512,11 @@ def def_rot_axis_FoR_wrt_node_general(MB_tstep, MB_beam, FoR_body, node_body, no
         n1 = np.linalg.norm(aux_Bnh[1,:])
         n2 = np.linalg.norm(aux_Bnh[2,:])
         if ((n0 < n1) and (n0 < n2)):
-            # indep = np.array([1,2], dtype = int)
             indep[:] = [1, 2]
-            # new_Lambda_dot = np.array([0., Lambda_dot[ieq], Lambda_dot[ieq+1]])
         elif ((n1 < n0) and (n1 < n2)):
-            # indep = np.array([0,2], dtype = int)
             indep[:] = [0, 2]
-            # new_Lambda_dot = np.array([Lambda_dot[ieq], 0.0, Lambda_dot[ieq+1]])
         elif ((n2 < n0) and (n2 < n1)):
-            # indep = np.array([0,1], dtype = int)
             indep[:] = [0, 1]
-            # new_Lambda_dot = np.array([Lambda_dot[ieq], Lambda_dot[ieq+1], 0.0])
 
     new_Lambda_dot = np.zeros(3)
     new_Lambda_dot[indep[0]] = Lambda_dot[ieq]
@@ -467,9 +526,6 @@ def def_rot_axis_FoR_wrt_node_general(MB_tstep, MB_beam, FoR_body, node_body, no
     Bnh = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
     B = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
 
-    # Lambda_dot[ieq:ieq+num_LM_eq_specific]
-    # np.concatenate((Lambda_dot[ieq:ieq+num_LM_eq_specific], np.array([0.])))
-
     Bnh[:, FoR_dof+3:FoR_dof+6] = ag.multiply_matrices(ag.skew(rot_axisB),
                                                        cab.T,
                                                        node_cga.T,
@@ -609,7 +665,7 @@ def def_rot_axis_FoR_wrt_node_xyz(MB_tstep, MB_beam, FoR_body, node_body, node_n
     # Components to be zero
     Z = np.zeros((2,3))
     Z[:, zero_comp] = np.eye(2)
-    
+
     Bnh[:, FoR_dof+3:FoR_dof+6] += ag.multiply_matrices(Z, cab.T, node_cga.T, FoR_cga)
     Bnh[:, node_dof+3:node_dof+6] -= ag.multiply_matrices(Z, ag.crv2tan(psi))
     Bnh[:, node_FoR_dof+3:node_FoR_dof+6] -= ag.multiply_matrices(Z, cab.T)
@@ -705,7 +761,7 @@ def def_rot_axis_FoR_wrt_node_xyz(MB_tstep, MB_beam, FoR_body, node_body, node_n
     return ieq
 
 
-def def_rot_vel_FoR_wrt_node(MB_tstep, MB_beam, FoR_body, node_body, node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, rot_axisB, rot_vel, scalingFactor, penaltyFactor, ieq, LM_K, LM_C, LM_Q):
+def def_rot_vel_mod_FoR_wrt_node(MB_tstep, MB_beam, FoR_body, node_body, node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, nonzero_comp, rot_vel, scalingFactor, penaltyFactor, ieq, LM_K, LM_C, LM_Q):
     """
     This function generates the stiffness and damping matrices and the independent vector associated to a joint that
     forces the rotation velocity of a FoR with respect to a node
@@ -713,7 +769,7 @@ def def_rot_vel_FoR_wrt_node(MB_tstep, MB_beam, FoR_body, node_body, node_number
     See ``LagrangeConstraints`` for the description of variables
 
     Args:
-        rot_axisB (np.ndarray): Rotation axis with respect to the node B FoR
+        nonzero_comp (int): Component of the rotation axis with respect to the node B FoR which is non-zero
         rot_vel (float): Rotation velocity
         node_number (int): number of the "node" within its own body
         node_body (int): body number of the "node"
@@ -723,43 +779,40 @@ def def_rot_vel_FoR_wrt_node(MB_tstep, MB_beam, FoR_body, node_body, node_number
         FoR_dof (int): position of the first degree of freedom associated to the "FoR"
     """
 
+    ielem, inode_in_elem = MB_beam[node_body].node_master_elem[node_number]
     num_LM_eq_specific = 1
     Bnh = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
     B = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
 
-    ielem, inode_in_elem = MB_beam[node_body].node_master_elem[node_number]
-    Bnh[:, FoR_dof+3:FoR_dof+6] = ag.multiply_matrices(rot_axisB,
-                                                  ag.crv2rotation(MB_tstep[node_body].psi[ielem,inode_in_elem,:]).T,
-                                                  MB_tstep[node_body].cga().T,
-                                                  MB_tstep[FoR_body].cga())
+    # Simplify notation
+    cab = ag.crv2rotation(MB_tstep[node_body].psi[ielem,inode_in_elem,:])
+    node_cga = MB_tstep[node_body].cga()
+    FoR_cga = MB_tstep[FoR_body].cga()
+    FoR_wa = MB_tstep[FoR_body].for_vel[3:6]
+
+    # Components to be zero
+    Znon = np.zeros((1,3))
+    Znon[:, nonzero_comp] = 1
+
+    Bnh[:, FoR_dof+3:FoR_dof+6] += ag.multiply_matrices(Znon, cab.T, node_cga.T, FoR_cga)
 
     # Constrain angular velocities
-    LM_Q[:sys_size] += scalingFactor*np.dot(np.transpose(Bnh),Lambda_dot[ieq:ieq+num_LM_eq_specific])
-    LM_Q[sys_size+ieq:sys_size+ieq+num_LM_eq_specific] += scalingFactor*ag.multiply_matrices(rot_axisB,
-                                                  ag.crv2rotation(MB_tstep[node_body].psi[ielem,inode_in_elem,:]).T,
-                                                  MB_tstep[node_body].cga().T,
-                                                  MB_tstep[FoR_body].cga(),
-                                                  MB_tstep[FoR_body].for_vel[3:6]) - scalingFactor*rot_vel
+    LM_Q[:sys_size] += scalingFactor*np.dot(np.transpose(Bnh), Lambda_dot[ieq:ieq+num_LM_eq_specific])
+    LM_Q[sys_size+ieq:sys_size+ieq+num_LM_eq_specific] += scalingFactor*ag.multiply_matrices(Znon, cab.T, node_cga.T, FoR_cga, FoR_wa)
+    LM_Q[sys_size+ieq:sys_size+ieq+num_LM_eq_specific] -= scalingFactor*rot_vel
 
     LM_C[sys_size+ieq:sys_size+ieq+num_LM_eq_specific,:sys_size] += scalingFactor*Bnh
     LM_C[:sys_size,sys_size+ieq:sys_size+ieq+num_LM_eq_specific] += scalingFactor*np.transpose(Bnh)
 
-    if MB_beam[node_body].FoR_movement == 'free':
-        LM_C[FoR_dof+3:FoR_dof+6,node_FoR_dof+6:node_FoR_dof+10] += scalingFactor*np.dot(MB_tstep[FoR_body].cga().T,
-                                                                           ag.der_Cquat_by_v(MB_tstep[node_body].quat,
-                                                                                                  ag.multiply_matrices(ag.crv2rotation(MB_tstep[node_body].psi[ielem,inode_in_elem,:]),
-                                                                                                                    # rot_axisB.T,
-                                                                                                                    rot_axisB.T*Lambda_dot[ieq:ieq+num_LM_eq_specific])))
+    vec = ag.multiply_matrices(node_cga, cab, Znon.T, Lambda_dot[ieq:ieq+num_LM_eq_specific])
+    LM_C[FoR_dof+3:FoR_dof+6, FoR_dof+6:FoR_dof+10] += scalingFactor*ag.der_CquatT_by_v(MB_tstep[FoR_body].quat, vec)
 
-    LM_C[FoR_dof+3:FoR_dof+6,FoR_dof+6:FoR_dof+10] += scalingFactor*ag.der_CquatT_by_v(MB_tstep[FoR_body].quat,
-                                                                              ag.multiply_matrices(MB_tstep[node_body].cga(),
-                                                                                                ag.crv2rotation(MB_tstep[node_body].psi[ielem,inode_in_elem,:]).T,
-                                                                                                rot_axisB.T*Lambda_dot[ieq:ieq+num_LM_eq_specific]))
+    if MB_beam[node_body].FoR_movement == 'free':
+        vec = ag.multiply_matrices(cab, Znon.T, Lambda_dot[ieq:ieq+num_LM_eq_specific])
+        LM_C[FoR_dof+3:FoR_dof+6, node_FoR_dof+6:node_FoR_dof+10] += scalingFactor*ag.multiply_matrices(FoR_cga.T, ag.der_Cquat_by_v(MB_tstep[node_body].quat, vec))
 
-    LM_K[FoR_dof+3:FoR_dof+6,node_dof+3:node_dof+6] += scalingFactor*ag.multiply_matrices(MB_tstep[FoR_body].cga().T,
-                                                                         MB_tstep[node_body].cga(),
-                                                                         ag.der_Ccrv_by_v(MB_tstep[node_body].psi[ielem,inode_in_elem,:],
-                                                                                                rot_axisB.T*Lambda_dot[ieq:ieq+num_LM_eq_specific]))
+    LM_K[FoR_dof+3:FoR_dof+6, node_dof+3:node_dof+6] += scalingFactor*ag.multiply_matrices(FoR_cga.T, node_cga, ag.der_Ccrv_by_v(MB_tstep[node_body].psi[ielem,inode_in_elem,:],
+                                                                                                                                  np.dot(Znon.T, Lambda_dot[ieq:ieq+num_LM_eq_specific])))
 
     ieq += 1
     return ieq
@@ -767,7 +820,7 @@ def def_rot_vel_FoR_wrt_node(MB_tstep, MB_beam, FoR_body, node_body, node_number
 def def_rot_vect_FoR_wrt_node(MB_tstep, MB_beam, FoR_body, node_body, node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, rot_vect, scalingFactor, penaltyFactor, ieq, LM_K, LM_C, LM_Q):
     """
         This function fixes the rotation velocity VECTOR of a FOR equal to a velocity vector defined in the B FoR of a node
-        This function is a new implementation that combines and simplifies the use of 'def_rot_vel_FoR_wrt_node' and 'def_rot_axis_FoR_wrt_node' together
+        This function is a new implementation that combines and simplifies the use of 'def_rot_vel_mod_FoR_wrt_node' and 'def_rot_axis_FoR_wrt_node' together
     """
 
     num_LM_eq_specific = 3
@@ -862,9 +915,10 @@ def initialise(self, MBdict_entry, ieq, print_info=True):
             self.rot_dir = 'z'
             self.zero_comp = np.array([0, 1], dtype=int)
         else:
-            self.rot_dir = 'general'
-            self.indep = []
-    
+            raise NotImplementedError("Hinges should be parallel to the xB, yB or zB of the reference node")
+            #self.rot_dir = 'general'
+            #self.indep = []
+
         return self._ieq + self._n_eq
 
     def staticmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
@@ -913,11 +967,12 @@ class hinge_node_FoR_constant_vel(BaseLagrangeConstraint):
         node_body (int): body number of the "node"
         FoR_body (int): body number of the "FoR"
         rot_vect (np.ndarray): Rotation velocity vector in the node B FoR
+        rel_posB (np.ndarray): Relative position between the node and the frame of reference in the node B FoR
     """
     _lc_id = 'hinge_node_FoR_constant_vel'
 
     def __init__(self):
-        self.required_parameters = ['node_in_body', 'body', 'body_FoR', 'rot_vect']
+        self.required_parameters = ['node_in_body', 'body', 'body_FoR', 'rot_vect', 'rel_posB']
         self._n_eq = 6
 
     def get_n_eq(self):
@@ -928,17 +983,36 @@ def initialise(self, MBdict_entry, ieq, print_info=True):
         self.node_number = MBdict_entry['node_in_body']
         self.node_body = MBdict_entry['body']
         self.FoR_body = MBdict_entry['body_FoR']
-        self.rot_vect = MBdict_entry['rot_vect']
+        self.rel_posB = MBdict_entry['rel_posB']
         self._ieq = ieq
         self.indep = []
         self.scalingFactor = set_value_or_default(MBdict_entry, "scalingFactor", 1.)
         self.penaltyFactor = set_value_or_default(MBdict_entry, "penaltyFactor", 0.)
 
-        # self.static_constraint = fully_constrained_node_FoR()
-        # self.static_constraint.initialise(MBdict_entry, ieq)
+        self.rot_axisB = ag.unit_vector(MBdict_entry['rot_vect'])
+        if (self.rot_axisB[[1, 2]]  == 0).all():
+            self.rot_dir = 'x'
+            self.zero_comp = np.array([1, 2], dtype=int)
+            self.nonzero_comp = 0
+        elif (self.rot_axisB[[0, 2]]  == 0).all():
+            self.rot_dir = 'y'
+            self.zero_comp = np.array([0, 2], dtype=int)
+            self.nonzero_comp = 1
+        elif (self.rot_axisB[[0, 1]]  == 0).all():
+            self.rot_dir = 'z'
+            self.zero_comp = np.array([0, 1], dtype=int)
+            self.nonzero_comp = 2
+        else:
+            raise NotImplementedError("Hinges should be parallel to the xB, yB or zB of the reference node")
+        self.set_rot_vel(MBdict_entry['rot_vect'][self.nonzero_comp])
 
         return self._ieq + self._n_eq
 
+
+    def set_rot_vel(self, rot_vel):
+        self.rot_vel = rot_vel
+
+
     def staticmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
                 sys_size, dt, Lambda, Lambda_dot):
         return
@@ -954,29 +1028,121 @@ def dynamicmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
 
         # Define the equations
         # ieq =  equal_pos_node_FoR(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q)
-        ieq = equal_lin_vel_node_FoR(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q)
-        ieq = def_rot_vect_FoR_wrt_node(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.rot_vect, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q)
-        # ieq = def_rot_axis_FoR_wrt_node(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.rot_axisB, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q, self.indep)
-        # ieq = def_rot_vel_FoR_wrt_node(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.rot_axisB, self.rot_vel, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q)
+        ieq = equal_lin_vel_node_FoR(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q, rel_posB=self.rel_posB)
+        # ieq = def_rot_vect_FoR_wrt_node(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.rot_vect, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q)
+        ieq = def_rot_axis_FoR_wrt_node_xyz(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.rot_axisB, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q, self.zero_comp)
+        ieq = def_rot_vel_mod_FoR_wrt_node(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.nonzero_comp, self.rot_vel, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q)
         return
 
     def staticpost(self, lc_list, MB_beam, MB_tstep):
         return
 
     def dynamicpost(self, lc_list, MB_beam, MB_tstep):
-        MB_tstep[self.FoR_body].for_pos[0:3] = np.dot(MB_tstep[self.node_body].cga(), MB_tstep[self.node_body].pos[self.node_number,:]) + MB_tstep[self.node_body].for_pos[0:3]
 
         ielem, inode_in_elem = MB_beam[self.node_body].node_master_elem[self.node_number]
         node_cga = MB_tstep[self.node_body].cga()
-        cab = ag.crv2rotation(MB_tstep[self.node_body].psi[ielem,inode_in_elem,:])
+        cab = ag.crv2rotation(MB_tstep[self.node_body].psi[ielem, inode_in_elem, :])
+
+        MB_tstep[self.FoR_body].for_pos[0:3] = (np.dot(node_cga,
+                                                       MB_tstep[self.node_body].pos[self.node_number,:] + np.dot(cab, self.rel_posB)) +
+                                                MB_tstep[self.node_body].for_pos[0:3])
+        return
+
+
+@lagrangeconstraint
+class hinge_node_FoR_pitch(BaseLagrangeConstraint):
+    __doc__ = """
+    hinge_node_FoR_pitch
+
+    This constraint forces a hinge behaviour between a node and a FoR and
+    a rotation velocity at the joint
+
+    See ``LagrangeConstraints`` for the description of variables
+
+    Attributes:
+        node_number (int): number of the "node" within its own body
+        node_body (int): body number of the "node"
+        FoR_body (int): body number of the "FoR"
+        rot_vect (np.ndarray): Rotation velocity vector in the node B FoR
+        rel_posB (np.ndarray): Relative position between the node and the frame of reference in the node B FoR
+    """
+    _lc_id = 'hinge_node_FoR_pitch'
+
+    def __init__(self):
+        self.required_parameters = ['node_in_body', 'body', 'body_FoR', 'rotor_vel', 'rel_posB']
+        self._n_eq = 6
+
+    def get_n_eq(self):
+        return self._n_eq
+
+    def initialise(self, MBdict_entry, ieq, print_info=True):
+
+        self.node_number = MBdict_entry['node_in_body']
+        self.node_body = MBdict_entry['body']
+        self.FoR_body = MBdict_entry['body_FoR']
+        self.rel_posB = MBdict_entry['rel_posB']
+        self._ieq = ieq
+        self.indep = []
+        self.scalingFactor = set_value_or_default(MBdict_entry, "scalingFactor", 1.)
+        self.penaltyFactor = set_value_or_default(MBdict_entry, "penaltyFactor", 0.)
+
+        self.set_rotor_vel(MBdict_entry['rotor_vel'])
+        pitch_vel = set_value_or_default(MBdict_entry, "pitch_vel", 0.)
+        self.set_pitch_vel(pitch_vel)
+
+        return self._ieq + self._n_eq
+
+
+    def set_rotor_vel(self, rotor_vel):
+        self.rotor_vel = rotor_vel
+
+
+    def set_pitch_vel(self, pitch_vel):
+        self.pitch_vel = pitch_vel
+
+
+    def staticmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
+                sys_size, dt, Lambda, Lambda_dot):
+        return
+
+    def dynamicmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
+                sys_size, dt, Lambda, Lambda_dot):
+
+        # Define the position of the first degree of freedom associated to the node
+        node_dof = define_node_dof(MB_beam, self.node_body, self.node_number)
+        node_FoR_dof = define_FoR_dof(MB_beam, self.node_body)
+        FoR_dof = define_FoR_dof(MB_beam, self.FoR_body)
+        ieq = self._ieq
+
+        # Compute relative velocity
+        ielem, inode_in_elem = MB_beam[self.node_body].node_master_elem[self.node_number]
+        node_cga = MB_tstep[self.node_body].cga()
+        cab = ag.crv2rotation(MB_tstep[self.node_body].psi[ielem, inode_in_elem, :])
         FoR_cga = MB_tstep[self.FoR_body].cga()
 
-        rot_vect_A = ag.multiply_matrices(FoR_cga.T,
-                                         node_cga,
-                                         cab,
-                                         self.rot_vect)
+        # rel_vel in B FoR
+        rel_vel = np.array([0., 0., self.rotor_vel])
+        rel_vel += ag.multiply_matrices(cab.T, node_cga.T, FoR_cga,
+                                        np.array([self.pitch_vel, 0., 0.]))
+
+        # Define the equations
+        ieq = equal_lin_vel_node_FoR(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q, rel_posB=self.rel_posB)
+        ieq = rel_rot_vel_node_FoR(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q, rel_vel=rel_vel)
+        return
+
+    def staticpost(self, lc_list, MB_beam, MB_tstep):
+        return
+
+    def dynamicpost(self, lc_list, MB_beam, MB_tstep):
+
+        ielem, inode_in_elem = MB_beam[self.node_body].node_master_elem[self.node_number]
+        node_cga = MB_tstep[self.node_body].cga()
+        cab = ag.crv2rotation(MB_tstep[self.node_body].psi[ielem, inode_in_elem, :])
+
+        MB_tstep[self.FoR_body].for_pos[0:3] = (np.dot(node_cga,
+                                                       MB_tstep[self.node_body].pos[self.node_number,:] + np.dot(cab, self.rel_posB)) +
+                                                MB_tstep[self.node_body].for_pos[0:3])
 
-        MB_tstep[self.FoR_body].for_vel[3:6] = rot_vect_A.copy()
         return
 
 
@@ -1350,7 +1516,7 @@ class fully_constrained_node_FoR(BaseLagrangeConstraint):
     _lc_id = 'fully_constrained_node_FoR'
 
     def __init__(self):
-        self.required_parameters = ['node_in_body', 'body', 'body_FoR']
+        self.required_parameters = ['node_in_body', 'body', 'body_FoR', 'rel_posB']
         self._n_eq = 6
 
     def get_n_eq(self):
@@ -1358,10 +1524,11 @@ def get_n_eq(self):
 
     def initialise(self, MBdict_entry, ieq, print_info=True):
 
-        cout.cout_wrap("WARNING: do not use fully_constrained_node_FoR. It is outdated. Definetly not working if 'body' has velocity", 3)
+        # cout.cout_wrap("WARNING: do not use fully_constrained_node_FoR. It is outdated. Definetly not working if 'body' has velocity", 3)
         self.node_number = MBdict_entry['node_in_body']
         self.node_body = MBdict_entry['body']
         self.FoR_body = MBdict_entry['body_FoR']
+        self.rel_posB = MBdict_entry['rel_posB']
         self._ieq = ieq
         self.scalingFactor = set_value_or_default(MBdict_entry, "scalingFactor", 1.)
         self.penaltyFactor = set_value_or_default(MBdict_entry, "penaltyFactor", 0.)
@@ -1374,47 +1541,30 @@ def staticmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
 
     def dynamicmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
                 sys_size, dt, Lambda, Lambda_dot):
-        num_LM_eq_specific = self._n_eq
-        Bnh = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
-        B = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order = 'F')
 
+        # Define the position of the first degree of freedom associated to the node
         node_dof = define_node_dof(MB_beam, self.node_body, self.node_number)
+        node_FoR_dof = define_FoR_dof(MB_beam, self.node_body)
         FoR_dof = define_FoR_dof(MB_beam, self.FoR_body)
         ieq = self._ieq
 
-        # Option with non holonomic constraints
-        # BC for linear velocities
-        Bnh[:3, node_dof:node_dof+3] = -1.0*np.eye(3)
-        quat = ag.quat_bound(MB_tstep[self.FoR_body].quat)
-        Bnh[:3, FoR_dof:FoR_dof+3] = ag.quat2rotation(quat)
-
-        # BC for angular velocities
-        Bnh[3:6,FoR_dof+3:FoR_dof+6] = -1.0*ag.quat2rotation(quat)
-        ielem, inode_in_elem = MB_beam[0].node_master_elem[self.node_number]
-        Bnh[3:6,node_dof+3:node_dof+6] = ag.crv2tan(MB_tstep[0].psi[ielem, inode_in_elem, :])
-
-        LM_C[sys_size+ieq:sys_size+ieq+num_LM_eq_specific,:sys_size] += self.scalingFactor*Bnh
-        LM_C[:sys_size,sys_size+ieq:sys_size+ieq+num_LM_eq_specific] += self.scalingFactor*np.transpose(Bnh)
-
-        LM_Q[:sys_size] += self.scalingFactor*np.dot(np.transpose(Bnh),Lambda_dot[ieq:ieq+num_LM_eq_specific])
-        LM_Q[sys_size+ieq:sys_size+ieq+3] += -self.scalingFactor*MB_tstep[0].pos_dot[-1,:] + np.dot(ag.quat2rotation(quat),MB_tstep[1].for_vel[0:3])
-        LM_Q[sys_size+ieq+3:sys_size+ieq+6] += self.scalingFactor*(np.dot(ag.crv2tan(MB_tstep[0].psi[ielem, inode_in_elem, :]),MB_tstep[0].psi_dot[ielem, inode_in_elem, :]) -
-                                      np.dot(ag.quat2rotation(quat), MB_tstep[self.FoR_body].for_vel[3:6]))
-
-        #LM_K[FoR_dof:FoR_dof+3,FoR_dof+6:FoR_dof+10] = ag.der_CquatT_by_v(MB_tstep[body_FoR].quat,Lambda_dot)
-        LM_C[FoR_dof:FoR_dof+3,FoR_dof+6:FoR_dof+10] += self.scalingFactor*ag.der_CquatT_by_v(quat,Lambda_dot[ieq:ieq+3])
-        LM_C[FoR_dof+3:FoR_dof+6,FoR_dof+6:FoR_dof+10] -= self.scalingFactor*ag.der_CquatT_by_v(quat,Lambda_dot[ieq+3:ieq+6])
-
-        LM_K[node_dof+3:node_dof+6,node_dof+3:node_dof+6] += self.scalingFactor*ag.der_TanT_by_xv(MB_tstep[0].psi[ielem, inode_in_elem, :],Lambda_dot[ieq+3:ieq+6])
+        # Define the equations
+        ieq = equal_lin_vel_node_FoR(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q, rel_posB=self.rel_posB)
+        ieq = rel_rot_vel_node_FoR(MB_tstep, MB_beam, self.FoR_body, self.node_body, self.node_number, node_FoR_dof, node_dof, FoR_dof, sys_size, Lambda_dot, self.scalingFactor, self.penaltyFactor, ieq, LM_K, LM_C, LM_Q, rel_vel=np.zeros((3)))
 
-        ieq += 6
         return
 
     def staticpost(self, lc_list, MB_beam, MB_tstep):
         return
 
     def dynamicpost(self, lc_list, MB_beam, MB_tstep):
-        # MB_tstep[self.FoR_body].for_pos[0:3] = np.dot(ag.quat2rotation(MB_tstep[self.node_body].quat), MB_tstep[self.node_body].pos[self.node_number,:]) + MB_tstep[self.node_body].for_pos[0:3]
+        ielem, inode_in_elem = MB_beam[self.node_body].node_master_elem[self.node_number]
+        node_cga = MB_tstep[self.node_body].cga()
+        cab = ag.crv2rotation(MB_tstep[self.node_body].psi[ielem, inode_in_elem, :])
+
+        MB_tstep[self.FoR_body].for_pos[0:3] = (np.dot(node_cga,
+                                                       MB_tstep[self.node_body].pos[self.node_number,:] + np.dot(cab, self.rel_posB)) +
+                                                MB_tstep[self.node_body].for_pos[0:3])
         return
 
 
@@ -1543,6 +1693,85 @@ def staticpost(self, lc_list, MB_beam, MB_tstep):
     def dynamicpost(self, lc_list, MB_beam, MB_tstep):
         return
 
+
+@lagrangeconstraint
+class zero_lin_vel_sine_rot_vel_FoR(BaseLagrangeConstraint):
+    __doc__ = """
+    zero_lin_vel_sine_rot_vel_FoR
+
+    Zero linear velocity and sinusoidal rotation velocity FoR
+
+    See ``LagrangeConstraints`` for the description of variables
+
+    Attributes:
+        FoR_body (int): body number of the "FoR"
+        vel_amp (float): Rotation velocity amplitude
+        omega (float): Frequency of the sinusoidally-varying rotation velocity
+        xyz (string): Axis with the sine velocity
+    """
+    _lc_id = 'zero_lin_vel_sine_rot_vel_FoR'
+
+    def __init__(self):
+        self.required_parameters = ['FoR_body', 'vel_amp', 'omega', 'xyz']
+        self._n_eq = 6
+
+    def get_n_eq(self):
+        return self._n_eq
+
+    def initialise(self, MBdict_entry, ieq, print_info=True):
+
+        self.FoR_body = MBdict_entry['FoR_body']
+        self.vel_amp = MBdict_entry['vel_amp']
+        self.omega = MBdict_entry['omega']
+        if MBdict_entry['xyz'] == 'x':
+            self.xyz_index = 0
+        elif MBdict_entry['xyz'] == 'y':
+            self.xyz_index = 1
+        elif MBdict_entry['xyz'] == 'z':
+            self.xyz_index = 2
+        else:
+            raise NotImplementedError("FoR rotation velocity shouldd be parallel to x, y or z")
+        self._ieq = ieq
+        self.scalingFactor = set_value_or_default(MBdict_entry, "scalingFactor", 1.)
+        self.penaltyFactor = set_value_or_default(MBdict_entry, "penaltyFactor", 0.)
+
+        return self._ieq + self._n_eq
+
+    def staticmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
+                sys_size, dt, Lambda, Lambda_dot):
+        return
+
+    def dynamicmat(self, LM_C, LM_K, LM_Q, MB_beam, MB_tstep, ts, num_LM_eq,
+                sys_size, dt, Lambda, Lambda_dot):
+        num_LM_eq_specific = self._n_eq
+        Bnh = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order='F')
+        B = np.zeros((num_LM_eq_specific, sys_size), dtype=ct.c_double, order='F')
+
+        # Define the position of the first degree of freedom associated to the FoR
+        FoR_dof = define_FoR_dof(MB_beam, self.FoR_body)
+        ieq = self._ieq
+
+        vel = np.zeros((6))
+        vel[3 + self.xyz_index] = self.vel_amp*np.sin(self.omega*ts*dt)
+
+        Bnh[:num_LM_eq_specific, FoR_dof:FoR_dof+6] = np.eye(6)
+
+        LM_C[sys_size + ieq:sys_size + ieq + num_LM_eq_specific, :sys_size] += self.scalingFactor * Bnh
+        LM_C[:sys_size, sys_size + ieq:sys_size + ieq + num_LM_eq_specific] += self.scalingFactor * np.transpose(Bnh)
+
+        LM_Q[:sys_size] += self.scalingFactor * np.dot(np.transpose(Bnh), Lambda_dot[ieq:ieq + num_LM_eq_specific])
+        LM_Q[sys_size + ieq:sys_size + ieq + num_LM_eq_specific] += self.scalingFactor*(MB_tstep[self.FoR_body].for_vel - vel)
+
+        ieq += 6
+        return
+
+    def staticpost(self, lc_list, MB_beam, MB_tstep):
+        return
+
+    def dynamicpost(self, lc_list, MB_beam, MB_tstep):
+        return
+
+
 @lagrangeconstraint
 class lin_vel_node_wrtA(BaseLagrangeConstraint):
     __doc__ = """
@@ -1754,7 +1983,11 @@ def initialize_constraints(MBdict):
     # Read the dictionary and create the constraints
     for iconstraint in range(num_constraints):
         lc_list.append(lc_from_string(MBdict["constraint_%02d" % iconstraint]['behaviour'])())
-        index_eq = lc_list[-1].initialise(MBdict["constraint_%02d" % iconstraint], index_eq)
+        MBdict_entry = MBdict["constraint_%02d" % iconstraint]
+        if "penaltyFactor" in MBdict_entry.keys():
+            if not MBdict_entry['penaltyFactor'] == 0.:
+                raise NotImplementedError("Penalty method not completely implemented for Lagrange Constraints")
+        index_eq = lc_list[-1].initialise(MBdict_entry, index_eq)
 
     return lc_list
 
diff --git a/sharpy/structure/utils/xbeamlib.py b/sharpy/structure/utils/xbeamlib.py
index 82fa113b8..98dd73100 100644
--- a/sharpy/structure/utils/xbeamlib.py
+++ b/sharpy/structure/utils/xbeamlib.py
@@ -386,6 +386,9 @@ def xbeam_solv_couplednlndyn(beam, settings):
     xbopts.gravity_dir_y = ct.c_double(settings['gravity_dir'][1])
     xbopts.gravity_dir_z = ct.c_double(settings['gravity_dir'][2])
     xbopts.relaxation_factor = ct.c_double(settings['relaxation_factor'])
+    xbopts.gravity_dir_x = ct.c_double(settings['gravity_dir'][0])
+    xbopts.gravity_dir_y = ct.c_double(settings['gravity_dir'][1])
+    xbopts.gravity_dir_z = ct.c_double(settings['gravity_dir'][2])
 
     pos_def_history = np.zeros((n_tsteps.value, beam.num_node, 3), order='F', dtype=ct.c_double)
     pos_dot_def_history = np.zeros((n_tsteps.value, beam.num_node, 3), order='F', dtype=ct.c_double)
diff --git a/sharpy/utils/algebra.py b/sharpy/utils/algebra.py
index ade9174e1..f6dff6254 100644
--- a/sharpy/utils/algebra.py
+++ b/sharpy/utils/algebra.py
@@ -921,9 +921,9 @@ def quat2euler(quat):
     if np.abs(delta) > 0.9 * 0.5:
         warn('Warning, approaching singularity. Delta {:.3f} for singularity at Delta=0.5'.format(np.abs(delta)))
 
-    yaw = np.arctan(2*(q0*q3+q1*q2)/(1-2*(q2**2+q3**2)))
+    yaw = np.arctan2(2*(q0*q3+q1*q2), (1-2*(q2**2+q3**2)))
     pitch = np.arcsin(2*delta)
-    roll = np.arctan(2*(q0*q1+q2*q3)/(1-2*(q1**2+q2**2)))
+    roll = np.arctan2(2*(q0*q1+q2*q3), (1-2*(q1**2+q2**2)))
 
     return np.array([roll, pitch, yaw])
 
diff --git a/sharpy/utils/control_utils.py b/sharpy/utils/control_utils.py
index 7ec48b334..c6d29536b 100644
--- a/sharpy/utils/control_utils.py
+++ b/sharpy/utils/control_utils.py
@@ -61,9 +61,14 @@ def __init__(self, gain_p, gain_i, gain_d, dt):
 
         self._n_calls = 0
 
+        self._anti_windup_lim = None
+
     def set_point(self, point):
         self._point = point
 
+    def set_anti_windup_lim(self, lim):
+        self._anti_windup_lim = lim
+
     def reset_integrator(self):
         self._accumulated_integral = 0.0
 
@@ -88,11 +93,23 @@ def __call__(self, state):
         detailed[2] = derivative*self._kd
 
         # Integral gain
-        self._accumulated_integral += error*self._dt
-        if self._accumulated_integral < self._integral_limits[0]:
-            self._accumulated_integral = self._integral_limits[0]
-        elif self._accumulated_integral > self._integral_limits[1]:
-            self._accumulated_integral = self._integral_limits[1]
+        aux_acc_int = self._accumulated_integral + error*self._dt
+        if aux_acc_int < self._integral_limits[0]:
+            aux_acc_int = self._integral_limits[0]
+        elif aux_acc_int > self._integral_limits[1]:
+            aux_acc_int = self._integral_limits[1]
+
+        if self._anti_windup_lim is not None:
+            # Apply anti wind up
+            aux_actuation = actuation + aux_acc_int*self._ki
+            if ((aux_actuation > self._anti_windup_lim[0]) and
+                (aux_actuation < self._anti_windup_lim[1])):
+                # Within limits
+                self._accumulated_integral = aux_acc_int
+                # If the system exceeds the limits, this 
+                # will not be added to the self._accumulated_integral
+        else:
+            self._accumulated_integral = aux_acc_int
 
         actuation += self._accumulated_integral*self._ki
         detailed[1] = self._accumulated_integral*self._ki
diff --git a/sharpy/utils/controller_interface.py b/sharpy/utils/controller_interface.py
index b382ed2eb..401ec0c77 100644
--- a/sharpy/utils/controller_interface.py
+++ b/sharpy/utils/controller_interface.py
@@ -25,7 +25,10 @@ def print_available_controllers():
 
 
 class BaseController(metaclass=ABCMeta):
-    pass
+    
+    def teardown(self):
+        pass
+
 
 def controller_from_string(string):
     return dict_of_controllers[string]
@@ -47,17 +50,18 @@ def controller_list_from_path(cwd):
     return files
 
 
-def initialise_controller(controller_name):
-    cout.cout_wrap('Generating an instance of %s' % controller_name, 2)
+def initialise_controller(controller_name, print_info=True):
+    if print_info:
+        cout.cout_wrap('Generating an instance of %s' % controller_name, 2)
     cls_type = controller_from_string(controller_name)
     controller = cls_type()
     return controller
 
-def dictionary_of_controllers():
+def dictionary_of_controllers(print_info=True):
     import sharpy.controllers
     dictionary = dict()
     for controller in dict_of_controllers:
-        init_controller = initialise_controller(controller)
+        init_controller = initialise_controller(controller, print_info=print_info)
         dictionary[controller] = init_controller.settings_default
 
     return dictionary
diff --git a/sharpy/utils/datastructures.py b/sharpy/utils/datastructures.py
index c3c5408fe..57b0156fe 100644
--- a/sharpy/utils/datastructures.py
+++ b/sharpy/utils/datastructures.py
@@ -501,7 +501,9 @@ class StructTimeStepInfo(object):
           ``[num_nodes x 6]``. Expressed in B FoR
         unsteady_applied_forces (np.ndarray): Forces applied to the structure associated to time derivatives
           ``[num_node x 6]``. Expressed in B FoR
-        runtime_generated_forces (np.ndarray): Forces generated at runtime through runtime generators
+        runtime_steady_forces (np.ndarray): Steady forces generated at runtime through runtime generators
+          ``[num_node x 6]``. Expressed in B FoR
+        runtime_unsteady_forces (np.ndarray): Unsteady forces generated at runtime through runtime generators
           ``[num_node x 6]``. Expressed in B FoR
         gravity_forces (np.ndarray): Gravity forces at nodes ``[num_node x 6]``. Expressed in A FoR
 
@@ -515,6 +517,8 @@ class StructTimeStepInfo(object):
         postproc_cell (dict): Variables associated to cells to be postprocessed
         postproc_node (dict): Variables associated to nodes to be postprocessed
 
+        psi_local (np.ndarray): Cartesian Rotation Vector for each node in each element in local FoR
+        psi_dot_local (np.ndarray): Time derivative of ``psi`` in the local FoR
         mb_FoR_pos (np.ndarray): Position of the local A FoR of each body ``[num_bodies x 6]``
         mb_FoR_vel (np.ndarray): Velocity of the local A FoR of each body ``[num_bodies x 6]``
         mb_FoR_acc (np.ndarray): Acceleration of the local A FoR of each body ``[num_bodies x 6]``
@@ -550,7 +554,8 @@ def __init__(self, num_node, num_elem, num_node_elem=3, num_dof=None, num_bodies
 
         self.steady_applied_forces = np.zeros((self.num_node, 6), dtype=ct.c_double, order='F')
         self.unsteady_applied_forces = np.zeros((self.num_node, 6), dtype=ct.c_double, order='F')
-        self.runtime_generated_forces = np.zeros((self.num_node, 6), dtype=ct.c_double, order='F')
+        self.runtime_steady_forces = np.zeros((self.num_node, 6), dtype=ct.c_double, order='F')
+        self.runtime_unsteady_forces = np.zeros((self.num_node, 6), dtype=ct.c_double, order='F')
         self.gravity_forces = np.zeros((self.num_node, 6), dtype=ct.c_double, order='F')
         self.total_gravity_forces = np.zeros((6,), dtype=ct.c_double, order='F')
         self.total_forces = np.zeros((6,), dtype=ct.c_double, order='F')
@@ -566,6 +571,8 @@ def __init__(self, num_node, num_elem, num_node_elem=3, num_dof=None, num_bodies
         self.postproc_node = dict()
 
         # Multibody
+        self.psi_local = np.zeros((self.num_elem, num_node_elem, 3), dtype=ct.c_double, order='F')
+        self.psi_dot_local = np.zeros((self.num_elem, num_node_elem, 3), dtype=ct.c_double, order='F')
         self.mb_FoR_pos = np.zeros((num_bodies,6), dtype=ct.c_double, order='F')
         self.mb_FoR_vel = np.zeros((num_bodies,6), dtype=ct.c_double, order='F')
         self.mb_FoR_acc = np.zeros((num_bodies,6), dtype=ct.c_double, order='F')
@@ -605,7 +612,8 @@ def copy(self):
 
         copied.steady_applied_forces = self.steady_applied_forces.astype(dtype=ct.c_double, order='F', copy=True)
         copied.unsteady_applied_forces = self.unsteady_applied_forces.astype(dtype=ct.c_double, order='F', copy=True)
-        copied.runtime_generated_forces = self.runtime_generated_forces.astype(dtype=ct.c_double, order='F', copy=True)
+        copied.runtime_steady_forces = self.runtime_steady_forces.astype(dtype=ct.c_double, order='F', copy=True)
+        copied.runtime_unsteady_forces = self.runtime_unsteady_forces.astype(dtype=ct.c_double, order='F', copy=True)
         copied.gravity_forces = self.gravity_forces.astype(dtype=ct.c_double, order='F', copy=True)
         copied.total_gravity_forces = self.total_gravity_forces.astype(dtype=ct.c_double, order='F', copy=True)
         copied.total_forces = self.total_forces.astype(dtype=ct.c_double, order='F', copy=True)
@@ -617,7 +625,8 @@ def copy(self):
         copied.postproc_cell = copy.deepcopy(self.postproc_cell)
         copied.postproc_node = copy.deepcopy(self.postproc_node)
 
-        #if not self.mb_quat is None:
+        copied.psi_local = self.psi_local.astype(dtype=ct.c_double, order='F', copy=True)
+        copied.psi_dot_local = self.psi_dot_local.astype(dtype=ct.c_double, order='F', copy=True)
         copied.mb_FoR_pos = self.mb_FoR_pos.astype(dtype=ct.c_double, order='F', copy=True)
         copied.mb_FoR_vel = self.mb_FoR_vel.astype(dtype=ct.c_double, order='F', copy=True)
         copied.mb_FoR_acc = self.mb_FoR_acc.astype(dtype=ct.c_double, order='F', copy=True)
@@ -701,12 +710,15 @@ def get_body(self, beam, num_dof_ibody, ibody):
         ibody_StructTimeStepInfo.pos_ddot = self.pos_ddot[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
 
         ibody_StructTimeStepInfo.psi = self.psi[ibody_elems,:,:].astype(dtype=ct.c_double, order='F', copy=True)
+        ibody_StructTimeStepInfo.psi_local = self.psi_local[ibody_elems,:,:].astype(dtype=ct.c_double, order='F', copy=True)
         ibody_StructTimeStepInfo.psi_dot = self.psi_dot[ibody_elems,:,:].astype(dtype=ct.c_double, order='F', copy=True)
+        ibody_StructTimeStepInfo.psi_dot_local = self.psi_dot_local[ibody_elems,:,:].astype(dtype=ct.c_double, order='F', copy=True)
         ibody_StructTimeStepInfo.psi_ddot = self.psi_ddot[ibody_elems,:,:].astype(dtype=ct.c_double, order='F', copy=True)
 
         ibody_StructTimeStepInfo.steady_applied_forces = self.steady_applied_forces[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
         ibody_StructTimeStepInfo.unsteady_applied_forces = self.unsteady_applied_forces[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
-        ibody_StructTimeStepInfo.runtime_generated_forces = self.runtime_generated_forces[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
+        ibody_StructTimeStepInfo.runtime_steady_forces = self.runtime_steady_forces[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
+        ibody_StructTimeStepInfo.runtime_unsteady_forces = self.runtime_unsteady_forces[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
         ibody_StructTimeStepInfo.gravity_forces = self.gravity_forces[ibody_nodes,:].astype(dtype=ct.c_double, order='F', copy=True)
         ibody_StructTimeStepInfo.total_gravity_forces = self.total_gravity_forces.astype(dtype=ct.c_double, order='F', copy=True)
 
@@ -727,11 +739,11 @@ def get_body(self, beam, num_dof_ibody, ibody):
 
         return ibody_StructTimeStepInfo
 
-    def change_to_local_AFoR(self, for0_pos, for0_vel, quat0):
+    def compute_psi_local_AFoR(self, for0_pos, for0_vel, quat0):
         """
-        change_to_local_AFoR
+        compute_psi_local_AFoR
 
-        Reference a :class:`~sharpy.utils.datastructures.StructTimeStepInfo` to the local A frame of reference
+        Compute psi and psi_dot in the local A frame of reference
 
         Args:
             for0_pos (np.ndarray): Position of the global A FoR
@@ -744,36 +756,16 @@ def change_to_local_AFoR(self, for0_pos, for0_vel, quat0):
         CGAmaster = algebra.quat2rotation(quat0)
         Csm = np.dot(CAslaveG, CGAmaster)
 
-        delta_vel_ms = np.zeros((6,))
-        delta_pos_ms = self.for_pos[0:3] - for0_pos[0:3]
-        delta_vel_ms[0:3] = np.dot(CAslaveG.T, self.for_vel[0:3]) - np.dot(CGAmaster, for0_vel[0:3])
-        delta_vel_ms[3:6] = np.dot(CAslaveG.T, self.for_vel[3:6]) - np.dot(CGAmaster, for0_vel[3:6])
-
-        # Modify position
-        for inode in range(self.pos.shape[0]):
-            pos_previous = self.pos[inode,:] + np.zeros((3,),)
-            self.pos[inode,:] = np.dot(Csm,self.pos[inode,:]) - np.dot(CAslaveG,delta_pos_ms[0:3])
-            # self.pos_dot[inode,:] = np.dot(Csm,self.pos_dot[inode,:]) - np.dot(CAslaveG,delta_vel_ms[0:3])
-            self.pos_dot[inode,:] = (np.dot(Csm, self.pos_dot[inode,:]) -
-                                    np.dot(CAslaveG, delta_vel_ms[0:3]) -
-                                    np.dot(algebra.skew(np.dot( CAslaveG, self.for_vel[3:6])), self.pos[inode,:]) +
-                                    np.dot(Csm, np.dot(algebra.skew(np.dot(CGAmaster.T, for0_vel[3:6])), pos_previous)))
-
-            self.gravity_forces[inode,0:3] = np.dot(Csm, self.gravity_forces[inode,0:3])
-            self.gravity_forces[inode,3:6] = np.dot(Csm, self.gravity_forces[inode,3:6])
-
-        # Modify local rotations
         for ielem in range(self.psi.shape[0]):
             for inode in range(3):
-                psi_previous = self.psi[ielem,inode,:] + np.zeros((3,),)
-                self.psi[ielem,inode,:] = algebra.rotation2crv(np.dot(Csm,algebra.crv2rotation(self.psi[ielem,inode,:])))
-                self.psi_dot[ielem, inode, :] = np.dot(np.dot(algebra.crv2tan(self.psi[ielem,inode,:]),Csm),
-                                                    (np.dot(algebra.crv2tan(psi_previous).T,self.psi_dot[ielem,inode,:]) - np.dot(CGAmaster.T,delta_vel_ms[3:6])))
-
+                self.psi_local[ielem, inode, :] = algebra.rotation2crv(np.dot(Csm,algebra.crv2rotation(self.psi[ielem,inode,:])))
+                self.psi_dot_local[ielem, inode, :] = np.zeros((3))
 
-    def change_to_global_AFoR(self, for0_pos, for0_vel, quat0):
+    def change_to_local_AFoR(self, for0_pos, for0_vel, quat0):
         """
-        Reference a :class:`~sharpy.utils.datastructures.StructTimeStepInfo` to the global A frame of reference
+        change_to_local_AFoR
+
+        Reference a :class:`~sharpy.utils.datastructures.StructTimeStepInfo` to the local A frame of reference
 
         Args:
             for0_pos (np.ndarray): Position of the global A FoR
@@ -786,113 +778,243 @@ def change_to_global_AFoR(self, for0_pos, for0_vel, quat0):
         CGAmaster = algebra.quat2rotation(quat0)
         Csm = np.dot(CAslaveG, CGAmaster)
 
-        delta_vel_ms = np.zeros((6,))
-        delta_pos_ms = self.for_pos[0:3] - for0_pos[0:3]
-        delta_vel_ms[0:3] = np.dot(CAslaveG.T, self.for_vel[0:3]) - np.dot(CGAmaster, for0_vel[0:3])
-        delta_vel_ms[3:6] = np.dot(CAslaveG.T, self.for_vel[3:6]) - np.dot(CGAmaster, for0_vel[3:6])
-
+        # Modify position
         for inode in range(self.pos.shape[0]):
-            pos_previous = self.pos[inode,:] + np.zeros((3,),)
-            self.pos[inode,:] = (np.dot(np.transpose(Csm),self.pos[inode,:]) +
-                                np.dot(np.transpose(CGAmaster),delta_pos_ms[0:3]))
-            self.pos_dot[inode,:] = (np.dot(np.transpose(Csm),self.pos_dot[inode,:]) +
-                                    np.dot(np.transpose(CGAmaster),delta_vel_ms[0:3]) +
-                                    np.dot(Csm.T, np.dot(algebra.skew(np.dot(CAslaveG, self.for_vel[3:6])), pos_previous)) -
-                                    np.dot(algebra.skew(np.dot(CGAmaster.T, for0_vel[3:6])), self.pos[inode,:]))
-            self.gravity_forces[inode,0:3] = np.dot(Csm.T, self.gravity_forces[inode,0:3])
-            self.gravity_forces[inode,3:6] = np.dot(Csm.T, self.gravity_forces[inode,3:6])
-                                    # np.cross(np.dot(CGAmaster.T, delta_vel_ms[3:6]), pos_previous))
+            vel_master = (self.pos_dot[inode,:] +
+                          for0_vel[0:3] +
+                          algebra.cross3(for0_vel[3:6], self.pos[inode, :]))
+            self.pos[inode, :] = np.dot(Csm,self.pos[inode,:]) + np.dot(CAslaveG, for0_pos[0:3] - self.for_pos[0:3])
+            self.pos_dot[inode, :] = (np.dot(Csm, vel_master) -
+                                     self.for_vel[0:3] -
+                                     algebra.cross3(self.for_vel[3:6], self.pos[inode,:]))
 
+            self.gravity_forces[inode, 0:3] = np.dot(Csm, self.gravity_forces[inode, 0:3])
+            self.gravity_forces[inode, 3:6] = np.dot(Csm, self.gravity_forces[inode, 3:6])
+
+        # Modify local rotations
         for ielem in range(self.psi.shape[0]):
             for inode in range(3):
-                psi_previous = self.psi[ielem,inode,:] + np.zeros((3,),)
-                self.psi[ielem,inode,:] = algebra.rotation2crv(np.dot(Csm.T, algebra.crv2rotation(self.psi[ielem,inode,:])))
-                self.psi_dot[ielem, inode, :] = np.dot(algebra.crv2tan(self.psi[ielem,inode,:]),
-                                                (np.dot(Csm.T, np.dot(algebra.crv2tan(psi_previous).T, self.psi_dot[ielem, inode, :])) +
-                                                np.dot(algebra.quat2rotation(quat0).T, delta_vel_ms[3:6])))
+                # psi_master = self.psi[ielem, inode, :] + np.zeros((3,),)
+                # self.psi[ielem, inode, :] = np.dot(Csm, self.psi[ielem, inode, :])
+                # self.psi_dot[ielem, inode, :] = (np.dot(Csm, self.psi_dot[ielem, inode, :] + algebra.cross3(for0_vel[3:6], psi_master)) -
+                #                                  algebra.multiply_matrices(CAslaveG, algebra.skew(self.for_vel[3:6]), CGAmaster, psi_master))
+
+                # psi_master = self.psi[ielem,inode,:] + np.zeros((3,),)
+                # self.psi[ielem, inode, :] = algebra.rotation2crv(np.dot(Csm,algebra.crv2rotation(self.psi[ielem,inode,:])))
+                # psi_slave = self.psi[ielem, inode, :] + np.zeros((3,),)
+                # cbam = algebra.crv2rotation(psi_master).T
+                # cbas = algebra.crv2rotation(psi_slave).T
+                # tm = algebra.crv2tan(psi_master)
+                # inv_ts = np.linalg.inv(algebra.crv2tan(psi_slave))
+
+                # self.psi_dot[ielem, inode, :] = np.dot(inv_ts, (np.dot(tm, self.psi_dot[ielem, inode, :]) +
+                #                                                 np.dot(cbam, for0_vel[3:6]) -
+                #                                                 np.dot(cbas, self.for_vel[3:6])))
+                self.psi[ielem, inode, :] = self.psi_local[ielem,inode,:].copy()
+                self.psi_dot[ielem, inode, :] = self.psi_dot_local[ielem, inode, :].copy()
 
 
-    def whole_structure_to_local_AFoR(self, beam):
+    def change_to_global_AFoR(self, for0_pos, for0_vel, quat0):
         """
-        Same as change_to_local_AFoR but for a multibody structure
+        Reference a :class:`~sharpy.utils.datastructures.StructTimeStepInfo` to the global A frame of reference
 
         Args:
-            beam(sharpy.structure.models.beam.Beam): Beam structure of ``PreSharpy``
+            for0_pos (np.ndarray): Position of the global A FoR
+            for0_vel (np.ndarray): Velocity of the global A FoR
+            quat0 (np.ndarray): Quaternion of the global A FoR
         """
-        if not self.in_global_AFoR:
-            raise NotImplementedError("Wrong managing of FoR")
 
-        self.in_global_AFoR = False
-        quat0 = self.quat.astype(dtype=ct.c_double, order='F', copy=True)
-        for0_pos = self.for_pos.astype(dtype=ct.c_double, order='F', copy=True)
-        for0_vel = self.for_vel.astype(dtype=ct.c_double, order='F', copy=True)
-
-        MB_beam = [None]*beam.num_bodies
-        MB_tstep = [None]*beam.num_bodies
-
-        for ibody in range(beam.num_bodies):
-            MB_beam[ibody] = beam.get_body(ibody = ibody)
-            MB_tstep[ibody] = self.get_body(beam, MB_beam[ibody].num_dof, ibody = ibody)
-            MB_tstep[ibody].change_to_local_AFoR(for0_pos, for0_vel, quat0)
-
-        first_dof = 0
-        for ibody in range(beam.num_bodies):
-            # Renaming for clarity
-            ibody_elems = MB_beam[ibody].global_elems_num
-            ibody_nodes = MB_beam[ibody].global_nodes_num
-
-            # Merge tstep
-            self.pos[ibody_nodes,:] = MB_tstep[ibody].pos.astype(dtype=ct.c_double, order='F', copy=True)
-            self.psi[ibody_elems,:,:] = MB_tstep[ibody].psi.astype(dtype=ct.c_double, order='F', copy=True)
-            self.gravity_forces[ibody_nodes,:] = MB_tstep[ibody].gravity_forces.astype(dtype=ct.c_double, order='F', copy=True)
+        # Define the rotation matrices between the different FoR
+        CGAslave = algebra.quat2rotation(self.quat)
+        CAmasterG = algebra.quat2rotation(quat0).T
+        Cms = np.dot(CAmasterG, CGAslave)
 
-            self.pos_dot[ibody_nodes,:] = MB_tstep[ibody].pos_dot.astype(dtype=ct.c_double, order='F', copy=True)
-            self.psi_dot[ibody_elems,:,:] = MB_tstep[ibody].psi_dot.astype(dtype=ct.c_double, order='F', copy=True)
+        for inode in range(self.pos.shape[0]):
+            vel_slave = (self.pos_dot[inode, :] +
+                         self.for_vel[0:3] +
+                         algebra.cross3(self.for_vel[3:6], self.pos[inode, :]))
+            self.pos[inode, :] = np.dot(Cms, self.pos[inode,:]) + np.dot(CAmasterG, self.for_pos[0:3] - for0_pos[0:3])
+            self.pos_dot[inode, :] = (np.dot(Cms, vel_slave) -
+                                      for0_vel[0:3] -
+                                      algebra.cross3(for0_vel[3:6], self.pos[inode, :]))
 
-            # TODO: Do I need a change in FoR for the following variables? Maybe for the FoR ones.
-            # tstep.forces_constraints_nodes[ibody_nodes,:] = MB_tstep[ibody].forces_constraints_nodes.astype(dtype=ct.c_double, order='F', copy=True)
-            # tstep.forces_constraints_FoR[ibody, :] = MB_tstep[ibody].forces_constraints_FoR[ibody, :].astype(dtype=ct.c_double, order='F', copy=True)
+            self.gravity_forces[inode, 0:3] = np.dot(Cms, self.gravity_forces[inode, 0:3])
+            self.gravity_forces[inode, 3:6] = np.dot(Cms, self.gravity_forces[inode, 3:6])
 
-    def whole_structure_to_global_AFoR(self, beam):
+        for ielem in range(self.psi.shape[0]):
+            for inode in range(3):
+                # psi_slave = self.psi[ielem,inode,:] + np.zeros((3,),)
+                # self.psi[ielem, inode, :] = np.dot(Cms, self.psi[ielem, inode, :])
+                # self.psi_dot[ielem, inode, :] = (np.dot(Cms, self.psi_dot[ielem, inode, :] + algebra.cross3(self.for_vel[3:6], psi_slave)) -
+                #                                  algebra.multiply_matrices(CAmasterG, algebra.skew(self.for0_vel[3:6]), CGAslave, psi_slave))
+
+
+                self.psi_local[ielem, inode, :] = self.psi[ielem, inode, :].copy() # Copy here the result from the structural computation
+                self.psi_dot_local[ielem, inode, :] = self.psi_dot[ielem, inode, :].copy() # Copy here the result from the structural computation
+
+                # psi_slave = self.psi[ielem, inode, :] + np.zeros((3,),)
+                self.psi[ielem, inode, :] = algebra.rotation2crv(np.dot(Cms,algebra.crv2rotation(self.psi[ielem,inode,:])))
+
+                # Convert psi_dot_local to psi_dot to be used by the rest of the code
+                psi_master = self.psi[ielem,inode,:] + np.zeros((3,),)
+                cbam = algebra.crv2rotation(psi_master).T
+                cbas = algebra.crv2rotation(self.psi_local[ielem, inode, :]).T
+                ts = algebra.crv2tan(self.psi_local[ielem, inode, :])
+                inv_tm = np.linalg.inv(algebra.crv2tan(psi_master))
+
+                self.psi_dot[ielem, inode, :] = np.dot(inv_tm, (np.dot(ts, self.psi_dot_local[ielem, inode, :]) +
+                                                                np.dot(cbas, self.for_vel[3:6]) -
+                                                                np.dot(cbam, for0_vel[3:6])))
+
+    # def whole_structure_to_local_AFoR(self, beam, compute_psi_local=False):
+    #     """
+    #     Same as change_to_local_AFoR but for a multibody structure
+    #
+    #     Args:
+    #         beam(sharpy.structure.models.beam.Beam): Beam structure of ``PreSharpy``
+    #     """
+    #     if not self.in_global_AFoR:
+    #         raise NotImplementedError("Wrong managing of FoR")
+    #
+    #     self.in_global_AFoR = False
+    #     quat0 = self.quat.astype(dtype=ct.c_double, order='F', copy=True)
+    #     for0_pos = self.for_pos.astype(dtype=ct.c_double, order='F', copy=True)
+    #     for0_vel = self.for_vel.astype(dtype=ct.c_double, order='F', copy=True)
+    #
+    #     MB_beam = [None]*beam.num_bodies
+    #     MB_tstep = [None]*beam.num_bodies
+    #
+    #     for ibody in range(beam.num_bodies):
+    #         MB_beam[ibody] = beam.get_body(ibody = ibody)
+    #         MB_tstep[ibody] = self.get_body(beam, MB_beam[ibody].num_dof, ibody = ibody)
+    #         if compute_psi_local:
+    #             MB_tstep[ibody].compute_psi_local_AFoR(for0_pos, for0_vel, quat0)
+    #         MB_tstep[ibody].change_to_local_AFoR(for0_pos, for0_vel, quat0)
+    #
+    #     first_dof = 0
+    #     for ibody in range(beam.num_bodies):
+    #         # Renaming for clarity
+    #         ibody_elems = MB_beam[ibody].global_elems_num
+    #         ibody_nodes = MB_beam[ibody].global_nodes_num
+    #
+    #         # Merge tstep
+    #         self.pos[ibody_nodes,:] = MB_tstep[ibody].pos.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi[ibody_elems,:,:] = MB_tstep[ibody].psi.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi_local[ibody_elems,:,:] = MB_tstep[ibody].psi_local.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.gravity_forces[ibody_nodes,:] = MB_tstep[ibody].gravity_forces.astype(dtype=ct.c_double, order='F', copy=True)
+    #
+    #         self.pos_dot[ibody_nodes,:] = MB_tstep[ibody].pos_dot.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi_dot[ibody_elems,:,:] = MB_tstep[ibody].psi_dot.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi_dot_local[ibody_elems,:,:] = MB_tstep[ibody].psi_dot_local.astype(dtype=ct.c_double, order='F', copy=True)
+    #
+    #         # TODO: Do I need a change in FoR for the following variables? Maybe for the FoR ones.
+    #         # tstep.forces_constraints_nodes[ibody_nodes,:] = MB_tstep[ibody].forces_constraints_nodes.astype(dtype=ct.c_double, order='F', copy=True)
+    #         # tstep.forces_constraints_FoR[ibody, :] = MB_tstep[ibody].forces_constraints_FoR[ibody, :].astype(dtype=ct.c_double, order='F', copy=True)
+
+    # def whole_structure_to_global_AFoR(self, beam):
+    #     """
+    #     Same as change_to_global_AFoR but for a multibody structure
+    #
+    #     Args:
+    #         beam(sharpy.structure.models.beam.Beam): Beam structure of ``PreSharpy``
+    #     """
+    #     if self.in_global_AFoR:
+    #         raise NotImplementedError("Wrong managing of FoR")
+    #
+    #     self.in_global_AFoR = True
+    #
+    #     MB_beam = [None]*beam.num_bodies
+    #     MB_tstep = [None]*beam.num_bodies
+    #     quat0 = self.quat.astype(dtype=ct.c_double, order='F', copy=True)
+    #     for0_pos = self.for_pos.astype(dtype=ct.c_double, order='F', copy=True)
+    #     for0_vel = self.for_vel.astype(dtype=ct.c_double, order='F', copy=True)
+    #
+    #     for ibody in range(beam.num_bodies):
+    #         MB_beam[ibody] = beam.get_body(ibody = ibody)
+    #         MB_tstep[ibody] = self.get_body(beam, MB_beam[ibody].num_dof, ibody = ibody)
+    #         MB_tstep[ibody].change_to_global_AFoR(for0_pos, for0_vel, quat0)
+    #
+    #
+    #     first_dof = 0
+    #     for ibody in range(beam.num_bodies):
+    #         # Renaming for clarity
+    #         ibody_elems = MB_beam[ibody].global_elems_num
+    #         ibody_nodes = MB_beam[ibody].global_nodes_num
+    #
+    #         # Merge tstep
+    #         self.pos[ibody_nodes,:] = MB_tstep[ibody].pos.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi[ibody_elems,:,:] = MB_tstep[ibody].psi.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi_local[ibody_elems,:,:] = MB_tstep[ibody].psi_local.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.gravity_forces[ibody_nodes,:] = MB_tstep[ibody].gravity_forces.astype(dtype=ct.c_double, order='F',
+    #                                                                                    copy=True)
+    #
+    #         self.pos_dot[ibody_nodes,:] = MB_tstep[ibody].pos_dot.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi_dot[ibody_elems,:,:] = MB_tstep[ibody].psi_dot.astype(dtype=ct.c_double, order='F', copy=True)
+    #         self.psi_dot_local[ibody_elems,:,:] = MB_tstep[ibody].psi_dot_local.astype(dtype=ct.c_double, order='F', copy=True)
+
+
+    def nodal_b_for_2_a_for(self, nodal, beam, filter=np.array([True]*6), ibody=None):
         """
-        Same as change_to_global_AFoR but for a multibody structure
+        Projects a nodal variable from the local, body-attached frame (B) to the reference A frame.
 
         Args:
-            beam(sharpy.structure.models.beam.Beam): Beam structure of ``PreSharpy``
-        """
-        if self.in_global_AFoR:
-            raise NotImplementedError("Wrong managing of FoR")
-
-        self.in_global_AFoR = True
-
-        MB_beam = [None]*beam.num_bodies
-        MB_tstep = [None]*beam.num_bodies
-        quat0 = self.quat.astype(dtype=ct.c_double, order='F', copy=True)
-        for0_pos = self.for_pos.astype(dtype=ct.c_double, order='F', copy=True)
-        for0_vel = self.for_vel.astype(dtype=ct.c_double, order='F', copy=True)
-
-        for ibody in range(beam.num_bodies):
-            MB_beam[ibody] = beam.get_body(ibody = ibody)
-            MB_tstep[ibody] = self.get_body(beam, MB_beam[ibody].num_dof, ibody = ibody)
-            MB_tstep[ibody].change_to_global_AFoR(for0_pos, for0_vel, quat0)
-
-
-        first_dof = 0
-        for ibody in range(beam.num_bodies):
-            # Renaming for clarity
-            ibody_elems = MB_beam[ibody].global_elems_num
-            ibody_nodes = MB_beam[ibody].global_nodes_num
-
-            # Merge tstep
-            self.pos[ibody_nodes,:] = MB_tstep[ibody].pos.astype(dtype=ct.c_double, order='F', copy=True)
-            # tstep.pos_dot[ibody_nodes,:] = MB_tstep[ibody].pos_dot.astype(dtype=ct.c_double, order='F', copy=True)
-            self.psi[ibody_elems,:,:] = MB_tstep[ibody].psi.astype(dtype=ct.c_double, order='F', copy=True)
-            self.gravity_forces[ibody_nodes,:] = MB_tstep[ibody].gravity_forces.astype(dtype=ct.c_double, order='F',
-                                                                                       copy=True)
-            
-            self.pos_dot[ibody_nodes,:] = MB_tstep[ibody].pos_dot.astype(dtype=ct.c_double, order='F', copy=True)
-            self.psi_dot[ibody_elems,:,:] = MB_tstep[ibody].psi_dot.astype(dtype=ct.c_double, order='F', copy=True)
+            nodal (np.array): Nodal variable of size ``(num_node, 6)``
+            beam (sharpy.datastructures.StructTimeStepInfo): beam info.
+            filter (np.array): optional argument that filters and does not convert a specific degree of
+              freedom. Defaults to ``np.array([True, True, True, True, True, True])``.
 
+        Returns:
+            np.array: the ``nodal`` argument projected onto the reference ``A`` frame.
+        """
+        nodal_a = np.zeros_like(nodal)
+        for i_node in range(self.num_node):
+            # get master elem and i_local_node
+            i_master_elem, i_local_node = beam.node_master_elem[i_node, :]
+            if ((ibody is None) or (beam.body_number[i_master_elem] == ibody)):
+                crv = self.psi[i_master_elem, i_local_node, :]
+                cab = algebra.crv2rotation(crv)
+                nodal_a[i_node, 0:3] = np.dot(cab, nodal[i_node, 0:3])
+                nodal_a[i_node, 3:6] = np.dot(cab, nodal[i_node, 3:6])
+                nodal_a *= filter
+
+        return nodal_a
+
+    def nodal_type_b_for_2_a_for(self, beam,
+                            force_type=['steady', 'unsteady'],
+                            filter=np.array([True]*6),
+                            ibody=None):
+        forces_output = []
+        for ft in force_type:
+            if ft == 'steady':
+                fb = self.steady_applied_forces
+            elif ft == 'unsteady':
+                fb = self.unsteady_applied_forces
+
+            forces_output.append(self.nodal_b_for_2_a_for(fb, beam, filter=filter, ibody=ibody))
+
+        return forces_output
+
+
+    def extract_resultants(self, beam, force_type=['steady', 'unsteady', 'grav'], ibody=None):
+
+        forces_output = []
+        for ft in force_type:
+            totals = np.zeros((6))
+            if ft == 'steady':
+                fa = self.nodal_type_b_for_2_a_for(beam, force_type=['steady'], ibody=ibody)[0]
+            elif ft == 'grav':
+                fa = self.gravity_forces.copy()
+            elif ft == 'unsteady':
+                fa = self.nodal_type_b_for_2_a_for(beam, force_type=['unsteady'], ibody=ibody)[0]
+
+            for i_node in range(beam.num_node):
+                totals += fa[i_node, :]
+                totals[3:6] += algebra.cross3(self.pos[i_node, :],
+                                              fa[i_node, 0:3])
+
+            forces_output.append(totals)
+
+        return forces_output
 
 class LinearTimeStepInfo(object):
     """
diff --git a/sharpy/utils/generate_cases.py b/sharpy/utils/generate_cases.py
index 9d36be63f..b2b5c74c1 100644
--- a/sharpy/utils/generate_cases.py
+++ b/sharpy/utils/generate_cases.py
@@ -28,6 +28,7 @@
 import sharpy.utils.algebra as algebra
 import sharpy.utils.solver_interface as solver_interface
 import sharpy.utils.generator_interface as generator_interface
+import sharpy.utils.controller_interface as controller_interface
 import sharpy.structure.utils.lagrangeconstraints as lagrangeconstraints
 import sharpy.utils.cout_utils as cout
 
@@ -314,6 +315,29 @@ def list_methods(class_instance, print_info=True, clean=True):
     return list
 
 
+def set_variable_dict(dictionary, variable, set_value):
+
+    if variable in dictionary:
+        dictionary[variable] = set_value
+
+    for key, value in dictionary.items():
+        if isinstance(value, dict):
+            set_variable_dict(value, variable, set_value)
+
+
+def define_or_concatenate(variable, value, axis=0):
+    """
+    if variable is None, value is assigned
+    If variable is an array, value is concatenated along axis
+    """
+    if variable is None:
+        variable = value
+    else:
+        variable = np.concatenate((variable, value), axis=axis)
+    
+    return variable
+
+
 ######################################################################
 ###############  STRUCTURAL INFORMATION  #############################
 ######################################################################
@@ -827,6 +851,38 @@ def generate_uniform_beam(self,
         self.boundary_conditions = np.zeros((self.num_node), dtype=int)
 
 
+    def add_lumped_mass(self, node, mass=None, inertia=None, pos=None, mat=None):
+        """
+        Add lumped mass to structure
+        
+        node(int): Node where the lumped mass is to be placed
+
+        For lumped masses:
+        mass(float): Mass
+        inertia(np.array): 3x3 inertia matrix
+        pos(np.array): 3 coordinates of the mass position
+        
+        For lumped masses described as a 6x6 matrix:
+        mat(np.array): 6x6 mass and inertia matrix
+        """
+
+        if (mass is not None) and (inertia is not None):
+            if pos is None:
+                pos = np.zeros((3))
+            if mat is not None:
+                raise ValueError("mass, inertia and mat cannot be defined at the same time")
+
+            self.lumped_mass_nodes = define_or_concatenate(self.lumped_mass_nodes, np.array([node]), axis=0)
+            self.lumped_mass = define_or_concatenate(self.lumped_mass, np.array([mass]), axis=0)
+            self.lumped_mass_inertia = define_or_concatenate(self.lumped_mass_inertia, np.array([inertia]), axis=0)
+            self.lumped_mass_position = define_or_concatenate(self.lumped_mass_position, np.array([pos]), axis=0)
+
+        elif (mat is not None):
+            
+            self.lumped_mass_mat_nodes = define_or_concatenate(self.lumped_mass_mat_nodes, np.array([node]), axis=0)
+            self.lumped_mass_mat = define_or_concatenate(self.lumped_mass_mat, np.array([mat]), axis=0)
+
+
     def assembly_structures(self, *args):
         """
         assembly_structures
@@ -1006,6 +1062,7 @@ def __init__(self):
         # self.control_surface_chord = None
         # self.control_surface_hinge_coords = None
         self.polars = None
+        self.first_twist = [None]
 
     def copy(self):
         """
@@ -1031,6 +1088,7 @@ def copy(self):
         copied.user_defined_m_distribution = self.user_defined_m_distribution.copy()
         if self.polars is not None:
             copied.polars = self.polars.copy()
+        copied.first_twist = self.first_twist.copy()
 
         return copied
 
@@ -1063,6 +1121,7 @@ def set_to_zero(self, num_node_elem, num_node, num_elem,
         self.airfoils = np.zeros((num_airfoils, num_points_camber, 2), dtype=float)
         for iairfoil in range(num_airfoils):
             self.airfoils[iairfoil, :, 0] = np.linspace(0.0, 1.0, num_points_camber)
+        self.first_twist = [True]
 
     def generate_full_aerodynamics(self,
                                    aero_node,
@@ -1074,7 +1133,8 @@ def generate_full_aerodynamics(self,
                                    m_distribution,
                                    elastic_axis,
                                    airfoil_distribution,
-                                   airfoils):
+                                   airfoils,
+                                   first_twist):
         """
         generate_full_aerodynamics
 
@@ -1091,6 +1151,7 @@ def generate_full_aerodynamics(self,
             elastic_axis (np.array): position of the elastic axis in the chord
             airfoil_distribution (np.array): airfoil at each element node
             airfoils (np.array): coordinates of the camber lines of the airfoils
+            first_twist (list(bool)): Apply the twist rotation before the sweep
         """
 
         self.aero_node = aero_node
@@ -1103,6 +1164,7 @@ def generate_full_aerodynamics(self,
         self.elastic_axis = elastic_axis
         self.airfoil_distribution = airfoil_distribution
         self.airfoils = airfoils
+        self.first_twist = first_twist
 
     def create_aerodynamics_from_vec(self,
                                      StructuralInformation,
@@ -1116,7 +1178,8 @@ def create_aerodynamics_from_vec(self,
                                      vec_elastic_axis,
                                      vec_airfoil_distribution,
                                      airfoils,
-                                     user_defined_m_distribution=None):
+                                     user_defined_m_distribution=None,
+                                     first_twist=True):
         """
         create_aerodynamics_from_vec
 
@@ -1134,6 +1197,7 @@ def create_aerodynamics_from_vec(self,
             vec_elastic_axis (np.array): position of the elastic axis in the chord
             vec_airfoil_distribution (np.array): airfoil at each element node
             airfoils (np.array): coordinates of the camber lines of the airfoils
+            first_twist (bool): Apply the twist rotation before the sweep
         """
         self.aero_node = vec_aero_node
 
@@ -1154,6 +1218,8 @@ def create_aerodynamics_from_vec(self,
             udmd_by_elements = from_node_array_to_elem_matrix(user_defined_m_distribution, StructuralInformation.connectivities)
             self.user_defined_m_distribution = [udmd_by_elements]
 
+        self.first_twist = [first_twist]
+
     def create_one_uniform_aerodynamics(self,
                                      StructuralInformation,
                                      chord,
@@ -1163,7 +1229,8 @@ def create_one_uniform_aerodynamics(self,
                                      m_distribution,
                                      elastic_axis,
                                      num_points_camber,
-                                     airfoil):
+                                     airfoil,
+                                     first_twist=True):
         """
         create_one_uniform_aerodynamics
 
@@ -1179,6 +1246,7 @@ def create_one_uniform_aerodynamics(self,
             elastic_axis (float): position of the elastic axis in the chord
             num_points_camber (int): Number of points to define the camber line
             airfoils (np.array): coordinates of the camber lines of the airfoils
+            first_twist (bool): Apply the twist rotation before the sweep
         """
         num_node = StructuralInformation.num_node
         num_node_elem = StructuralInformation.num_node_elem
@@ -1202,6 +1270,8 @@ def create_one_uniform_aerodynamics(self,
             self.user_defined_m_distribution = []
             self.user_defined_m_distribution.append(np.zeros((num_chord_panels + 1, num_elem, num_node_elem)))
 
+        self.first_twist = [first_twist]
+
     def change_airfoils_discretezation(self, airfoils, new_num_nodes):
         """
         change_airfoils_discretezation
@@ -1277,6 +1347,7 @@ def assembly_aerodynamics(self, *args):
             # total_num_surfaces += len(aerodynamics_to_add.surface_m)
             total_num_surfaces += np.sum(aerodynamics_to_add.surface_m != -1)
 
+            self.first_twist.extend(aerodynamics_to_add.first_twist)
         # self.num_airfoils = total_num_airfoils
         # self.num_surfaces = total_num_surfaces
 
@@ -1415,6 +1486,8 @@ def generate_aero_file(self, route, case_name, StructuralInformation):
             h5file.create_dataset('elastic_axis', data=self.elastic_axis)
             h5file.create_dataset('airfoil_distribution', data=self.airfoil_distribution)
             h5file.create_dataset('sweep', data=self.sweep)
+           
+            h5file.create_dataset('first_twist', data=np.array(self.first_twist))
 
             airfoils_group = h5file.create_group('airfoils')
             for iairfoil in range(len(self.airfoils)):
@@ -1685,39 +1758,17 @@ def set_default_values(self):
         """
 
         self.solvers = dict()
-        # cout.start_writer()
-        aux_names = solver_interface.dictionary_of_solvers(print_info=False)
-        # cout.finish_writer()
-        aux_names.update(generator_interface.dictionary_of_generators(print_info=False))
+        aux_solvers = solver_interface.dictionary_of_solvers(print_info=False)
+        aux_solvers.update(generator_interface.dictionary_of_generators(print_info=False))
+        aux_solvers.update(controller_interface.dictionary_of_controllers(print_info=False))
 
-        # TODO: I am sure this can be done in a better way
-        for solver in aux_names:
+        for solver in aux_solvers:
             if solver == 'PreSharpy':
                 solver_name = 'SHARPy'
             else:
                 solver_name = solver
-            self.solvers[solver_name] = {}
-            try:
-                aux_solver = solver_interface.solver_from_string(solver)
-            except:
-                aux_solver = generator_interface.generator_from_string(solver)
-                # TODO: remove this try/except when generators are rewriten as solvers with class attributes instead of instance attributes
-                aux_solver.__init__(aux_solver)
-
-            if aux_solver.settings_default == {}:
-                aux_solver.__init__(aux_solver)
-
-            for key, value in aux_solver.settings_default.items():
-                self.solvers[solver_name][key] = deepcopy(value)
-
-        # # MAIN
-        # self.solvers['SHARPy'] = {'flow': '',
-        #                           'case': 'default_case_name',
-        #                           'route': '',
-        #                           'write_screen': 'on',
-        #                           'write_log': 'off',
-        #                           'log_folder': './output',
-        #                           'log_file': 'log'}
+            self.solvers[solver_name] = deepcopy(aux_solvers[solver])
+            
 
     def check(self):
 
@@ -1729,6 +1780,7 @@ def check(self):
                 if key not in default.solvers[solver]:
                     raise RuntimeError(("solver '%s' has no key named '%s'" % (solver, key)))
 
+
     def define_num_steps(self, num_steps):
         """
         define_num_steps
@@ -1739,44 +1791,12 @@ def define_num_steps(self, num_steps):
             num_steps (int): number of steps
         """
 
-        solver_names = solver_interface.dictionary_of_solvers(print_info=False)
-        for solver in solver_names:
-            if not solver == 'PreSharpy':
-                if 'n_time_steps' in self.solvers[solver]:
-                    self.solvers[solver]['n_time_steps'] = num_steps
-                if 'num_steps' in self.solvers[solver]:
-                    self.solvers[solver]['num_steps'] = num_steps
-
-        # TODO:Maybe it would be convenient to use the same name for all the solvers
-        # try:
-        #     self.solvers["DynamicCoupled"]['n_time_steps'] = num_steps
-        # except KeyError:
-        #     pass
-        # # self.solvers["DynamicPrescribedCoupled"]['n_time_steps'] = num_steps
-        # try:
-        #     self.solvers["StepUvlm"]['n_time_steps'] = num_steps
-        # except KeyError:
-        #     pass
-        # try:
-        #     self.solvers['NonLinearDynamicMultibody']['num_steps'] = num_steps
-        # except KeyError:
-        #     pass
-        # try:
-        #     self.solvers['NonLinearDynamicCoupledStep']['num_steps'] = num_steps
-        # except KeyError:
-        #     pass
-        # try:
-        #     self.solvers['NonLinearDynamicPrescribedStep']['num_steps'] = num_steps
-        # except KeyError:
-        #     pass
-        # try:
-        #     self.solvers['RigidDynamicPrescribedStep']['num_steps'] = num_steps
-        # except KeyError:
-        #     pass
-        # try:
-        #     self.solvers['SteadyHelicoidalWake']['n_time_steps'] = num_steps
-        # except KeyError:
-        #     pass
+        for solver in self.solvers:
+            if 'n_time_steps' in self.solvers[solver]:
+                self.solvers[solver]['n_time_steps'] = num_steps
+            if 'num_steps' in self.solvers[solver]:
+                self.solvers[solver]['num_steps'] = num_steps
+
 
     def define_uinf(self, unit_vector, norm):
         """
@@ -1802,7 +1822,8 @@ def define_uinf(self, unit_vector, norm):
         # self.solvers['StepUvlm']['velocity_field_input'] = {'u_inf': norm,
         #                                                     'u_inf_direction': unit_vector}
 
-    def set_variable_all_dicts(self, variable, value):
+
+    def set_variable_all_dicts(self, variable, set_value):
         """
         set_variable_all_dicts
 
@@ -1810,11 +1831,9 @@ def set_variable_all_dicts(self, variable, value):
 
         Args:
             variable (str): variable name
-            value ( ): value
+            set_value ( ): value
         """
-        for solver in self.solvers:
-            if variable in self.solvers[solver]:
-                self.solvers[solver][variable] = value
+        set_variable_dict(self.solvers, variable, set_value)
 
     def generate_solver_file(self):
         """
diff --git a/sharpy/utils/generator_interface.py b/sharpy/utils/generator_interface.py
index 717dae296..9d2ab7555 100644
--- a/sharpy/utils/generator_interface.py
+++ b/sharpy/utils/generator_interface.py
@@ -28,7 +28,10 @@ def print_available_generators():
 
 
 class BaseGenerator(metaclass=ABCMeta):
-    pass
+    
+    def teardown(self):
+        pass
+
 
 def generator_from_string(string):
     return dict_of_generators[string]
diff --git a/sharpy/utils/h5utils.py b/sharpy/utils/h5utils.py
index 2adbd0631..927af014c 100644
--- a/sharpy/utils/h5utils.py
+++ b/sharpy/utils/h5utils.py
@@ -161,7 +161,13 @@ def read_group(Grp):
             Hinst = list(Grp['_as_array'][()])
         else:
             N = len(MainLev) - 1
-            for nn in range(N):
+            list_ts = MainLev.copy()
+            list_ts.remove('_read_as')
+            list_ts = np.sort(np.unique(np.array(list_ts, dtype=np.int)))
+            if len(list_ts > 0):
+                for nn in range(list_ts[0] - 1):
+                    Hinst.append('NoneType')
+            for nn in list_ts:
                 name = '%.5d' % nn
                 ### extract value
                 if type(Grp[name]) is h5._hl.group.Group:
diff --git a/sharpy/utils/multibody.py b/sharpy/utils/multibody.py
index d6eaa6113..6aa43f66f 100644
--- a/sharpy/utils/multibody.py
+++ b/sharpy/utils/multibody.py
@@ -33,6 +33,14 @@ def split_multibody(beam, tstep, mb_data_dict, ts):
     MB_beam = []
     MB_tstep = []
 
+    quat0 = tstep.quat.astype(dtype=ct.c_double, order='F', copy=True)
+    for0_pos = tstep.for_pos.astype(dtype=ct.c_double, order='F', copy=True)
+    for0_vel = tstep.for_vel.astype(dtype=ct.c_double, order='F', copy=True)
+
+    ini_quat0 = beam.ini_info.quat.astype(dtype=ct.c_double, order='F', copy=True)
+    ini_for0_pos = beam.ini_info.for_pos.astype(dtype=ct.c_double, order='F', copy=True)
+    ini_for0_vel = beam.ini_info.for_vel.astype(dtype=ct.c_double, order='F', copy=True)
+
     for ibody in range(beam.num_bodies):
         ibody_beam = None
         ibody_tstep = None
@@ -41,13 +49,11 @@ def split_multibody(beam, tstep, mb_data_dict, ts):
 
         ibody_beam.FoR_movement = mb_data_dict['body_%02d' % ibody]['FoR_movement']
 
+        ibody_beam.ini_info.compute_psi_local_AFoR(ini_for0_pos, ini_for0_vel, ini_quat0)
+        ibody_beam.ini_info.change_to_local_AFoR(ini_for0_pos, ini_for0_vel, ini_quat0)
         if ts == 1:
-            ibody_beam.ini_info.pos_dot *= 0
-            ibody_beam.timestep_info.pos_dot *= 0
-            ibody_tstep.pos_dot *= 0
-            ibody_beam.ini_info.psi_dot *= 0
-            ibody_beam.timestep_info.psi_dot *= 0
-            ibody_tstep.psi_dot *= 0
+            ibody_tstep.compute_psi_local_AFoR(for0_pos, for0_vel, quat0)
+        ibody_tstep.change_to_local_AFoR(for0_pos, for0_vel, quat0)
 
         MB_beam.append(ibody_beam)
         MB_tstep.append(ibody_tstep)
@@ -77,6 +83,13 @@ def merge_multibody(MB_tstep, MB_beam, beam, tstep, mb_data_dict, dt):
 
     update_mb_dB_before_merge(tstep, MB_tstep)
 
+    quat0 = MB_tstep[0].quat.astype(dtype=ct.c_double, order='F', copy=True)
+    for0_pos = MB_tstep[0].for_pos.astype(dtype=ct.c_double, order='F', copy=True)
+    for0_vel = MB_tstep[0].for_vel.astype(dtype=ct.c_double, order='F', copy=True)
+
+    for ibody in range(beam.num_bodies):
+        MB_tstep[ibody].change_to_global_AFoR(for0_pos, for0_vel, quat0)
+
     first_dof = 0
     for ibody in range(beam.num_bodies):
         # Renaming for clarity
@@ -88,11 +101,16 @@ def merge_multibody(MB_tstep, MB_beam, beam, tstep, mb_data_dict, dt):
         tstep.pos_dot[ibody_nodes,:] = MB_tstep[ibody].pos_dot.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.pos_ddot[ibody_nodes,:] = MB_tstep[ibody].pos_ddot.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.psi[ibody_elems,:,:] = MB_tstep[ibody].psi.astype(dtype=ct.c_double, order='F', copy=True)
+        tstep.psi_local[ibody_elems,:,:] = MB_tstep[ibody].psi_local.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.psi_dot[ibody_elems,:,:] = MB_tstep[ibody].psi_dot.astype(dtype=ct.c_double, order='F', copy=True)
+        tstep.psi_dot_local[ibody_elems,:,:] = MB_tstep[ibody].psi_dot_local.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.psi_ddot[ibody_elems,:,:] = MB_tstep[ibody].psi_ddot.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.gravity_forces[ibody_nodes,:] = MB_tstep[ibody].gravity_forces.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.steady_applied_forces[ibody_nodes,:] = MB_tstep[ibody].steady_applied_forces.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.unsteady_applied_forces[ibody_nodes,:] = MB_tstep[ibody].unsteady_applied_forces.astype(dtype=ct.c_double, order='F', copy=True)
+        tstep.runtime_steady_forces[ibody_nodes,:] = MB_tstep[ibody].runtime_steady_forces.astype(dtype=ct.c_double, order='F', copy=True)
+        tstep.runtime_unsteady_forces[ibody_nodes,:] = MB_tstep[ibody].runtime_unsteady_forces.astype(dtype=ct.c_double, order='F', copy=True)
+        # TODO: Do I need a change in FoR for the following variables? Maybe for the FoR ones.
         tstep.forces_constraints_nodes[ibody_nodes,:] = MB_tstep[ibody].forces_constraints_nodes.astype(dtype=ct.c_double, order='F', copy=True)
         tstep.forces_constraints_FoR[ibody, :] = MB_tstep[ibody].forces_constraints_FoR[ibody, :].astype(dtype=ct.c_double, order='F', copy=True)
 
@@ -149,7 +167,7 @@ def disp_and_accel2state(MB_beam, MB_tstep, Lambda, Lambda_dot, sys_size, num_LM
         MB_tstep (list(:class:`~sharpy.utils.datastructures.StructTimeStepInfo`)): each entry represents a body
         Lambda(np.ndarray): Lagrange multipliers of holonomic constraints
         Lambda_dot(np.ndarray): Lagrange multipliers of non-holonomic constraints
-    
+
         sys_size(int): number of degrees of freedom of the system of equations not accounting for lagrange multipliers
         num_LM_eq(int): Number of equations associated to the Lagrange Multipliers
 
@@ -183,8 +201,9 @@ def disp_and_accel2state(MB_beam, MB_tstep, Lambda, Lambda_dot, sys_size, num_LM
             dqddt[first_dof+ibody_num_dof+6:first_dof+ibody_num_dof+10]=dquatdt.astype(dtype=ct.c_double, order='F', copy=True)
             first_dof += ibody_num_dof + 10
 
-    q[first_dof:] = Lambda.astype(dtype=ct.c_double, order='F', copy=True)
-    dqdt[first_dof:] = Lambda_dot.astype(dtype=ct.c_double, order='F', copy=True)
+    if num_LM_eq > 0:
+        q[first_dof:] = Lambda.astype(dtype=ct.c_double, order='F', copy=True)
+        dqdt[first_dof:] = Lambda_dot.astype(dtype=ct.c_double, order='F', copy=True)
 
     return q, dqdt, dqddt
 
@@ -202,9 +221,9 @@ def state2disp_and_accel(q, dqdt, dqddt, MB_beam, MB_tstep, num_LM_eq):
         q(np.ndarray): Vector of states
     	dqdt(np.ndarray): Time derivatives of states
         dqddt(np.ndarray): Second time derivatives of states
-        
+
         num_LM_eq(int): Number of equations associated to the Lagrange Multipliers
-        
+
         Lambda(np.ndarray): Lagrange multipliers of holonomic constraints
         Lambda_dot(np.ndarray): Lagrange multipliers of non-holonomic constraints
 
@@ -255,8 +274,8 @@ def get_elems_nodes_list(beam, ibody):
             ibody_nodes (list): List of nodes that belong the ``ibody``
 
     """
-    int_list = np.arange(0, beam.num_elem, 1)
+    int_list = np.arange(beam.num_elem)
     ibody_elements = int_list[beam.body_number == ibody]
-    ibody_nodes = list(set(beam.connectivities[ibody_elements, :].reshape(-1)))
+    ibody_nodes = np.sort(np.unique(beam.connectivities[ibody_elements, :].reshape(-1)))
 
     return ibody_elements, ibody_nodes
diff --git a/sharpy/utils/settings.py b/sharpy/utils/settings.py
index 140a1c494..cdab4a4da 100644
--- a/sharpy/utils/settings.py
+++ b/sharpy/utils/settings.py
@@ -439,3 +439,12 @@ def setting_line_format(self):
         for i_field in range(self.n_fields):
             string += '{0[' + str(i_field) + ']:<' + str(self.field_length[i_field]) + '}'
         return string
+
+
+def set_value_or_default(dictionary, key, default_val):
+    try:
+        value = dictionary[key]
+    except KeyError:
+        value = default_val
+    return value
+
diff --git a/sharpy/utils/solver_interface.py b/sharpy/utils/solver_interface.py
index 898e4b70b..db6ecc762 100644
--- a/sharpy/utils/solver_interface.py
+++ b/sharpy/utils/solver_interface.py
@@ -46,12 +46,12 @@ def solver_id(self):
 
     # The input is a ProblemData class structure
     @abstractmethod
-    def initialise(self, data):
+    def initialise(self, data, restart=False):
         pass
 
     # This executes the solver
     @abstractmethod
-    def run(self):
+    def run(self, **kwargs):
         pass
 
     # @property
@@ -62,6 +62,9 @@ def __doc__(self):
         _doc += settings_table.generate(settings_types, settings_default, settings_description)
         return _doc
 
+    def teardown(self):
+        pass
+
 
 def solver_from_string(string):
     try:


Test patch:
diff --git a/.github/workflows/sharpy_tests.yaml b/.github/workflows/sharpy_tests.yaml
index 77754c028..11c5f315b 100644
--- a/.github/workflows/sharpy_tests.yaml
+++ b/.github/workflows/sharpy_tests.yaml
@@ -54,7 +54,7 @@ jobs:
           source activate sharpy_minimal
           git submodule init
           git submodule update
-          git fetch -t
+          git fetch --tags -f
           mkdir build && cd build
           cmake .. && make install -j 4 && cd ..
           pip install .
diff --git a/tests/coupled/multibody/double_pendulum/test_double_pendulum_geradin.py b/tests/coupled/multibody/double_pendulum/test_double_pendulum_geradin.py
index c97acbfb8..f9cb820fb 100644
--- a/tests/coupled/multibody/double_pendulum/test_double_pendulum_geradin.py
+++ b/tests/coupled/multibody/double_pendulum/test_double_pendulum_geradin.py
@@ -266,7 +266,7 @@ def setUp(self):
         LC1.body_FoR = 0
         LC1.rot_axis_AFoR = np.array([0.0,1.0,0.0])
         LC1.scalingFactor = 1e6
-        LC1.penaltyFactor = 1e-12
+        LC1.penaltyFactor = 0.
 
         LC2 = gc.LagrangeConstraint()
         LC2.behaviour = 'hinge_node_FoR'
@@ -275,7 +275,7 @@ def setUp(self):
         LC2.body_FoR = 1
         LC2.rot_axisB = np.array([0.0,1.0,0.0])
         LC2.scalingFactor = 1e6
-        LC2.penaltyFactor = 1e-12
+        LC2.penaltyFactor = 0.
 
         LC = []
         LC.append(LC1)
diff --git a/tests/coupled/multibody/floating_forces/test_floatingforces.py b/tests/coupled/multibody/floating_forces/test_floatingforces.py
index fb8470c05..1944b9823 100644
--- a/tests/coupled/multibody/floating_forces/test_floatingforces.py
+++ b/tests/coupled/multibody/floating_forces/test_floatingforces.py
@@ -143,7 +143,11 @@ def test_time_wave_forces(self):
                 self.assertLess(error, 0.3)
             
         save_fig = False
-        if save_fig:  
+        if save_fig:
+            np.savetxt("zero_noise_jonswap.txt", np.column_stack((w_js, zero_noise_spectrum)))
+            np.savetxt("realisations_jonswap.txt", np.column_stack((w_ns, np.abs(ns))))
+            np.savetxt("average_jonswap.txt", np.column_stack((w_ns, avg_noise_spectrum)))
+             
             import matplotlib.pyplot as plt
             fig, ax = plt.subplots(1, 1, figsize=(4, 3))
             ax.grid()
diff --git a/tests/coupled/multibody/floating_wind_turbine/oc3_cs_v07.floating.h5 b/tests/coupled/multibody/floating_wind_turbine/oc3_cs_v07.floating.h5
new file mode 100755
index 000000000..275365c5b
Binary files /dev/null and b/tests/coupled/multibody/floating_wind_turbine/oc3_cs_v07.floating.h5 differ
diff --git a/tests/coupled/multibody/floating_wind_turbine/test_floating_wind_turbine.py b/tests/coupled/multibody/floating_wind_turbine/test_floating_wind_turbine.py
new file mode 100755
index 000000000..346bf5725
--- /dev/null
+++ b/tests/coupled/multibody/floating_wind_turbine/test_floating_wind_turbine.py
@@ -0,0 +1,391 @@
+
+"""
+spar_from_excel_type04
+
+Example of a file used to generate a floating wind turbine case
+"""
+# Load libraries
+import sharpy.utils.generate_cases as gc
+import cases.templates.template_wt as template_wt
+import numpy as np
+import os
+import sharpy.utils.algebra as algebra
+from sharpy.utils.constants import deg2rad
+import sharpy.sharpy_main
+import unittest
+import shutil
+
+case = 'flex_wsp18_val'
+
+class TestFloatingWindTrubine(unittest.TestCase):
+    """
+    Test and example to run floating wind turbines
+    """
+    def generate_floating_wind_turbine(self, restart=False):
+        ######################################################################
+        ###########################  PARAMETERS  #############################
+        ######################################################################
+        # Case
+        route = os.path.dirname(os.path.realpath(__file__)) + '/'
+        
+        # Geometry discretization
+        chord_panels = np.array([16], dtype=int)
+        revs_in_wake = 1
+        
+        # Operation
+        rotation_velocity = 12.1*2*np.pi/60
+        pitch_deg = 14.6 #degrees
+        yaw_deg = 0. #degrees
+        
+        # Wind
+        WSP = 18.
+        air_density = 1.225
+        gravity_on = True
+        grav_value = 9.80665
+        
+        # Simulation
+        dphi = 4.*deg2rad
+        revs_to_simulate = 120
+        structural_substeps = 0
+        
+        ######################################################################
+        ##########################  GENERATE WT  #############################
+        ######################################################################
+        dt = dphi/rotation_velocity
+        # time_steps = int(revs_to_simulate*2.*np.pi/dphi)
+        if not restart:
+            time_steps = 1
+        else:
+            time_steps = 2
+        struct_dt = dt/(structural_substeps + 1)
+        
+        op_params = {}
+        op_params['rotation_velocity'] = rotation_velocity
+        op_params['pitch_deg'] = pitch_deg
+        op_params['wsp'] = WSP
+        op_params['dt'] = dt
+        
+        geom_params = {}
+        geom_params['chord_panels'] = chord_panels
+        geom_params['tol_remove_points'] = 1e-8
+        geom_params['n_points_camber'] = 100
+        geom_params['h5_cross_sec_prop'] = None
+        geom_params['m_distribution'] = 'uniform'
+        
+        options = {}
+        options['camber_effect_on_twist'] = False
+        options['user_defined_m_distribution_type'] = None
+        options['include_polars'] = True
+        options['separate_blades'] = True
+        options['concentrate_spar'] = True
+        options['twist_in_aero'] = False
+        
+        excel_description = {}
+        excel_description['excel_file_name'] = '../../../../docs/source/content/example_notebooks/source/type04_db_nrel5mw_oc3_v06.xlsx'
+        excel_description['excel_sheet_parameters'] = 'parameters'
+        excel_description['excel_sheet_structural_tower'] = 'structural_tower'
+        excel_description['excel_sheet_structural_spar'] = 'structural_spar'
+        excel_description['excel_sheet_structural_blade'] = 'structural_blade'
+        excel_description['excel_sheet_discretization_blade'] = 'discretization_blade'
+        excel_description['excel_sheet_aero_blade'] = 'aero_blade'
+        excel_description['excel_sheet_airfoil_info'] = 'airfoil_info'
+        excel_description['excel_sheet_airfoil_chord'] = 'airfoil_coord'
+        
+        spar, LC, MB = template_wt.spar_from_excel_type04(op_params,
+                                                       geom_params,
+                                                       excel_description,
+                                                       options)
+        
+        tower_top_node = 24
+        hub_node = 25
+        blade_tip_node = 51
+        
+        for ilc in range(len(LC)):
+            LC[ilc].behaviour = "hinge_node_FoR_pitch"
+            LC[ilc].rotor_vel = rotation_velocity
+            del LC[ilc].rot_vect
+            LC[ilc].scalingFactor = 1e6
+            LC[ilc].penaltyFactor = 0.
+        
+        MB[0].FoR_movement = 'free'
+        
+        ######################################################################
+        ######################  DEFINE SIMULATION  ###########################
+        ######################################################################
+        SimInfo = gc.SimulationInformation()
+        SimInfo.set_default_values()
+        
+        if not restart:
+            SimInfo.solvers['SHARPy']['flow'] = ['BeamLoader',
+                                'AerogridLoader',
+                                'StaticUvlm',
+                                'BeamPlot',
+                                'AerogridPlot',
+                                'DynamicCoupled',
+                                'PickleData',]
+        
+            SimInfo.solvers['SHARPy']['case'] = case
+        else:
+            SimInfo.solvers['SHARPy']['flow'] = ['DynamicCoupled',
+                                    'PickleData',]
+            
+            SimInfo.solvers['SHARPy']['case'] = "restart_%s" % case
+        
+        SimInfo.solvers['SHARPy']['route'] = route
+        SimInfo.solvers['SHARPy']['write_log'] = True
+        SimInfo.solvers['SHARPy']['write_screen'] = False
+        SimInfo.solvers['SHARPy']['log_file'] = ("log_%s" % SimInfo.solvers['SHARPy']['case'])
+        SimInfo.set_variable_all_dicts('dt', dt)
+        SimInfo.set_variable_all_dicts('rho', air_density)
+        
+        SimInfo.solvers['SteadyVelocityField']['u_inf'] = WSP
+        SimInfo.solvers['SteadyVelocityField']['u_inf_direction'] = np.array([0., -np.sin(yaw_deg*deg2rad), np.cos(yaw_deg*deg2rad)])
+        
+        SimInfo.solvers['BeamLoader']['unsteady'] = 'on'
+        
+        centre_rot_ini = np.array([87.6, 0., -5.0191])
+        rbm_vel_g_ini = np.zeros((6))
+        rbm_vel_g_ini[3:6] = np.array([0., 0., rotation_velocity])
+            
+        quat0 = algebra.euler2quat(np.array([0., -2.28*deg2rad, 0.]))
+        for_pos0 = np.array([0., 0., 11.6])
+        SimInfo.solvers['BeamLoader']['orientation'] = quat0.copy()
+        SimInfo.solvers['BeamLoader']['for_pos'] = for_pos0.copy()
+        
+        rot_mat0 = algebra.quat2rotation(quat0)
+        centre_rot = np.dot(rot_mat0, centre_rot_ini) + for_pos0
+        rbm_vel_g = np.zeros((6))
+        rbm_vel_g[3:6] = np.dot(rot_mat0, rbm_vel_g_ini[3:6])
+        
+        MB[0].FoR_position[0:3] = for_pos0.copy()
+        MB[0].quat = quat0.copy()
+        
+        for ibody in range(1, len(MB)):
+            MB[ibody].FoR_position[0:3] = centre_rot.copy()
+            MB[ibody].FoR_velocity[3:6] = rbm_vel_g[3:6]
+            az = (360./3)*(ibody - 1)
+            rot_mat_az = algebra.rotation3d_z(az*deg2rad)
+            quat = algebra.rotation2quat(np.dot(rot_mat_az, rot_mat0))
+            MB[ibody].quat[0:4] = quat.copy()
+        
+        # Compute mstar
+        SimInfo.solvers['AerogridLoader']['wake_shape_generator'] = 'HelicoidalWake'
+        SimInfo.solvers['AerogridLoader']['wake_shape_generator_input'] = {'u_inf': WSP,
+                                                                           'u_inf_direction': SimInfo.solvers['SteadyVelocityField']['u_inf_direction'],
+                                                                           'rotation_velocity': rbm_vel_g[3:6],
+                                                                           'h_ref': centre_rot[0],
+                                                                           'h_corr': 0.,
+                                                                           'dt': dt,
+                                                                           'dphi1': dphi,
+                                                                           'ndphi1': int(10),
+                                                                           'r': 1.05,
+                                                                           'dphimax': 10*deg2rad}
+        
+        import sharpy.utils.generator_interface as gi
+        gi.dictionary_of_generators(print_info=False)
+        hw = gi.dict_of_generators['HelicoidalWake']
+        wsg_in = SimInfo.solvers['AerogridLoader']['wake_shape_generator_input'] # for simplicity
+        angle = 0
+        mstar = 0
+        while angle < (revs_in_wake*2*np.pi):
+            mstar += 1
+            angle += hw.get_dphi(mstar, wsg_in['dphi1'],
+                                        wsg_in['ndphi1'],
+                                        wsg_in['r'],
+                                        wsg_in['dphimax'])
+        
+        SimInfo.solvers['AerogridLoader']['unsteady'] = 'on'
+        SimInfo.solvers['AerogridLoader']['mstar'] = mstar
+        SimInfo.solvers['AerogridLoader']['freestream_dir'] = np.array([0., 0, 0])
+        
+        struct_static_solver = 'NonLinearStatic'
+        SimInfo.solvers[struct_static_solver]['gravity_on'] = gravity_on
+        SimInfo.solvers[struct_static_solver]['gravity'] = grav_value
+        SimInfo.solvers[struct_static_solver]['gravity_dir'] = np.array([1., 0., 0.])
+        SimInfo.solvers[struct_static_solver]['max_iterations'] = 100
+        SimInfo.solvers[struct_static_solver]['num_load_steps'] = 1 
+        SimInfo.solvers[struct_static_solver]['min_delta'] = 1e-5
+        SimInfo.solvers[struct_static_solver]['newmark_damp'] = 1e-1
+        SimInfo.solvers[struct_static_solver]['dt'] = dt
+        
+        SimInfo.solvers['StaticCoupled']['structural_solver'] = struct_static_solver
+        SimInfo.solvers['StaticCoupled']['structural_solver_settings'] = SimInfo.solvers[struct_static_solver]
+        SimInfo.solvers['StaticCoupled']['aero_solver'] = 'StaticUvlm'
+        SimInfo.solvers['StaticCoupled']['aero_solver_settings'] = SimInfo.solvers['StaticUvlm']
+        
+        SimInfo.solvers['StaticCoupled']['tolerance'] = 1e-8
+        SimInfo.solvers['StaticCoupled']['n_load_steps'] = 0
+        SimInfo.solvers['StaticCoupled']['relaxation_factor'] = 0.
+        SimInfo.solvers['StaticCoupled']['max_iter'] = 100
+        
+        SimInfo.solvers['StaticUvlm']['horseshoe'] = False
+        SimInfo.solvers['StaticUvlm']['num_cores'] = 8
+        SimInfo.solvers['StaticUvlm']['n_rollup'] = 0
+        SimInfo.solvers['StaticUvlm']['rollup_dt'] = dt
+        SimInfo.solvers['StaticUvlm']['rollup_aic_refresh'] = 1
+        SimInfo.solvers['StaticUvlm']['rollup_tolerance'] = 1e-8
+        SimInfo.solvers['StaticUvlm']['rbm_vel_g'] = rbm_vel_g 
+        SimInfo.solvers['StaticUvlm']['centre_rot_g'] = centre_rot
+        SimInfo.solvers['StaticUvlm']['cfl1'] = False
+        SimInfo.solvers['StaticUvlm']['vortex_radius'] = 1e-6
+        SimInfo.solvers['StaticUvlm']['vortex_radius_wake_ind'] = 1e-3
+        SimInfo.solvers['StaticUvlm']['velocity_field_generator'] = 'SteadyVelocityField'
+        SimInfo.solvers['StaticUvlm']['velocity_field_input'] = SimInfo.solvers['SteadyVelocityField']
+        SimInfo.solvers['StaticUvlm']['map_forces_on_struct'] = True
+        
+        SimInfo.solvers['FloatingForces']['n_time_steps'] = time_steps
+        SimInfo.solvers['FloatingForces']['dt'] = dt
+        SimInfo.solvers['FloatingForces']['water_density'] = 1025 # kg/m3
+        SimInfo.solvers['FloatingForces']['gravity'] = grav_value
+        SimInfo.solvers['FloatingForces']['gravity_dir'] = [1., 0., 0.]
+        SimInfo.solvers['FloatingForces']['floating_file_name'] = 'oc3_cs_v07.floating.h5'
+        SimInfo.solvers['FloatingForces']['concentrate_spar'] = True
+        SimInfo.solvers['FloatingForces']['method_matrices_freq'] = 'rational_function'
+        SimInfo.solvers['FloatingForces']['matrices_freq'] = 2*np.pi/120.
+        SimInfo.solvers['FloatingForces']['steps_constant_matrices'] = 0
+        SimInfo.solvers['FloatingForces']['method_wave'] = 'jonswap'
+        SimInfo.solvers['FloatingForces']['wave_amplitude'] = 0.
+        SimInfo.solvers['FloatingForces']['wave_freq'] = 0.
+        SimInfo.solvers['FloatingForces']['wave_Tp'] = 10.
+        SimInfo.solvers['FloatingForces']['wave_Hs'] = 6.
+        SimInfo.solvers['FloatingForces']['wave_incidence'] = 0.*deg2rad
+        SimInfo.solvers['FloatingForces']['added_mass_in_mass_matrix'] = True
+        SimInfo.solvers['FloatingForces']['write_output'] = True
+        
+        SimInfo.solvers['StepUvlm']['convection_scheme'] = 2
+        SimInfo.solvers['StepUvlm']['num_cores'] = 8
+        SimInfo.solvers['StepUvlm']['velocity_field_generator'] = 'SteadyVelocityField'
+        SimInfo.solvers['StepUvlm']['velocity_field_input'] = SimInfo.solvers['SteadyVelocityField']
+        SimInfo.solvers['StepUvlm']['cfl1'] = False
+        SimInfo.solvers['StepUvlm']['interp_coords'] = 0
+        SimInfo.solvers['StepUvlm']['filter_method'] = 0
+        SimInfo.solvers['StepUvlm']['interp_method'] = 3
+        SimInfo.solvers['StepUvlm']['centre_rot'] = centre_rot 
+        SimInfo.solvers['StepUvlm']['vortex_radius'] = 1e-6
+        SimInfo.solvers['StepUvlm']['vortex_radius_wake_ind'] = 1e-3
+        
+        struct_dyn_solver = 'NonLinearDynamicMultibody'
+        SimInfo.solvers[struct_dyn_solver]['gravity_on'] = gravity_on
+        SimInfo.solvers[struct_dyn_solver]['gravity'] = grav_value
+        SimInfo.solvers[struct_dyn_solver]['gravity_dir'] = np.array([1., 0., 0.])
+        SimInfo.solvers[struct_dyn_solver]['max_iterations'] = 300
+        SimInfo.solvers[struct_dyn_solver]['min_delta'] = 1e-6
+        SimInfo.solvers[struct_dyn_solver]['newmark_damp'] = 1e-1
+        SimInfo.solvers[struct_dyn_solver]['dt'] = struct_dt
+        SimInfo.solvers[struct_dyn_solver]['write_lm'] = True
+        SimInfo.solvers[struct_dyn_solver]['allow_skip_step'] = False
+        SimInfo.solvers[struct_dyn_solver]['relax_factor_lm'] = 0. 
+        SimInfo.solvers[struct_dyn_solver]['rigid_bodies'] = False
+        SimInfo.solvers[struct_dyn_solver]['zero_ini_dot_ddot'] = True
+        SimInfo.solvers[struct_dyn_solver]['time_integrator'] = 'NewmarkBeta'
+        SimInfo.solvers[struct_dyn_solver]['time_integrator_settings'] = {'newmark_damp': 1e-1,
+                                                                                    'dt': struct_dt}
+        
+        SimInfo.solvers['SaveData']['compress_float'] = True
+        SimInfo.solvers['SaveData']['save_wake'] = False
+        
+        SimInfo.solvers['WriteVariablesTime']['FoR_variables'] = ['for_pos', 'for_vel', 'quat']
+        SimInfo.solvers['WriteVariablesTime']['structure_variables'] = ['pos']
+        SimInfo.solvers['WriteVariablesTime']['structure_nodes'] = [tower_top_node, blade_tip_node]
+        
+        SimInfo.solvers['PickleData']['stride'] = 180
+        SimInfo.solvers['AerogridPlot']['stride'] = 180
+        
+        SimInfo.solvers['DynamicCoupled']['structural_solver'] = struct_dyn_solver
+        SimInfo.solvers['DynamicCoupled']['structural_solver_settings'] = SimInfo.solvers[struct_dyn_solver]
+        SimInfo.solvers['DynamicCoupled']['aero_solver'] = 'StepUvlm'
+        SimInfo.solvers['DynamicCoupled']['aero_solver_settings'] = SimInfo.solvers['StepUvlm']
+        SimInfo.solvers['DynamicCoupled']['postprocessors'] = ['Cleanup', 'BeamPlot', 'AerogridPlot', 'PickleData', 'SaveData', 'WriteVariablesTime']
+        SimInfo.solvers['DynamicCoupled']['postprocessors_settings'] = {'Cleanup': SimInfo.solvers['Cleanup'],
+                                              'BeamPlot': SimInfo.solvers['BeamPlot'],
+                                              'AerogridPlot': SimInfo.solvers['AerogridPlot'],
+                                              'PickleData': SimInfo.solvers['PickleData'],
+                                              'SaveData': SimInfo.solvers['SaveData'],
+                                              'WriteVariablesTime': SimInfo.solvers['WriteVariablesTime'],}
+        
+        SimInfo.solvers['DynamicCoupled']['minimum_steps'] = 0
+        SimInfo.solvers['DynamicCoupled']['include_unsteady_force_contribution'] = True
+        SimInfo.solvers['DynamicCoupled']['relaxation_factor'] = 0.
+        SimInfo.solvers['DynamicCoupled']['final_relaxation_factor'] = 0.
+        SimInfo.solvers['DynamicCoupled']['dynamic_relaxation'] = False
+        SimInfo.solvers['DynamicCoupled']['relaxation_steps'] = 0
+        SimInfo.solvers['DynamicCoupled']['fsi_tolerance'] = 1e-6
+        SimInfo.solvers['DynamicCoupled']['structural_substeps'] = structural_substeps
+        SimInfo.solvers['DynamicCoupled']['runtime_generators'] = {'FloatingForces': SimInfo.solvers['FloatingForces']}
+        
+        power = 5296609.984
+        GBR = 97.
+        PID0 = [0.006275604, 0.0008965149, 0.] # Offshore
+        
+        # Gain scheduler
+        pitch_deg_doubled_sens = 6.302336 # deg
+        gk = 1./(1 + pitch_deg/pitch_deg_doubled_sens)
+        PID = np.zeros((3))
+        for i in range(3):
+            PID[i] = PID0[i]*gk
+        
+        SimInfo.solvers['DynamicCoupled']['controller_id']['colective_pitch'] = 'BladePitchPid'
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch'] = dict()
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['P'] = PID[0]
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['I'] = PID[1]
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['D'] = PID[2]
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['sp_type'] = 'gen_vel'
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['sp_source'] = 'const'
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['sp_const'] = rotation_velocity*GBR
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['gen_model_const_var'] = 'torque'
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['gen_model_const_value'] = power/rotation_velocity/GBR
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['GBR'] = GBR
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['inertia_dt'] = 43702538.05
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['dt'] = dt
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['ntime_steps'] = time_steps
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['blade_num_body'] = [1, 2, 3]
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['min_pitch'] = 0.
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['max_pitch'] = 90.*deg2rad
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['initial_pitch'] = pitch_deg*deg2rad
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['pitch_sp'] = pitch_deg*deg2rad
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['initial_rotor_vel'] = rotation_velocity
+        SimInfo.solvers['DynamicCoupled']['controller_settings']['colective_pitch']['nocontrol_steps'] = 0
+        
+        SimInfo.define_num_steps(time_steps)
+        
+        # Define dynamic simulation
+        SimInfo.with_forced_vel = False
+        SimInfo.with_dynamic_forces = False
+        
+        ######################################################################
+        #######################  GENERATE FILES  #############################
+        ######################################################################
+        gc.clean_test_files(SimInfo.solvers['SHARPy']['route'], SimInfo.solvers['SHARPy']['case'])
+        spar.generate_h5_files(SimInfo.solvers['SHARPy']['route'], SimInfo.solvers['SHARPy']['case'])
+        SimInfo.generate_solver_file()
+        gc.generate_multibody_file(LC, MB,SimInfo.solvers['SHARPy']['route'], SimInfo.solvers['SHARPy']['case'])
+
+        return SimInfo.solvers['SHARPy']['case']
+
+    def test_floating_wind_turbine(self):
+        name = self.generate_floating_wind_turbine(restart=False)
+        solver_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/' + name + '.sharpy')
+        sharpy.sharpy_main.main(['', solver_path])
+        
+        name_restart = self.generate_floating_wind_turbine(restart=True)
+        solver_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/' + name_restart + '.sharpy')
+        restart_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/output/' + name + '/' + name + '.pkl')
+        sharpy.sharpy_main.main(['', '-r' + restart_path , solver_path])
+
+        self.clean_files(name)
+    
+    def clean_files(self, case):
+        solver_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
+        solver_path += '/'
+        files_to_delete = [case + '.aero.h5',
+                           case + '.fem.h5',
+                           case + '.mb.h5',
+                           case + '.sharpy',
+                           'restart_' + case + '.aero.h5',
+                           'restart_' + case + '.fem.h5',
+                           'restart_' + case + '.mb.h5',
+                           'restart_' + case + '.sharpy']
+        for f in files_to_delete:
+            os.remove(solver_path + f)
+
+        shutil.rmtree(solver_path + 'output/')
diff --git a/tests/coupled/prescribed/WindTurbine/test_rotor.py b/tests/coupled/prescribed/WindTurbine/test_rotor.py
index 2d29faf76..737e1f66b 100644
--- a/tests/coupled/prescribed/WindTurbine/test_rotor.py
+++ b/tests/coupled/prescribed/WindTurbine/test_rotor.py
@@ -64,7 +64,7 @@ def setUp(self):
                     'n_points_camber': 100,
                     'm_distribution': 'uniform'}
 
-        excel_description = {'excel_file_name': route + '../../../../docs/source/content/example_notebooks/source/type02_db_NREL5MW_v02.xlsx',
+        excel_description = {'excel_file_name': route + '../../../../docs/source/content/example_notebooks/source/type04_db_nrel5mw_oc3_v06.xlsx',
                             'excel_sheet_parameters': 'parameters',
                             'excel_sheet_structural_blade': 'structural_blade',
                             'excel_sheet_discretization_blade': 'discretization_blade',
@@ -74,9 +74,10 @@ def setUp(self):
 
         options = {'camber_effect_on_twist': False,
                    'user_defined_m_distribution_type': None,
-                   'include_polars': False}
+                   'include_polars': False,
+                   'separate_blades': False}
 
-        rotor = template_wt.rotor_from_excel_type03(op_params,
+        rotor, hub_nodes = template_wt.rotor_from_excel_type03(op_params,
                                                     geom_params,
                                                     excel_description,
                                                     options)
diff --git a/tests/linear/control_surfaces/test_control_surfaces.py b/tests/linear/control_surfaces/test_control_surfaces.py
index a8f8e64f2..df44f952f 100644
--- a/tests/linear/control_surfaces/test_control_surfaces.py
+++ b/tests/linear/control_surfaces/test_control_surfaces.py
@@ -213,7 +213,7 @@ def setup(self):
                                                             'minus_m_star': 0}, }
                                       }
 
-        ws.config['PickleData'] = {'folder': self.route_test_dir + '/output/'}
+        ws.config['PickleData'] = {}
 
         ws.config.write()
 
diff --git a/tests/linear/derivatives/test_stabilityderivatives.py b/tests/linear/derivatives/test_stabilityderivatives.py
index 60213caa8..b75e2e9ac 100644
--- a/tests/linear/derivatives/test_stabilityderivatives.py
+++ b/tests/linear/derivatives/test_stabilityderivatives.py
@@ -375,7 +375,7 @@ def run_case(self, target_system):
         import scipy.io as scio
         linss_data = scio.loadmat(self.route_test_dir + '/output/{:s}/savedata/{:s}.linss.mat'.format(ref_case_name,
                                                                                                   ref_case_name))
-        
+
         # Steady State transfer function
         if target_system == 'aerodynamic':
             ss = libss.StateSpace.load_from_h5(self.route_test_dir +
diff --git a/tests/linear/statespace/test_statespace.py b/tests/linear/statespace/test_statespace.py
index 0e436b189..cc555eef6 100644
--- a/tests/linear/statespace/test_statespace.py
+++ b/tests/linear/statespace/test_statespace.py
@@ -162,7 +162,7 @@ def test_join(self):
             Yref += wv[ii] * SS_list[ii].freqresp(kv)
 
         er = np.max(np.abs(Yjoin - Yref))
-        assert er < 1e-14, 'test_join error %.3e too large' % er
+        assert er < 1e-12, 'test_join error %.3e too large' % er
 
     def test_disc2cont(self):
         # not the best test given that eigenvalue comparison is not great with random systems. (error grows near
diff --git a/tests/utils/test_generate_cases.py b/tests/utils/test_generate_cases.py
index 95f127b18..0cb09b0bd 100644
--- a/tests/utils/test_generate_cases.py
+++ b/tests/utils/test_generate_cases.py
@@ -63,7 +63,7 @@ def setUp(self):
                     'n_points_camber': 100,
                     'm_distribution': 'uniform'}
 
-        excel_description = {'excel_file_name': route + '../../docs/source/content/example_notebooks/source/type02_db_NREL5MW_v02.xlsx',
+        excel_description = {'excel_file_name': route + '../../docs/source/content/example_notebooks/source/type04_db_nrel5mw_oc3_v06.xlsx',
                             'excel_sheet_parameters': 'parameters',
                             'excel_sheet_structural_blade': 'structural_blade',
                             'excel_sheet_discretization_blade': 'discretization_blade',
@@ -73,9 +73,10 @@ def setUp(self):
 
         options = {'camber_effect_on_twist': False,
                    'user_defined_m_distribution_type': None,
-                   'include_polars': False}
+                   'include_polars': False,
+                   'separate_blades': False}
 
-        rotor = template_wt.rotor_from_excel_type03(op_params,
+        rotor, hub_nodes = template_wt.rotor_from_excel_type03(op_params,
                                                     geom_params,
                                                     excel_description,
                                                     options)
@@ -93,7 +94,7 @@ def setUp(self):
 
         SimInfo.solvers['SHARPy']['flow'] = ['BeamLoader',
                                 'AerogridLoader',
-                                'StaticCoupledRBM',
+                                'StaticCoupled',
                                 'DynamicCoupled',
                                 'SaveData']
 
@@ -121,16 +122,16 @@ def setUp(self):
                                                                            'dt': dt,
                                                                            'rotation_velocity': rotation_velocity*np.array([0., 0., 1.])}
 
-        SimInfo.solvers['StaticCoupledRBM']['structural_solver'] = 'RigidDynamicPrescribedStep'
-        SimInfo.solvers['StaticCoupledRBM']['structural_solver_settings'] = SimInfo.solvers['RigidDynamicPrescribedStep']
-        # SimInfo.solvers['StaticCoupledRBM']['structural_solver'] = 'NonLinearDynamicPrescribedStep'
-        # SimInfo.solvers['StaticCoupledRBM']['structural_solver_settings'] = SimInfo.solvers['NonLinearDynamicPrescribedStep']
-        SimInfo.solvers['StaticCoupledRBM']['aero_solver'] = 'StaticUvlm'
-        SimInfo.solvers['StaticCoupledRBM']['aero_solver_settings'] = SimInfo.solvers['StaticUvlm']
+        SimInfo.solvers['StaticCoupled']['structural_solver'] = 'RigidDynamicPrescribedStep'
+        SimInfo.solvers['StaticCoupled']['structural_solver_settings'] = SimInfo.solvers['RigidDynamicPrescribedStep']
+        # SimInfo.solvers['StaticCoupled']['structural_solver'] = 'NonLinearDynamicPrescribedStep'
+        # SimInfo.solvers['StaticCoupled']['structural_solver_settings'] = SimInfo.solvers['NonLinearDynamicPrescribedStep']
+        SimInfo.solvers['StaticCoupled']['aero_solver'] = 'StaticUvlm'
+        SimInfo.solvers['StaticCoupled']['aero_solver_settings'] = SimInfo.solvers['StaticUvlm']
 
-        SimInfo.solvers['StaticCoupledRBM']['tolerance'] = 1e-6
-        SimInfo.solvers['StaticCoupledRBM']['n_load_steps'] = 0
-        SimInfo.solvers['StaticCoupledRBM']['relaxation_factor'] = 0.
+        SimInfo.solvers['StaticCoupled']['tolerance'] = 1e-6
+        SimInfo.solvers['StaticCoupled']['n_load_steps'] = 0
+        SimInfo.solvers['StaticCoupled']['relaxation_factor'] = 0.
 
         SimInfo.solvers['StaticUvlm']['horseshoe'] = False
         SimInfo.solvers['StaticUvlm']['num_cores'] = 8