Repository: fusion-energy/paramak (language: python)

Issue:
Adding brep to h5m helper methods to Reactor and BallReactor
## Proposed changes

This PR refactors the Reactor class and the BallReactor so that it is more suitable for making neutronics models from Brep files.

- divertors were a multiple volume compound -> now two seperate volumes with names 'divertor_lower' ' divertor_upper'
- pf coils were a multi volume compound -> now they are seperate volumes with the magnet number in the name
- the inputs for pf coils can accept an empty list as mentioned in #143 
- the overlapping shapes warning from BlanketFP no longer prints a warning when used in ball reactor as this is the overlapping points are intended
- export brep now returns the brep filename and a dictionary of volume ids and their names (useful for neutronics plans)
- docstrings updated and a few corrections made

## Types of changes

- [x] Bugfix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [x] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [x] Code refactoring
- [ ] Documentation Update (if none of the other choices apply)
- [ ] New tests

## Checklist

- [ ] I have added tests that prove my fix is effective or that my feature works
- [x] I have added necessary documentation (if appropriate)



Discussion / hints:

Fix patch:
diff --git a/AUTHORS.md b/AUTHORS.md
deleted file mode 100644
index 304f21bdf..000000000
--- a/AUTHORS.md
+++ /dev/null
@@ -1,11 +0,0 @@
-@Shimwell
-@billingsley-john
-@RemDelaporteMathurin
-@pshriwise
-@katie-taylor
-@bruceey42
-@#7DeclanMorbey
-@#8agoose77
-@shen3443
-@Blitan
-@mateczentye
diff --git a/CITATION.cff b/CITATION.cff
index da344461d..5b10125bd 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -12,6 +12,7 @@ authors:
   orcid: "https://orcid.org/0000-0003-1064-8882"
 - family-names: "Czentye"
   given-names: "Máté"
+  orcid: "https://orcid.org/0000-0001-6643-7844"
 - family-names: "Hearn"
   given-names: "Keir"
 - family-names: "Shriwise"
diff --git a/docs/source/example_parametric_reactors.rst b/docs/source/example_parametric_reactors.rst
index 29a80d5b5..f534bb9a5 100644
--- a/docs/source/example_parametric_reactors.rst
+++ b/docs/source/example_parametric_reactors.rst
@@ -92,8 +92,11 @@ ball_reactor_single_null.ipynb
       triangularity=0.55,
       number_of_tf_coils=16,
       rotation_angle=90,
-      pf_coil_radial_thicknesses=[50, 50, 50, 50],
-      pf_coil_vertical_thicknesses=[50, 50, 50, 50],
+      pf_coil_case_thicknesses=[10, 10, 10, 10],
+      pf_coil_radial_thicknesses=[20, 50, 50, 20],
+      pf_coil_vertical_thicknesses=[20, 50, 50, 20],
+      pf_coil_radial_position=[500, 575, 575, 500],
+      pf_coil_vertical_position=[300, 100, -100, -300],
       rear_blanket_to_tf_gap=50,
       outboard_tf_coil_radial_thickness=100,
       outboard_tf_coil_poloidal_thickness=50,
diff --git a/docs/source/parametric_components.rst b/docs/source/parametric_components.rst
index 6a08362db..a7515da1c 100644
--- a/docs/source/parametric_components.rst
+++ b/docs/source/parametric_components.rst
@@ -1161,6 +1161,29 @@ ExtrudeRectangle()
    :members:
    :show-inheritance:
 
+ExtrudeHollowRectangle()
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. cadquery::
+   :select: cadquery_object
+   :gridsize: 0
+
+   import paramak
+   my_component = paramak.ExtrudeHollowRectangle(
+      height=10,
+      width=15,
+      casing_thickness=1,
+      distance=2
+   )
+
+   cadquery_object = my_component.solid
+
+.. image:: https://user-images.githubusercontent.com/8583900/145905435-87d05386-d2e5-4de3-8f03-5a08cc5a4b22.png
+    :width: 200px
+
+.. automodule:: paramak.parametric_components.extrude_hollow_rectangle
+   :members:
+   :show-inheritance:
 
 HexagonPin()
 ^^^^^^^^^^^^
diff --git a/examples/example_parametric_components/make_components_other.ipynb b/examples/example_parametric_components/make_components_other.ipynb
index 730ab7f89..7465ecc4a 100644
--- a/examples/example_parametric_components/make_components_other.ipynb
+++ b/examples/example_parametric_components/make_components_other.ipynb
@@ -39,6 +39,22 @@
     "component.show()"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "component = paramak.ExtrudeHollowRectangle(\n",
+    "    height=10,\n",
+    "    width=15,\n",
+    "    casing_thickness=1,\n",
+    "    distance=2,\n",
+    "    workplane='YZ'\n",
+    ")\n",
+    "component.show()"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -229,7 +245,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.5"
+   "version": "3.8.11"
   }
  },
  "nbformat": 4,
diff --git a/examples/example_parametric_reactors/ball_reactor.ipynb b/examples/example_parametric_reactors/ball_reactor.ipynb
index 9e0081a4c..f0099bac7 100644
--- a/examples/example_parametric_reactors/ball_reactor.ipynb
+++ b/examples/example_parametric_reactors/ball_reactor.ipynb
@@ -79,7 +79,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.5"
+   "version": "3.8.11"
   }
  },
  "nbformat": 4,
diff --git a/examples/example_parametric_reactors/ball_reactor_single_null.ipynb b/examples/example_parametric_reactors/ball_reactor_single_null.ipynb
index da1b927b7..f3d73aae6 100644
--- a/examples/example_parametric_reactors/ball_reactor_single_null.ipynb
+++ b/examples/example_parametric_reactors/ball_reactor_single_null.ipynb
@@ -24,8 +24,11 @@
     "    triangularity=0.55,\n",
     "    number_of_tf_coils=16,\n",
     "    rotation_angle=180,\n",
-    "    pf_coil_radial_thicknesses=[50, 50, 50, 50],\n",
-    "    pf_coil_vertical_thicknesses=[50, 50, 50, 50],\n",
+    "    pf_coil_case_thicknesses=[10, 10, 10, 10],\n",
+    "    pf_coil_radial_thicknesses=[20, 50, 50, 20],\n",
+    "    pf_coil_vertical_thicknesses=[20, 50, 50, 20],\n",
+    "    pf_coil_radial_position=[500, 575, 575, 500],\n",
+    "    pf_coil_vertical_position=[300, 100, -100, -300],\n",
     "    rear_blanket_to_tf_gap=50,\n",
     "    outboard_tf_coil_radial_thickness=100,\n",
     "    outboard_tf_coil_poloidal_thickness=50,\n",
diff --git a/examples/example_parametric_reactors/eu_demo_from_2015_paper.ipynb b/examples/example_parametric_reactors/eu_demo_from_2015_paper.ipynb
index 4d8843e61..3744cd53d 100644
--- a/examples/example_parametric_reactors/eu_demo_from_2015_paper.ipynb
+++ b/examples/example_parametric_reactors/eu_demo_from_2015_paper.ipynb
@@ -2,9 +2,226 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Overwriting auto display for cadquery Workplane and Shape\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "f1e7f7b27f8546d9aa195a6555c665f9",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(VBox(children=(HBox(children=(Checkbox(value=False, description='Axes', indent=False, _dom_clas…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<style>\n",
+       ".scroll-area {\n",
+       "    overflow: scroll !important;\n",
+       "    border: unset !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar::-webkit-scrollbar {\n",
+       "    width: 5px !important;\n",
+       "    height: 5px !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar::-webkit-scrollbar-track {\n",
+       "    background-color: transparent !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar .widget-html-content {\n",
+       "    overflow-x: visible;\n",
+       "    overflow-y: visible;\n",
+       "}\n",
+       "\n",
+       ".tab-content-no-padding .widget-tab-contents {\n",
+       "    overflow-x: visible !important;\n",
+       "    overflow-y: visible !important;\n",
+       "    padding-bottom: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_renderer {\n",
+       "    border: 1px solid var(--jp-border-color1);\n",
+       "    margin-top: 3px;\n",
+       "    margin-left: 2px;\n",
+       "}\n",
+       "\n",
+       ".view_tree {\n",
+       "    padding: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_axes {\n",
+       "    width: 60px !important;\n",
+       "    margin-left: 5px !important;\n",
+       "}\n",
+       "\n",
+       ".view_zero {\n",
+       "    width: 55px !important;\n",
+       "}\n",
+       "\n",
+       ".view_grid {\n",
+       "    width: 56px !important;\n",
+       "}\n",
+       "\n",
+       ".view_ortho {\n",
+       "    width: 64px !important;\n",
+       "}\n",
+       "\n",
+       ".view_transparent {\n",
+       "    width: 125px !important;\n",
+       "}\n",
+       "\n",
+       ".view_black_edges {\n",
+       "    width: 105px !important;\n",
+       "}\n",
+       "\n",
+       ".view_button {\n",
+       "    padding: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_button>img {\n",
+       "    height: 28px;\n",
+       "    width: 36px;\n",
+       "}\n",
+       "\n",
+       ".node_entry_wrap {\n",
+       "    white-space: pre;\n",
+       "}\n",
+       "\n",
+       ".node_entry {\n",
+       "    white-space: nowrap;\n",
+       "    padding-top: 4px;\n",
+       "}\n",
+       "\n",
+       ".t-caret {\n",
+       "    cursor: pointer;\n",
+       "    -webkit-user-select: none;\n",
+       "    /* Safari 3.1+ */\n",
+       "    -moz-user-select: none;\n",
+       "    /* Firefox 2+ */\n",
+       "    -ms-user-select: none;\n",
+       "    /* IE 10+ */\n",
+       "    user-select: none;\n",
+       "}\n",
+       "\n",
+       ".t-caret-down::before {\n",
+       "    -ms-transform: rotate(90deg);\n",
+       "    /* IE 9 */\n",
+       "    -webkit-transform: rotate(90deg);\n",
+       "    /* Safari */\n",
+       "    transform: rotate(90deg);\n",
+       "}\n",
+       "\n",
+       ".toplevel {\n",
+       "    list-style-type: none;\n",
+       "    padding-inline-start: 0px;\n",
+       "}\n",
+       "\n",
+       ".nested {\n",
+       "    display: none;\n",
+       "    list-style-type: none;\n",
+       "    padding-inline-start: 16px;\n",
+       "}\n",
+       "\n",
+       ".active {\n",
+       "    display: block;\n",
+       "}\n",
+       "\n",
+       ".icon {\n",
+       "    width: 28px !important;\n",
+       "    height: 22px !important;\n",
+       "    padding-right: 2px;\n",
+       "    vertical-align: middle;\n",
+       "}\n",
+       "\n",
+       ".indent {\n",
+       "    margin-left: 12px;\n",
+       "}\n",
+       "\n",
+       ".tree_label {\n",
+       "    padding-left: 2px;\n",
+       "    font-size: 14px;\n",
+       "}\n",
+       "\n",
+       ".scroll_down {\n",
+       "    display: flex;\n",
+       "    flex-direction: column-reverse;\n",
+       "}\n",
+       "\n",
+       ".small_table {\n",
+       "    line-height: 14px;\n",
+       "}\n",
+       "\n",
+       ".monospace select {\n",
+       "    font-family: monospace;\n",
+       "}\n",
+       "\n",
+       "        .t-caret::before {\n",
+       "            content: u\"▶\";\n",
+       "            font-size: 12px;\n",
+       "            color: \"#080808\";\n",
+       "            display: inline-block;\n",
+       "            margin-right: 2px;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb {\n",
+       "            background-color: rgba(0, 0, 0, 0.2) !important;\n",
+       "            border-radius: 100px !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb:hover {\n",
+       "            background: rgba(0, 0, 0, 0.4) !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb:active {\n",
+       "            background: #181818 !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-corner {\n",
+       "            background: white;\n",
+       "        }\n",
+       "\n",
+       "        .view_output {\n",
+       "            border: 1px solid var(--jp-border-color1);\n",
+       "            margin: 2px 2px 2px 2px !important;\n",
+       "            padding-right: 1px !important;\n",
+       "            background-color: white;\n",
+       "        }\n",
+       "    </style>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<jupyter_cadquery.cad_display.CadqueryDisplay at 0x7f2c9a1cd970>"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
     "import paramak\n",
     "\n",
@@ -25,7 +242,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   },
@@ -39,7 +256,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.3"
+   "version": "3.8.11"
   }
  },
  "nbformat": 4,
diff --git a/examples/example_parametric_reactors/iter_from_2020_paper.ipynb b/examples/example_parametric_reactors/iter_from_2020_paper.ipynb
index 1a690a2a8..87051210f 100644
--- a/examples/example_parametric_reactors/iter_from_2020_paper.ipynb
+++ b/examples/example_parametric_reactors/iter_from_2020_paper.ipynb
@@ -2,9 +2,234 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Overwriting auto display for cadquery Workplane and Shape\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "29e9fa0d979b4dc7a3c3f812490bc0f7",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(VBox(children=(HBox(children=(Checkbox(value=False, description='Axes', indent=False, _dom_clas…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<style>\n",
+       ".scroll-area {\n",
+       "    overflow: scroll !important;\n",
+       "    border: unset !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar::-webkit-scrollbar {\n",
+       "    width: 5px !important;\n",
+       "    height: 5px !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar::-webkit-scrollbar-track {\n",
+       "    background-color: transparent !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar .widget-html-content {\n",
+       "    overflow-x: visible;\n",
+       "    overflow-y: visible;\n",
+       "}\n",
+       "\n",
+       ".tab-content-no-padding .widget-tab-contents {\n",
+       "    overflow-x: visible !important;\n",
+       "    overflow-y: visible !important;\n",
+       "    padding-bottom: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_renderer {\n",
+       "    border: 1px solid var(--jp-border-color1);\n",
+       "    margin-top: 3px;\n",
+       "    margin-left: 2px;\n",
+       "}\n",
+       "\n",
+       ".view_tree {\n",
+       "    padding: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_axes {\n",
+       "    width: 60px !important;\n",
+       "    margin-left: 5px !important;\n",
+       "}\n",
+       "\n",
+       ".view_zero {\n",
+       "    width: 55px !important;\n",
+       "}\n",
+       "\n",
+       ".view_grid {\n",
+       "    width: 56px !important;\n",
+       "}\n",
+       "\n",
+       ".view_ortho {\n",
+       "    width: 64px !important;\n",
+       "}\n",
+       "\n",
+       ".view_transparent {\n",
+       "    width: 125px !important;\n",
+       "}\n",
+       "\n",
+       ".view_black_edges {\n",
+       "    width: 105px !important;\n",
+       "}\n",
+       "\n",
+       ".view_button {\n",
+       "    padding: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_button>img {\n",
+       "    height: 28px;\n",
+       "    width: 36px;\n",
+       "}\n",
+       "\n",
+       ".node_entry_wrap {\n",
+       "    white-space: pre;\n",
+       "}\n",
+       "\n",
+       ".node_entry {\n",
+       "    white-space: nowrap;\n",
+       "    padding-top: 4px;\n",
+       "}\n",
+       "\n",
+       ".t-caret {\n",
+       "    cursor: pointer;\n",
+       "    -webkit-user-select: none;\n",
+       "    /* Safari 3.1+ */\n",
+       "    -moz-user-select: none;\n",
+       "    /* Firefox 2+ */\n",
+       "    -ms-user-select: none;\n",
+       "    /* IE 10+ */\n",
+       "    user-select: none;\n",
+       "}\n",
+       "\n",
+       ".t-caret-down::before {\n",
+       "    -ms-transform: rotate(90deg);\n",
+       "    /* IE 9 */\n",
+       "    -webkit-transform: rotate(90deg);\n",
+       "    /* Safari */\n",
+       "    transform: rotate(90deg);\n",
+       "}\n",
+       "\n",
+       ".toplevel {\n",
+       "    list-style-type: none;\n",
+       "    padding-inline-start: 0px;\n",
+       "}\n",
+       "\n",
+       ".nested {\n",
+       "    display: none;\n",
+       "    list-style-type: none;\n",
+       "    padding-inline-start: 16px;\n",
+       "}\n",
+       "\n",
+       ".active {\n",
+       "    display: block;\n",
+       "}\n",
+       "\n",
+       ".icon {\n",
+       "    width: 28px !important;\n",
+       "    height: 22px !important;\n",
+       "    padding-right: 2px;\n",
+       "    vertical-align: middle;\n",
+       "}\n",
+       "\n",
+       ".indent {\n",
+       "    margin-left: 12px;\n",
+       "}\n",
+       "\n",
+       ".tree_label {\n",
+       "    padding-left: 2px;\n",
+       "    font-size: 14px;\n",
+       "}\n",
+       "\n",
+       ".scroll_down {\n",
+       "    display: flex;\n",
+       "    flex-direction: column-reverse;\n",
+       "}\n",
+       "\n",
+       ".small_table {\n",
+       "    line-height: 14px;\n",
+       "}\n",
+       "\n",
+       ".monospace select {\n",
+       "    font-family: monospace;\n",
+       "}\n",
+       "\n",
+       "        .t-caret::before {\n",
+       "            content: u\"▶\";\n",
+       "            font-size: 12px;\n",
+       "            color: \"#080808\";\n",
+       "            display: inline-block;\n",
+       "            margin-right: 2px;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb {\n",
+       "            background-color: rgba(0, 0, 0, 0.2) !important;\n",
+       "            border-radius: 100px !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb:hover {\n",
+       "            background: rgba(0, 0, 0, 0.4) !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb:active {\n",
+       "            background: #181818 !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-corner {\n",
+       "            background: white;\n",
+       "        }\n",
+       "\n",
+       "        .view_output {\n",
+       "            border: 1px solid var(--jp-border-color1);\n",
+       "            margin: 2px 2px 2px 2px !important;\n",
+       "            padding-right: 1px !important;\n",
+       "            background-color: white;\n",
+       "        }\n",
+       "    </style>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<jupyter_cadquery.cad_display.CadqueryDisplay at 0x7f0e0ed47670>"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
     "import paramak\n",
     "\n",
@@ -25,7 +250,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   },
@@ -39,7 +264,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.3"
+   "version": "3.8.11"
   }
  },
  "nbformat": 4,
diff --git a/examples/example_parametric_reactors/sparc_from_2020_paper.ipynb b/examples/example_parametric_reactors/sparc_from_2020_paper.ipynb
index 8b4737129..9d9331dfc 100644
--- a/examples/example_parametric_reactors/sparc_from_2020_paper.ipynb
+++ b/examples/example_parametric_reactors/sparc_from_2020_paper.ipynb
@@ -2,9 +2,466 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 1,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Overwriting auto display for cadquery Workplane and Shape\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n",
+      "/home/jshim/miniconda3/envs/openmc-dagmc/lib/python3.8/site-packages/scipy/integrate/odepack.py:247: ODEintWarning: Excess work done on this call (perhaps wrong Dfun type). Run with full_output = 1 to get quantitative information.\n",
+      "  warnings.warn(warning_msg, ODEintWarning)\n"
+     ]
+    },
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "61484b26e0684310bc2410cf6d64227b",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "HBox(children=(VBox(children=(HBox(children=(Checkbox(value=False, description='Axes', indent=False, _dom_clas…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "<style>\n",
+       ".scroll-area {\n",
+       "    overflow: scroll !important;\n",
+       "    border: unset !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar::-webkit-scrollbar {\n",
+       "    width: 5px !important;\n",
+       "    height: 5px !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar::-webkit-scrollbar-track {\n",
+       "    background-color: transparent !important;\n",
+       "}\n",
+       "\n",
+       ".mac-scrollbar .widget-html-content {\n",
+       "    overflow-x: visible;\n",
+       "    overflow-y: visible;\n",
+       "}\n",
+       "\n",
+       ".tab-content-no-padding .widget-tab-contents {\n",
+       "    overflow-x: visible !important;\n",
+       "    overflow-y: visible !important;\n",
+       "    padding-bottom: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_renderer {\n",
+       "    border: 1px solid var(--jp-border-color1);\n",
+       "    margin-top: 3px;\n",
+       "    margin-left: 2px;\n",
+       "}\n",
+       "\n",
+       ".view_tree {\n",
+       "    padding: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_axes {\n",
+       "    width: 60px !important;\n",
+       "    margin-left: 5px !important;\n",
+       "}\n",
+       "\n",
+       ".view_zero {\n",
+       "    width: 55px !important;\n",
+       "}\n",
+       "\n",
+       ".view_grid {\n",
+       "    width: 56px !important;\n",
+       "}\n",
+       "\n",
+       ".view_ortho {\n",
+       "    width: 64px !important;\n",
+       "}\n",
+       "\n",
+       ".view_transparent {\n",
+       "    width: 125px !important;\n",
+       "}\n",
+       "\n",
+       ".view_black_edges {\n",
+       "    width: 105px !important;\n",
+       "}\n",
+       "\n",
+       ".view_button {\n",
+       "    padding: 0px !important;\n",
+       "}\n",
+       "\n",
+       ".view_button>img {\n",
+       "    height: 28px;\n",
+       "    width: 36px;\n",
+       "}\n",
+       "\n",
+       ".node_entry_wrap {\n",
+       "    white-space: pre;\n",
+       "}\n",
+       "\n",
+       ".node_entry {\n",
+       "    white-space: nowrap;\n",
+       "    padding-top: 4px;\n",
+       "}\n",
+       "\n",
+       ".t-caret {\n",
+       "    cursor: pointer;\n",
+       "    -webkit-user-select: none;\n",
+       "    /* Safari 3.1+ */\n",
+       "    -moz-user-select: none;\n",
+       "    /* Firefox 2+ */\n",
+       "    -ms-user-select: none;\n",
+       "    /* IE 10+ */\n",
+       "    user-select: none;\n",
+       "}\n",
+       "\n",
+       ".t-caret-down::before {\n",
+       "    -ms-transform: rotate(90deg);\n",
+       "    /* IE 9 */\n",
+       "    -webkit-transform: rotate(90deg);\n",
+       "    /* Safari */\n",
+       "    transform: rotate(90deg);\n",
+       "}\n",
+       "\n",
+       ".toplevel {\n",
+       "    list-style-type: none;\n",
+       "    padding-inline-start: 0px;\n",
+       "}\n",
+       "\n",
+       ".nested {\n",
+       "    display: none;\n",
+       "    list-style-type: none;\n",
+       "    padding-inline-start: 16px;\n",
+       "}\n",
+       "\n",
+       ".active {\n",
+       "    display: block;\n",
+       "}\n",
+       "\n",
+       ".icon {\n",
+       "    width: 28px !important;\n",
+       "    height: 22px !important;\n",
+       "    padding-right: 2px;\n",
+       "    vertical-align: middle;\n",
+       "}\n",
+       "\n",
+       ".indent {\n",
+       "    margin-left: 12px;\n",
+       "}\n",
+       "\n",
+       ".tree_label {\n",
+       "    padding-left: 2px;\n",
+       "    font-size: 14px;\n",
+       "}\n",
+       "\n",
+       ".scroll_down {\n",
+       "    display: flex;\n",
+       "    flex-direction: column-reverse;\n",
+       "}\n",
+       "\n",
+       ".small_table {\n",
+       "    line-height: 14px;\n",
+       "}\n",
+       "\n",
+       ".monospace select {\n",
+       "    font-family: monospace;\n",
+       "}\n",
+       "\n",
+       "        .t-caret::before {\n",
+       "            content: u\"▶\";\n",
+       "            font-size: 12px;\n",
+       "            color: \"#080808\";\n",
+       "            display: inline-block;\n",
+       "            margin-right: 2px;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb {\n",
+       "            background-color: rgba(0, 0, 0, 0.2) !important;\n",
+       "            border-radius: 100px !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb:hover {\n",
+       "            background: rgba(0, 0, 0, 0.4) !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-thumb:active {\n",
+       "            background: #181818 !important;\n",
+       "        }\n",
+       "\n",
+       "        .mac-scrollbar::-webkit-scrollbar-corner {\n",
+       "            background: white;\n",
+       "        }\n",
+       "\n",
+       "        .view_output {\n",
+       "            border: 1px solid var(--jp-border-color1);\n",
+       "            margin: 2px 2px 2px 2px !important;\n",
+       "            padding-right: 1px !important;\n",
+       "            background-color: white;\n",
+       "        }\n",
+       "    </style>"
+      ],
+      "text/plain": [
+       "<IPython.core.display.HTML object>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "<jupyter_cadquery.cad_display.CadqueryDisplay at 0x7f5cb10ba940>"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
     "import paramak\n",
     "\n",
@@ -14,11 +471,18 @@
     "\n",
     "my_reactor.show()"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
   },
@@ -32,7 +496,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.3"
+   "version": "3.8.11"
   }
  },
  "nbformat": 4,
diff --git a/paramak/__init__.py b/paramak/__init__.py
index b7cd48b2b..6d4a1a332 100644
--- a/paramak/__init__.py
+++ b/paramak/__init__.py
@@ -66,6 +66,7 @@
     PoloidalFieldCoilCaseSetFC,
 )
 from .parametric_components.extrude_rectangle import ExtrudeRectangle
+from .parametric_components.extrude_hollow_rectangle import ExtrudeHollowRectangle
 
 from .parametric_components.poloidal_segmenter import PoloidalSegments
 from .parametric_components.port_cutters_rotated import PortCutterRotated
diff --git a/paramak/parametric_components/blanket_cutter_parallels.py b/paramak/parametric_components/blanket_cutter_parallels.py
index b7d5ad327..baf4eff69 100644
--- a/paramak/parametric_components/blanket_cutter_parallels.py
+++ b/paramak/parametric_components/blanket_cutter_parallels.py
@@ -1,4 +1,3 @@
-
 from paramak import ExtrudeStraightShape
 from paramak.utils import cut_solid
 
diff --git a/paramak/parametric_components/blanket_cutters_star.py b/paramak/parametric_components/blanket_cutters_star.py
index 9236d7fd5..9ffad18cc 100644
--- a/paramak/parametric_components/blanket_cutters_star.py
+++ b/paramak/parametric_components/blanket_cutters_star.py
@@ -23,8 +23,8 @@ class BlanketCutterStar(ExtrudeStraightShape):
     def __init__(
         self,
         distance: float,
-        height: float = 2000.,
-        width: float = 2000.,
+        height: float = 2000.0,
+        width: float = 2000.0,
         azimuth_placement_angle: Union[float, List[float]] = [
             0.0,
             36.0,
diff --git a/paramak/parametric_components/blanket_fp.py b/paramak/parametric_components/blanket_fp.py
index 2772c688e..416c6efa7 100644
--- a/paramak/parametric_components/blanket_fp.py
+++ b/paramak/parametric_components/blanket_fp.py
@@ -59,6 +59,7 @@ def __init__(
         vertical_displacement: Optional[float] = 0.0,
         offset_from_plasma: Union[float, list] = 0.0,
         num_points: Optional[int] = 50,
+        allow_overlapping_shape=False,
         **kwargs
     ):
 
@@ -70,6 +71,7 @@ def __init__(
         self.stop_angle = stop_angle
         self.plasma = plasma
         self.vertical_displacement = vertical_displacement
+        self.allow_overlapping_shape = allow_overlapping_shape
         if plasma is None:
             self.minor_radius = minor_radius
             self.major_radius = major_radius
@@ -202,7 +204,7 @@ def outer_offset(theta):
 
         # assemble
         points = inner_points + outer_points
-        if self._overlapping_shape:
+        if self._overlapping_shape and self.allow_overlapping_shape is False:
             msg = (
                 "BlanketFP: Some points with negative R coordinate have "
                 "been ignored."
diff --git a/paramak/parametric_components/center_column_cylinder.py b/paramak/parametric_components/center_column_cylinder.py
index 453d35969..710ee17db 100644
--- a/paramak/parametric_components/center_column_cylinder.py
+++ b/paramak/parametric_components/center_column_cylinder.py
@@ -18,7 +18,7 @@ def __init__(
         height: float,
         inner_radius: float,
         outer_radius: float,
-        center_height: float = 0.,
+        center_height: float = 0.0,
         name: str = "CenterColumnShieldCylinder",
         color: Tuple[float, float, float, Optional[float]] = (
             0.0,
diff --git a/paramak/parametric_components/extrude_hollow_rectangle.py b/paramak/parametric_components/extrude_hollow_rectangle.py
new file mode 100644
index 000000000..0b48d4420
--- /dev/null
+++ b/paramak/parametric_components/extrude_hollow_rectangle.py
@@ -0,0 +1,115 @@
+from typing import Tuple
+
+from paramak import ExtrudeStraightShape
+
+
+class ExtrudeHollowRectangle(ExtrudeStraightShape):
+    """Creates a rectangular with a hollow section extrusion.
+
+    Args:
+        height: the vertical (z axis) height of the rectangle (cm).
+        width: the horizontal (x axis) width of the rectangle (cm).
+        casing_thickness: the thickness of the casing (cm).
+        center_point: the center of the rectangle (x,z) values (cm).
+        name: defaults to "extrude_rectangle".
+    """
+
+    def __init__(
+        self,
+        height: float,
+        width: float,
+        distance: float,
+        casing_thickness: float,
+        center_point: Tuple[float, float] = (0, 0),
+        name: str = "extrude_hollow_rectangle",
+        **kwargs
+    ) -> None:
+
+        self.distance = distance
+        super().__init__(name=name, distance=self.distance, **kwargs)
+
+        self.center_point = center_point
+        self.height = height
+        self.width = width
+        self.casing_thickness = casing_thickness
+
+    @property
+    def center_point(self):
+        return self._center_point
+
+    @center_point.setter
+    def center_point(self, center_point):
+        self._center_point = center_point
+
+    @property
+    def height(self):
+        return self._height
+
+    @height.setter
+    def height(self, height):
+        self._height = height
+
+    @property
+    def width(self):
+        return self._width
+
+    @width.setter
+    def width(self, width):
+        self._width = width
+
+    def find_points(self):
+        """Finds the XZ points joined by straight connections that describe
+        the 2D profile of the shape."""
+
+        #   9-------------6
+        #   | 4 -------5,1|
+        #   | |         | |
+        #   | |  (0,0)  | |
+        #   | |         | |
+        #   | 3 ------- 2 |
+        #   8-------------7
+
+        points = [
+            (
+                self.center_point[0] + self.width / 2.0,
+                self.center_point[1] + self.height / 2.0,
+            ),
+            (
+                self.center_point[0] + self.width / 2.0,
+                self.center_point[1] - self.height / 2.0,
+            ),
+            (
+                self.center_point[0] - self.width / 2.0,
+                self.center_point[1] - self.height / 2.0,
+            ),
+            (
+                self.center_point[0] - self.width / 2.0,
+                self.center_point[1] + self.height / 2.0,
+            ),
+            (
+                self.center_point[0] + self.width / 2.0,
+                self.center_point[1] + self.height / 2.0,
+            ),
+            (
+                self.center_point[0] + (self.casing_thickness + self.width / 2.0),
+                self.center_point[1] + (self.casing_thickness + self.height / 2.0),
+            ),
+            (
+                self.center_point[0] + (self.casing_thickness + self.width / 2.0),
+                self.center_point[1] - (self.casing_thickness + self.height / 2.0),
+            ),
+            (
+                self.center_point[0] - (self.casing_thickness + self.width / 2.0),
+                self.center_point[1] - (self.casing_thickness + self.height / 2.0),
+            ),
+            (
+                self.center_point[0] - (self.casing_thickness + self.width / 2.0),
+                self.center_point[1] + (self.casing_thickness + self.height / 2.0),
+            ),
+            (
+                self.center_point[0] + (self.casing_thickness + self.width / 2.0),
+                self.center_point[1] + (self.casing_thickness + self.height / 2.0),
+            ),
+        ]
+
+        self.points = points
diff --git a/paramak/parametric_components/extrude_rectangle.py b/paramak/parametric_components/extrude_rectangle.py
index b66c725d6..e25f2d8f1 100644
--- a/paramak/parametric_components/extrude_rectangle.py
+++ b/paramak/parametric_components/extrude_rectangle.py
@@ -7,9 +7,9 @@ class ExtrudeRectangle(ExtrudeStraightShape):
     """Creates a rectangular extrusion.
 
     Args:
-        height: the vertical (z axis) height of the coil (cm).
-        width: the horizontal (x axis) width of the coil (cm).
-        center_point: the center of the coil (x,z) values (cm).
+        height: the vertical (z axis) height of the rectangle (cm).
+        width: the horizontal (x axis) width of the rectangle (cm).
+        center_point: the center of the rectangle (x,z) values (cm).
         name: defaults to "extrude_rectangle".
     """
 
@@ -54,7 +54,7 @@ def width(self, width):
 
     def find_points(self):
         """Finds the XZ points joined by straight connections that describe
-        the 2D profile of the poloidal field coil shape."""
+        the 2D profile of the shape."""
 
         points = [
             (
diff --git a/paramak/parametric_components/poloidal_field_coil_fp.py b/paramak/parametric_components/poloidal_field_coil_fp.py
index bc1b21849..8ebb6685b 100644
--- a/paramak/parametric_components/poloidal_field_coil_fp.py
+++ b/paramak/parametric_components/poloidal_field_coil_fp.py
@@ -14,7 +14,7 @@ def __init__(self, corner_points, **kwargs):
         height = abs(corner_points[0][1] - corner_points[1][1])
         width = abs(corner_points[0][0] - corner_points[1][0])
 
-        center_width = (corner_points[0][1] + corner_points[1][1]) / 2.0
+        center_width = (corner_points[0][0] + corner_points[1][0]) / 2.0
         center_height = (corner_points[0][1] + corner_points[1][1]) / 2.0
         center_point = (center_width, center_height)
 
diff --git a/paramak/parametric_reactors/ball_reactor.py b/paramak/parametric_reactors/ball_reactor.py
index d02ab455e..12b59edb3 100644
--- a/paramak/parametric_reactors/ball_reactor.py
+++ b/paramak/parametric_reactors/ball_reactor.py
@@ -1,5 +1,5 @@
 import warnings
-from typing import List, Optional, Union
+from typing import List, Optional
 
 import paramak
 
@@ -48,10 +48,9 @@ class BallReactor(paramak.Reactor):
         pf_coil_vertical_position: The vertical (z) position(s) of the centers
             of the poloidal field coils.
         pf_coil_case_thicknesses: the thickness(s) to use in both the radial
-            and vertical direction for the casing around the pf coils. If float
-            then the single value will be applied to all pf coils. If list then
-            each value will be applied to the pf coils one by one. To have no
-            casing set to 0.
+            and vertical direction for the casing around the pf coils. Each
+            float value in the list will be applied to the pf coils one by one.
+            To have no casing set each entry to 0 or leave as an empty list.
         outboard_tf_coil_radial_thickness: the radial thickness of the toroidal
             field coil.
         outboard_tf_coil_poloidal_thickness: the poloidal thickness of the
@@ -79,11 +78,11 @@ def __init__(
         divertor_to_tf_gap_vertical_thickness: Optional[float] = 0,
         number_of_tf_coils: Optional[int] = 12,
         rear_blanket_to_tf_gap: Optional[float] = None,
-        pf_coil_radial_thicknesses: Optional[Union[float, List[float]]] = None,
-        pf_coil_vertical_thicknesses: Optional[Union[float, List[float]]] = None,
-        pf_coil_radial_position: Optional[Union[float, List[float]]] = None,
-        pf_coil_vertical_position: Optional[Union[float, List[float]]] = None,
-        pf_coil_case_thicknesses: Optional[Union[float, List[float]]] = 10,
+        pf_coil_radial_thicknesses: List[float] = [],
+        pf_coil_vertical_thicknesses: List[float] = [],
+        pf_coil_radial_position: List[float] = [],
+        pf_coil_vertical_position: List[float] = [],
+        pf_coil_case_thicknesses: List[float] = [],
         outboard_tf_coil_radial_thickness: float = None,
         outboard_tf_coil_poloidal_thickness: float = None,
         divertor_position: Optional[str] = "both",
@@ -161,6 +160,12 @@ def __init__(
         self.major_radius = None
         self.minor_radius = None
 
+        # set during geometry creation
+        self._pf_coils = None
+        self._pf_coils_casing = None
+        self._divertor_lower = None
+        self._divertor_upper = None
+
     @property
     def rotation_angle(self):
         return self._rotation_angle
@@ -183,7 +188,7 @@ def pf_coil_vertical_position(self):
 
     @pf_coil_vertical_position.setter
     def pf_coil_vertical_position(self, value):
-        if not isinstance(value, list) and value is not None:
+        if not isinstance(value, list):
             raise ValueError("pf_coil_vertical_position must be a list")
         self._pf_coil_vertical_position = value
 
@@ -193,7 +198,7 @@ def pf_coil_radial_position(self):
 
     @pf_coil_radial_position.setter
     def pf_coil_radial_position(self, value):
-        if not isinstance(value, list) and value is not None:
+        if not isinstance(value, list):
             raise ValueError("pf_coil_radial_position must be a list")
         self._pf_coil_radial_position = value
 
@@ -203,7 +208,7 @@ def pf_coil_radial_thicknesses(self):
 
     @pf_coil_radial_thicknesses.setter
     def pf_coil_radial_thicknesses(self, value):
-        if not isinstance(value, list) and value is not None:
+        if not isinstance(value, list):
             raise ValueError("pf_coil_radial_thicknesses must be a list")
         self._pf_coil_radial_thicknesses = value
 
@@ -213,7 +218,7 @@ def pf_coil_vertical_thicknesses(self):
 
     @pf_coil_vertical_thicknesses.setter
     def pf_coil_vertical_thicknesses(self, value):
-        if not isinstance(value, list) and value is not None:
+        if not isinstance(value, list):
             raise ValueError("pf_coil_vertical_thicknesses must be a list")
         self._pf_coil_vertical_thicknesses = value
 
@@ -243,7 +248,7 @@ def create_solids(self):
         uncut_shapes.append(self._make_inboard_tf_coils())
         uncut_shapes.append(self._make_center_column_shield())
         uncut_shapes += self._make_blankets_layers()
-        uncut_shapes.append(self._make_divertor())
+        uncut_shapes += self._make_divertor()
         uncut_shapes += self._make_tf_coils()
         pf_coils = self._make_pf_coils()
 
@@ -253,7 +258,7 @@ def create_solids(self):
             for shape in uncut_shapes:
                 for pf_coil in pf_coils:
                     shape.solid = shape.solid.cut(pf_coil.solid)
-            shapes_and_components = pf_coils + uncut_shapes
+            shapes_and_components = uncut_shapes + pf_coils
 
         self.shapes_and_components = shapes_and_components
 
@@ -422,6 +427,7 @@ def _make_blankets_layers(self):
             color=(0.5, 0.5, 0.5),
             name="firstwall",
             cut=[self._center_column_cutter],
+            allow_overlapping_shape=True,
         )
 
         self._blanket = paramak.BlanketFP(
@@ -436,6 +442,7 @@ def _make_blankets_layers(self):
             color=(0.0, 1.0, 0.498),
             name="blanket",
             cut=[self._center_column_cutter],
+            allow_overlapping_shape=True,
         )
 
         self._blanket_rear_wall = paramak.BlanketFP(
@@ -451,6 +458,7 @@ def _make_blankets_layers(self):
             color=(0.0, 1.0, 1.0),
             name="blanket_rear_wall",
             cut=[self._center_column_cutter],
+            allow_overlapping_shape=True,
         )
 
         return [self._firstwall, self._blanket, self._blanket_rear_wall]
@@ -475,6 +483,7 @@ def _make_divertor(self):
             start_angle=-180,
             stop_angle=180,
             rotation_angle=self.rotation_angle,
+            allow_overlapping_shape=True,
         )
 
         divertor_height = self._blanket_rear_wall_end_height * 2
@@ -482,38 +491,62 @@ def _make_divertor(self):
         divertor_height_top = divertor_height
         divertor_height_bottom = -divertor_height
 
-        if self.divertor_position == "lower":
-            divertor_height_top = 0
-        elif self.divertor_position == "upper":
-            divertor_height_bottom = 0
-        self._divertor = paramak.RotateStraightShape(
-            points=[
-                (self._divertor_start_radius, divertor_height_bottom),
-                (self._divertor_end_radius, divertor_height_bottom),
-                (self._divertor_end_radius, divertor_height_top),
-                (self._divertor_start_radius, divertor_height_top),
-            ],
-            intersect=self._blanket_fw_rear_wall_envelope,
-            name="divertor",
-            color=(1.0, 0.667, 0.0),
-            rotation_angle=self.rotation_angle,
-        )
+        if self.divertor_position in ["lower", "both"]:
+            self._divertor_lower = paramak.RotateStraightShape(
+                points=[
+                    (self._divertor_start_radius, divertor_height_bottom),
+                    (self._divertor_end_radius, divertor_height_bottom),
+                    (self._divertor_end_radius, 0),
+                    (self._divertor_start_radius, 0),
+                ],
+                intersect=self._blanket_fw_rear_wall_envelope,
+                name="divertor_lower",
+                color=(1.0, 0.667, 0.0),
+                rotation_angle=self.rotation_angle,
+            )
+        if self.divertor_position in ["upper", "both"]:
+            self._divertor_upper = paramak.RotateStraightShape(
+                points=[
+                    (self._divertor_start_radius, 0),
+                    (self._divertor_end_radius, 0),
+                    (self._divertor_end_radius, divertor_height_top),
+                    (self._divertor_start_radius, divertor_height_top),
+                ],
+                intersect=self._blanket_fw_rear_wall_envelope,
+                name="divertor_upper",
+                color=(1.0, 0.667, 0.0),
+                rotation_angle=self.rotation_angle,
+            )
 
         for component in [self._firstwall, self._blanket, self._blanket_rear_wall]:
-            component.cut.append(self._divertor)
+            if self.divertor_position in ["upper", "both"]:
+                component.cut.append(self._divertor_upper)
+            if self.divertor_position in ["lower", "both"]:
+                component.cut.append(self._divertor_lower)
 
-        return self._divertor
+        if self.divertor_position == "upper":
+            return [self._divertor_upper]
+        if self.divertor_position == "lower":
+            return [self._divertor_lower]
+        if self.divertor_position == "both":
+            return [self._divertor_upper, self._divertor_lower]
 
     def _make_pf_coils(self):
-        if None not in [
+
+        pf_input_lists = [
             self.pf_coil_vertical_thicknesses,
             self.pf_coil_radial_thicknesses,
             self.pf_coil_vertical_position,
             self.pf_coil_radial_position,
-        ]:
-            list_of_components = []
+        ]
 
-            # TODO make use of counter in the name attribute
+        # checks if lists are all the same length
+        if all(
+            len(input_list) == len(pf_input_lists[0]) for input_list in pf_input_lists
+        ):
+            number_of_pf_coils = len(pf_input_lists[0])
+            if number_of_pf_coils == 0:
+                return None
 
             center_points = [
                 (x, y)
@@ -522,32 +555,58 @@ def _make_pf_coils(self):
                 )
             ]
 
-            self._pf_coils = self._pf_coil = paramak.PoloidalFieldCoilSet(
-                heights=self.pf_coil_vertical_thicknesses,
-                widths=self.pf_coil_radial_thicknesses,
-                center_points=center_points,
-                rotation_angle=self.rotation_angle,
-                name="pf_coil",
-            )
-            list_of_components.append(self._pf_coil)
-
-            if self.pf_coil_case_thicknesses is not None:
-                self._pf_coils_casing = paramak.PoloidalFieldCoilCaseSetFC(
-                    pf_coils=self._pf_coil,
-                    casing_thicknesses=self.pf_coil_case_thicknesses,
+            self._pf_coils = []
+            for counter, (
+                center_point,
+                pf_coil_vertical_thickness,
+                pf_coil_radial_thickness,
+            ) in enumerate(
+                zip(
+                    center_points,
+                    self.pf_coil_vertical_thicknesses,
+                    self.pf_coil_radial_thicknesses,
+                ),
+                1,
+            ):
+                pf_coil = paramak.PoloidalFieldCoil(
+                    height=pf_coil_vertical_thickness,
+                    width=pf_coil_radial_thickness,
+                    center_point=center_point,
                     rotation_angle=self.rotation_angle,
-                    name="pf_coil_case",
+                    name=f"pf_coil_{counter}",
+                )
+                self._pf_coils.append(pf_coil)
+
+            if self.pf_coil_case_thicknesses == []:
+                return self._pf_coils
+
+            self._pf_coils_casing = []
+            if len(self.pf_coil_case_thicknesses) == number_of_pf_coils:
+                for counter, (pf_coil_case_thickness, pf_coil) in enumerate(
+                    zip(self.pf_coil_case_thicknesses, self._pf_coils), 1
+                ):
+                    pf_coils_casing = paramak.PoloidalFieldCoilCaseFC(
+                        pf_coil=pf_coil,
+                        casing_thickness=pf_coil_case_thickness,
+                        rotation_angle=self.rotation_angle,
+                        name=f"pf_coil_case_{counter}",
+                    )
+                    self._pf_coils_casing.append(pf_coils_casing)
+            else:
+                raise ValueError(
+                    "pf_coil_case_thicknesses is not the same length as the other "
+                    "PF coil inputs (pf_coil_vertical_thicknesses, "
+                    "pf_coil_radial_thicknesses, pf_coil_radial_position, "
+                    "pf_coil_vertical_position) so can not make pf coils cases"
                 )
-                list_of_components.append(self._pf_coils_casing)
 
-            return list_of_components
-        else:
-            print(
-                "pf_coil_vertical_thicknesses, pf_coil_radial_thicknesses, "
-                "pf_coil_radial_position, pf_coil_vertical_position not "
-                "so not making pf coils"
-            )
-            return None
+            return self._pf_coils + self._pf_coils_casing
+
+        raise ValueError(
+            "pf_coil_vertical_thicknesses, pf_coil_radial_thicknesses, "
+            "pf_coil_radial_position, pf_coil_vertical_position are not "
+            "the same length so can not make PF coils"
+        )
 
     def _make_tf_coils(self):
         comp = []
diff --git a/paramak/parametric_reactors/eu_demo_2015_reactor.py b/paramak/parametric_reactors/eu_demo_2015_reactor.py
index 68f59cc8f..0c9224af9 100644
--- a/paramak/parametric_reactors/eu_demo_2015_reactor.py
+++ b/paramak/parametric_reactors/eu_demo_2015_reactor.py
@@ -95,6 +95,7 @@ def create_tf_coils(self, vac_vessel_inner, vac_vessel) -> list:
             ),
             rotation_angle=self.rotation_angle,
             color=(1.0, 1.0, 0.498),
+            name="tf_coil_casing",
         )
 
         return [tf_coil_casing]
@@ -136,6 +137,7 @@ def create_vessel_components(self) -> list:
             ],
             rotation_angle=self.rotation_angle,
             color=(0.0, 1.0, 0.498),
+            name="blanket",
         )
 
         # SN Divertor
@@ -169,6 +171,7 @@ def create_vessel_components(self) -> list:
             ],
             rotation_angle=self.rotation_angle,
             color=(1.0, 0.667, 0.0),
+            name="divertor",
         )
 
         # Vacuum vessel
@@ -223,6 +226,7 @@ def create_vessel_components(self) -> list:
             rotation_angle=self.rotation_angle,
             # avoid overlap between VV and blanket divertor
             union=[blanket, divertor],
+            name="vessel_inner",
         )
         vac_vessel = paramak.RotateSplineShape(
             points=[
@@ -281,6 +285,7 @@ def create_vessel_components(self) -> list:
             cut=vac_vessel_inner,  # hollow shape
             rotation_angle=self.rotation_angle,
             color=(0.0, 1.0, 1.0),
+            name="vessel",
         )
 
         return [divertor, blanket, vac_vessel, vac_vessel_inner]
@@ -309,33 +314,42 @@ def create_pf_coils(self) -> list:
             A list of CadQuery solids: A list of 3D solid volumes
         """
 
-        outboard_pf_coils = paramak.PoloidalFieldCoilSet(
-            center_points=[
-                (689, -985),
-                (1421, -689),
-                (1580, -252),
-                (1550, 293),
-                (1400, 598),
-                (621, 811),
-            ],
-            widths=[
-                803 - 599,
-                1492 - 1351,
-                1628 - 1526,
-                1598 - 1503,
-                1439 - 1360,
-                684 - 563,
-            ],
-            heights=[
-                803 - 599,
-                1492 - 1351,
-                1628 - 1526,
-                1598 - 1503,
-                1439 - 1360,
-                684 - 563,
-            ],
-            rotation_angle=self.rotation_angle,
-        )
+        center_points = [
+            (689, -985),
+            (1421, -689),
+            (1580, -252),
+            (1550, 293),
+            (1400, 598),
+            (621, 811),
+        ]
+        widths = [
+            803 - 599,
+            1492 - 1351,
+            1628 - 1526,
+            1598 - 1503,
+            1439 - 1360,
+            684 - 563,
+        ]
+        heights = [
+            803 - 599,
+            1492 - 1351,
+            1628 - 1526,
+            1598 - 1503,
+            1439 - 1360,
+            684 - 563,
+        ]
+        outboard_pf_coils = []
+        for counter, (center_point, width, height) in enumerate(
+            zip(center_points, widths, heights), 1
+        ):
+            pf_coil = paramak.PoloidalFieldCoil(
+                height=height,
+                width=width,
+                center_point=center_point,
+                rotation_angle=self.rotation_angle,
+                name=f"outboard_pf_coil_{counter}",
+            )
+            outboard_pf_coils.append(pf_coil)
 
         pf_coils_1 = paramak.RotateStraightShape(
             points=[
@@ -345,6 +359,7 @@ def create_pf_coils(self) -> list:
                 (363.04586051526934, -881.6221003581469),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coils_1",
         )
 
         pf_coils_2 = paramak.RotateStraightShape(
@@ -355,6 +370,7 @@ def create_pf_coils(self) -> list:
                 (266.2030353910733, -600.8478453421652),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coils_2",
         )
 
         pf_coils_3 = paramak.RotateStraightShape(
@@ -365,6 +381,7 @@ def create_pf_coils(self) -> list:
                 (263.5606400431317, -316.0372010628879),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coils_3",
         )
 
         pf_coils_4 = paramak.RotateStraightShape(
@@ -375,6 +392,7 @@ def create_pf_coils(self) -> list:
                 (262.2297985905187, 229.49149612970268),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coils_4",
         )
 
         pf_coils_5 = paramak.RotateStraightShape(
@@ -385,10 +403,10 @@ def create_pf_coils(self) -> list:
                 (261.01468248161126, 510.27832556706545),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coils_5",
         )
 
-        return [
-            outboard_pf_coils,
+        return outboard_pf_coils + [
             pf_coils_1,
             pf_coils_2,
             pf_coils_3,
diff --git a/paramak/parametric_reactors/flf_system_code_reactor.py b/paramak/parametric_reactors/flf_system_code_reactor.py
index 08a371ca4..98b250c30 100644
--- a/paramak/parametric_reactors/flf_system_code_reactor.py
+++ b/paramak/parametric_reactors/flf_system_code_reactor.py
@@ -8,7 +8,8 @@ class FlfSystemCodeReactor(paramak.Reactor):
     on parameters. Model design was originally presented at University of
     York in 2019. Model shown at 50 mins 48 seconds in presentation
     https://www.youtube.com/watch?v=DtvcEkIb4D4
-    Args:
+
+    Arguments:
         inner_blanket_radius: The radial distance between the center of the
             reactor on the start of the blanket (cm).
         blanket_thickness: The radial thickness of the blanket (cm).
@@ -26,8 +27,6 @@ class FlfSystemCodeReactor(paramak.Reactor):
             lower section of vaccum vessel (cm).
         rotation_angle: The angle of the sector simulated. Set to 360 for
             simulations and less when creating models for visualization.
-    Returns:
-        paramak.Reactor object
     """
 
     def __init__(
diff --git a/paramak/parametric_reactors/iter_paper_2020.py b/paramak/parametric_reactors/iter_paper_2020.py
index 621b5a1fe..763fd9f92 100644
--- a/paramak/parametric_reactors/iter_paper_2020.py
+++ b/paramak/parametric_reactors/iter_paper_2020.py
@@ -54,6 +54,7 @@ def create_tf_coils(self) -> list:
             distance=coil_thickness,
             number_of_coils=self.number_of_tf_coils,
             rotation_angle=self.rotation_angle,
+            name="tf_coils",
         )
 
         return [tf_coil]
@@ -74,6 +75,7 @@ def create_vessel_components(self) -> list:
             rotation_angle=self.rotation_angle,
             vertical_displacement=self.plasma.vertical_displacement,
             offset_from_plasma=[[-70, 0, 90, 180, 230], [50, 20, 59, 16, 50]],
+            name="blanket",
         )
 
         # SN Divertor
@@ -86,6 +88,7 @@ def create_vessel_components(self) -> list:
             dome_height=45,
             dome_pos=0.45,
             rotation_angle=self.rotation_angle,
+            name="divertor",
         )
 
         # Vacuum vessel
@@ -95,6 +98,7 @@ def create_vessel_components(self) -> list:
         vac_vessel_inner = paramak.RotateMixedShape(
             points=blanket.outer_points + divertor.casing_points,
             rotation_angle=self.rotation_angle,
+            name="vessel",
         )
 
         vac_vessel = paramak.RotateSplineShape(
@@ -177,6 +181,7 @@ def create_vessel_components(self) -> list:
             ],
             cut=[vac_vessel_inner],  # to make a hollow shape
             rotation_angle=self.rotation_angle,
+            name="vessel_inner",
         )
 
         return [divertor, blanket, vac_vessel, vac_vessel_inner]
@@ -208,7 +213,7 @@ def create_pf_coils(self) -> list:
         """
 
         # from diagram
-        bot_lefts = np.array(
+        lower_lefts = np.array(
             [
                 (345.5429497568881, -788.0537547271744),
                 (800.6482982171799, -703.3664235548353),
@@ -230,12 +235,16 @@ def create_pf_coils(self) -> list:
             ]
         )
 
-        outboard_pf_coils = paramak.PoloidalFieldCoilSet(
-            center_points=((bot_lefts + top_rights) / 2).tolist(),
-            widths=(top_rights[:, 0] - bot_lefts[:, 0]).tolist(),
-            heights=(top_rights[:, 1] - bot_lefts[:, 1]).tolist(),
-            rotation_angle=self.rotation_angle,
-        )
+        outboard_pf_coils = []
+        for counter, (top_right, lower_left) in enumerate(
+            zip(top_rights, lower_lefts), 1
+        ):
+            pf_coil = paramak.PoloidalFieldCoilFP(
+                corner_points=(top_right, lower_left),
+                rotation_angle=self.rotation_angle,
+                name=f"outboard_pf_coils_{counter}",
+            )
+            outboard_pf_coils.append(pf_coil)
 
         x_inner, x_outer = 132.73905996758506, 202.26904376012968
 
@@ -247,6 +256,7 @@ def create_pf_coils(self) -> list:
                 (x_inner, -400),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coil_1",
         )
 
         pf_coils_2 = paramak.RotateStraightShape(
@@ -257,6 +267,7 @@ def create_pf_coils(self) -> list:
                 (x_inner, -200),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coil_2",
         )
 
         pf_coils_3 = paramak.RotateStraightShape(
@@ -267,6 +278,7 @@ def create_pf_coils(self) -> list:
                 (x_inner, 0),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coil_3",
         )
 
         pf_coils_4 = paramak.RotateStraightShape(
@@ -277,6 +289,7 @@ def create_pf_coils(self) -> list:
                 (x_inner, 200),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coil_4",
         )
 
         pf_coils_5 = paramak.RotateStraightShape(
@@ -287,6 +300,7 @@ def create_pf_coils(self) -> list:
                 (x_inner, 400),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coil_5",
         )
 
         pf_coils_6 = paramak.RotateStraightShape(
@@ -297,10 +311,10 @@ def create_pf_coils(self) -> list:
                 (x_inner, 600),
             ],
             rotation_angle=self.rotation_angle,
+            name="pf_coil_6",
         )
 
-        return [
-            outboard_pf_coils,
+        return outboard_pf_coils + [
             pf_coils_1,
             pf_coils_2,
             pf_coils_3,
diff --git a/paramak/parametric_reactors/sparc_paper_2020.py b/paramak/parametric_reactors/sparc_paper_2020.py
index 50e816dd1..928774e83 100644
--- a/paramak/parametric_reactors/sparc_paper_2020.py
+++ b/paramak/parametric_reactors/sparc_paper_2020.py
@@ -37,72 +37,101 @@ def create_pf_coils(self):
 
         """
 
-        inboard_pf_coils = paramak.PoloidalFieldCoilSet(
-            center_points=[
-                (53.5, -169.58),
-                (53.5, -118.43),
-                (53.5, -46.54),
-                (53.5, 46.54),
-                (53.5, 118.43),
-                (53.5, 169.58),
-            ],
-            heights=[
-                41.5,
-                40.5,
-                82.95,
-                82.95,
-                40.5,
-                41.5,
-            ],
-            widths=[27.7, 27.7, 27.7, 27.7, 27.7, 27.7],
-            rotation_angle=self.rotation_angle,
-        )
-
-        outboard_pf_coils = paramak.PoloidalFieldCoilSet(
-            center_points=[
-                (86, 230),
-                (86, -230),
-                (164, 241),
-                (164, -241),
-                (263, 222),
-                (263, -222),
-                (373, 131),
-                (373, -131),
-            ],
-            widths=[
-                32,
-                32,
-                50,
-                50,
-                43,
-                43,
-                48,
-                48,
-            ],
-            heights=[
-                40,
-                40,
-                30,
-                30,
-                28,
-                28,
-                37,
-                37,
-            ],
-            rotation_angle=self.rotation_angle,
-        )
-
-        div_coils = paramak.PoloidalFieldCoilSet(
-            center_points=[
-                (207, 144),
-                (207, 125),
-                (207, -144),
-                (207, -125),
-            ],
-            widths=[15, 15, 15, 15],
-            heights=[15, 15, 15, 15],
-            rotation_angle=self.rotation_angle,
-        )
+        center_points = [
+            (53.5, -169.58),
+            (53.5, -118.43),
+            (53.5, -46.54),
+            (53.5, 46.54),
+            (53.5, 118.43),
+            (53.5, 169.58),
+        ]
+        heights = [
+            41.5,
+            40.5,
+            82.95,
+            82.95,
+            40.5,
+            41.5,
+        ]
+        widths = [27.7, 27.7, 27.7, 27.7, 27.7, 27.7]
+
+        inboard_pf_coils = []
+        for counter, (center_point, width, height) in enumerate(
+            zip(center_points, widths, heights), 1
+        ):
+            pf_coil = paramak.PoloidalFieldCoil(
+                height=height,
+                width=width,
+                center_point=center_point,
+                rotation_angle=self.rotation_angle,
+                name=f"inboard_pf_coil_{counter}",
+            )
+            inboard_pf_coils.append(pf_coil)
+
+        center_points = [
+            (86, 230),
+            (86, -230),
+            (164, 241),
+            (164, -241),
+            (263, 222),
+            (263, -222),
+            (373, 131),
+            (373, -131),
+        ]
+        widths = [
+            32,
+            32,
+            50,
+            50,
+            43,
+            43,
+            48,
+            48,
+        ]
+        heights = [
+            40,
+            40,
+            30,
+            30,
+            28,
+            28,
+            37,
+            37,
+        ]
+        outboard_pf_coils = []
+        for counter, (center_point, width, height) in enumerate(
+            zip(center_points, widths, heights), 1
+        ):
+            pf_coil = paramak.PoloidalFieldCoil(
+                height=height,
+                width=width,
+                center_point=center_point,
+                rotation_angle=self.rotation_angle,
+                name=f"outboard_pf_coil_{counter}",
+            )
+            outboard_pf_coils.append(pf_coil)
+
+        center_points = [
+            (207, 144),
+            (207, 125),
+            (207, -144),
+            (207, -125),
+        ]
+        widths = [15, 15, 15, 15]
+        heights = [15, 15, 15, 15]
+
+        div_coils = []
+        for counter, (center_point, width, height) in enumerate(
+            zip(center_points, widths, heights), 1
+        ):
+            pf_coil = paramak.PoloidalFieldCoil(
+                height=height,
+                width=width,
+                center_point=center_point,
+                rotation_angle=self.rotation_angle,
+                name=f"div_coil_{counter}",
+            )
+            div_coils.append(pf_coil)
 
         efccu_coils_1 = paramak.RotateStraightShape(
             points=[
@@ -112,6 +141,7 @@ def create_pf_coils(self):
                 (242.0323325635104, -132.25806451612902),
             ],
             rotation_angle=self.rotation_angle,
+            name="efccu_coils_1",
         )
 
         efccu_coils_2 = paramak.RotateStraightShape(
@@ -122,6 +152,7 @@ def create_pf_coils(self):
                 (268.82217090069287, -94.47004608294935),
             ],
             rotation_angle=self.rotation_angle,
+            name="efccu_coils_2",
         )
 
         efccu_coils_3 = paramak.RotateStraightShape(
@@ -132,6 +163,7 @@ def create_pf_coils(self):
                 (281.7551963048499, -78.80184331797238),
             ],
             rotation_angle=self.rotation_angle,
+            name="efccu_coils_3",
         )
 
         efccu_coils_4 = paramak.RotateStraightShape(
@@ -142,6 +174,7 @@ def create_pf_coils(self):
                 (242.0323325635104, 132.25806451612902),
             ],
             rotation_angle=self.rotation_angle,
+            name="efccu_coils_4",
         )
 
         efccu_coils_5 = paramak.RotateStraightShape(
@@ -152,6 +185,7 @@ def create_pf_coils(self):
                 (268.82217090069287, 94.47004608294935),
             ],
             rotation_angle=self.rotation_angle,
+            name="efccu_coils_5",
         )
 
         efccu_coils_6 = paramak.RotateStraightShape(
@@ -162,31 +196,44 @@ def create_pf_coils(self):
                 (281.7551963048499, 78.80184331797238),
             ],
             rotation_angle=self.rotation_angle,
+            name="efccu_coils_6",
         )
 
         # these are cut away from the vessel components
-        vs_coils = paramak.PoloidalFieldCoilSet(
-            center_points=[
-                (240, 70),
-                (240, -70),
-            ],
-            widths=[10, 10],
-            heights=[10, 10],
-            rotation_angle=self.rotation_angle,
-        )
-
-        return [
-            inboard_pf_coils,
-            outboard_pf_coils,
-            div_coils,
-            efccu_coils_1,
-            efccu_coils_2,
-            efccu_coils_3,
-            efccu_coils_4,
-            efccu_coils_5,
-            efccu_coils_6,
-            vs_coils,
+        center_points = [
+            (240, 70),
+            (240, -70),
         ]
+        widths = [10, 10]
+        heights = [10, 10]
+
+        vs_coils = []
+        for counter, (center_point, width, height) in enumerate(
+            zip(center_points, widths, heights), 1
+        ):
+            pf_coil = paramak.PoloidalFieldCoil(
+                height=height,
+                width=width,
+                center_point=center_point,
+                rotation_angle=self.rotation_angle,
+                name=f"vs_coil_{counter}",
+            )
+            vs_coils.append(pf_coil)
+
+        return (
+            vs_coils
+            + inboard_pf_coils
+            + outboard_pf_coils
+            + div_coils
+            + [
+                efccu_coils_1,
+                efccu_coils_2,
+                efccu_coils_3,
+                efccu_coils_4,
+                efccu_coils_5,
+                efccu_coils_6,
+            ]
+        )
 
     def create_tf_coils(self):
         """Creates a 3d solids for each tf coil.
@@ -203,6 +250,7 @@ def create_tf_coils(self):
             distance=33,
             number_of_coils=12,
             rotation_angle=self.rotation_angle,
+            name="tf_coil",
         )
 
         return [tf_coil]
@@ -229,6 +277,7 @@ def create_vessel_components(self, vs_coils):
                 (231.87066974595842, 46.5437788018433, "straight"),
             ],
             rotation_angle=self.rotation_angle,
+            name="antenna",
         )
 
         vac_vessel = paramak.RotateStraightShape(
@@ -269,6 +318,7 @@ def create_vessel_components(self, vs_coils):
             ],
             rotation_angle=self.rotation_angle,
             color=(0.0, 1.0, 1.0),
+            name="vessel",
         )
 
         inner_vessel = paramak.RotateMixedShape(
@@ -318,8 +368,9 @@ def create_vessel_components(self, vs_coils):
                 (269.7459584295612, -63.13364055299536, "straight"),
             ],
             rotation_angle=self.rotation_angle,
-            cut=[vac_vessel, vs_coils, antenna],
+            cut=[vac_vessel, antenna] + vs_coils,
             color=(0.0, 1.0, 0.498),
+            name="inner_vessel",
         )
 
         return [antenna, vac_vessel, inner_vessel]
@@ -357,7 +408,7 @@ def create_solids(self):
         plasma = self.create_plasma()
         pf_coils = self.create_pf_coils()
         tf_coils = self.create_tf_coils()
-        vessel = self.create_vessel_components(pf_coils[-1])
+        vessel = self.create_vessel_components([pf_coils[0], pf_coils[1]])
 
         all_shapes_and_components = plasma + pf_coils + tf_coils + vessel
 
diff --git a/paramak/parametric_reactors/submersion_reactor.py b/paramak/parametric_reactors/submersion_reactor.py
index d28264160..6004f5b69 100644
--- a/paramak/parametric_reactors/submersion_reactor.py
+++ b/paramak/parametric_reactors/submersion_reactor.py
@@ -1,5 +1,5 @@
 import warnings
-from typing import List, Optional, Union
+from typing import List, Optional
 
 import cadquery as cq
 
@@ -75,11 +75,11 @@ def __init__(
         outboard_tf_coil_radial_thickness: Optional[float] = None,
         rear_blanket_to_tf_gap: Optional[float] = None,
         outboard_tf_coil_poloidal_thickness: Optional[float] = None,
-        pf_coil_vertical_thicknesses: Optional[float] = None,
-        pf_coil_radial_thicknesses: Optional[float] = None,
-        pf_coil_radial_position: Optional[Union[float, List[float]]] = None,
-        pf_coil_vertical_position: Optional[Union[float, List[float]]] = None,
-        pf_coil_case_thicknesses: Optional[float] = 10,
+        pf_coil_radial_thicknesses: List[float] = [],
+        pf_coil_vertical_thicknesses: List[float] = [],
+        pf_coil_radial_position: List[float] = [],
+        pf_coil_vertical_position: List[float] = [],
+        pf_coil_case_thicknesses: List[float] = [],
         divertor_position: Optional[str] = "both",
         support_position: Optional[str] = "both",
     ):
@@ -149,6 +149,12 @@ def __init__(
         self.major_radius = None
         self.minor_radius = None
 
+        # set during geometry creation
+        self._pf_coils = None
+        self._pf_coils_casing = None
+        self._divertor_lower = None
+        self._divertor_upper = None
+
     @property
     def pf_coil_radial_position(self):
         return self._pf_coil_radial_position
@@ -219,7 +225,7 @@ def create_solids(self):
         uncut_shapes.append(self._make_center_column_shield())
         uncut_shapes.append(self._make_firstwall())
         uncut_shapes.append(self._make_blanket())
-        uncut_shapes.append(self._make_divertor())
+        uncut_shapes += self._make_divertor()
         uncut_shapes.append(self._make_supports())
         uncut_shapes.append(self._make_rear_blanket_wall())
         uncut_shapes += self._make_tf_coils()
@@ -465,27 +471,45 @@ def _make_divertor(self):
         divertor_height_top = divertor_height
         divertor_height_bottom = -divertor_height
 
-        if self.divertor_position == "lower":
-            divertor_height_top = 0
-        elif self.divertor_position == "upper":
-            divertor_height_bottom = 0
+        if self.divertor_position in ["lower", "both"]:
+            self._divertor_lower = paramak.RotateStraightShape(
+                points=[
+                    (self._divertor_start_radius, divertor_height_bottom),
+                    (self._divertor_end_radius, divertor_height_bottom),
+                    (self._divertor_end_radius, 0),
+                    (self._divertor_start_radius, 0),
+                ],
+                intersect=fw_envelope,
+                name="divertor_lower",
+                color=(1.0, 0.667, 0.0),
+                rotation_angle=self.rotation_angle,
+            )
+        if self.divertor_position in ["upper", "both"]:
+            self._divertor_upper = paramak.RotateStraightShape(
+                points=[
+                    (self._divertor_start_radius, 0),
+                    (self._divertor_end_radius, 0),
+                    (self._divertor_end_radius, divertor_height_top),
+                    (self._divertor_start_radius, divertor_height_top),
+                ],
+                intersect=fw_envelope,
+                name="divertor_upper",
+                color=(1.0, 0.667, 0.0),
+                rotation_angle=self.rotation_angle,
+            )
 
-        self._divertor = paramak.RotateStraightShape(
-            points=[
-                (self._divertor_start_radius, divertor_height_bottom),
-                (self._divertor_end_radius, divertor_height_bottom),
-                (self._divertor_end_radius, divertor_height_top),
-                (self._divertor_start_radius, divertor_height_top),
-            ],
-            intersect=fw_envelope,
-            rotation_angle=self.rotation_angle,
-            name="divertor",
-            color=(1.0, 0.667, 0.0),
-        )
+        for component in [self._firstwall, self._inboard_firstwall]:
+            if self.divertor_position in ["upper", "both"]:
+                component.cut = [self._divertor_upper]
+            if self.divertor_position in ["lower", "both"]:
+                component.cut = [self._divertor_lower]
 
-        self._firstwall.cut = self._divertor
-        self._inboard_firstwall.cut = self._divertor
-        return self._divertor
+        if self.divertor_position == "upper":
+            return [self._divertor_upper]
+        if self.divertor_position == "lower":
+            return [self._divertor_lower]
+        if self.divertor_position == "both":
+            return [self._divertor_upper, self._divertor_lower]
 
     def _make_blanket(self):
         self._inboard_blanket = paramak.CenterColumnShieldCylinder(
@@ -621,15 +645,21 @@ def _make_rear_blanket_wall(self):
         return self._outboard_rear_blanket_wall
 
     def _make_pf_coils(self):
-        if None not in [
+
+        pf_input_lists = [
             self.pf_coil_vertical_thicknesses,
             self.pf_coil_radial_thicknesses,
             self.pf_coil_vertical_position,
             self.pf_coil_radial_position,
-        ]:
-            list_of_components = []
+        ]
 
-            # TODO make use of counter in the name attribute
+        # checks if lists are all the same length
+        if all(
+            len(input_list) == len(pf_input_lists[0]) for input_list in pf_input_lists
+        ):
+            number_of_pf_coils = len(pf_input_lists[0])
+            if number_of_pf_coils == 0:
+                return None
 
             center_points = [
                 (x, y)
@@ -638,32 +668,52 @@ def _make_pf_coils(self):
                 )
             ]
 
-            self._pf_coils = self._pf_coil = paramak.PoloidalFieldCoilSet(
-                heights=self.pf_coil_vertical_thicknesses,
-                widths=self.pf_coil_radial_thicknesses,
-                center_points=center_points,
-                rotation_angle=self.rotation_angle,
-                name="pf_coil",
-            )
-            list_of_components.append(self._pf_coil)
-
-            if self.pf_coil_case_thicknesses is not None:
-                self._pf_coils_casing = paramak.PoloidalFieldCoilCaseSetFC(
-                    pf_coils=self._pf_coil,
-                    casing_thicknesses=self.pf_coil_case_thicknesses,
+            self._pf_coils = []
+            for counter, (
+                center_point,
+                pf_coil_vertical_thickness,
+                pf_coil_radial_thickness,
+            ) in enumerate(
+                zip(
+                    center_points,
+                    self.pf_coil_vertical_thicknesses,
+                    self.pf_coil_radial_thicknesses,
+                ),
+                1,
+            ):
+                pf_coil = paramak.PoloidalFieldCoil(
+                    height=pf_coil_vertical_thickness,
+                    width=pf_coil_radial_thickness,
+                    center_point=center_point,
                     rotation_angle=self.rotation_angle,
-                    name="pf_coil_case",
+                    name=f"pf_coil_{counter}",
+                )
+                self._pf_coils.append(pf_coil)
+
+            if self.pf_coil_case_thicknesses == []:
+                return self._pf_coils
+
+            self._pf_coils_casing = []
+            if len(self.pf_coil_case_thicknesses) == number_of_pf_coils:
+                for counter, (pf_coil_case_thickness, pf_coil) in enumerate(
+                    zip(self.pf_coil_case_thicknesses, self._pf_coils), 1
+                ):
+                    pf_coils_casing = paramak.PoloidalFieldCoilCaseFC(
+                        pf_coil=pf_coil,
+                        casing_thickness=pf_coil_case_thickness,
+                        rotation_angle=self.rotation_angle,
+                        name=f"pf_coil_case_{counter}",
+                    )
+                    self._pf_coils_casing.append(pf_coils_casing)
+            else:
+                raise ValueError(
+                    "pf_coil_case_thicknesses is not the same length as the other "
+                    "PF coil inputs (pf_coil_vertical_thicknesses, "
+                    "pf_coil_radial_thicknesses, pf_coil_radial_position, "
+                    "pf_coil_vertical_position) so can not make pf coils cases"
                 )
-                list_of_components.append(self._pf_coils_casing)
 
-            return list_of_components
-        else:
-            print(
-                "pf_coil_vertical_thicknesses, pf_coil_radial_thicknesses, "
-                "pf_coil_radial_position, pf_coil_vertical_position not "
-                "so not making pf coils"
-            )
-            return None
+            return self._pf_coils + self._pf_coils_casing
 
     def _make_tf_coils(self):
         list_of_components = []
@@ -703,6 +753,7 @@ def _make_tf_coils(self):
                     rotation_angle=self.rotation_angle,
                     horizontal_length=self._outboard_tf_coils_horizontal_length,
                     vertical_length=self._outboard_tf_coils_vertical_height,
+                    name="tf_coils",
                 )
                 list_of_components.append(self._tf_coil)
 
diff --git a/paramak/reactor.py b/paramak/reactor.py
index 433558869..075114181 100644
--- a/paramak/reactor.py
+++ b/paramak/reactor.py
@@ -37,7 +37,7 @@ class Reactor:
     def __init__(
         self,
         shapes_and_components: List[paramak.Shape] = [],
-        graveyard_size: float = 20_000.,
+        graveyard_size: float = 20_000.0,
         graveyard_offset: Optional[float] = None,
         largest_shapes: Optional[List[paramak.Shape]] = None,
     ):
@@ -292,7 +292,8 @@ def export_stp(
         if len(filename) != len(self.shapes_and_components):
             msg = (
                 f"The Reactor contains {len(self.shapes_and_components)} "
-                f"Shapes and {len(filename)} filenames have be provided"
+                f"Shapes and {len(filename)} filenames have be provided. "
+                f"The names of the shapes are {self.name}"
             )
             raise ValueError(msg)
 
@@ -318,6 +319,9 @@ def export_brep(self, filename: str, merge: bool = True):
         Args:
             filename: the filename of exported the brep file.
             merged: if the surfaces should be merged (True) or not (False).
+
+        Returns:
+            filename of the brep created
         """
 
         path_filename = Path(filename)
@@ -409,7 +413,8 @@ def export_stl(
         if len(filename) != len(self.shapes_and_components):
             msg = (
                 f"The Reactor contains {len(self.shapes_and_components)} "
-                f"Shapes and {len(filename)} filenames have be provided"
+                f"Shapes and {len(filename)} filenames have be provided. "
+                f"The names of the shapes are {self.name}"
             )
             raise ValueError(msg)
 


Test patch:
diff --git a/tests/test_parametric_components/test_extrude_hollow_rectangle.py b/tests/test_parametric_components/test_extrude_hollow_rectangle.py
new file mode 100644
index 000000000..465ac2de0
--- /dev/null
+++ b/tests/test_parametric_components/test_extrude_hollow_rectangle.py
@@ -0,0 +1,76 @@
+import unittest
+
+import pytest
+
+import paramak
+
+
+class TestExtrudeHollowRectangle(unittest.TestCase):
+    def setUp(self):
+        self.test_shape = paramak.ExtrudeHollowRectangle(
+            height=10, width=15, casing_thickness=1, distance=2
+        )
+
+    def test_default_parameters(self):
+        """Checks that the default parameters of a ExtrudeHollowRectangle are
+        correct."""
+
+        assert self.test_shape.center_point == (0, 0)
+
+    def test_processed_points_calculation(self):
+        """Checks that the processed_points used to construct the
+        ExtrudeHollowRectangle are calculated correctly from the parameters given."""
+
+        assert self.test_shape.processed_points == [
+            (7.5, 5.0, "straight"),
+            (7.5, -5.0, "straight"),
+            (-7.5, -5.0, "straight"),
+            (-7.5, 5.0, "straight"),
+            (7.5, 5.0, "straight"),
+            (8.5, 6.0, "straight"),
+            (8.5, -6.0, "straight"),
+            (-8.5, -6.0, "straight"),
+            (-8.5, 6.0, "straight"),
+            (8.5, 6.0, "straight"),
+            (7.5, 5.0, "straight"),
+        ]
+
+    def test_points_calculation(self):
+        """Checks that the points used to construct the ExtrudeHollowRectangle are
+        calculated correctly from the parameters given."""
+
+        print(self.test_shape.points)
+        assert self.test_shape.points == [
+            (7.5, 5.0),
+            (7.5, -5.0),
+            (-7.5, -5.0),
+            (-7.5, 5.0),
+            (7.5, 5.0),
+            (8.5, 6.0),
+            (8.5, -6.0),
+            (-8.5, -6.0),
+            (-8.5, 6.0),
+            (8.5, 6.0),
+        ]
+
+    def test_creation(self):
+        """Creates a rectangular extrusion using the ExtrudeHollowRectangle
+        parametric component and checks that a cadquery solid is created."""
+
+        assert self.test_shape.solid is not None
+        assert self.test_shape.volume() > 100
+
+    def test_absolute_volume(self):
+        """Creates a rectangular extrusion using the ExtrudeHollowRectangle
+        parametric component and checks that the volume is correct"""
+
+        assert self.test_shape.volume() == pytest.approx((17 * 12 * 2) - (15 * 10 * 2))
+
+    def test_absolute_areas(self):
+        """Creates a rectangular extrusion using the ExtrudeHollowRectangle
+        parametric component and checks that the areas are correct"""
+
+        assert len(self.test_shape.areas) == 10
+        assert len(set([round(i) for i in self.test_shape.areas])) == 5
+        assert self.test_shape.areas.count(pytest.approx(15 * 2)) == 2
+        assert self.test_shape.areas.count(pytest.approx(10 * 2)) == 2
diff --git a/tests/test_parametric_components/test_poloidal_field_coil_fp.py b/tests/test_parametric_components/test_poloidal_field_coil_fp.py
index 2045e8a13..674416c15 100644
--- a/tests/test_parametric_components/test_poloidal_field_coil_fp.py
+++ b/tests/test_parametric_components/test_poloidal_field_coil_fp.py
@@ -11,6 +11,6 @@ def test_shape_construction_and_volume(self):
 
         test_component = paramak.PoloidalFieldCoilFP(corner_points=[(10, 10), (20, 22)])
 
-        assert test_component.volume() == pytest.approx(12063.715789784808)
+        assert test_component.volume() == pytest.approx(11309.733552923257)
         assert test_component.corner_points == [(10, 10), (20, 22)]
         assert test_component.solid is not None
diff --git a/tests/test_parametric_reactors/test_ball_reactor.py b/tests/test_parametric_reactors/test_ball_reactor.py
index 6ec9c8d64..1f3c9b906 100644
--- a/tests/test_parametric_reactors/test_ball_reactor.py
+++ b/tests/test_parametric_reactors/test_ball_reactor.py
@@ -42,7 +42,7 @@ def test_creation_with_narrow_divertor(self):
         self.test_reactor.divertor_radial_thickness = 50
 
         assert self.test_reactor.solid is not None
-        assert len(self.test_reactor.shapes_and_components) == 7
+        assert len(self.test_reactor.shapes_and_components) == 8
 
     def test_creation_with_wide_divertor(self):
         """Creates a BallReactor with a wide divertor and checks that the correct
@@ -51,7 +51,7 @@ def test_creation_with_wide_divertor(self):
         self.test_reactor.divertor_radial_thickness = 172.5
 
         assert self.test_reactor.solid is not None
-        assert len(self.test_reactor.shapes_and_components) == 7
+        assert len(self.test_reactor.shapes_and_components) == 8
 
     def test_svg_creation(self):
         """Creates a BallReactor and checks that an svg image of the reactor can be
@@ -73,7 +73,7 @@ def test_with_pf_coils(self):
         self.test_reactor.pf_coil_case_thickness = 10
 
         assert self.test_reactor.solid is not None
-        assert len(self.test_reactor.shapes_and_components) == 9
+        assert len(self.test_reactor.shapes_and_components) == 12
 
     def test_rotation_angle_error(self):
         """Checks that an error is raised when an angle is over 360."""
@@ -106,12 +106,12 @@ def test_with_pf_and_tf_coils(self):
         self.test_reactor.pf_coil_radial_position = [200, 200, 200, 200]
         self.test_reactor.pf_coil_vertical_position = [200, 100, -100, -200]
         self.test_reactor.rear_blanket_to_tf_gap = 50
-        self.test_reactor.pf_coil_case_thickness = 10
+        self.test_reactor.pf_coil_case_thicknesses = [10, 10, 10, 10]
         self.test_reactor.outboard_tf_coil_radial_thickness = 50
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 50
 
         assert self.test_reactor.solid is not None
-        assert len(self.test_reactor.shapes_and_components) == 10
+        assert len(self.test_reactor.shapes_and_components) == 17
 
     def test_rotation_angle_warning(self):
         """Creates a BallReactor with rotation_angle = 360 and checks that the correct
@@ -146,40 +146,44 @@ def test_ball_reactor_hash_value(self):
         self.test_reactor.pf_coil_radial_position = [200, 200, 200, 200]
         self.test_reactor.pf_coil_vertical_position = [200, 100, -100, -200]
         self.test_reactor.rear_blanket_to_tf_gap = 50
-        self.test_reactor.pf_coil_case_thickness = 10
+        self.test_reactor.pf_coil_case_thicknesses = [10, 10, 10, 10]
         self.test_reactor.outboard_tf_coil_radial_thickness = 100
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 50
 
         assert self.test_reactor.reactor_hash_value is None
-        for key in [
-            "_plasma",
-            "_inboard_tf_coils",
-            "_center_column_shield",
-            "_divertor",
-            "_firstwall",
-            "_blanket",
-            "_blanket_rear_wall",
-            "_pf_coil",
-            "_pf_coils_casing",
-            "_tf_coil",
-        ]:
-            assert key not in self.test_reactor.__dict__.keys()
+        # commented out as code inspector suggests all attributs should be
+        # declaired in class init
+        # for key in [
+        #     "_plasma",
+        #     "_inboard_tf_coils",
+        #     "_center_column_shield",
+        #     "_divertor_upper",
+        #     "_divertor_lower",
+        #     "_firstwall",
+        #     "_blanket",
+        #     "_blanket_rear_wall",
+        #     "_pf_coils",
+        #     "_pf_coils_casing",
+        #     "_tf_coil",
+        # ]:
+        #     assert key not in self.test_reactor.__dict__.keys()
         assert self.test_reactor.shapes_and_components is not None
 
         for key in [
             "_plasma",
             "_inboard_tf_coils",
             "_center_column_shield",
-            "_divertor",
+            "_divertor_upper",
+            "_divertor_lower",
             "_firstwall",
             "_blanket",
             "_blanket_rear_wall",
-            "_pf_coil",
+            "_pf_coils",
             "_pf_coils_casing",
             "_tf_coil",
         ]:
             assert key in self.test_reactor.__dict__.keys()
-        assert len(self.test_reactor.shapes_and_components) == 10
+        assert len(self.test_reactor.shapes_and_components) == 17
         assert self.test_reactor.reactor_hash_value is not None
         initial_hash_value = self.test_reactor.reactor_hash_value
         self.test_reactor.rotation_angle = 270
@@ -196,7 +200,7 @@ def test_hash_value_time_saving(self):
         self.test_reactor.pf_coil_radial_position = [200, 200, 200, 200]
         self.test_reactor.pf_coil_vertical_position = [200, 100, -100, -200]
         self.test_reactor.rear_blanket_to_tf_gap = 50
-        self.test_reactor.pf_coil_case_thickness = 10
+        self.test_reactor.pf_coil_case_thicknesses = [10, 10, 10, 10]
         self.test_reactor.outboard_tf_coil_radial_thickness = 100
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 50
 
@@ -222,6 +226,20 @@ def invalid_position():
 
         self.assertRaises(ValueError, invalid_position)
 
+    def test_pf_coil_cases_error(self):
+        """checks an invalid number of coil case thicknesses raises the correct
+        ValueError."""
+
+        def invalid_pf_coil_case_thicknesses():
+            self.test_reactor.pf_coil_radial_thicknesses = [30, 30, 30, 30]
+            self.test_reactor.pf_coil_vertical_thicknesses = [30, 30, 30, 30]
+            self.test_reactor.pf_coil_radial_position = [100, 100, 200, 200]
+            self.test_reactor.pf_coil_vertical_position = [100, -100, 200, -200]
+            self.test_reactor.pf_coil_case_thicknesses = [10, 10]
+            self.test_reactor.create_solids()
+
+        self.assertRaises(ValueError, invalid_pf_coil_case_thicknesses)
+
     def test_divertor_upper_lower(self):
         """Checks that BallReactors with coils with lower and upper divertors
         can be created."""
@@ -230,17 +248,17 @@ def test_divertor_upper_lower(self):
         self.test_reactor.pf_coil_radial_position = [200, 200, 200, 200]
         self.test_reactor.pf_coil_vertical_position = [200, 100, -100, -200]
         self.test_reactor.rear_blanket_to_tf_gap = 50
-        self.test_reactor.pf_coil_case_thickness = 10
+        self.test_reactor.pf_coil_case_thicknesses = [10, 10, 10, 10]
         self.test_reactor.outboard_tf_coil_radial_thickness = 50
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 50
 
         self.test_reactor.divertor_position = "lower"
         assert self.test_reactor.solid is not None
-        assert len(self.test_reactor.shapes_and_components) == 10
+        assert len(self.test_reactor.shapes_and_components) == 16
 
         self.test_reactor.divertor_position = "upper"
         assert self.test_reactor.solid is not None
-        assert len(self.test_reactor.shapes_and_components) == 10
+        assert len(self.test_reactor.shapes_and_components) == 16
 
     def test_export_stp(self):
         """Exports and stp file with mode = solid and wire and checks
diff --git a/tests/test_parametric_reactors/test_eu_demo_2015_reactor.py b/tests/test_parametric_reactors/test_eu_demo_2015_reactor.py
index 4d988a6bc..7be575304 100644
--- a/tests/test_parametric_reactors/test_eu_demo_2015_reactor.py
+++ b/tests/test_parametric_reactors/test_eu_demo_2015_reactor.py
@@ -46,17 +46,22 @@ def test_make_demo_2015_reactor(self):
         files checking that each component results in a stp file"""
 
         output_filenames = [
-            "blanket.stp",
-            "divertor.stp",
-            "outboard_pf_coils.stp",
+            "plasma.stp",
+            "outboard_pf_coil_1.stp",
+            "outboard_pf_coil_2.stp",
+            "outboard_pf_coil_3.stp",
+            "outboard_pf_coil_4.stp",
+            "outboard_pf_coil_5.stp",
+            "outboard_pf_coil_6.stp",
             "pf_coils_1.stp",
             "pf_coils_2.stp",
             "pf_coils_3.stp",
             "pf_coils_4.stp",
             "pf_coils_5.stp",
+            "divertor.stp",
+            "blanket.stp",
+            "vessel.stp",
             "tf_coil_casing.stp",
-            "vacvessel.stp",
-            "another.stp",
         ]
         os.system("rm *.stp")
         my_reactor = paramak.EuDemoFrom2015PaperDiagram(number_of_tf_coils=1)
@@ -71,18 +76,24 @@ def test_make_parametric_demo_2015_rector(self):
         results in a stp file"""
 
         output_filenames = [
-            "blanket.stp",
-            "divertor.stp",
-            "outboard_pf_coils.stp",
+            "plasma.stp",
+            "outboard_pf_coil_1.stp",
+            "outboard_pf_coil_2.stp",
+            "outboard_pf_coil_3.stp",
+            "outboard_pf_coil_4.stp",
+            "outboard_pf_coil_5.stp",
+            "outboard_pf_coil_6.stp",
             "pf_coils_1.stp",
             "pf_coils_2.stp",
             "pf_coils_3.stp",
             "pf_coils_4.stp",
             "pf_coils_5.stp",
+            "divertor.stp",
+            "blanket.stp",
+            "vessel.stp",
             "tf_coil_casing.stp",
-            "vacvessel.stp",
-            "another.stp",
         ]
+
         os.system("rm *.stp")
         my_reactor = paramak.EuDemoFrom2015PaperDiagram(
             number_of_tf_coils=1, rotation_angle=90
diff --git a/tests/test_parametric_reactors/test_iter_reactor.py b/tests/test_parametric_reactors/test_iter_reactor.py
index d3ce8f389..ff2f017a4 100644
--- a/tests/test_parametric_reactors/test_iter_reactor.py
+++ b/tests/test_parametric_reactors/test_iter_reactor.py
@@ -42,23 +42,28 @@ def test_vessel_construction(self):
         for component in vessel_components:
             assert component.volume() > 0
 
-    def test_make_demo_2015_reactor(self):
+    def test_make_iter_reactor(self):
         """Creates a ITERTokamak reactor and exports the stp
         files checking that each component results in a stp file"""
 
         output_filenames = [
-            "blanket.stp",
+            "plasma.stp",
+            "outboard_pf_coils_1.stp",
+            "outboard_pf_coils_2.stp",
+            "outboard_pf_coils_3.stp",
+            "outboard_pf_coils_4.stp",
+            "outboard_pf_coils_5.stp",
+            "outboard_pf_coils_6.stp",
+            "pf_coil_1.stp",
+            "pf_coil_2.stp",
+            "pf_coil_3.stp",
+            "pf_coil_4.stp",
+            "pf_coil_5.stp",
+            "pf_coil_6.stp",
             "divertor.stp",
-            "outboard_pf_coils.stp",
-            "pf_coils_1.stp",
-            "pf_coils_2.stp",
-            "pf_coils_3.stp",
-            "pf_coils_4.stp",
-            "pf_coils_5.stp",
-            "pf_coils_6.stp",
+            "blanket.stp",
+            "vessel_inner.stp",
             "tf_coils.stp",
-            "vacvessel.stp",
-            "another.stp",
         ]
         os.system("rm *.stp")
         my_reactor = paramak.IterFrom2020PaperDiagram(number_of_tf_coils=1)
@@ -67,24 +72,29 @@ def test_make_demo_2015_reactor(self):
             assert Path(output_filename).exists() is True
         os.system("rm *.stp")
 
-    def test_make_parametric_demo_2015_rector(self):
+    def test_make_parametric_iter_rector(self):
         """Creates a ITERTokamak reactor with a non defaults
         rotation angle and exports the stp files checking that each component
         results in a stp file"""
 
         output_filenames = [
-            "blanket.stp",
+            "plasma.stp",
+            "outboard_pf_coils_1.stp",
+            "outboard_pf_coils_2.stp",
+            "outboard_pf_coils_3.stp",
+            "outboard_pf_coils_4.stp",
+            "outboard_pf_coils_5.stp",
+            "outboard_pf_coils_6.stp",
+            "pf_coil_1.stp",
+            "pf_coil_2.stp",
+            "pf_coil_3.stp",
+            "pf_coil_4.stp",
+            "pf_coil_5.stp",
+            "pf_coil_6.stp",
             "divertor.stp",
-            "outboard_pf_coils.stp",
-            "pf_coils_1.stp",
-            "pf_coils_2.stp",
-            "pf_coils_3.stp",
-            "pf_coils_4.stp",
-            "pf_coils_5.stp",
-            "pf_coils_6.stp",
+            "blanket.stp",
+            "vessel_inner.stp",
             "tf_coils.stp",
-            "vacvessel.stp",
-            "another.stp",
         ]
         os.system("rm *.stp")
         my_reactor = paramak.IterFrom2020PaperDiagram(
diff --git a/tests/test_parametric_reactors/test_single_null_ball_reactor.py b/tests/test_parametric_reactors/test_single_null_ball_reactor.py
index 405f8dc3e..14211de4d 100644
--- a/tests/test_parametric_reactors/test_single_null_ball_reactor.py
+++ b/tests/test_parametric_reactors/test_single_null_ball_reactor.py
@@ -46,7 +46,7 @@ def test_single_null_ball_reactor_with_pf_and_tf_coils(self):
         """Checks that a SingleNullBallReactor with optional pf and tf coils can
         be created and that the correct number of components are produced."""
 
-        assert len(self.test_reactor.shapes_and_components) == 10
+        assert len(self.test_reactor.shapes_and_components) == 16
 
     def test_single_null_ball_reactor_rotation_angle_impacts_volume(self):
         """Creates SingleNullBallReactors with different rotation angles and
@@ -72,35 +72,37 @@ def test_hash_value(self):
         reactor is reconstruced."""
 
         assert self.test_reactor.reactor_hash_value is None
-        for key in [
-            "_plasma",
-            "_inboard_tf_coils",
-            "_center_column_shield",
-            "_divertor",
-            "_firstwall",
-            "_blanket",
-            "_blanket_rear_wall",
-            "_pf_coil",
-            "_pf_coils_casing",
-            "_tf_coil",
-        ]:
-            assert key not in self.test_reactor.__dict__.keys()
+        # commented out as code inspector suggests all attributs should be
+        # declaired in class init
+        # for key in [
+        #     "_plasma",
+        #     "_inboard_tf_coils",
+        #     "_center_column_shield",
+        #     "_divertor_lower",
+        #     "_firstwall",
+        #     "_blanket",
+        #     "_blanket_rear_wall",
+        #     "_pf_coils",
+        #     "_pf_coils_casing",
+        #     "_tf_coil",
+        # ]:
+        #     assert key not in self.test_reactor.__dict__.keys()
         assert self.test_reactor.shapes_and_components is not None
 
         for key in [
             "_plasma",
             "_inboard_tf_coils",
             "_center_column_shield",
-            "_divertor",
+            "_divertor_lower",
             "_firstwall",
             "_blanket",
             "_blanket_rear_wall",
-            "_pf_coil",
+            "_pf_coils",
             "_pf_coils_casing",
             "_tf_coil",
         ]:
             assert key in self.test_reactor.__dict__.keys()
-        assert len(self.test_reactor.shapes_and_components) == 10
+        assert len(self.test_reactor.shapes_and_components) == 16
         assert self.test_reactor.reactor_hash_value is not None
         initial_hash_value = self.test_reactor.reactor_hash_value
         self.test_reactor.rotation_angle = 270
diff --git a/tests/test_parametric_reactors/test_single_null_submersion_tokamak.py b/tests/test_parametric_reactors/test_single_null_submersion_tokamak.py
index 1a13f3d84..b1dd4b5cb 100644
--- a/tests/test_parametric_reactors/test_single_null_submersion_tokamak.py
+++ b/tests/test_parametric_reactors/test_single_null_submersion_tokamak.py
@@ -49,14 +49,13 @@ def test_single_null_submersion_tokamak_with_pf_and_tf_coils(self):
 
         self.test_reactor.pf_coil_radial_thicknesses = [50, 50, 50, 50]
         self.test_reactor.pf_coil_vertical_thicknesses = [50, 50, 50, 50]
-        self.test_reactor.pf_coil_to_tf_coil_radial_gap = 50
-        self.test_reactor.pf_coil_case_thickness = 10
+        self.test_reactor.pf_coil_case_thicknesses = [10, 20, 10, 10]
+        self.test_reactor.rear_blanket_to_tf_gap = 50
         self.test_reactor.outboard_tf_coil_radial_thickness = 100
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 50
-        self.test_reactor.tf_coil_to_rear_blanket_radial_gap = 20
         self.test_reactor.number_of_tf_coils = 16
 
-        assert len(self.test_reactor.shapes_and_components) == 11
+        assert len(self.test_reactor.shapes_and_components) == 17
 
     def test_single_null_submersion_tokamak_rotation_angle_impacts_volume(self):
         """Creates SingleNullSubmersionTokamaks with different rotation angles and
@@ -87,32 +86,33 @@ def test_hash_value(self):
 
         self.test_reactor.pf_coil_radial_thicknesses = [30, 30, 30, 30]
         self.test_reactor.pf_coil_vertical_thicknesses = [30, 30, 30, 30]
-        self.test_reactor.pf_coil_to_tf_coil_radial_gap = 50
-        self.test_reactor.pf_coil_case_thickness = 10
+        self.test_reactor.rear_blanket_to_tf_gap = 50
+        self.test_reactor.pf_coil_case_thicknesses = [10, 20, 20, 30]
         self.test_reactor.outboard_tf_coil_radial_thickness = 30
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 30
-        self.test_reactor.tf_coil_to_rear_blanket_radial_gap = 20
         self.test_reactor.number_of_tf_coils = 16
 
         assert self.test_reactor.reactor_hash_value is None
-        for key in [
-            "_inboard_tf_coils",
-            "_center_column_shield",
-            "_plasma",
-            "_inboard_firstwall",
-            "_inboard_blanket",
-            "_firstwall",
-            "_divertor",
-            "_blanket",
-            "_supports",
-            "_outboard_rear_blanket_wall_upper",
-            "_outboard_rear_blanket_wall_lower",
-            "_outboard_rear_blanket_wall",
-            "_tf_coil",
-            "_pf_coil",
-            "_pf_coils_casing",
-        ]:
-            assert key not in self.test_reactor.__dict__.keys()
+        # commented out as code inspector suggests all attributs should be
+        # declaired in class init
+        # for key in [
+        #     "_inboard_tf_coils",
+        #     "_center_column_shield",
+        #     "_plasma",
+        #     "_inboard_firstwall",
+        #     "_inboard_blanket",
+        #     "_firstwall",
+        #     "_divertor_lower",
+        #     "_blanket",
+        #     "_supports",
+        #     "_outboard_rear_blanket_wall_upper",
+        #     "_outboard_rear_blanket_wall_lower",
+        #     "_outboard_rear_blanket_wall",
+        #     "_tf_coil",
+        #     "_pf_coils",
+        #     "_pf_coils_casing",
+        # ]:
+        #     assert key not in self.test_reactor.__dict__.keys()
         assert self.test_reactor.shapes_and_components is not None
 
         for key in [
@@ -122,18 +122,18 @@ def test_hash_value(self):
             "_inboard_firstwall",
             "_inboard_blanket",
             "_firstwall",
-            "_divertor",
+            "_divertor_lower",
             "_blanket",
             "_supports",
             "_outboard_rear_blanket_wall_upper",
             "_outboard_rear_blanket_wall_lower",
             "_outboard_rear_blanket_wall",
             "_tf_coil",
-            "_pf_coil",
+            "_pf_coils",
             "_pf_coils_casing",
         ]:
             assert key in self.test_reactor.__dict__.keys()
-        assert len(self.test_reactor.shapes_and_components) == 11
+        assert len(self.test_reactor.shapes_and_components) == 17
         assert self.test_reactor.reactor_hash_value is not None
         initial_hash_value = self.test_reactor.reactor_hash_value
         self.test_reactor.rotation_angle = 270
diff --git a/tests/test_parametric_reactors/test_sparc_2020_reactor.py b/tests/test_parametric_reactors/test_sparc_2020_reactor.py
index 55587117c..7d0733d09 100644
--- a/tests/test_parametric_reactors/test_sparc_2020_reactor.py
+++ b/tests/test_parametric_reactors/test_sparc_2020_reactor.py
@@ -29,20 +29,36 @@ def setUp(self):
 
         self.output_filenames = [
             "plasma.stp",
-            "inboard_pf_coils.stp",
-            "outboard_pf_coils.stp",
-            "div_coils.stp",
-            "vs_coils.stp",
+            "vs_coil_1.stp",
+            "vs_coil_2.stp",
+            "inboard_pf_coil_1.stp",
+            "inboard_pf_coil_2.stp",
+            "inboard_pf_coil_3.stp",
+            "inboard_pf_coil_4.stp",
+            "inboard_pf_coil_5.stp",
+            "inboard_pf_coil_6.stp",
+            "outboard_pf_coil_1.stp",
+            "outboard_pf_coil_2.stp",
+            "outboard_pf_coil_3.stp",
+            "outboard_pf_coil_4.stp",
+            "outboard_pf_coil_5.stp",
+            "outboard_pf_coil_6.stp",
+            "outboard_pf_coil_7.stp",
+            "outboard_pf_coil_8.stp",
+            "div_coil_1.stp",
+            "div_coil_2.stp",
+            "div_coil_3.stp",
+            "div_coil_4.stp",
             "efccu_coils_1.stp",
             "efccu_coils_2.stp",
             "efccu_coils_3.stp",
             "efccu_coils_4.stp",
             "efccu_coils_5.stp",
             "efccu_coils_6.stp",
-            "antenna.stp",
             "tf_coil.stp",
-            "vacuum_vessel.stp",
-            "vacuum_vessel_inner.stp",
+            "antenna.stp",
+            "vessel.stp",
+            "inner_vessel.stp",
         ]
 
     def test_input_variables_names(self):
diff --git a/tests/test_parametric_reactors/test_submersion_tokamak.py b/tests/test_parametric_reactors/test_submersion_tokamak.py
index 28d3f0c7b..9063382b0 100644
--- a/tests/test_parametric_reactors/test_submersion_tokamak.py
+++ b/tests/test_parametric_reactors/test_submersion_tokamak.py
@@ -21,10 +21,6 @@ def setUp(self):
             outer_plasma_gap_radial_thickness=30,
             firstwall_radial_thickness=30,
             blanket_rear_wall_radial_thickness=30,
-            number_of_tf_coils=16,
-            outboard_tf_coil_radial_thickness=10,
-            outboard_tf_coil_poloidal_thickness=10,
-            rear_blanket_to_tf_gap=10,
             support_radial_thickness=20,
             inboard_blanket_radial_thickness=20,
             outboard_blanket_radial_thickness=20,
@@ -66,7 +62,7 @@ def test_with_tf_coils_creation(self):
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 70
         self.test_reactor.number_of_tf_coils = 4
 
-        assert len(self.test_reactor.shapes_and_components) == 9
+        assert len(self.test_reactor.shapes_and_components) == 10
 
     def test_with_tf_and_pf_coils_creation(self):
         """Creates a SubmersionTokamak with tf and pf coils and checks that the
@@ -78,33 +74,60 @@ def test_with_tf_and_pf_coils_creation(self):
         self.test_reactor.pf_coil_radial_thicknesses = [40, 40, 40, 40, 40]
         self.test_reactor.pf_coil_radial_position = [100, 100, 200, 200, 100]
         self.test_reactor.pf_coil_vertical_position = [100, -100, 200, -200, 0]
+        self.test_reactor.pf_coil_case_thicknesses = [10, 10, 10, 10, 10]
         self.test_reactor.rear_blanket_to_tf_gap = 50
-        self.test_reactor.pf_coil_case_thicknesses = 10
         self.test_reactor.number_of_tf_coils = 4
 
-        assert len(self.test_reactor.shapes_and_components) == 11
+        assert len(self.test_reactor.shapes_and_components) == 20
 
     def test_minimal_stp_creation(self):
         """Creates a SubmersionTokamak and checks that stp files of all
         components can be exported using the export_stp method."""
 
-        os.system("rm -r minimal_SubmersionTokamak")
+        os.system("rm -r *.stp")
+        output_filenames = [
+            "plasma.stp",
+            "center_column_shield.stp",
+            "outboard_firstwall.stp",
+            "blanket.stp",
+            "divertor_upper.stp",
+            "divertor_lower.stp",
+            "supports.stp",
+            "outboard_rear_blanket_wall.stp",
+            "inboard_tf_coils.stp",
+        ]
+        self.test_reactor.export_stp(filename=output_filenames)
+
+        for output_filename in output_filenames:
+            assert Path(output_filename).exists() is True
+        os.system("rm -r *.stp")
+
+    def test_stp_creation_with_tf(self):
+        """Creates a SubmersionTokamak and checks that stp files of all
+        components can be exported using the export_stp method."""
+
+        os.system("rm -r *.stp")
+        self.test_reactor.number_of_tf_coils = 4
+        self.test_reactor.outboard_tf_coil_radial_thickness = 10
+        self.test_reactor.outboard_tf_coil_poloidal_thickness = 10
+        self.test_reactor.rear_blanket_to_tf_gap = 10
         output_filenames = [
-            "minimal_SubmersionTokamak/inboard_tf_coils.stp",
-            "minimal_SubmersionTokamak/center_column_shield.stp",
-            "minimal_SubmersionTokamak/plasma.stp",
-            "minimal_SubmersionTokamak/divertor.stp",
-            "minimal_SubmersionTokamak/outboard_firstwall.stp",
-            "minimal_SubmersionTokamak/supports.stp",
-            "minimal_SubmersionTokamak/blanket.stp",
-            "minimal_SubmersionTokamak/outboard_rear_blanket_wall.stp",
-            "another.stp",
+            "plasma.stp",
+            "center_column_shield.stp",
+            "outboard_firstwall.stp",
+            "blanket.stp",
+            "divertor_upper.stp",
+            "divertor_lower.stp",
+            "supports.stp",
+            "outboard_rear_blanket_wall.stp",
+            "inboard_tf_coils.stp",
+            "tf_coils.stp",
         ]
         self.test_reactor.export_stp(filename=output_filenames)
 
         for output_filename in output_filenames:
             assert Path(output_filename).exists() is True
-        os.system("rm -r minimal_SubmersionTokamak")
+        os.system("rm -r *.stp")
 
     def test_with_pf_coils_stp_creation(self):
         """Creates a SubmersionTokamak with pf coils and checks that stp files
@@ -119,18 +142,19 @@ def test_with_pf_coils_stp_creation(self):
         self.test_reactor.pf_coil_vertical_position = [100, -100]
 
         output_filenames = [
-            "pf_SubmersionTokamak/inboard_tf_coils.stp",
-            "pf_SubmersionTokamak/center_column_shield.stp",
-            "pf_SubmersionTokamak/plasma.stp",
-            "pf_SubmersionTokamak/divertor.stp",
-            "pf_SubmersionTokamak/outboard_firstwall.stp",
-            "pf_SubmersionTokamak/supports.stp",
-            "pf_SubmersionTokamak/blanket.stp",
-            "pf_SubmersionTokamak/outboard_rear_blanket_wall.stp",
-            "tf_pf_SubmersionTokamak/another_shape.stp",
-            "tf_pf_SubmersionTokamak/another_shape2.stp",
-            "tf_pf_SubmersionTokamak/another_shape3.stp",
+            "pf_coil_1.stp",
+            "pf_coil_2.stp",
+            "plasma.stp",
+            "center_column_shield.stp",
+            "outboard_firstwall.stp",
+            "blanket.stp",
+            "divertor_lower.stp",
+            "supports.stp",
+            "outboard_rear_blanket_wall.stp",
+            "inboard_tf_coils.stp",
+            "tf_coils.stp",
         ]
+
         self.test_reactor.export_stp(filename=output_filenames)
 
         for output_filename in output_filenames:
@@ -141,7 +165,7 @@ def test_with_tf_and_pf_coils_stp_creation(self):
         """Creates a SubmersionTokamak with tf and pf coils and checks that
         stp files of all components can be exported using the export_stp method."""
 
-        os.system("rm -r tf_pf_SubmersionTokamak")
+        os.system("rm -r *.stp")
 
         self.test_reactor.outboard_tf_coil_radial_thickness = 50
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 70
@@ -150,27 +174,30 @@ def test_with_tf_and_pf_coils_stp_creation(self):
         self.test_reactor.pf_coil_radial_position = [100, 100]
         self.test_reactor.pf_coil_vertical_position = [100, -100]
         self.test_reactor.rear_blanket_to_tf_gap = 50
-        self.test_reactor.pf_coil_case_thicknesses = 10
+        self.test_reactor.pf_coil_case_thicknesses = [10, 10]
         self.test_reactor.number_of_tf_coils = 4
 
         output_filenames = [
-            "tf_pf_SubmersionTokamak/inboard_tf_coils.stp",
-            "tf_pf_SubmersionTokamak/center_column_shield.stp",
-            "tf_pf_SubmersionTokamak/plasma.stp",
-            "tf_pf_SubmersionTokamak/divertor.stp",
-            "tf_pf_SubmersionTokamak/outboard_firstwall.stp",
-            "tf_pf_SubmersionTokamak/supports.stp",
-            "tf_pf_SubmersionTokamak/blanket.stp",
-            "tf_pf_SubmersionTokamak/outboard_rear_blanket_wall.stp",
-            "tf_pf_SubmersionTokamak/pf_coil_cases.stp",
-            "tf_pf_SubmersionTokamak/another1.stp",
-            "tf_pf_SubmersionTokamak/another2.stp",
+            "pf_coil_1.stp",
+            "pf_coil_2.stp",
+            "pf_coil_case_1.stp",
+            "pf_coil_case_2.stp",
+            "plasma.stp",
+            "center_column_shield.stp",
+            "outboard_firstwall.stp",
+            "blanket.stp",
+            "divertor_upper.stp",
+            "divertor_lower.stp",
+            "supports.stp",
+            "outboard_rear_blanket_wall.stp",
+            "inboard_tf_coils.stp",
+            "tf_coils.stp",
         ]
         self.test_reactor.export_stp(filename=output_filenames)
 
         for output_filename in output_filenames:
             assert Path(output_filename).exists() is True
-        os.system("rm -r tf_pf_SubmersionTokamak")
+        os.system("rm -r *.stp")
 
     def test_rotation_angle_warning(self):
         """Creates a SubmersionTokamak with rotation_angle = 360 and checks that the
@@ -201,33 +228,36 @@ def test_submersion_reactor_hash_value(self):
 
         self.test_reactor.pf_coil_radial_thicknesses = [30, 30, 30, 30]
         self.test_reactor.pf_coil_vertical_thicknesses = [30, 30, 30, 30]
+        self.test_reactor.pf_coil_radial_position = [100, 100, 200, 200]
+        self.test_reactor.pf_coil_vertical_position = [100, -100, 200, -200]
+        self.test_reactor.pf_coil_case_thicknesses = [10, 10, 10, 10]
         self.test_reactor.rear_blanket_to_tf_gap = 50
-        self.test_reactor.pf_coil_case_thicknesses = 10
         self.test_reactor.outboard_tf_coil_radial_thickness = 30
         self.test_reactor.outboard_tf_coil_poloidal_thickness = 30
-        self.test_reactor.pf_coil_radial_position = [100, 100, 200, 200]
-        self.test_reactor.pf_coil_vertical_position = [100, -100, 200, -200]
         self.test_reactor.number_of_tf_coils = 16
 
         assert self.test_reactor.reactor_hash_value is None
-        for key in [
-            "_inboard_tf_coils",
-            "_center_column_shield",
-            "_plasma",
-            "_inboard_firstwall",
-            "_inboard_blanket",
-            "_firstwall",
-            "_divertor",
-            "_blanket",
-            "_supports",
-            "_outboard_rear_blanket_wall_upper",
-            "_outboard_rear_blanket_wall_lower",
-            "_outboard_rear_blanket_wall",
-            "_tf_coil",
-            "_pf_coil",
-            "_pf_coils_casing",
-        ]:
-            assert key not in self.test_reactor.__dict__
+        # commented out as code inspector suggests all attributs should be
+        # declaired in class init
+        # for key in [
+        #     "_inboard_tf_coils",
+        #     "_center_column_shield",
+        #     "_plasma",
+        #     "_inboard_firstwall",
+        #     "_inboard_blanket",
+        #     "_firstwall",
+        #     "_divertor_upper",
+        #     "_divertor_lower",
+        #     "_blanket",
+        #     "_supports",
+        #     "_outboard_rear_blanket_wall_upper",
+        #     "_outboard_rear_blanket_wall_lower",
+        #     "_outboard_rear_blanket_wall",
+        #     "_tf_coil",
+        #     "_pf_coils",
+        #     "_pf_coils_casing",
+        # ]:
+        #     assert key not in self.test_reactor.__dict__
 
         assert self.test_reactor.shapes_and_components is not None
         for key in [
@@ -237,19 +267,20 @@ def test_submersion_reactor_hash_value(self):
             "_inboard_firstwall",
             "_inboard_blanket",
             "_firstwall",
-            "_divertor",
+            "_divertor_upper",
+            "_divertor_lower",
             "_blanket",
             "_supports",
             "_outboard_rear_blanket_wall_upper",
             "_outboard_rear_blanket_wall_lower",
             "_outboard_rear_blanket_wall",
             "_tf_coil",
-            "_pf_coil",
+            "_pf_coils",
             "_pf_coils_casing",
         ]:
             assert key in self.test_reactor.__dict__.keys()
 
-        assert len(self.test_reactor.shapes_and_components) == 11
+        assert len(self.test_reactor.shapes_and_components) == 18
         assert self.test_reactor.reactor_hash_value is not None
         initial_hash_value = self.test_reactor.reactor_hash_value
         self.test_reactor.rotation_angle = 270
@@ -271,6 +302,20 @@ def invalid_support_position():
 
         self.assertRaises(ValueError, invalid_support_position)
 
+    def test_error_coil_case_thickness(self):
+        """checks an invalid number of coil case thicknesses raises the correct
+        ValueError."""
+
+        def invalid_pf_coil_case_thicknesses():
+            self.test_reactor.pf_coil_radial_thicknesses = [30, 30, 30, 30]
+            self.test_reactor.pf_coil_vertical_thicknesses = [30, 30, 30, 30]
+            self.test_reactor.pf_coil_radial_position = [100, 100, 200, 200]
+            self.test_reactor.pf_coil_vertical_position = [100, -100, 200, -200]
+            self.test_reactor.pf_coil_case_thicknesses = [10, 10]
+            self.test_reactor.create_solids()
+
+        self.assertRaises(ValueError, invalid_pf_coil_case_thicknesses)
+
     def test_divertors_supports(self):
         """Checks that SubmersionTokamaks with lower and upper supports
         and divertors can be created."""