From 106c0464168713a3e48fef7ed95267f81a5acd7c Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Wed, 7 Aug 2024 15:38:56 +0200
Subject: [PATCH] RoughnessModel --> InterlayerModel

---
 GUI/Model/FromCore/ItemizeSample.cpp          |   8 +-
 GUI/Model/Sample/InterlayerModelItems.h       |  53 ++
 GUI/Model/Sample/RoughnessCatalog.cpp         |  18 +-
 GUI/Model/Sample/RoughnessCatalog.h           |   8 +-
 GUI/Model/Sample/RoughnessItems.cpp           |   2 +-
 GUI/Model/Sample/RoughnessItems.h             |  10 +-
 GUI/Model/Sample/RoughnessModelItems.h        |  49 --
 GUI/View/Sample/PolyForm.cpp                  |   2 +-
 GUI/View/Sample/PolyForm.h                    |   2 +-
 Resample/Slice/ProfileHelper.cpp              |   2 +-
 Resample/Specular/ComputeFluxMagnetic.cpp     |   8 +-
 Resample/Specular/ComputeFluxScalar.cpp       |   8 +-
 ...ughnessModels.cpp => InterlayerModels.cpp} |  34 +-
 .../{RoughnessModels.h => InterlayerModels.h} |  32 +-
 Sample/Interface/LayerRoughness.cpp           |  20 +-
 Sample/Interface/LayerRoughness.h             |  14 +-
 Sample/Interface/RoughnessMap.cpp             |   4 +-
 Sample/Multilayer/MultiLayer.h                |   2 +-
 Sample/StandardSample/FeNiBilayerBuilder.cpp  |  18 +-
 .../StandardSample/MagneticLayersBuilder.cpp  |   8 +-
 Sample/StandardSample/MagneticLayersBuilder.h |   2 +-
 .../MultiLayerWithRoughnessBuilder.cpp        |  10 +-
 Sim/Export/SampleToPython.cpp                 |   4 +-
 Wrap/Swig/libBornAgainSample.i                |   2 +-
 auto/Examples/fit/specular/Honeycomb_fit.py   |   2 +-
 auto/Examples/specular/RoughnessModel.py      |   4 +-
 auto/Examples/varia/MaterialProfile.py        |   2 +-
 auto/Examples/varia/RoughSurface.py           |   2 +-
 .../fit/specular/Honeycomb_fit.py             |   2 +-
 auto/MiniExamples/specular/RoughnessModel.py  |   4 +-
 auto/MiniExamples/varia/MaterialProfile.py    |   2 +-
 auto/MiniExamples/varia/RoughSurface.py       |   2 +-
 auto/Wrap/libBornAgainSample.py               | 110 ++--
 auto/Wrap/libBornAgainSample_wrap.cpp         | 554 +++++++++---------
 rawEx/fit/specular/Honeycomb_fit.py           |   2 +-
 rawEx/specular/RoughnessModel.py              |   4 +-
 rawEx/varia/MaterialProfile.py                |   2 +-
 rawEx/varia/RoughSurface.py                   |   2 +-
 38 files changed, 509 insertions(+), 505 deletions(-)
 create mode 100644 GUI/Model/Sample/InterlayerModelItems.h
 delete mode 100644 GUI/Model/Sample/RoughnessModelItems.h
 rename Sample/Interface/{RoughnessModels.cpp => InterlayerModels.cpp} (64%)
 rename Sample/Interface/{RoughnessModels.h => InterlayerModels.h} (58%)

diff --git a/GUI/Model/FromCore/ItemizeSample.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
index 9cda2a84a66..da4aa3a54da 100644
--- a/GUI/Model/FromCore/ItemizeSample.cpp
+++ b/GUI/Model/FromCore/ItemizeSample.cpp
@@ -292,10 +292,10 @@ void set_Roughness(LayerItem* parent, const LayerInterface* top_interface)
             auto* t = new BasicRoughnessItem(roughness->sigma(), roughness->hurst(),
                                              roughness->lateralCorrLength());
 
-            if (dynamic_cast<const ErfRoughness*>(roughness->roughnessModel()))
-                t->roughnessModelSelection().setCertainItem(new ErfRoughnessItem);
-            else if (dynamic_cast<const TanhRoughness*>(roughness->roughnessModel()))
-                t->roughnessModelSelection().setCertainItem(new TanhRoughnessItem);
+            if (dynamic_cast<const ErfInterlayer*>(roughness->interlayerModel()))
+                t->roughnessModelSelection().setCertainItem(new ErfInterlayerItem);
+            else if (dynamic_cast<const TanhInterlayer*>(roughness->interlayerModel()))
+                t->roughnessModelSelection().setCertainItem(new TanhInterlayerItem);
             else
                 ASSERT_NEVER;
 
diff --git a/GUI/Model/Sample/InterlayerModelItems.h b/GUI/Model/Sample/InterlayerModelItems.h
new file mode 100644
index 00000000000..50121ab7e0b
--- /dev/null
+++ b/GUI/Model/Sample/InterlayerModelItems.h
@@ -0,0 +1,53 @@
+//  ************************************************************************************************
+//
+//  BornAgain: simulate and fit reflection and scattering
+//
+//! @file      GUI/Model/Sample/InterlayerModelItem.h
+//! @brief     Defines classes InterlayerModelItem.
+//!
+//! @homepage  http://www.bornagainproject.org
+//! @license   GNU General Public License v3 or higher (see COPYING)
+//! @copyright Forschungszentrum Jülich GmbH 2024
+//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
+//
+//  ************************************************************************************************
+
+#ifndef BORNAGAIN_GUI_MODEL_SAMPLE_INTERLAYERMODELITEMS_H
+#define BORNAGAIN_GUI_MODEL_SAMPLE_INTERLAYERMODELITEMS_H
+
+#include "Sample/Interface/InterlayerModels.h"
+#include <QXmlStreamReader>
+#include <memory>
+
+class InterlayerModelItem {
+public:
+    virtual ~InterlayerModelItem() = default;
+
+    virtual void writeTo(QXmlStreamWriter*) const {}
+    virtual void readFrom(QXmlStreamReader*) {}
+
+    virtual std::unique_ptr<InterlayerModel> createModel() const = 0;
+
+protected:
+    InterlayerModelItem() = default;
+};
+
+class ErfInterlayerItem : public InterlayerModelItem {
+public:
+    ErfInterlayerItem() = default;
+    std::unique_ptr<InterlayerModel> createModel() const
+    {
+        return std::make_unique<ErfInterlayer>();
+    }
+};
+
+class TanhInterlayerItem : public InterlayerModelItem {
+public:
+    TanhInterlayerItem() = default;
+    std::unique_ptr<InterlayerModel> createModel() const
+    {
+        return std::make_unique<TanhInterlayer>();
+    }
+};
+
+#endif // BORNAGAIN_GUI_MODEL_SAMPLE_INTERLAYERMODELITEMS_H
diff --git a/GUI/Model/Sample/RoughnessCatalog.cpp b/GUI/Model/Sample/RoughnessCatalog.cpp
index fb4344c6b25..0429b7ada2c 100644
--- a/GUI/Model/Sample/RoughnessCatalog.cpp
+++ b/GUI/Model/Sample/RoughnessCatalog.cpp
@@ -14,8 +14,8 @@
 
 #include "GUI/Model/Sample/RoughnessCatalog.h"
 #include "Base/Util/Assert.h"
+#include "GUI/Model/Sample/InterlayerModelItems.h"
 #include "GUI/Model/Sample/RoughnessItems.h"
-#include "GUI/Model/Sample/RoughnessModelItems.h"
 
 RoughnessItem* RoughnessCatalog::create(Type type)
 {
@@ -57,23 +57,23 @@ RoughnessCatalog::Type RoughnessCatalog::type(const RoughnessItem* item)
 
 //--------------------------------------------------------------------------
 
-RoughnessModelItem* RoughnessModelCatalog::create(Type type)
+InterlayerModelItem* InterlayerModelCatalog::create(Type type)
 {
     switch (type) {
     case Type::Erf:
-        return new ErfRoughnessItem();
+        return new ErfInterlayerItem();
     case Type::Tanh:
-        return new TanhRoughnessItem();
+        return new TanhInterlayerItem();
     }
     ASSERT_NEVER;
 }
 
-QVector<RoughnessModelCatalog::Type> RoughnessModelCatalog::types()
+QVector<InterlayerModelCatalog::Type> InterlayerModelCatalog::types()
 {
     return {Type::Erf, Type::Tanh};
 }
 
-UiInfo RoughnessModelCatalog::uiInfo(Type type)
+UiInfo InterlayerModelCatalog::uiInfo(Type type)
 {
     switch (type) {
     case Type::Erf:
@@ -84,12 +84,12 @@ UiInfo RoughnessModelCatalog::uiInfo(Type type)
     ASSERT_NEVER;
 }
 
-RoughnessModelCatalog::Type RoughnessModelCatalog::type(const RoughnessModelItem* model)
+InterlayerModelCatalog::Type InterlayerModelCatalog::type(const InterlayerModelItem* model)
 {
-    if (dynamic_cast<const ErfRoughnessItem*>(model))
+    if (dynamic_cast<const ErfInterlayerItem*>(model))
         return Type::Erf;
 
-    if (dynamic_cast<const TanhRoughnessItem*>(model))
+    if (dynamic_cast<const TanhInterlayerItem*>(model))
         return Type::Tanh;
 
     ASSERT_NEVER;
diff --git a/GUI/Model/Sample/RoughnessCatalog.h b/GUI/Model/Sample/RoughnessCatalog.h
index 0d72ccc4d4f..d3972dd2374 100644
--- a/GUI/Model/Sample/RoughnessCatalog.h
+++ b/GUI/Model/Sample/RoughnessCatalog.h
@@ -18,8 +18,8 @@
 #include "GUI/Model/Type/UiInfo.h"
 #include <QVector>
 
+class InterlayerModelItem;
 class RoughnessItem;
-class RoughnessModelItem;
 
 class RoughnessCatalog {
 public:
@@ -41,13 +41,13 @@ public:
 
 //--------------------------------------------------------------------------
 
-class RoughnessModelCatalog {
+class InterlayerModelCatalog {
 public:
     // Do not change the numbering! It is serialized!
     enum class Type : uint8_t { Erf = 0, Tanh = 1 };
 
     //! Creates the item of the given type.
-    static RoughnessModelItem* create(Type type);
+    static InterlayerModelItem* create(Type type);
 
     //! List of available types, sorted as expected in the UI.
     static QVector<Type> types();
@@ -56,7 +56,7 @@ public:
     static UiInfo uiInfo(Type t);
 
     //! Returns the enum type of the given item.
-    static Type type(const RoughnessModelItem* model);
+    static Type type(const InterlayerModelItem* model);
 };
 
 #endif // BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSCATALOG_H
diff --git a/GUI/Model/Sample/RoughnessItems.cpp b/GUI/Model/Sample/RoughnessItems.cpp
index c08a4929531..51daca255f7 100644
--- a/GUI/Model/Sample/RoughnessItems.cpp
+++ b/GUI/Model/Sample/RoughnessItems.cpp
@@ -49,7 +49,7 @@ RoughnessItem::RoughnessItem()
     m_roughness_model.simpleInit("Interlayer profile",
                                  "Laterally averaged profile of the interlayer transition (or "
                                  "roughness height distribution)",
-                                 RoughnessModelCatalog::Type::Tanh);
+                                 InterlayerModelCatalog::Type::Tanh);
 }
 
 //------------------------------------------------------------------------------------------------
diff --git a/GUI/Model/Sample/RoughnessItems.h b/GUI/Model/Sample/RoughnessItems.h
index c8e8a694b47..1f840ae8098 100644
--- a/GUI/Model/Sample/RoughnessItems.h
+++ b/GUI/Model/Sample/RoughnessItems.h
@@ -17,8 +17,8 @@
 
 #include "GUI/Model/Descriptor/DoubleProperty.h"
 #include "GUI/Model/Descriptor/PolyPtr.h"
+#include "GUI/Model/Sample/InterlayerModelItems.h"
 #include "GUI/Model/Sample/RoughnessCatalog.h"
-#include "GUI/Model/Sample/RoughnessModelItems.h"
 
 class RoughnessItem {
 public:
@@ -28,16 +28,16 @@ public:
     virtual void readFrom(QXmlStreamReader* r);
     virtual DoubleProperties lateralProperties() = 0;
 
-    PolyPtr<RoughnessModelItem, RoughnessModelCatalog>& roughnessModelSelection()
+    PolyPtr<InterlayerModelItem, InterlayerModelCatalog>& roughnessModelSelection()
     {
         return m_roughness_model;
     }
-    RoughnessModelItem* certainRoughnessModel() const { return m_roughness_model.certainItem(); }
-    void setRoughnessModelType(RoughnessModelItem* p) { m_roughness_model.setCertainItem(p); }
+    InterlayerModelItem* certainRoughnessModel() const { return m_roughness_model.certainItem(); }
+    void setRoughnessModelType(InterlayerModelItem* p) { m_roughness_model.setCertainItem(p); }
 
 protected:
     RoughnessItem();
-    PolyPtr<RoughnessModelItem, RoughnessModelCatalog> m_roughness_model;
+    PolyPtr<InterlayerModelItem, InterlayerModelCatalog> m_roughness_model;
 };
 
 class BasicRoughnessItem : public RoughnessItem {
diff --git a/GUI/Model/Sample/RoughnessModelItems.h b/GUI/Model/Sample/RoughnessModelItems.h
deleted file mode 100644
index dd9c5673006..00000000000
--- a/GUI/Model/Sample/RoughnessModelItems.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      GUI/Model/Sample/RoughnessModelItems.h
-//! @brief     Defines classes RoughnessModelItems.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2024
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifndef BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSMODELITEMS_H
-#define BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSMODELITEMS_H
-
-#include "Sample/Interface/RoughnessModels.h"
-#include <memory>
-
-class RoughnessModelItem {
-public:
-    virtual ~RoughnessModelItem() = default;
-
-    virtual void writeTo(QXmlStreamWriter*) const {}
-    virtual void readFrom(QXmlStreamReader*) {}
-
-    virtual std::unique_ptr<RoughnessModel> createModel() const = 0;
-
-protected:
-    RoughnessModelItem() = default;
-};
-
-class ErfRoughnessItem : public RoughnessModelItem {
-public:
-    ErfRoughnessItem() = default;
-    std::unique_ptr<RoughnessModel> createModel() const { return std::make_unique<ErfRoughness>(); }
-};
-
-class TanhRoughnessItem : public RoughnessModelItem {
-public:
-    TanhRoughnessItem() = default;
-    std::unique_ptr<RoughnessModel> createModel() const
-    {
-        return std::make_unique<TanhRoughness>();
-    }
-};
-
-#endif // BORNAGAIN_GUI_MODEL_SAMPLE_ROUGHNESSMODELITEMS_H
diff --git a/GUI/View/Sample/PolyForm.cpp b/GUI/View/Sample/PolyForm.cpp
index 1ec46bab2e5..809cf395ad5 100644
--- a/GUI/View/Sample/PolyForm.cpp
+++ b/GUI/View/Sample/PolyForm.cpp
@@ -53,7 +53,7 @@ DoubleProperties PolyForm::doublePropertiesOfItem(FormfactorItem* item)
     return item->geometryProperties();
 }
 
-DoubleProperties PolyForm::doublePropertiesOfItem(RoughnessModelItem*)
+DoubleProperties PolyForm::doublePropertiesOfItem(InterlayerModelItem*)
 {
     return {};
 }
diff --git a/GUI/View/Sample/PolyForm.h b/GUI/View/Sample/PolyForm.h
index 31174835872..6ce7453abba 100644
--- a/GUI/View/Sample/PolyForm.h
+++ b/GUI/View/Sample/PolyForm.h
@@ -52,7 +52,7 @@ public:
     virtual void createContent();
 
 private:
-    static DoubleProperties doublePropertiesOfItem(class RoughnessModelItem* item);
+    static DoubleProperties doublePropertiesOfItem(class InterlayerModelItem* item);
     static DoubleProperties doublePropertiesOfItem(class FormfactorItem* item);
     static DoubleProperties doublePropertiesOfItem(class Profile1DItem* item);
     static DoubleProperties doublePropertiesOfItem(class Profile2DItem* item);
diff --git a/Resample/Slice/ProfileHelper.cpp b/Resample/Slice/ProfileHelper.cpp
index d182d9e8661..0e25c536748 100644
--- a/Resample/Slice/ProfileHelper.cpp
+++ b/Resample/Slice/ProfileHelper.cpp
@@ -27,7 +27,7 @@ double Transition(double x, const LayerRoughness* roughness)
     if (!roughness)
         return Math::Heaviside(x);
 
-    return roughness->roughnessModel()->transient(x, roughness->sigma());
+    return roughness->interlayerModel()->transient(x, roughness->sigma());
 }
 
 const std::string SLD = "SLD";
diff --git a/Resample/Specular/ComputeFluxMagnetic.cpp b/Resample/Specular/ComputeFluxMagnetic.cpp
index cb2cf20fb64..83e5b8a7302 100644
--- a/Resample/Specular/ComputeFluxMagnetic.cpp
+++ b/Resample/Specular/ComputeFluxMagnetic.cpp
@@ -117,7 +117,7 @@ Spinor checkForUnderflow(const Spinor& eigenvs)
 
 std::pair<SpinMatrix, SpinMatrix> refractionMatrixBlocks(const MatrixFlux& tr_a,
                                                          const MatrixFlux& tr_b, double sigma,
-                                                         const RoughnessModel* r_model)
+                                                         const InterlayerModel* r_model)
 {
     ASSERT(sigma >= 0);
     if (sigma < 10 * std::numeric_limits<double>::epsilon()) {
@@ -128,7 +128,7 @@ std::pair<SpinMatrix, SpinMatrix> refractionMatrixBlocks(const MatrixFlux& tr_a,
     }
     ASSERT(r_model);
 
-    if (dynamic_cast<const ErfRoughness*>(r_model))
+    if (dynamic_cast<const ErfInterlayer*>(r_model))
         return refractionMatrixBlocksNevot(tr_a, tr_b, sigma);
 
     return refractionMatrixBlocksTanh(tr_a, tr_b, sigma);
@@ -183,7 +183,7 @@ std::vector<MatrixFlux> computeTR(const SliceStack& slices, const std::vector<co
     for (size_t i = N - 1; i > 0; --i) {
         const auto* roughness = slices.bottomRoughness(i);
         const double sigma = roughness ? roughness->sigma() : 0.;
-        const auto* r_model = roughness ? roughness->roughnessModel() : nullptr;
+        const auto* r_model = roughness ? roughness->interlayerModel() : nullptr;
 
         // compute the 2x2 blocks of the transfer matrix
         const auto [sp, sm] = refractionMatrixBlocks(TR[i - 1], TR[i], sigma, r_model);
@@ -289,7 +289,7 @@ SpinMatrix Compute::polarizedReflectivity(const SliceStack& slices,
         MatrixFlux tr_i = createCoeff(i - 1);
         const auto* roughness = slices.bottomRoughness(i - 1);
         const double sigma = roughness ? roughness->sigma() : 0.;
-        const auto* r_model = roughness ? roughness->roughnessModel() : nullptr;
+        const auto* r_model = roughness ? roughness->interlayerModel() : nullptr;
 
         // compute the 2x2 blocks of the transfer matrix
         const auto [sp, sm] = ::refractionMatrixBlocks(tr_i, tr_i1, sigma, r_model);
diff --git a/Resample/Specular/ComputeFluxScalar.cpp b/Resample/Specular/ComputeFluxScalar.cpp
index 10a158ff001..7f8a70ddeac 100644
--- a/Resample/Specular/ComputeFluxScalar.cpp
+++ b/Resample/Specular/ComputeFluxScalar.cpp
@@ -28,7 +28,7 @@ namespace {
 
 //! See PhysRef, chapter "Scattering by rough interfaces", section "Interface with tanh profile".
 std::pair<complex_t, complex_t> transition(complex_t kzi, complex_t kzi1, double sigma,
-                                           const RoughnessModel* r_model)
+                                           const InterlayerModel* r_model)
 {
     const complex_t kz_ratio = kzi1 / kzi;
 
@@ -38,7 +38,7 @@ std::pair<complex_t, complex_t> transition(complex_t kzi, complex_t kzi1, double
     ASSERT(sigma > 0);
     ASSERT(r_model);
 
-    if (dynamic_cast<const ErfRoughness*>(r_model))
+    if (dynamic_cast<const ErfInterlayer*>(r_model))
         // Roughness is modelled by a Gaussian profile, i.e. Nevot-Croce factors for the
         // reflection coefficients.
         // Implementation follows A. Gibaud and G. Vignaud, in X-ray and Neutron Reflectivity,
@@ -85,7 +85,7 @@ std::vector<Spinor> computeTR(const SliceStack& slices, const std::vector<comple
         const size_t jlast = X[i];
         const auto* roughness = slices.bottomRoughness(jthis);
         const double sigma = roughness ? roughness->sigma() : 0.;
-        const auto* r_model = roughness ? roughness->roughnessModel() : nullptr;
+        const auto* r_model = roughness ? roughness->interlayerModel() : nullptr;
 
         const auto [slp, slm] = transition(kz[jthis], kz[jlast], sigma, r_model);
 
@@ -139,7 +139,7 @@ complex_t Compute::scalarReflectivity(const SliceStack& slices, const std::vecto
     for (size_t i = N - 1; i > 0; i--) {
         const auto* roughness = slices.bottomRoughness(i - 1);
         const double sigma = roughness ? roughness->sigma() : 0.;
-        const auto* r_model = roughness ? roughness->roughnessModel() : nullptr;
+        const auto* r_model = roughness ? roughness->interlayerModel() : nullptr;
 
         const auto [sp, sm] = ::transition(kz[i - 1], kz[i], sigma, r_model);
 
diff --git a/Sample/Interface/RoughnessModels.cpp b/Sample/Interface/InterlayerModels.cpp
similarity index 64%
rename from Sample/Interface/RoughnessModels.cpp
rename to Sample/Interface/InterlayerModels.cpp
index 7a054246662..a94ac3dfcea 100644
--- a/Sample/Interface/RoughnessModels.cpp
+++ b/Sample/Interface/InterlayerModels.cpp
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sample/Interface/RoughnessModels.cpp
-//! @brief     Implements RoughnessModels enumerator and Python wrapper.
+//! @file      Sample/Interface/InterlayerModels.cpp
+//! @brief     Implements InterlayerModel classes.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Sample/Interface/RoughnessModels.h"
+#include "Sample/Interface/InterlayerModels.h"
 #include "Base/Math/Functions.h"
 #include "Base/Util/Assert.h"
 #include <cmath>
@@ -27,12 +27,12 @@ const double pi_2 = std::sqrt(pi);
 } // namespace
 
 
-ErfRoughness::ErfRoughness()
-    : RoughnessModel()
+ErfInterlayer::ErfInterlayer()
+    : InterlayerModel()
 {
 }
 
-double ErfRoughness::transient(double x, double sigma) const
+double ErfInterlayer::transient(double x, double sigma) const
 {
     ASSERT(sigma >= 0);
     if (sigma == 0.0)
@@ -41,28 +41,28 @@ double ErfRoughness::transient(double x, double sigma) const
     return (1.0 + std::erf(erf_prefactor * x / sigma)) / 2.0;
 }
 
-double ErfRoughness::distribution(double x, double sigma) const
+double ErfInterlayer::distribution(double x, double sigma) const
 {
     ASSERT(sigma > 0);
     return erf_prefactor / pi_2 / sigma * std::exp(-pow(erf_prefactor * x / sigma, 2));
 }
 
-double ErfRoughness::sigmaRange() const
+double ErfInterlayer::sigmaRange() const
 {
     return 6.;
 }
 
-ErfRoughness* ErfRoughness::clone() const
+ErfInterlayer* ErfInterlayer::clone() const
 {
-    return new ErfRoughness;
+    return new ErfInterlayer;
 }
 
-TanhRoughness::TanhRoughness()
-    : RoughnessModel()
+TanhInterlayer::TanhInterlayer()
+    : InterlayerModel()
 {
 }
 
-double TanhRoughness::transient(double x, double sigma) const
+double TanhInterlayer::transient(double x, double sigma) const
 {
     ASSERT(sigma >= 0);
     if (sigma == 0.0)
@@ -71,18 +71,18 @@ double TanhRoughness::transient(double x, double sigma) const
     return (1.0 + std::tanh(tanh_prefactor * x / sigma)) / 2.0;
 }
 
-double TanhRoughness::distribution(double x, double sigma) const
+double TanhInterlayer::distribution(double x, double sigma) const
 {
     ASSERT(sigma > 0);
     return tanh_prefactor / 2 / sigma / pow(std::cosh(tanh_prefactor * x / sigma), 2);
 }
 
-double TanhRoughness::sigmaRange() const
+double TanhInterlayer::sigmaRange() const
 {
     return 11.;
 }
 
-TanhRoughness* TanhRoughness::clone() const
+TanhInterlayer* TanhInterlayer::clone() const
 {
-    return new TanhRoughness;
+    return new TanhInterlayer;
 }
diff --git a/Sample/Interface/RoughnessModels.h b/Sample/Interface/InterlayerModels.h
similarity index 58%
rename from Sample/Interface/RoughnessModels.h
rename to Sample/Interface/InterlayerModels.h
index 132efeee079..a839662552a 100644
--- a/Sample/Interface/RoughnessModels.h
+++ b/Sample/Interface/InterlayerModels.h
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Sample/Interface/RoughnessModels.h
-//! @brief     Define RoughnessModels enumerator and Python wrapper.
+//! @file      Sample/Interface/InterlayerModels.h
+//! @brief     Define InterlayerModel classes.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -12,40 +12,40 @@
 //
 //  ************************************************************************************************
 
-#ifndef BORNAGAIN_SAMPLE_INTERFACE_ROUGHNESSMODELS_H
-#define BORNAGAIN_SAMPLE_INTERFACE_ROUGHNESSMODELS_H
+#ifndef BORNAGAIN_SAMPLE_INTERFACE_INTERLAYERMODELS_H
+#define BORNAGAIN_SAMPLE_INTERFACE_INTERLAYERMODELS_H
 
 #include "Base/Type/ICloneable.h"
 #include "Param/Node/INode.h"
 
-class RoughnessModel : public ICloneable, public INode {
+class InterlayerModel : public ICloneable, public INode {
 public:
-    RoughnessModel* clone() const override = 0;
+    InterlayerModel* clone() const override = 0;
     virtual double transient(double x, double sigma) const = 0;
     virtual double distribution(double x, double sigma) const = 0;
     virtual double sigmaRange() const = 0;
 };
 
-class ErfRoughness : public RoughnessModel {
+class ErfInterlayer : public InterlayerModel {
 public:
-    ErfRoughness();
+    ErfInterlayer();
     double transient(double x, double sigma) const override;
     double distribution(double x, double sigma) const override;
     double sigmaRange() const override;
-    ErfRoughness* clone() const override;
-    std::string className() const override { return "ErfRoughness"; }
+    ErfInterlayer* clone() const override;
+    std::string className() const override { return "ErfInterlayer"; }
 };
 
-class TanhRoughness : public RoughnessModel {
+class TanhInterlayer : public InterlayerModel {
 public:
-    TanhRoughness();
+    TanhInterlayer();
     double transient(double x, double sigma) const override;
     double distribution(double x, double sigma) const override;
     double sigmaRange() const override;
-    TanhRoughness* clone() const override;
-    std::string className() const override { return "TanhRoughness"; }
+    TanhInterlayer* clone() const override;
+    std::string className() const override { return "TanhInterlayer"; }
 };
 
-using DefaultRoughness = TanhRoughness;
+using DefaultInterlayer = TanhInterlayer;
 
-#endif // BORNAGAIN_SAMPLE_INTERFACE_ROUGHNESSMODELS_H
+#endif // BORNAGAIN_SAMPLE_INTERFACE_INTERLAYERMODELS_H
diff --git a/Sample/Interface/LayerRoughness.cpp b/Sample/Interface/LayerRoughness.cpp
index 217afd3a192..41418e176ea 100644
--- a/Sample/Interface/LayerRoughness.cpp
+++ b/Sample/Interface/LayerRoughness.cpp
@@ -27,17 +27,17 @@ using std::numbers::pi;
 //! @param lateralCorrLength: lateral correlation length of the roughness in nanometers
 //! @param profileModel: shape of the interfacial transition region
 LayerRoughness::LayerRoughness(double sigma, double hurstParameter, double lateralCorrLength,
-                               const RoughnessModel* roughnessModel)
+                               const InterlayerModel* interlayerModel)
     : m_sigma(sigma)
     , m_hurst_parameter(hurstParameter)
     , m_lateral_corr_length(lateralCorrLength)
 {
-    setRoughnessModel(roughnessModel);
+    setInterlayerModel(interlayerModel);
     validateOrThrow();
 }
 
-LayerRoughness::LayerRoughness(double sigma, const RoughnessModel* roughnessModel)
-    : LayerRoughness(sigma, 0, 0, roughnessModel)
+LayerRoughness::LayerRoughness(double sigma, const InterlayerModel* interlayerModel)
+    : LayerRoughness(sigma, 0, 0, interlayerModel)
 {
 }
 
@@ -49,12 +49,12 @@ LayerRoughness::LayerRoughness()
 LayerRoughness* LayerRoughness::clone() const
 {
     return new LayerRoughness(m_sigma, m_hurst_parameter, m_lateral_corr_length,
-                              m_roughness_model.get());
+                              m_interlayer_model.get());
 }
 
 std::vector<const INode*> LayerRoughness::nodeChildren() const
 {
-    return std::vector<const INode*>() << m_roughness_model;
+    return std::vector<const INode*>() << m_interlayer_model;
 }
 
 //! Power spectral density of the surface roughness is a result of two-dimensional
@@ -101,10 +101,10 @@ std::string LayerRoughness::validate() const
     return "";
 }
 
-void LayerRoughness::setRoughnessModel(const RoughnessModel* roughnessModel)
+void LayerRoughness::setInterlayerModel(const InterlayerModel* interlayerModel)
 {
-    if (!roughnessModel)
-        m_roughness_model = std::make_unique<DefaultRoughness>();
+    if (!interlayerModel)
+        m_interlayer_model = std::make_unique<DefaultInterlayer>();
     else
-        m_roughness_model.reset(roughnessModel->clone());
+        m_interlayer_model.reset(interlayerModel->clone());
 }
diff --git a/Sample/Interface/LayerRoughness.h b/Sample/Interface/LayerRoughness.h
index cd86f383e5e..82036b46cc7 100644
--- a/Sample/Interface/LayerRoughness.h
+++ b/Sample/Interface/LayerRoughness.h
@@ -15,7 +15,7 @@
 #ifndef BORNAGAIN_SAMPLE_INTERFACE_LAYERROUGHNESS_H
 #define BORNAGAIN_SAMPLE_INTERFACE_LAYERROUGHNESS_H
 
-#include "Sample/Interface/RoughnessModels.h"
+#include "Sample/Interface/InterlayerModels.h"
 #include "Sample/Scattering/ISampleNode.h"
 #include <heinz/Vectors3D.h>
 
@@ -27,8 +27,8 @@
 class LayerRoughness : public ISampleNode {
 public:
     LayerRoughness(double sigma, double hurstParameter = 0, double lateralCorrLength = 0,
-                   const RoughnessModel* roughnessModel = nullptr);
-    LayerRoughness(double sigma, const RoughnessModel* roughnessModel);
+                   const InterlayerModel* interlayerModel = nullptr);
+    LayerRoughness(double sigma, const InterlayerModel* interlayerModel);
     LayerRoughness();
 
     LayerRoughness* clone() const override;
@@ -74,17 +74,17 @@ public:
 
     std::string validate() const override;
 
-    void setRoughnessModel(const RoughnessModel* roughnessModel);
-    const RoughnessModel* roughnessModel() const
+    void setInterlayerModel(const InterlayerModel* interlayerModel);
+    const InterlayerModel* interlayerModel() const
     {
-        return m_roughness_model.get();
+        return m_interlayer_model.get();
     }
 
 private:
     double m_sigma;           //!< rms of roughness
     double m_hurst_parameter; //!< Hurst parameter which describes how jagged the interface, 0<H<=1
     double m_lateral_corr_length; //!< lateral correlation length of the roughness
-    std::unique_ptr<RoughnessModel> m_roughness_model; // never nullptr
+    std::unique_ptr<InterlayerModel> m_interlayer_model; // never nullptr
 };
 
 #endif // BORNAGAIN_SAMPLE_INTERFACE_LAYERROUGHNESS_H
diff --git a/Sample/Interface/RoughnessMap.cpp b/Sample/Interface/RoughnessMap.cpp
index ddad4ca7782..84d766dcac8 100644
--- a/Sample/Interface/RoughnessMap.cpp
+++ b/Sample/Interface/RoughnessMap.cpp
@@ -71,7 +71,7 @@ double2d_t RoughnessMap::mapFromHeights() const
 {
     const size_t z_steps = 3999;
     const double sigma = m_layerRoughness->sigma();
-    const double sigma_factor = m_layerRoughness->roughnessModel()->sigmaRange();
+    const double sigma_factor = m_layerRoughness->interlayerModel()->sigmaRange();
     const double z_limit = sigma * sigma_factor;
     const double step = 2 * z_limit / (z_steps - 1);
 
@@ -83,7 +83,7 @@ double2d_t RoughnessMap::mapFromHeights() const
     // fill mesh with weights
     std::vector<double> z_weights(z_steps);
     for (size_t i = 0; i < z_steps; i++)
-        z_weights[i] = m_layerRoughness->roughnessModel()->distribution(z_points[i], sigma);
+        z_weights[i] = m_layerRoughness->interlayerModel()->distribution(z_points[i], sigma);
 
     // fill map with random values
     std::discrete_distribution<int> d(z_weights.begin(), z_weights.end());
diff --git a/Sample/Multilayer/MultiLayer.h b/Sample/Multilayer/MultiLayer.h
index 56f835a1912..d4c1df189a6 100644
--- a/Sample/Multilayer/MultiLayer.h
+++ b/Sample/Multilayer/MultiLayer.h
@@ -16,7 +16,7 @@
 #define BORNAGAIN_SAMPLE_MULTILAYER_MULTILAYER_H
 
 #include "Base/Type/OwningVector.h"
-#include "Sample/Interface/RoughnessModels.h"
+#include "Sample/Interface/InterlayerModels.h"
 #include "Sample/Scattering/ISampleNode.h"
 #include <functional>
 #include <heinz/Vectors3D.h>
diff --git a/Sample/StandardSample/FeNiBilayerBuilder.cpp b/Sample/StandardSample/FeNiBilayerBuilder.cpp
index 53a7401c807..13ba4135704 100644
--- a/Sample/StandardSample/FeNiBilayerBuilder.cpp
+++ b/Sample/StandardSample/FeNiBilayerBuilder.cpp
@@ -41,7 +41,7 @@ public:
     double m_thickness_ni = 40. * Units::angstrom;
     double m_sigma_roughness = 0.;
     int m_effectiveSLD = 0;
-    std::unique_ptr<RoughnessModel> m_roughness_model;
+    std::unique_ptr<InterlayerModel> m_interlayer_model;
 
     Options() = default;
     void setNBilayers(int n) { m_NBilayers = n; }
@@ -51,7 +51,7 @@ public:
     void setThicknessNi(double t) { m_thickness_ni = t; }
     void setSigmaRoughness(double r) { m_sigma_roughness = r; }
     void setEffectiveSLD(int i) { m_effectiveSLD = i; }
-    void setRoughnessModel(RoughnessModel* rm) { m_roughness_model.reset(rm); }
+    void setInterlayerModel(InterlayerModel* im) { m_interlayer_model.reset(im); }
 };
 
 
@@ -66,7 +66,7 @@ public:
         , thicknessNi(opt.m_thickness_ni)
         , sigmaRoughness(opt.m_sigma_roughness)
         , effectiveSLD(opt.m_effectiveSLD)
-        , roughnessModel(opt.m_roughness_model ? opt.m_roughness_model->clone() : nullptr)
+        , interlayerModel(opt.m_interlayer_model ? opt.m_interlayer_model->clone() : nullptr)
     {
         if (angle != 0. && effectiveSLD != 0.)
             throw std::runtime_error("Cannot perform scalar computation "
@@ -87,7 +87,7 @@ private:
     double thicknessNi;
     double sigmaRoughness;
     int effectiveSLD;
-    std::unique_ptr<RoughnessModel> roughnessModel;
+    std::unique_ptr<InterlayerModel> interlayerModel;
 
     R3 magnetizationVector;
 
@@ -113,7 +113,7 @@ std::unique_ptr<MultiLayer> FeNiBilayer::constructSample()
     Layer l_Fe{m_Fe, thicknessFe};
     Layer l_Ni{m_Ni, thicknessNi};
 
-    LayerRoughness roughness{sigmaRoughness, 0., 0., roughnessModel.get()};
+    LayerRoughness roughness{sigmaRoughness, 0., 0., interlayerModel.get()};
     result->addLayer(Layer{m_ambient});
 
     for (auto i = 0; i < NBilayers; ++i) {
@@ -138,7 +138,7 @@ MultiLayer* ExemplarySamples::createFeNiBilayerTanh()
 {
     Options opt;
     opt.setSigmaRoughness(2. * Units::angstrom);
-    opt.setRoughnessModel(new TanhRoughness);
+    opt.setInterlayerModel(new TanhInterlayer);
     auto sample = FeNiBilayer{std::move(opt)};
     return sample.release();
 }
@@ -147,7 +147,7 @@ MultiLayer* ExemplarySamples::createFeNiBilayerNC()
 {
     Options opt;
     opt.setSigmaRoughness(2. * Units::angstrom);
-    opt.setRoughnessModel(new ErfRoughness);
+    opt.setInterlayerModel(new ErfInterlayer);
     auto sample = FeNiBilayer{std::move(opt)};
     return sample.release();
 }
@@ -165,7 +165,7 @@ MultiLayer* ExemplarySamples::createFeNiBilayerSpinFlipTanh()
     Options opt;
     opt.setAngle(38. * deg);
     opt.setSigmaRoughness(2. * Units::angstrom);
-    opt.setRoughnessModel(new TanhRoughness);
+    opt.setInterlayerModel(new TanhInterlayer);
     auto sample = FeNiBilayer{std::move(opt)};
     return sample.release();
 }
@@ -175,7 +175,7 @@ MultiLayer* ExemplarySamples::createFeNiBilayerSpinFlipNC()
     Options opt;
     opt.setAngle(38. * deg);
     opt.setSigmaRoughness(2. * Units::angstrom);
-    opt.setRoughnessModel(new ErfRoughness);
+    opt.setInterlayerModel(new ErfInterlayer);
     auto sample = FeNiBilayer{std::move(opt)};
     return sample.release();
 }
diff --git a/Sample/StandardSample/MagneticLayersBuilder.cpp b/Sample/StandardSample/MagneticLayersBuilder.cpp
index c8c22aa1354..096deb187b4 100644
--- a/Sample/StandardSample/MagneticLayersBuilder.cpp
+++ b/Sample/StandardSample/MagneticLayersBuilder.cpp
@@ -114,16 +114,16 @@ MultiLayer*
 ExemplarySamples::createSimpleMagneticRotationWithRoughness(const std::string& roughnessKey)
 {
     double sigmaRoughness = 0.;
-    std::unique_ptr<RoughnessModel> roughnessModel;
+    std::unique_ptr<InterlayerModel> interlayerModel;
 
     if (roughnessKey == "Flat") {
         sigmaRoughness = 0.;
     } else if (roughnessKey == "Tanh") {
         sigmaRoughness = 2. * Units::angstrom;
-        roughnessModel = std::make_unique<TanhRoughness>();
+        interlayerModel = std::make_unique<TanhInterlayer>();
     } else if (roughnessKey == "Erf") {
         sigmaRoughness = 2. * Units::angstrom;
-        roughnessModel = std::make_unique<ErfRoughness>();
+        interlayerModel = std::make_unique<ErfInterlayer>();
     } else
         ASSERT_NEVER;
 
@@ -137,7 +137,7 @@ ExemplarySamples::createSimpleMagneticRotationWithRoughness(const std::string& r
 
     auto roughness = LayerRoughness();
     roughness.setSigma(sigmaRoughness);
-    roughness.setRoughnessModel(roughnessModel.get());
+    roughness.setInterlayerModel(interlayerModel.get());
 
     Layer vacuum_layer(vacuum_material);
     Layer substrate_layer(substrate_material);
diff --git a/Sample/StandardSample/MagneticLayersBuilder.h b/Sample/StandardSample/MagneticLayersBuilder.h
index 5c62d7de809..7c02853b44c 100644
--- a/Sample/StandardSample/MagneticLayersBuilder.h
+++ b/Sample/StandardSample/MagneticLayersBuilder.h
@@ -20,7 +20,7 @@
 
 class MultiLayer;
 
-#include "Sample/Interface/RoughnessModels.h"
+#include "Sample/Interface/InterlayerModels.h"
 #include <string>
 
 //! Builds sample: spheres in substrate layer with a zero magnetic field.
diff --git a/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp b/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp
index e097e4a7ff7..af591ef3ab7 100644
--- a/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp
+++ b/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp
@@ -19,7 +19,7 @@
 #include "Sample/Multilayer/MultiLayer.h"
 
 namespace {
-MultiLayer* createMultiLayerWithRoughnessModel(const RoughnessModel* roughnessModel)
+MultiLayer* createMultiLayerWithInterlayerModel(const InterlayerModel* interlayerModel)
 {
     const double thicknessA(2.5);
     const double thicknessB(5.0);
@@ -38,7 +38,7 @@ MultiLayer* createMultiLayerWithRoughnessModel(const RoughnessModel* roughnessMo
     Layer partB_layer(part_b_material, thicknessB);
     Layer substrate_layer(substrate_material, 0);
 
-    LayerRoughness roughness(sigma, hurst, lateralCorrLength, roughnessModel);
+    LayerRoughness roughness(sigma, hurst, lateralCorrLength, interlayerModel);
 
     auto* sample = new MultiLayer;
     sample->addLayer(vacuum_layer);
@@ -54,11 +54,11 @@ MultiLayer* createMultiLayerWithRoughnessModel(const RoughnessModel* roughnessMo
 
 MultiLayer* ExemplarySamples::createMultiLayerWithRoughness()
 {
-    return createMultiLayerWithRoughnessModel(nullptr);
+    return createMultiLayerWithInterlayerModel(nullptr);
 }
 
 MultiLayer* ExemplarySamples::createMultiLayerWithNCRoughness()
 {
-    std::unique_ptr<RoughnessModel> rm = std::make_unique<ErfRoughness>();
-    return createMultiLayerWithRoughnessModel(rm.get());
+    std::unique_ptr<InterlayerModel> rm = std::make_unique<ErfInterlayer>();
+    return createMultiLayerWithInterlayerModel(rm.get());
 }
diff --git a/Sim/Export/SampleToPython.cpp b/Sim/Export/SampleToPython.cpp
index a3b3436aca4..a95bd26ff84 100644
--- a/Sim/Export/SampleToPython.cpp
+++ b/Sim/Export/SampleToPython.cpp
@@ -153,7 +153,7 @@ std::string defineRoughnesses(const ComponentKeyHandler& objHandler)
     result << "\n" << indent() << "# Define roughness\n";
 
     std::vector<const LayerRoughness*> lr = objHandler.objectsOfType<LayerRoughness>();
-    std::vector<const RoughnessModel*> rm = objHandler.objectsOfType<RoughnessModel>();
+    std::vector<const InterlayerModel*> rm = objHandler.objectsOfType<InterlayerModel>();
     ASSERT(lr.size() == rm.size());
     if (lr.empty())
         return "";
@@ -526,7 +526,7 @@ std::string SampleToPython::sampleCode(const MultiLayer& sample)
         objHandler.insertModel("layer", x);
     for (const auto* x : NodeUtil::AllDescendantsOfType<LayerRoughness>(sample))
         objHandler.insertModel("roughness", x);
-    for (const auto* x : NodeUtil::AllDescendantsOfType<RoughnessModel>(sample))
+    for (const auto* x : NodeUtil::AllDescendantsOfType<InterlayerModel>(sample))
         objHandler.insertModel("interlayer", x);
     for (const auto* x : NodeUtil::AllDescendantsOfType<ParticleLayout>(sample))
         objHandler.insertModel("layout", x);
diff --git a/Wrap/Swig/libBornAgainSample.i b/Wrap/Swig/libBornAgainSample.i
index 3f97eaf9704..bc68a3c8fb9 100644
--- a/Wrap/Swig/libBornAgainSample.i
+++ b/Wrap/Swig/libBornAgainSample.i
@@ -103,7 +103,7 @@
 %include "Sample/Multilayer/Layer.h"
 %include "Sample/Multilayer/MultiLayer.h"
 
-%include "Sample/Interface/RoughnessModels.h"
+%include "Sample/Interface/InterlayerModels.h"
 
 %include "Sample/HardParticle/IFormfactorPolyhedron.h"
 %include "Sample/HardParticle/IFormfactorPrism.h"
diff --git a/auto/Examples/fit/specular/Honeycomb_fit.py b/auto/Examples/fit/specular/Honeycomb_fit.py
index e67e00e6fcb..7a214173a30 100755
--- a/auto/Examples/fit/specular/Honeycomb_fit.py
+++ b/auto/Examples/fit/specular/Honeycomb_fit.py
@@ -48,7 +48,7 @@ def get_sample(P, sign, T):
     l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom)
     l_Si = ba.Layer(material_Si)
 
-    roughness_model = ba.ErfRoughness()
+    roughness_model = ba.ErfInterlayer()
     rPyOx = ba.LayerRoughness(P["rPyOx"]*angstrom, roughness_model)
     rPy2 = ba.LayerRoughness(P["rPy2"]*angstrom, roughness_model)
     rPy1 = ba.LayerRoughness(P["rPy1"]*angstrom, roughness_model)
diff --git a/auto/Examples/specular/RoughnessModel.py b/auto/Examples/specular/RoughnessModel.py
index 31c3d448e02..55bca4e98f3 100755
--- a/auto/Examples/specular/RoughnessModel.py
+++ b/auto/Examples/specular/RoughnessModel.py
@@ -57,8 +57,8 @@ def simulate(roughness_model, title):
 
 if __name__ == '__main__':
     results = [
-        simulate(ba.ErfRoughness(), "Névot-Croce"),
-        simulate(ba.TanhRoughness(), "Tanh"),
+        simulate(ba.ErfInterlayer(), "Névot-Croce"),
+        simulate(ba.TanhInterlayer(), "Tanh"),
     ]
 
     bp.plot_multicurve(results)
diff --git a/auto/Examples/varia/MaterialProfile.py b/auto/Examples/varia/MaterialProfile.py
index bd7e7d0278d..1f7181a7a4e 100755
--- a/auto/Examples/varia/MaterialProfile.py
+++ b/auto/Examples/varia/MaterialProfile.py
@@ -29,7 +29,7 @@ def get_sample():
     # sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    roughness_model = ba.TanhRoughness()
+    roughness_model = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(5*angstrom, 0.5, 10*angstrom, roughness_model)
     for _ in range(4):
         sample.addLayerWithTopRoughness(ti_layer, roughness)
diff --git a/auto/Examples/varia/RoughSurface.py b/auto/Examples/varia/RoughSurface.py
index 9f86b9bb24e..5b11b64e82d 100755
--- a/auto/Examples/varia/RoughSurface.py
+++ b/auto/Examples/varia/RoughSurface.py
@@ -46,7 +46,7 @@ def plot(h):
 sigma = 1*nm
 alpha = 0.5
 xi = 35*nm
-height_distribution = ba.ErfRoughness()
+height_distribution = ba.ErfInterlayer()
 
 # sample size
 Lx = 1000*nm
diff --git a/auto/MiniExamples/fit/specular/Honeycomb_fit.py b/auto/MiniExamples/fit/specular/Honeycomb_fit.py
index 54c11676bb7..4ece8ee460d 100755
--- a/auto/MiniExamples/fit/specular/Honeycomb_fit.py
+++ b/auto/MiniExamples/fit/specular/Honeycomb_fit.py
@@ -48,7 +48,7 @@ def get_sample(P, sign, T):
     l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom)
     l_Si = ba.Layer(material_Si)
 
-    roughness_model = ba.ErfRoughness()
+    roughness_model = ba.ErfInterlayer()
     rPyOx = ba.LayerRoughness(P["rPyOx"]*angstrom, roughness_model)
     rPy2 = ba.LayerRoughness(P["rPy2"]*angstrom, roughness_model)
     rPy1 = ba.LayerRoughness(P["rPy1"]*angstrom, roughness_model)
diff --git a/auto/MiniExamples/specular/RoughnessModel.py b/auto/MiniExamples/specular/RoughnessModel.py
index b8de9ff317b..d1209dcea63 100755
--- a/auto/MiniExamples/specular/RoughnessModel.py
+++ b/auto/MiniExamples/specular/RoughnessModel.py
@@ -57,8 +57,8 @@ def simulate(roughness_model, title):
 
 if __name__ == '__main__':
     results = [
-        simulate(ba.ErfRoughness(), "Névot-Croce"),
-        simulate(ba.TanhRoughness(), "Tanh"),
+        simulate(ba.ErfInterlayer(), "Névot-Croce"),
+        simulate(ba.TanhInterlayer(), "Tanh"),
     ]
 
     bp.plot_multicurve(results)
diff --git a/auto/MiniExamples/varia/MaterialProfile.py b/auto/MiniExamples/varia/MaterialProfile.py
index bd7e7d0278d..1f7181a7a4e 100755
--- a/auto/MiniExamples/varia/MaterialProfile.py
+++ b/auto/MiniExamples/varia/MaterialProfile.py
@@ -29,7 +29,7 @@ def get_sample():
     # sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    roughness_model = ba.TanhRoughness()
+    roughness_model = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(5*angstrom, 0.5, 10*angstrom, roughness_model)
     for _ in range(4):
         sample.addLayerWithTopRoughness(ti_layer, roughness)
diff --git a/auto/MiniExamples/varia/RoughSurface.py b/auto/MiniExamples/varia/RoughSurface.py
index 34810eddd1b..d798b4eb561 100755
--- a/auto/MiniExamples/varia/RoughSurface.py
+++ b/auto/MiniExamples/varia/RoughSurface.py
@@ -46,7 +46,7 @@ def plot(h):
 sigma = 1*nm
 alpha = 0.5
 xi = 35*nm
-height_distribution = ba.ErfRoughness()
+height_distribution = ba.ErfInterlayer()
 
 # sample size
 Lx = 1000*nm
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 140d4b9ff6f..d6716eb108d 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -4177,8 +4177,8 @@ class LayerRoughness(ISampleNode):
 
     def __init__(self, *args):
         r"""
-        __init__(LayerRoughness self, double sigma, double hurstParameter=0, double lateralCorrLength=0, RoughnessModel roughnessModel=None) -> LayerRoughness
-        __init__(LayerRoughness self, double sigma, RoughnessModel roughnessModel) -> LayerRoughness
+        __init__(LayerRoughness self, double sigma, double hurstParameter=0, double lateralCorrLength=0, InterlayerModel interlayerModel=None) -> LayerRoughness
+        __init__(LayerRoughness self, double sigma, InterlayerModel interlayerModel) -> LayerRoughness
         __init__(LayerRoughness self) -> LayerRoughness
         """
         _libBornAgainSample.LayerRoughness_swiginit(self, _libBornAgainSample.new_LayerRoughness(*args))
@@ -4235,13 +4235,13 @@ class LayerRoughness(ISampleNode):
         r"""validate(LayerRoughness self) -> std::string"""
         return _libBornAgainSample.LayerRoughness_validate(self)
 
-    def setRoughnessModel(self, roughnessModel):
-        r"""setRoughnessModel(LayerRoughness self, RoughnessModel roughnessModel)"""
-        return _libBornAgainSample.LayerRoughness_setRoughnessModel(self, roughnessModel)
+    def setInterlayerModel(self, interlayerModel):
+        r"""setInterlayerModel(LayerRoughness self, InterlayerModel interlayerModel)"""
+        return _libBornAgainSample.LayerRoughness_setInterlayerModel(self, interlayerModel)
 
-    def roughnessModel(self):
-        r"""roughnessModel(LayerRoughness self) -> RoughnessModel"""
-        return _libBornAgainSample.LayerRoughness_roughnessModel(self)
+    def interlayerModel(self):
+        r"""interlayerModel(LayerRoughness self) -> InterlayerModel"""
+        return _libBornAgainSample.LayerRoughness_interlayerModel(self)
     __swig_destroy__ = _libBornAgainSample.delete_LayerRoughness
 
 # Register LayerRoughness in _libBornAgainSample:
@@ -4341,8 +4341,8 @@ class MultiLayer(ISampleNode):
 
 # Register MultiLayer in _libBornAgainSample:
 _libBornAgainSample.MultiLayer_swigregister(MultiLayer)
-class RoughnessModel(libBornAgainBase.ICloneable, libBornAgainParam.INode):
-    r"""Proxy of C++ RoughnessModel class."""
+class InterlayerModel(libBornAgainBase.ICloneable, libBornAgainParam.INode):
+    r"""Proxy of C++ InterlayerModel class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
 
@@ -4351,90 +4351,90 @@ class RoughnessModel(libBornAgainBase.ICloneable, libBornAgainParam.INode):
     __repr__ = _swig_repr
 
     def clone(self):
-        r"""clone(RoughnessModel self) -> RoughnessModel"""
-        return _libBornAgainSample.RoughnessModel_clone(self)
+        r"""clone(InterlayerModel self) -> InterlayerModel"""
+        return _libBornAgainSample.InterlayerModel_clone(self)
 
     def transient(self, x, sigma):
-        r"""transient(RoughnessModel self, double x, double sigma) -> double"""
-        return _libBornAgainSample.RoughnessModel_transient(self, x, sigma)
+        r"""transient(InterlayerModel self, double x, double sigma) -> double"""
+        return _libBornAgainSample.InterlayerModel_transient(self, x, sigma)
 
     def distribution(self, x, sigma):
-        r"""distribution(RoughnessModel self, double x, double sigma) -> double"""
-        return _libBornAgainSample.RoughnessModel_distribution(self, x, sigma)
+        r"""distribution(InterlayerModel self, double x, double sigma) -> double"""
+        return _libBornAgainSample.InterlayerModel_distribution(self, x, sigma)
 
     def sigmaRange(self):
-        r"""sigmaRange(RoughnessModel self) -> double"""
-        return _libBornAgainSample.RoughnessModel_sigmaRange(self)
-    __swig_destroy__ = _libBornAgainSample.delete_RoughnessModel
+        r"""sigmaRange(InterlayerModel self) -> double"""
+        return _libBornAgainSample.InterlayerModel_sigmaRange(self)
+    __swig_destroy__ = _libBornAgainSample.delete_InterlayerModel
 
-# Register RoughnessModel in _libBornAgainSample:
-_libBornAgainSample.RoughnessModel_swigregister(RoughnessModel)
-class ErfRoughness(RoughnessModel):
-    r"""Proxy of C++ ErfRoughness class."""
+# Register InterlayerModel in _libBornAgainSample:
+_libBornAgainSample.InterlayerModel_swigregister(InterlayerModel)
+class ErfInterlayer(InterlayerModel):
+    r"""Proxy of C++ ErfInterlayer class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
     def __init__(self):
-        r"""__init__(ErfRoughness self) -> ErfRoughness"""
-        _libBornAgainSample.ErfRoughness_swiginit(self, _libBornAgainSample.new_ErfRoughness())
+        r"""__init__(ErfInterlayer self) -> ErfInterlayer"""
+        _libBornAgainSample.ErfInterlayer_swiginit(self, _libBornAgainSample.new_ErfInterlayer())
 
     def transient(self, x, sigma):
-        r"""transient(ErfRoughness self, double x, double sigma) -> double"""
-        return _libBornAgainSample.ErfRoughness_transient(self, x, sigma)
+        r"""transient(ErfInterlayer self, double x, double sigma) -> double"""
+        return _libBornAgainSample.ErfInterlayer_transient(self, x, sigma)
 
     def distribution(self, x, sigma):
-        r"""distribution(ErfRoughness self, double x, double sigma) -> double"""
-        return _libBornAgainSample.ErfRoughness_distribution(self, x, sigma)
+        r"""distribution(ErfInterlayer self, double x, double sigma) -> double"""
+        return _libBornAgainSample.ErfInterlayer_distribution(self, x, sigma)
 
     def sigmaRange(self):
-        r"""sigmaRange(ErfRoughness self) -> double"""
-        return _libBornAgainSample.ErfRoughness_sigmaRange(self)
+        r"""sigmaRange(ErfInterlayer self) -> double"""
+        return _libBornAgainSample.ErfInterlayer_sigmaRange(self)
 
     def clone(self):
-        r"""clone(ErfRoughness self) -> ErfRoughness"""
-        return _libBornAgainSample.ErfRoughness_clone(self)
+        r"""clone(ErfInterlayer self) -> ErfInterlayer"""
+        return _libBornAgainSample.ErfInterlayer_clone(self)
 
     def className(self):
-        r"""className(ErfRoughness self) -> std::string"""
-        return _libBornAgainSample.ErfRoughness_className(self)
-    __swig_destroy__ = _libBornAgainSample.delete_ErfRoughness
+        r"""className(ErfInterlayer self) -> std::string"""
+        return _libBornAgainSample.ErfInterlayer_className(self)
+    __swig_destroy__ = _libBornAgainSample.delete_ErfInterlayer
 
-# Register ErfRoughness in _libBornAgainSample:
-_libBornAgainSample.ErfRoughness_swigregister(ErfRoughness)
-class TanhRoughness(RoughnessModel):
-    r"""Proxy of C++ TanhRoughness class."""
+# Register ErfInterlayer in _libBornAgainSample:
+_libBornAgainSample.ErfInterlayer_swigregister(ErfInterlayer)
+class TanhInterlayer(InterlayerModel):
+    r"""Proxy of C++ TanhInterlayer class."""
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
     def __init__(self):
-        r"""__init__(TanhRoughness self) -> TanhRoughness"""
-        _libBornAgainSample.TanhRoughness_swiginit(self, _libBornAgainSample.new_TanhRoughness())
+        r"""__init__(TanhInterlayer self) -> TanhInterlayer"""
+        _libBornAgainSample.TanhInterlayer_swiginit(self, _libBornAgainSample.new_TanhInterlayer())
 
     def transient(self, x, sigma):
-        r"""transient(TanhRoughness self, double x, double sigma) -> double"""
-        return _libBornAgainSample.TanhRoughness_transient(self, x, sigma)
+        r"""transient(TanhInterlayer self, double x, double sigma) -> double"""
+        return _libBornAgainSample.TanhInterlayer_transient(self, x, sigma)
 
     def distribution(self, x, sigma):
-        r"""distribution(TanhRoughness self, double x, double sigma) -> double"""
-        return _libBornAgainSample.TanhRoughness_distribution(self, x, sigma)
+        r"""distribution(TanhInterlayer self, double x, double sigma) -> double"""
+        return _libBornAgainSample.TanhInterlayer_distribution(self, x, sigma)
 
     def sigmaRange(self):
-        r"""sigmaRange(TanhRoughness self) -> double"""
-        return _libBornAgainSample.TanhRoughness_sigmaRange(self)
+        r"""sigmaRange(TanhInterlayer self) -> double"""
+        return _libBornAgainSample.TanhInterlayer_sigmaRange(self)
 
     def clone(self):
-        r"""clone(TanhRoughness self) -> TanhRoughness"""
-        return _libBornAgainSample.TanhRoughness_clone(self)
+        r"""clone(TanhInterlayer self) -> TanhInterlayer"""
+        return _libBornAgainSample.TanhInterlayer_clone(self)
 
     def className(self):
-        r"""className(TanhRoughness self) -> std::string"""
-        return _libBornAgainSample.TanhRoughness_className(self)
-    __swig_destroy__ = _libBornAgainSample.delete_TanhRoughness
+        r"""className(TanhInterlayer self) -> std::string"""
+        return _libBornAgainSample.TanhInterlayer_className(self)
+    __swig_destroy__ = _libBornAgainSample.delete_TanhInterlayer
 
-# Register TanhRoughness in _libBornAgainSample:
-_libBornAgainSample.TanhRoughness_swigregister(TanhRoughness)
+# Register TanhInterlayer in _libBornAgainSample:
+_libBornAgainSample.TanhInterlayer_swigregister(TanhInterlayer)
 class IFormfactorPolyhedron(IFormfactor):
     r"""Proxy of C++ IFormfactorPolyhedron class."""
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index ac4058afedf..e5acef4f63c 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -3661,7 +3661,7 @@ namespace Swig {
 #define SWIGTYPE_p_Cylinder swig_types[13]
 #define SWIGTYPE_p_Dodecahedron swig_types[14]
 #define SWIGTYPE_p_EllipsoidalCylinder swig_types[15]
-#define SWIGTYPE_p_ErfRoughness swig_types[16]
+#define SWIGTYPE_p_ErfInterlayer swig_types[16]
 #define SWIGTYPE_p_FuzzySphere swig_types[17]
 #define SWIGTYPE_p_GaussFisherPeakShape swig_types[18]
 #define SWIGTYPE_p_GaussSphere swig_types[19]
@@ -3696,51 +3696,51 @@ namespace Swig {
 #define SWIGTYPE_p_InterferenceHardDisk swig_types[48]
 #define SWIGTYPE_p_InterferenceNone swig_types[49]
 #define SWIGTYPE_p_InterferenceRadialParacrystal swig_types[50]
-#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[51]
-#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[52]
-#define SWIGTYPE_p_Lattice2D swig_types[53]
-#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[54]
-#define SWIGTYPE_p_Lattice3D swig_types[55]
-#define SWIGTYPE_p_Layer swig_types[56]
-#define SWIGTYPE_p_LayerRoughness swig_types[57]
-#define SWIGTYPE_p_LongBoxGauss swig_types[58]
-#define SWIGTYPE_p_LongBoxLorentz swig_types[59]
-#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[60]
-#define SWIGTYPE_p_Material swig_types[61]
-#define SWIGTYPE_p_MaterialBySLDImpl swig_types[62]
-#define SWIGTYPE_p_Mesocrystal swig_types[63]
-#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[64]
-#define SWIGTYPE_p_MisesGaussPeakShape swig_types[65]
-#define SWIGTYPE_p_MultiLayer swig_types[66]
-#define SWIGTYPE_p_Particle swig_types[67]
-#define SWIGTYPE_p_ParticleLayout swig_types[68]
-#define SWIGTYPE_p_PlatonicOctahedron swig_types[69]
-#define SWIGTYPE_p_PlatonicTetrahedron swig_types[70]
-#define SWIGTYPE_p_Prism3 swig_types[71]
-#define SWIGTYPE_p_Prism6 swig_types[72]
-#define SWIGTYPE_p_Profile1DCauchy swig_types[73]
-#define SWIGTYPE_p_Profile1DCosine swig_types[74]
-#define SWIGTYPE_p_Profile1DGate swig_types[75]
-#define SWIGTYPE_p_Profile1DGauss swig_types[76]
-#define SWIGTYPE_p_Profile1DTriangle swig_types[77]
-#define SWIGTYPE_p_Profile1DVoigt swig_types[78]
-#define SWIGTYPE_p_Profile2DCauchy swig_types[79]
-#define SWIGTYPE_p_Profile2DCone swig_types[80]
-#define SWIGTYPE_p_Profile2DGate swig_types[81]
-#define SWIGTYPE_p_Profile2DGauss swig_types[82]
-#define SWIGTYPE_p_Profile2DVoigt swig_types[83]
-#define SWIGTYPE_p_Pyramid2 swig_types[84]
-#define SWIGTYPE_p_Pyramid3 swig_types[85]
-#define SWIGTYPE_p_Pyramid4 swig_types[86]
-#define SWIGTYPE_p_Pyramid6 swig_types[87]
-#define SWIGTYPE_p_RefractiveMaterialImpl swig_types[88]
-#define SWIGTYPE_p_Rotation3DT_double_t swig_types[89]
-#define SWIGTYPE_p_RotationEuler swig_types[90]
-#define SWIGTYPE_p_RotationX swig_types[91]
-#define SWIGTYPE_p_RotationY swig_types[92]
-#define SWIGTYPE_p_RotationZ swig_types[93]
-#define SWIGTYPE_p_RoughnessMap swig_types[94]
-#define SWIGTYPE_p_RoughnessModel swig_types[95]
+#define SWIGTYPE_p_InterlayerModel swig_types[51]
+#define SWIGTYPE_p_IsotropicGaussPeakShape swig_types[52]
+#define SWIGTYPE_p_IsotropicLorentzPeakShape swig_types[53]
+#define SWIGTYPE_p_Lattice2D swig_types[54]
+#define SWIGTYPE_p_Lattice2D__ReciprocalBases swig_types[55]
+#define SWIGTYPE_p_Lattice3D swig_types[56]
+#define SWIGTYPE_p_Layer swig_types[57]
+#define SWIGTYPE_p_LayerRoughness swig_types[58]
+#define SWIGTYPE_p_LongBoxGauss swig_types[59]
+#define SWIGTYPE_p_LongBoxLorentz swig_types[60]
+#define SWIGTYPE_p_LorentzFisherPeakShape swig_types[61]
+#define SWIGTYPE_p_Material swig_types[62]
+#define SWIGTYPE_p_MaterialBySLDImpl swig_types[63]
+#define SWIGTYPE_p_Mesocrystal swig_types[64]
+#define SWIGTYPE_p_MisesFisherGaussPeakShape swig_types[65]
+#define SWIGTYPE_p_MisesGaussPeakShape swig_types[66]
+#define SWIGTYPE_p_MultiLayer swig_types[67]
+#define SWIGTYPE_p_Particle swig_types[68]
+#define SWIGTYPE_p_ParticleLayout swig_types[69]
+#define SWIGTYPE_p_PlatonicOctahedron swig_types[70]
+#define SWIGTYPE_p_PlatonicTetrahedron swig_types[71]
+#define SWIGTYPE_p_Prism3 swig_types[72]
+#define SWIGTYPE_p_Prism6 swig_types[73]
+#define SWIGTYPE_p_Profile1DCauchy swig_types[74]
+#define SWIGTYPE_p_Profile1DCosine swig_types[75]
+#define SWIGTYPE_p_Profile1DGate swig_types[76]
+#define SWIGTYPE_p_Profile1DGauss swig_types[77]
+#define SWIGTYPE_p_Profile1DTriangle swig_types[78]
+#define SWIGTYPE_p_Profile1DVoigt swig_types[79]
+#define SWIGTYPE_p_Profile2DCauchy swig_types[80]
+#define SWIGTYPE_p_Profile2DCone swig_types[81]
+#define SWIGTYPE_p_Profile2DGate swig_types[82]
+#define SWIGTYPE_p_Profile2DGauss swig_types[83]
+#define SWIGTYPE_p_Profile2DVoigt swig_types[84]
+#define SWIGTYPE_p_Pyramid2 swig_types[85]
+#define SWIGTYPE_p_Pyramid3 swig_types[86]
+#define SWIGTYPE_p_Pyramid4 swig_types[87]
+#define SWIGTYPE_p_Pyramid6 swig_types[88]
+#define SWIGTYPE_p_RefractiveMaterialImpl swig_types[89]
+#define SWIGTYPE_p_Rotation3DT_double_t swig_types[90]
+#define SWIGTYPE_p_RotationEuler swig_types[91]
+#define SWIGTYPE_p_RotationX swig_types[92]
+#define SWIGTYPE_p_RotationY swig_types[93]
+#define SWIGTYPE_p_RotationZ swig_types[94]
+#define SWIGTYPE_p_RoughnessMap swig_types[95]
 #define SWIGTYPE_p_SawtoothRippleBox swig_types[96]
 #define SWIGTYPE_p_SawtoothRippleGauss swig_types[97]
 #define SWIGTYPE_p_SawtoothRippleLorentz swig_types[98]
@@ -3750,7 +3750,7 @@ namespace Swig {
 #define SWIGTYPE_p_Spheroid swig_types[102]
 #define SWIGTYPE_p_SpinMatrix swig_types[103]
 #define SWIGTYPE_p_SquareLattice2D swig_types[104]
-#define SWIGTYPE_p_TanhRoughness swig_types[105]
+#define SWIGTYPE_p_TanhInterlayer swig_types[105]
 #define SWIGTYPE_p_TruncatedCube swig_types[106]
 #define SWIGTYPE_p_TruncatedSphere swig_types[107]
 #define SWIGTYPE_p_TruncatedSpheroid swig_types[108]
@@ -50497,7 +50497,7 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_0(PyObject *self, Py_ssize_t
   double arg1 ;
   double arg2 ;
   double arg3 ;
-  RoughnessModel *arg4 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg4 = (InterlayerModel *) 0 ;
   double val1 ;
   int ecode1 = 0 ;
   double val2 ;
@@ -50525,14 +50525,14 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_0(PyObject *self, Py_ssize_t
     SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_LayerRoughness" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  res4 = SWIG_ConvertPtr(swig_obj[3], &argp4,SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  res4 = SWIG_ConvertPtr(swig_obj[3], &argp4,SWIGTYPE_p_InterlayerModel, 0 |  0 );
   if (!SWIG_IsOK(res4)) {
-    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_LayerRoughness" "', argument " "4"" of type '" "RoughnessModel const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "new_LayerRoughness" "', argument " "4"" of type '" "InterlayerModel const *""'"); 
   }
-  arg4 = reinterpret_cast< RoughnessModel * >(argp4);
+  arg4 = reinterpret_cast< InterlayerModel * >(argp4);
   {
     try {
-      result = (LayerRoughness *)new LayerRoughness(arg1,arg2,arg3,(RoughnessModel const *)arg4);
+      result = (LayerRoughness *)new LayerRoughness(arg1,arg2,arg3,(InterlayerModel const *)arg4);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -50671,7 +50671,7 @@ fail:
 SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_4(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   double arg1 ;
-  RoughnessModel *arg2 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg2 = (InterlayerModel *) 0 ;
   double val1 ;
   int ecode1 = 0 ;
   void *argp2 = 0 ;
@@ -50685,14 +50685,14 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness__SWIG_4(PyObject *self, Py_ssize_t
     SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_LayerRoughness" "', argument " "1"" of type '" "double""'");
   } 
   arg1 = static_cast< double >(val1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_InterlayerModel, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_LayerRoughness" "', argument " "2"" of type '" "RoughnessModel const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_LayerRoughness" "', argument " "2"" of type '" "InterlayerModel const *""'"); 
   }
-  arg2 = reinterpret_cast< RoughnessModel * >(argp2);
+  arg2 = reinterpret_cast< InterlayerModel * >(argp2);
   {
     try {
-      result = (LayerRoughness *)new LayerRoughness(arg1,(RoughnessModel const *)arg2);
+      result = (LayerRoughness *)new LayerRoughness(arg1,(InterlayerModel const *)arg2);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -50761,7 +50761,7 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
     }
     if (_v) {
       void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_RoughnessModel, 0);
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_InterlayerModel, 0);
       _v = SWIG_CheckState(res);
       if (_v) {
         return _wrap_new_LayerRoughness__SWIG_4(self, argc, argv);
@@ -50824,7 +50824,7 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
         }
         if (_v) {
           void *vptr = 0;
-          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_RoughnessModel, 0);
+          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_InterlayerModel, 0);
           _v = SWIG_CheckState(res);
           if (_v) {
             return _wrap_new_LayerRoughness__SWIG_0(self, argc, argv);
@@ -50837,11 +50837,11 @@ SWIGINTERN PyObject *_wrap_new_LayerRoughness(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_LayerRoughness'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    LayerRoughness::LayerRoughness(double,double,double,RoughnessModel const *)\n"
+    "    LayerRoughness::LayerRoughness(double,double,double,InterlayerModel const *)\n"
     "    LayerRoughness::LayerRoughness(double,double,double)\n"
     "    LayerRoughness::LayerRoughness(double,double)\n"
     "    LayerRoughness::LayerRoughness(double)\n"
-    "    LayerRoughness::LayerRoughness(double,RoughnessModel const *)\n"
+    "    LayerRoughness::LayerRoughness(double,InterlayerModel const *)\n"
     "    LayerRoughness::LayerRoughness()\n");
   return 0;
 }
@@ -51337,10 +51337,10 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_LayerRoughness_setRoughnessModel(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_LayerRoughness_setInterlayerModel(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   LayerRoughness *arg1 = (LayerRoughness *) 0 ;
-  RoughnessModel *arg2 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg2 = (InterlayerModel *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   void *argp2 = 0 ;
@@ -51348,20 +51348,20 @@ SWIGINTERN PyObject *_wrap_LayerRoughness_setRoughnessModel(PyObject *self, PyOb
   PyObject *swig_obj[2] ;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setRoughnessModel", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "LayerRoughness_setInterlayerModel", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setRoughnessModel" "', argument " "1"" of type '" "LayerRoughness *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_setInterlayerModel" "', argument " "1"" of type '" "LayerRoughness *""'"); 
   }
   arg1 = reinterpret_cast< LayerRoughness * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_InterlayerModel, 0 |  0 );
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_setRoughnessModel" "', argument " "2"" of type '" "RoughnessModel const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "LayerRoughness_setInterlayerModel" "', argument " "2"" of type '" "InterlayerModel const *""'"); 
   }
-  arg2 = reinterpret_cast< RoughnessModel * >(argp2);
+  arg2 = reinterpret_cast< InterlayerModel * >(argp2);
   {
     try {
-      (arg1)->setRoughnessModel((RoughnessModel const *)arg2);
+      (arg1)->setInterlayerModel((InterlayerModel const *)arg2);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -51377,25 +51377,25 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_LayerRoughness_roughnessModel(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_LayerRoughness_interlayerModel(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   LayerRoughness *arg1 = (LayerRoughness *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  RoughnessModel *result = 0 ;
+  InterlayerModel *result = 0 ;
   
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_LayerRoughness, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_roughnessModel" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "LayerRoughness_interlayerModel" "', argument " "1"" of type '" "LayerRoughness const *""'"); 
   }
   arg1 = reinterpret_cast< LayerRoughness * >(argp1);
   {
     try {
-      result = (RoughnessModel *)((LayerRoughness const *)arg1)->roughnessModel();
+      result = (InterlayerModel *)((LayerRoughness const *)arg1)->interlayerModel();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -51404,7 +51404,7 @@ SWIGINTERN PyObject *_wrap_LayerRoughness_roughnessModel(PyObject *self, PyObjec
       SWIG_exception(SWIG_RuntimeError, msg.c_str());
     }
   }
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterlayerModel, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -52508,25 +52508,25 @@ SWIGINTERN PyObject *MultiLayer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObjec
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_RoughnessModel_clone(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_InterlayerModel_clone(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  RoughnessModel *arg1 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg1 = (InterlayerModel *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  RoughnessModel *result = 0 ;
+  InterlayerModel *result = 0 ;
   
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_InterlayerModel, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RoughnessModel_clone" "', argument " "1"" of type '" "RoughnessModel const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterlayerModel_clone" "', argument " "1"" of type '" "InterlayerModel const *""'"); 
   }
-  arg1 = reinterpret_cast< RoughnessModel * >(argp1);
+  arg1 = reinterpret_cast< InterlayerModel * >(argp1);
   {
     try {
-      result = (RoughnessModel *)((RoughnessModel const *)arg1)->clone();
+      result = (InterlayerModel *)((InterlayerModel const *)arg1)->clone();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52535,16 +52535,16 @@ SWIGINTERN PyObject *_wrap_RoughnessModel_clone(PyObject *self, PyObject *args)
       SWIG_exception(SWIG_RuntimeError, msg.c_str());
     }
   }
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterlayerModel, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_RoughnessModel_transient(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_InterlayerModel_transient(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  RoughnessModel *arg1 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg1 = (InterlayerModel *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -52557,25 +52557,25 @@ SWIGINTERN PyObject *_wrap_RoughnessModel_transient(PyObject *self, PyObject *ar
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "RoughnessModel_transient", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "InterlayerModel_transient", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_InterlayerModel, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RoughnessModel_transient" "', argument " "1"" of type '" "RoughnessModel const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterlayerModel_transient" "', argument " "1"" of type '" "InterlayerModel const *""'"); 
   }
-  arg1 = reinterpret_cast< RoughnessModel * >(argp1);
+  arg1 = reinterpret_cast< InterlayerModel * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RoughnessModel_transient" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterlayerModel_transient" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RoughnessModel_transient" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "InterlayerModel_transient" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   {
     try {
-      result = (double)((RoughnessModel const *)arg1)->transient(arg2,arg3);
+      result = (double)((InterlayerModel const *)arg1)->transient(arg2,arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52591,9 +52591,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_RoughnessModel_distribution(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_InterlayerModel_distribution(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  RoughnessModel *arg1 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg1 = (InterlayerModel *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -52606,25 +52606,25 @@ SWIGINTERN PyObject *_wrap_RoughnessModel_distribution(PyObject *self, PyObject
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "RoughnessModel_distribution", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "InterlayerModel_distribution", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_InterlayerModel, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RoughnessModel_distribution" "', argument " "1"" of type '" "RoughnessModel const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterlayerModel_distribution" "', argument " "1"" of type '" "InterlayerModel const *""'"); 
   }
-  arg1 = reinterpret_cast< RoughnessModel * >(argp1);
+  arg1 = reinterpret_cast< InterlayerModel * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "RoughnessModel_distribution" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterlayerModel_distribution" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RoughnessModel_distribution" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "InterlayerModel_distribution" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   {
     try {
-      result = (double)((RoughnessModel const *)arg1)->distribution(arg2,arg3);
+      result = (double)((InterlayerModel const *)arg1)->distribution(arg2,arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52640,9 +52640,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_RoughnessModel_sigmaRange(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_InterlayerModel_sigmaRange(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  RoughnessModel *arg1 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg1 = (InterlayerModel *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -52651,14 +52651,14 @@ SWIGINTERN PyObject *_wrap_RoughnessModel_sigmaRange(PyObject *self, PyObject *a
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RoughnessModel, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_InterlayerModel, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RoughnessModel_sigmaRange" "', argument " "1"" of type '" "RoughnessModel const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "InterlayerModel_sigmaRange" "', argument " "1"" of type '" "InterlayerModel const *""'"); 
   }
-  arg1 = reinterpret_cast< RoughnessModel * >(argp1);
+  arg1 = reinterpret_cast< InterlayerModel * >(argp1);
   {
     try {
-      result = (double)((RoughnessModel const *)arg1)->sigmaRange();
+      result = (double)((InterlayerModel const *)arg1)->sigmaRange();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52674,9 +52674,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_RoughnessModel(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_InterlayerModel(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  RoughnessModel *arg1 = (RoughnessModel *) 0 ;
+  InterlayerModel *arg1 = (InterlayerModel *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -52684,11 +52684,11 @@ SWIGINTERN PyObject *_wrap_delete_RoughnessModel(PyObject *self, PyObject *args)
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RoughnessModel, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_InterlayerModel, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_RoughnessModel" "', argument " "1"" of type '" "RoughnessModel *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_InterlayerModel" "', argument " "1"" of type '" "InterlayerModel *""'"); 
   }
-  arg1 = reinterpret_cast< RoughnessModel * >(argp1);
+  arg1 = reinterpret_cast< InterlayerModel * >(argp1);
   {
     try {
       delete arg1;
@@ -52707,22 +52707,22 @@ fail:
 }
 
 
-SWIGINTERN PyObject *RoughnessModel_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *InterlayerModel_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_RoughnessModel, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_InterlayerModel, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *_wrap_new_ErfRoughness(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_ErfInterlayer(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  ErfRoughness *result = 0 ;
+  ErfInterlayer *result = 0 ;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "new_ErfRoughness", 0, 0, 0)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_ErfInterlayer", 0, 0, 0)) SWIG_fail;
   {
     try {
-      result = (ErfRoughness *)new ErfRoughness();
+      result = (ErfInterlayer *)new ErfInterlayer();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52731,16 +52731,16 @@ SWIGINTERN PyObject *_wrap_new_ErfRoughness(PyObject *self, PyObject *args) {
       SWIG_exception(SWIG_RuntimeError, msg.c_str());
     }
   }
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ErfRoughness, SWIG_POINTER_NEW |  0 );
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ErfInterlayer, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_ErfRoughness_transient(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_ErfInterlayer_transient(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  ErfRoughness *arg1 = (ErfRoughness *) 0 ;
+  ErfInterlayer *arg1 = (ErfInterlayer *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -52753,25 +52753,25 @@ SWIGINTERN PyObject *_wrap_ErfRoughness_transient(PyObject *self, PyObject *args
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "ErfRoughness_transient", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfRoughness, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "ErfInterlayer_transient", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfRoughness_transient" "', argument " "1"" of type '" "ErfRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfInterlayer_transient" "', argument " "1"" of type '" "ErfInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< ErfRoughness * >(argp1);
+  arg1 = reinterpret_cast< ErfInterlayer * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ErfRoughness_transient" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ErfInterlayer_transient" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ErfRoughness_transient" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ErfInterlayer_transient" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   {
     try {
-      result = (double)((ErfRoughness const *)arg1)->transient(arg2,arg3);
+      result = (double)((ErfInterlayer const *)arg1)->transient(arg2,arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52787,9 +52787,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_ErfRoughness_distribution(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_ErfInterlayer_distribution(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  ErfRoughness *arg1 = (ErfRoughness *) 0 ;
+  ErfInterlayer *arg1 = (ErfInterlayer *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -52802,25 +52802,25 @@ SWIGINTERN PyObject *_wrap_ErfRoughness_distribution(PyObject *self, PyObject *a
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "ErfRoughness_distribution", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfRoughness, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "ErfInterlayer_distribution", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfRoughness_distribution" "', argument " "1"" of type '" "ErfRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfInterlayer_distribution" "', argument " "1"" of type '" "ErfInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< ErfRoughness * >(argp1);
+  arg1 = reinterpret_cast< ErfInterlayer * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ErfRoughness_distribution" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ErfInterlayer_distribution" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ErfRoughness_distribution" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "ErfInterlayer_distribution" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   {
     try {
-      result = (double)((ErfRoughness const *)arg1)->distribution(arg2,arg3);
+      result = (double)((ErfInterlayer const *)arg1)->distribution(arg2,arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52836,9 +52836,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_ErfRoughness_sigmaRange(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_ErfInterlayer_sigmaRange(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  ErfRoughness *arg1 = (ErfRoughness *) 0 ;
+  ErfInterlayer *arg1 = (ErfInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -52847,14 +52847,14 @@ SWIGINTERN PyObject *_wrap_ErfRoughness_sigmaRange(PyObject *self, PyObject *arg
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfRoughness, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfRoughness_sigmaRange" "', argument " "1"" of type '" "ErfRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfInterlayer_sigmaRange" "', argument " "1"" of type '" "ErfInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< ErfRoughness * >(argp1);
+  arg1 = reinterpret_cast< ErfInterlayer * >(argp1);
   {
     try {
-      result = (double)((ErfRoughness const *)arg1)->sigmaRange();
+      result = (double)((ErfInterlayer const *)arg1)->sigmaRange();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52870,25 +52870,25 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_ErfRoughness_clone(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_ErfInterlayer_clone(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  ErfRoughness *arg1 = (ErfRoughness *) 0 ;
+  ErfInterlayer *arg1 = (ErfInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  ErfRoughness *result = 0 ;
+  ErfInterlayer *result = 0 ;
   
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfRoughness, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfRoughness_clone" "', argument " "1"" of type '" "ErfRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfInterlayer_clone" "', argument " "1"" of type '" "ErfInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< ErfRoughness * >(argp1);
+  arg1 = reinterpret_cast< ErfInterlayer * >(argp1);
   {
     try {
-      result = (ErfRoughness *)((ErfRoughness const *)arg1)->clone();
+      result = (ErfInterlayer *)((ErfInterlayer const *)arg1)->clone();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52897,16 +52897,16 @@ SWIGINTERN PyObject *_wrap_ErfRoughness_clone(PyObject *self, PyObject *args) {
       SWIG_exception(SWIG_RuntimeError, msg.c_str());
     }
   }
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ErfRoughness, 0 |  0 );
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ErfInterlayer, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_ErfRoughness_className(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_ErfInterlayer_className(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  ErfRoughness *arg1 = (ErfRoughness *) 0 ;
+  ErfInterlayer *arg1 = (ErfInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -52915,14 +52915,14 @@ SWIGINTERN PyObject *_wrap_ErfRoughness_className(PyObject *self, PyObject *args
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfRoughness, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfRoughness_className" "', argument " "1"" of type '" "ErfRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ErfInterlayer_className" "', argument " "1"" of type '" "ErfInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< ErfRoughness * >(argp1);
+  arg1 = reinterpret_cast< ErfInterlayer * >(argp1);
   {
     try {
-      result = ((ErfRoughness const *)arg1)->className();
+      result = ((ErfInterlayer const *)arg1)->className();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52938,9 +52938,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_ErfRoughness(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_ErfInterlayer(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  ErfRoughness *arg1 = (ErfRoughness *) 0 ;
+  ErfInterlayer *arg1 = (ErfInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -52948,11 +52948,11 @@ SWIGINTERN PyObject *_wrap_delete_ErfRoughness(PyObject *self, PyObject *args) {
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfRoughness, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ErfInterlayer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ErfRoughness" "', argument " "1"" of type '" "ErfRoughness *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ErfInterlayer" "', argument " "1"" of type '" "ErfInterlayer *""'"); 
   }
-  arg1 = reinterpret_cast< ErfRoughness * >(argp1);
+  arg1 = reinterpret_cast< ErfInterlayer * >(argp1);
   {
     try {
       delete arg1;
@@ -52971,26 +52971,26 @@ fail:
 }
 
 
-SWIGINTERN PyObject *ErfRoughness_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *ErfInterlayer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_ErfRoughness, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_ErfInterlayer, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *ErfRoughness_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *ErfInterlayer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_TanhRoughness(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_TanhInterlayer(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  TanhRoughness *result = 0 ;
+  TanhInterlayer *result = 0 ;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "new_TanhRoughness", 0, 0, 0)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "new_TanhInterlayer", 0, 0, 0)) SWIG_fail;
   {
     try {
-      result = (TanhRoughness *)new TanhRoughness();
+      result = (TanhInterlayer *)new TanhInterlayer();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52999,16 +52999,16 @@ SWIGINTERN PyObject *_wrap_new_TanhRoughness(PyObject *self, PyObject *args) {
       SWIG_exception(SWIG_RuntimeError, msg.c_str());
     }
   }
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_TanhRoughness, SWIG_POINTER_NEW |  0 );
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_TanhInterlayer, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_TanhRoughness_transient(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_TanhInterlayer_transient(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  TanhRoughness *arg1 = (TanhRoughness *) 0 ;
+  TanhInterlayer *arg1 = (TanhInterlayer *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -53021,25 +53021,25 @@ SWIGINTERN PyObject *_wrap_TanhRoughness_transient(PyObject *self, PyObject *arg
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "TanhRoughness_transient", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhRoughness, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "TanhInterlayer_transient", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhRoughness_transient" "', argument " "1"" of type '" "TanhRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhInterlayer_transient" "', argument " "1"" of type '" "TanhInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< TanhRoughness * >(argp1);
+  arg1 = reinterpret_cast< TanhInterlayer * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TanhRoughness_transient" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TanhInterlayer_transient" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "TanhRoughness_transient" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "TanhInterlayer_transient" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   {
     try {
-      result = (double)((TanhRoughness const *)arg1)->transient(arg2,arg3);
+      result = (double)((TanhInterlayer const *)arg1)->transient(arg2,arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -53055,9 +53055,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_TanhRoughness_distribution(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_TanhInterlayer_distribution(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  TanhRoughness *arg1 = (TanhRoughness *) 0 ;
+  TanhInterlayer *arg1 = (TanhInterlayer *) 0 ;
   double arg2 ;
   double arg3 ;
   void *argp1 = 0 ;
@@ -53070,25 +53070,25 @@ SWIGINTERN PyObject *_wrap_TanhRoughness_distribution(PyObject *self, PyObject *
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "TanhRoughness_distribution", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhRoughness, 0 |  0 );
+  if (!SWIG_Python_UnpackTuple(args, "TanhInterlayer_distribution", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhRoughness_distribution" "', argument " "1"" of type '" "TanhRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhInterlayer_distribution" "', argument " "1"" of type '" "TanhInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< TanhRoughness * >(argp1);
+  arg1 = reinterpret_cast< TanhInterlayer * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TanhRoughness_distribution" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TanhInterlayer_distribution" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "TanhRoughness_distribution" "', argument " "3"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "TanhInterlayer_distribution" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
   {
     try {
-      result = (double)((TanhRoughness const *)arg1)->distribution(arg2,arg3);
+      result = (double)((TanhInterlayer const *)arg1)->distribution(arg2,arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -53104,9 +53104,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_TanhRoughness_sigmaRange(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_TanhInterlayer_sigmaRange(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  TanhRoughness *arg1 = (TanhRoughness *) 0 ;
+  TanhInterlayer *arg1 = (TanhInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -53115,14 +53115,14 @@ SWIGINTERN PyObject *_wrap_TanhRoughness_sigmaRange(PyObject *self, PyObject *ar
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhRoughness, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhRoughness_sigmaRange" "', argument " "1"" of type '" "TanhRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhInterlayer_sigmaRange" "', argument " "1"" of type '" "TanhInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< TanhRoughness * >(argp1);
+  arg1 = reinterpret_cast< TanhInterlayer * >(argp1);
   {
     try {
-      result = (double)((TanhRoughness const *)arg1)->sigmaRange();
+      result = (double)((TanhInterlayer const *)arg1)->sigmaRange();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -53138,25 +53138,25 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_TanhRoughness_clone(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_TanhInterlayer_clone(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  TanhRoughness *arg1 = (TanhRoughness *) 0 ;
+  TanhInterlayer *arg1 = (TanhInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  TanhRoughness *result = 0 ;
+  TanhInterlayer *result = 0 ;
   
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhRoughness, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhRoughness_clone" "', argument " "1"" of type '" "TanhRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhInterlayer_clone" "', argument " "1"" of type '" "TanhInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< TanhRoughness * >(argp1);
+  arg1 = reinterpret_cast< TanhInterlayer * >(argp1);
   {
     try {
-      result = (TanhRoughness *)((TanhRoughness const *)arg1)->clone();
+      result = (TanhInterlayer *)((TanhInterlayer const *)arg1)->clone();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -53165,16 +53165,16 @@ SWIGINTERN PyObject *_wrap_TanhRoughness_clone(PyObject *self, PyObject *args) {
       SWIG_exception(SWIG_RuntimeError, msg.c_str());
     }
   }
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_TanhRoughness, 0 |  0 );
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_TanhInterlayer, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_TanhRoughness_className(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_TanhInterlayer_className(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  TanhRoughness *arg1 = (TanhRoughness *) 0 ;
+  TanhInterlayer *arg1 = (TanhInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -53183,14 +53183,14 @@ SWIGINTERN PyObject *_wrap_TanhRoughness_className(PyObject *self, PyObject *arg
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhRoughness, 0 |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhInterlayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhRoughness_className" "', argument " "1"" of type '" "TanhRoughness const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TanhInterlayer_className" "', argument " "1"" of type '" "TanhInterlayer const *""'"); 
   }
-  arg1 = reinterpret_cast< TanhRoughness * >(argp1);
+  arg1 = reinterpret_cast< TanhInterlayer * >(argp1);
   {
     try {
-      result = ((TanhRoughness const *)arg1)->className();
+      result = ((TanhInterlayer const *)arg1)->className();
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -53206,9 +53206,9 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_delete_TanhRoughness(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_TanhInterlayer(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
-  TanhRoughness *arg1 = (TanhRoughness *) 0 ;
+  TanhInterlayer *arg1 = (TanhInterlayer *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
@@ -53216,11 +53216,11 @@ SWIGINTERN PyObject *_wrap_delete_TanhRoughness(PyObject *self, PyObject *args)
   (void)self;
   if (!args) SWIG_fail;
   swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhRoughness, SWIG_POINTER_DISOWN |  0 );
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_TanhInterlayer, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TanhRoughness" "', argument " "1"" of type '" "TanhRoughness *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TanhInterlayer" "', argument " "1"" of type '" "TanhInterlayer *""'"); 
   }
-  arg1 = reinterpret_cast< TanhRoughness * >(argp1);
+  arg1 = reinterpret_cast< TanhInterlayer * >(argp1);
   {
     try {
       delete arg1;
@@ -53239,14 +53239,14 @@ fail:
 }
 
 
-SWIGINTERN PyObject *TanhRoughness_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *TanhInterlayer_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_TanhRoughness, SWIG_NewClientData(obj));
+  SWIG_TypeNewClientData(SWIGTYPE_p_TanhInterlayer, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *TanhRoughness_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *TanhInterlayer_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   return SWIG_Python_InitShadowInstance(args);
 }
 
@@ -73197,8 +73197,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "ParticleLayout_swigregister", ParticleLayout_swigregister, METH_O, NULL},
 	 { "ParticleLayout_swiginit", ParticleLayout_swiginit, METH_VARARGS, NULL},
 	 { "new_LayerRoughness", _wrap_new_LayerRoughness, METH_VARARGS, "\n"
-		"LayerRoughness(double sigma, double hurstParameter=0, double lateralCorrLength=0, RoughnessModel roughnessModel=None)\n"
-		"LayerRoughness(double sigma, RoughnessModel roughnessModel)\n"
+		"LayerRoughness(double sigma, double hurstParameter=0, double lateralCorrLength=0, InterlayerModel interlayerModel=None)\n"
+		"LayerRoughness(double sigma, InterlayerModel interlayerModel)\n"
 		"new_LayerRoughness() -> LayerRoughness\n"
 		""},
 	 { "LayerRoughness_clone", _wrap_LayerRoughness_clone, METH_O, "LayerRoughness_clone(LayerRoughness self) -> LayerRoughness"},
@@ -73214,8 +73214,8 @@ static PyMethodDef SwigMethods[] = {
 	 { "LayerRoughness_setLatteralCorrLength", _wrap_LayerRoughness_setLatteralCorrLength, METH_VARARGS, "LayerRoughness_setLatteralCorrLength(LayerRoughness self, double lateralCorrLength)"},
 	 { "LayerRoughness_lateralCorrLength", _wrap_LayerRoughness_lateralCorrLength, METH_O, "LayerRoughness_lateralCorrLength(LayerRoughness self) -> double"},
 	 { "LayerRoughness_validate", _wrap_LayerRoughness_validate, METH_O, "LayerRoughness_validate(LayerRoughness self) -> std::string"},
-	 { "LayerRoughness_setRoughnessModel", _wrap_LayerRoughness_setRoughnessModel, METH_VARARGS, "LayerRoughness_setRoughnessModel(LayerRoughness self, RoughnessModel roughnessModel)"},
-	 { "LayerRoughness_roughnessModel", _wrap_LayerRoughness_roughnessModel, METH_O, "LayerRoughness_roughnessModel(LayerRoughness self) -> RoughnessModel"},
+	 { "LayerRoughness_setInterlayerModel", _wrap_LayerRoughness_setInterlayerModel, METH_VARARGS, "LayerRoughness_setInterlayerModel(LayerRoughness self, InterlayerModel interlayerModel)"},
+	 { "LayerRoughness_interlayerModel", _wrap_LayerRoughness_interlayerModel, METH_O, "LayerRoughness_interlayerModel(LayerRoughness self) -> InterlayerModel"},
 	 { "delete_LayerRoughness", _wrap_delete_LayerRoughness, METH_O, "delete_LayerRoughness(LayerRoughness self)"},
 	 { "LayerRoughness_swigregister", LayerRoughness_swigregister, METH_O, NULL},
 	 { "LayerRoughness_swiginit", LayerRoughness_swiginit, METH_VARARGS, NULL},
@@ -73245,30 +73245,30 @@ static PyMethodDef SwigMethods[] = {
 	 { "MultiLayer_setName", _wrap_MultiLayer_setName, METH_VARARGS, "MultiLayer_setName(MultiLayer self, std::string const & name)"},
 	 { "MultiLayer_swigregister", MultiLayer_swigregister, METH_O, NULL},
 	 { "MultiLayer_swiginit", MultiLayer_swiginit, METH_VARARGS, NULL},
-	 { "RoughnessModel_clone", _wrap_RoughnessModel_clone, METH_O, "RoughnessModel_clone(RoughnessModel self) -> RoughnessModel"},
-	 { "RoughnessModel_transient", _wrap_RoughnessModel_transient, METH_VARARGS, "RoughnessModel_transient(RoughnessModel self, double x, double sigma) -> double"},
-	 { "RoughnessModel_distribution", _wrap_RoughnessModel_distribution, METH_VARARGS, "RoughnessModel_distribution(RoughnessModel self, double x, double sigma) -> double"},
-	 { "RoughnessModel_sigmaRange", _wrap_RoughnessModel_sigmaRange, METH_O, "RoughnessModel_sigmaRange(RoughnessModel self) -> double"},
-	 { "delete_RoughnessModel", _wrap_delete_RoughnessModel, METH_O, "delete_RoughnessModel(RoughnessModel self)"},
-	 { "RoughnessModel_swigregister", RoughnessModel_swigregister, METH_O, NULL},
-	 { "new_ErfRoughness", _wrap_new_ErfRoughness, METH_NOARGS, "new_ErfRoughness() -> ErfRoughness"},
-	 { "ErfRoughness_transient", _wrap_ErfRoughness_transient, METH_VARARGS, "ErfRoughness_transient(ErfRoughness self, double x, double sigma) -> double"},
-	 { "ErfRoughness_distribution", _wrap_ErfRoughness_distribution, METH_VARARGS, "ErfRoughness_distribution(ErfRoughness self, double x, double sigma) -> double"},
-	 { "ErfRoughness_sigmaRange", _wrap_ErfRoughness_sigmaRange, METH_O, "ErfRoughness_sigmaRange(ErfRoughness self) -> double"},
-	 { "ErfRoughness_clone", _wrap_ErfRoughness_clone, METH_O, "ErfRoughness_clone(ErfRoughness self) -> ErfRoughness"},
-	 { "ErfRoughness_className", _wrap_ErfRoughness_className, METH_O, "ErfRoughness_className(ErfRoughness self) -> std::string"},
-	 { "delete_ErfRoughness", _wrap_delete_ErfRoughness, METH_O, "delete_ErfRoughness(ErfRoughness self)"},
-	 { "ErfRoughness_swigregister", ErfRoughness_swigregister, METH_O, NULL},
-	 { "ErfRoughness_swiginit", ErfRoughness_swiginit, METH_VARARGS, NULL},
-	 { "new_TanhRoughness", _wrap_new_TanhRoughness, METH_NOARGS, "new_TanhRoughness() -> TanhRoughness"},
-	 { "TanhRoughness_transient", _wrap_TanhRoughness_transient, METH_VARARGS, "TanhRoughness_transient(TanhRoughness self, double x, double sigma) -> double"},
-	 { "TanhRoughness_distribution", _wrap_TanhRoughness_distribution, METH_VARARGS, "TanhRoughness_distribution(TanhRoughness self, double x, double sigma) -> double"},
-	 { "TanhRoughness_sigmaRange", _wrap_TanhRoughness_sigmaRange, METH_O, "TanhRoughness_sigmaRange(TanhRoughness self) -> double"},
-	 { "TanhRoughness_clone", _wrap_TanhRoughness_clone, METH_O, "TanhRoughness_clone(TanhRoughness self) -> TanhRoughness"},
-	 { "TanhRoughness_className", _wrap_TanhRoughness_className, METH_O, "TanhRoughness_className(TanhRoughness self) -> std::string"},
-	 { "delete_TanhRoughness", _wrap_delete_TanhRoughness, METH_O, "delete_TanhRoughness(TanhRoughness self)"},
-	 { "TanhRoughness_swigregister", TanhRoughness_swigregister, METH_O, NULL},
-	 { "TanhRoughness_swiginit", TanhRoughness_swiginit, METH_VARARGS, NULL},
+	 { "InterlayerModel_clone", _wrap_InterlayerModel_clone, METH_O, "InterlayerModel_clone(InterlayerModel self) -> InterlayerModel"},
+	 { "InterlayerModel_transient", _wrap_InterlayerModel_transient, METH_VARARGS, "InterlayerModel_transient(InterlayerModel self, double x, double sigma) -> double"},
+	 { "InterlayerModel_distribution", _wrap_InterlayerModel_distribution, METH_VARARGS, "InterlayerModel_distribution(InterlayerModel self, double x, double sigma) -> double"},
+	 { "InterlayerModel_sigmaRange", _wrap_InterlayerModel_sigmaRange, METH_O, "InterlayerModel_sigmaRange(InterlayerModel self) -> double"},
+	 { "delete_InterlayerModel", _wrap_delete_InterlayerModel, METH_O, "delete_InterlayerModel(InterlayerModel self)"},
+	 { "InterlayerModel_swigregister", InterlayerModel_swigregister, METH_O, NULL},
+	 { "new_ErfInterlayer", _wrap_new_ErfInterlayer, METH_NOARGS, "new_ErfInterlayer() -> ErfInterlayer"},
+	 { "ErfInterlayer_transient", _wrap_ErfInterlayer_transient, METH_VARARGS, "ErfInterlayer_transient(ErfInterlayer self, double x, double sigma) -> double"},
+	 { "ErfInterlayer_distribution", _wrap_ErfInterlayer_distribution, METH_VARARGS, "ErfInterlayer_distribution(ErfInterlayer self, double x, double sigma) -> double"},
+	 { "ErfInterlayer_sigmaRange", _wrap_ErfInterlayer_sigmaRange, METH_O, "ErfInterlayer_sigmaRange(ErfInterlayer self) -> double"},
+	 { "ErfInterlayer_clone", _wrap_ErfInterlayer_clone, METH_O, "ErfInterlayer_clone(ErfInterlayer self) -> ErfInterlayer"},
+	 { "ErfInterlayer_className", _wrap_ErfInterlayer_className, METH_O, "ErfInterlayer_className(ErfInterlayer self) -> std::string"},
+	 { "delete_ErfInterlayer", _wrap_delete_ErfInterlayer, METH_O, "delete_ErfInterlayer(ErfInterlayer self)"},
+	 { "ErfInterlayer_swigregister", ErfInterlayer_swigregister, METH_O, NULL},
+	 { "ErfInterlayer_swiginit", ErfInterlayer_swiginit, METH_VARARGS, NULL},
+	 { "new_TanhInterlayer", _wrap_new_TanhInterlayer, METH_NOARGS, "new_TanhInterlayer() -> TanhInterlayer"},
+	 { "TanhInterlayer_transient", _wrap_TanhInterlayer_transient, METH_VARARGS, "TanhInterlayer_transient(TanhInterlayer self, double x, double sigma) -> double"},
+	 { "TanhInterlayer_distribution", _wrap_TanhInterlayer_distribution, METH_VARARGS, "TanhInterlayer_distribution(TanhInterlayer self, double x, double sigma) -> double"},
+	 { "TanhInterlayer_sigmaRange", _wrap_TanhInterlayer_sigmaRange, METH_O, "TanhInterlayer_sigmaRange(TanhInterlayer self) -> double"},
+	 { "TanhInterlayer_clone", _wrap_TanhInterlayer_clone, METH_O, "TanhInterlayer_clone(TanhInterlayer self) -> TanhInterlayer"},
+	 { "TanhInterlayer_className", _wrap_TanhInterlayer_className, METH_O, "TanhInterlayer_className(TanhInterlayer self) -> std::string"},
+	 { "delete_TanhInterlayer", _wrap_delete_TanhInterlayer, METH_O, "delete_TanhInterlayer(TanhInterlayer self)"},
+	 { "TanhInterlayer_swigregister", TanhInterlayer_swigregister, METH_O, NULL},
+	 { "TanhInterlayer_swiginit", TanhInterlayer_swiginit, METH_VARARGS, NULL},
 	 { "delete_IFormfactorPolyhedron", _wrap_delete_IFormfactorPolyhedron, METH_O, "delete_IFormfactorPolyhedron(IFormfactorPolyhedron self)"},
 	 { "IFormfactorPolyhedron_volume", _wrap_IFormfactorPolyhedron_volume, METH_O, "IFormfactorPolyhedron_volume(IFormfactorPolyhedron self) -> double"},
 	 { "IFormfactorPolyhedron_radialExtension", _wrap_IFormfactorPolyhedron_radialExtension, METH_O, "IFormfactorPolyhedron_radialExtension(IFormfactorPolyhedron self) -> double"},
@@ -73926,8 +73926,8 @@ static void *_p_DodecahedronTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemo
 static void *_p_EllipsoidalCylinderTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *)(IFormfactor *) ((EllipsoidalCylinder *) x));
 }
-static void *_p_ErfRoughnessTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (RoughnessModel *) ((ErfRoughness *) x));
+static void *_p_ErfInterlayerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (InterlayerModel *) ((ErfInterlayer *) x));
 }
 static void *_p_FuzzySphereTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *)(IFormfactor *) ((FuzzySphere *) x));
@@ -74019,6 +74019,9 @@ static void *_p_InterferenceNoneTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(new
 static void *_p_InterferenceRadialParacrystalTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IInterference *) ((InterferenceRadialParacrystal *) x));
 }
+static void *_p_InterlayerModelTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *)  ((InterlayerModel *) x));
+}
 static void *_p_IsotropicGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IPeakShape *) ((IsotropicGaussPeakShape *) x));
 }
@@ -74130,9 +74133,6 @@ static void *_p_RotationYTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)
 static void *_p_RotationZTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IRotation *) ((RotationZ *) x));
 }
-static void *_p_RoughnessModelTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *)  ((RoughnessModel *) x));
-}
 static void *_p_SawtoothRippleBoxTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *)(IFormfactor *)(IProfileRipple *)(ISawtoothRipple *) ((SawtoothRippleBox *) x));
 }
@@ -74151,8 +74151,8 @@ static void *_p_SpheroidTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory))
 static void *_p_SquareLattice2DTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (Lattice2D *) ((SquareLattice2D *) x));
 }
-static void *_p_TanhRoughnessTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (RoughnessModel *) ((TanhRoughness *) x));
+static void *_p_TanhInterlayerTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ICloneable *) (InterlayerModel *) ((TanhInterlayer *) x));
 }
 static void *_p_TruncatedCubeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (ISampleNode *)(IFormfactor *)(IFormfactorPolyhedron *) ((TruncatedCube *) x));
@@ -74427,8 +74427,8 @@ static void *_p_DodecahedronTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory))
 static void *_p_EllipsoidalCylinderTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *)(IFormfactor *) ((EllipsoidalCylinder *) x));
 }
-static void *_p_ErfRoughnessTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (RoughnessModel *) ((ErfRoughness *) x));
+static void *_p_ErfInterlayerTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (InterlayerModel *) ((ErfInterlayer *) x));
 }
 static void *_p_FuzzySphereTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *)(IFormfactor *) ((FuzzySphere *) x));
@@ -74520,6 +74520,9 @@ static void *_p_InterferenceNoneTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemor
 static void *_p_InterferenceRadialParacrystalTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IInterference *) ((InterferenceRadialParacrystal *) x));
 }
+static void *_p_InterlayerModelTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *)  ((InterlayerModel *) x));
+}
 static void *_p_IsotropicGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IPeakShape *) ((IsotropicGaussPeakShape *) x));
 }
@@ -74634,9 +74637,6 @@ static void *_p_RotationYTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_RotationZTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IRotation *) ((RotationZ *) x));
 }
-static void *_p_RoughnessModelTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *)  ((RoughnessModel *) x));
-}
 static void *_p_SawtoothRippleBoxTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *)(IFormfactor *)(IProfileRipple *)(ISawtoothRipple *) ((SawtoothRippleBox *) x));
 }
@@ -74655,8 +74655,8 @@ static void *_p_SpheroidTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
 static void *_p_SquareLattice2DTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (Lattice2D *) ((SquareLattice2D *) x));
 }
-static void *_p_TanhRoughnessTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (RoughnessModel *) ((TanhRoughness *) x));
+static void *_p_TanhInterlayerTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((INode *) (InterlayerModel *) ((TanhInterlayer *) x));
 }
 static void *_p_TruncatedCubeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (ISampleNode *)(IFormfactor *)(IFormfactorPolyhedron *) ((TruncatedCube *) x));
@@ -74952,6 +74952,12 @@ static void *_p_SawtoothRippleLorentzTo_p_ISawtoothRipple(void *x, int *SWIGUNUS
 static void *_p_SimpleSelectionRuleTo_p_ISelectionRule(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISelectionRule *)  ((SimpleSelectionRule *) x));
 }
+static void *_p_ErfInterlayerTo_p_InterlayerModel(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((InterlayerModel *)  ((ErfInterlayer *) x));
+}
+static void *_p_TanhInterlayerTo_p_InterlayerModel(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((InterlayerModel *)  ((TanhInterlayer *) x));
+}
 static void *_p_BasicLattice2DTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((Lattice2D *)  ((BasicLattice2D *) x));
 }
@@ -74961,12 +74967,6 @@ static void *_p_HexagonalLattice2DTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(ne
 static void *_p_SquareLattice2DTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((Lattice2D *)  ((SquareLattice2D *) x));
 }
-static void *_p_ErfRoughnessTo_p_RoughnessModel(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((RoughnessModel *)  ((ErfRoughness *) x));
-}
-static void *_p_TanhRoughnessTo_p_RoughnessModel(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((RoughnessModel *)  ((TanhRoughness *) x));
-}
 static swig_type_info _swigt__p_BarGauss = {"_p_BarGauss", "BarGauss *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BarLorentz = {"_p_BarLorentz", "BarLorentz *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_BasicLattice2D = {"_p_BasicLattice2D", "BasicLattice2D *", 0, 0, (void*)0, 0};
@@ -74983,7 +74983,7 @@ static swig_type_info _swigt__p_Crystal = {"_p_Crystal", "Crystal *", 0, 0, (voi
 static swig_type_info _swigt__p_Cylinder = {"_p_Cylinder", "Cylinder *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Dodecahedron = {"_p_Dodecahedron", "Dodecahedron *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_EllipsoidalCylinder = {"_p_EllipsoidalCylinder", "EllipsoidalCylinder *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_ErfRoughness = {"_p_ErfRoughness", "ErfRoughness *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_ErfInterlayer = {"_p_ErfInterlayer", "ErfInterlayer *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_FuzzySphere = {"_p_FuzzySphere", "FuzzySphere *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_GaussFisherPeakShape = {"_p_GaussFisherPeakShape", "GaussFisherPeakShape *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_GaussSphere = {"_p_GaussSphere", "GaussSphere *", 0, 0, (void*)0, 0};
@@ -75018,6 +75018,7 @@ static swig_type_info _swigt__p_InterferenceFinite2DLattice = {"_p_InterferenceF
 static swig_type_info _swigt__p_InterferenceHardDisk = {"_p_InterferenceHardDisk", "InterferenceHardDisk *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_InterferenceNone = {"_p_InterferenceNone", "InterferenceNone *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_InterferenceRadialParacrystal = {"_p_InterferenceRadialParacrystal", "InterferenceRadialParacrystal *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_InterlayerModel = {"_p_InterlayerModel", "InterlayerModel *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IsotropicGaussPeakShape = {"_p_IsotropicGaussPeakShape", "IsotropicGaussPeakShape *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_IsotropicLorentzPeakShape = {"_p_IsotropicLorentzPeakShape", "IsotropicLorentzPeakShape *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_Lattice2D = {"_p_Lattice2D", "Lattice2D *", 0, 0, (void*)0, 0};
@@ -75062,7 +75063,6 @@ static swig_type_info _swigt__p_RotationX = {"_p_RotationX", "RotationX *", 0, 0
 static swig_type_info _swigt__p_RotationY = {"_p_RotationY", "RotationY *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RotationZ = {"_p_RotationZ", "RotationZ *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_RoughnessMap = {"_p_RoughnessMap", "RoughnessMap *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_RoughnessModel = {"_p_RoughnessModel", "RoughnessModel *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SawtoothRippleBox = {"_p_SawtoothRippleBox", "SawtoothRippleBox *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SawtoothRippleGauss = {"_p_SawtoothRippleGauss", "SawtoothRippleGauss *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SawtoothRippleLorentz = {"_p_SawtoothRippleLorentz", "SawtoothRippleLorentz *", 0, 0, (void*)0, 0};
@@ -75072,7 +75072,7 @@ static swig_type_info _swigt__p_Sphere = {"_p_Sphere", "Sphere *", 0, 0, (void*)
 static swig_type_info _swigt__p_Spheroid = {"_p_Spheroid", "Spheroid *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SpinMatrix = {"_p_SpinMatrix", "SpinMatrix *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_SquareLattice2D = {"_p_SquareLattice2D", "SquareLattice2D *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_TanhRoughness = {"_p_TanhRoughness", "DefaultRoughness *|TanhRoughness *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_TanhInterlayer = {"_p_TanhInterlayer", "DefaultInterlayer *|TanhInterlayer *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_TruncatedCube = {"_p_TruncatedCube", "TruncatedCube *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_TruncatedSphere = {"_p_TruncatedSphere", "TruncatedSphere *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_TruncatedSpheroid = {"_p_TruncatedSpheroid", "TruncatedSpheroid *", 0, 0, (void*)0, 0};
@@ -75146,7 +75146,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_Cylinder,
   &_swigt__p_Dodecahedron,
   &_swigt__p_EllipsoidalCylinder,
-  &_swigt__p_ErfRoughness,
+  &_swigt__p_ErfInterlayer,
   &_swigt__p_FuzzySphere,
   &_swigt__p_GaussFisherPeakShape,
   &_swigt__p_GaussSphere,
@@ -75181,6 +75181,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_InterferenceHardDisk,
   &_swigt__p_InterferenceNone,
   &_swigt__p_InterferenceRadialParacrystal,
+  &_swigt__p_InterlayerModel,
   &_swigt__p_IsotropicGaussPeakShape,
   &_swigt__p_IsotropicLorentzPeakShape,
   &_swigt__p_Lattice2D,
@@ -75225,7 +75226,6 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_RotationY,
   &_swigt__p_RotationZ,
   &_swigt__p_RoughnessMap,
-  &_swigt__p_RoughnessModel,
   &_swigt__p_SawtoothRippleBox,
   &_swigt__p_SawtoothRippleGauss,
   &_swigt__p_SawtoothRippleLorentz,
@@ -75235,7 +75235,7 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_Spheroid,
   &_swigt__p_SpinMatrix,
   &_swigt__p_SquareLattice2D,
-  &_swigt__p_TanhRoughness,
+  &_swigt__p_TanhInterlayer,
   &_swigt__p_TruncatedCube,
   &_swigt__p_TruncatedSphere,
   &_swigt__p_TruncatedSpheroid,
@@ -75309,21 +75309,21 @@ static swig_cast_info _swigc__p_Crystal[] = {  {&_swigt__p_Crystal, 0, 0, 0},{0,
 static swig_cast_info _swigc__p_Cylinder[] = {  {&_swigt__p_Cylinder, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Dodecahedron[] = {  {&_swigt__p_Dodecahedron, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_EllipsoidalCylinder[] = {  {&_swigt__p_EllipsoidalCylinder, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ErfRoughness[] = {  {&_swigt__p_ErfRoughness, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ErfInterlayer[] = {  {&_swigt__p_ErfInterlayer, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_FuzzySphere[] = {  {&_swigt__p_FuzzySphere, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_GaussFisherPeakShape[] = {  {&_swigt__p_GaussFisherPeakShape, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_GaussSphere[] = {  {&_swigt__p_GaussSphere, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_HemiEllipsoid[] = {  {&_swigt__p_HemiEllipsoid, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_HexagonalLattice2D[] = {  {&_swigt__p_HexagonalLattice2D, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_HorizontalCylinder[] = {  {&_swigt__p_HorizontalCylinder, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_BarGauss, _p_BarGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_BarLorentz, _p_BarLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Bipyramid4, _p_Bipyramid4To_p_ICloneable, 0, 0},  {&_swigt__p_Box, _p_BoxTo_p_ICloneable, 0, 0},  {&_swigt__p_CantellatedCube, _p_CantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_Compound, _p_CompoundTo_p_ICloneable, 0, 0},  {&_swigt__p_Cone, _p_ConeTo_p_ICloneable, 0, 0},  {&_swigt__p_CoreAndShell, _p_CoreAndShellTo_p_ICloneable, 0, 0},  {&_swigt__p_CosineRippleBox, _p_CosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_CosineRippleGauss, _p_CosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_CosineRippleLorentz, _p_CosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Cylinder, _p_CylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_Dodecahedron, _p_DodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_EllipsoidalCylinder, _p_EllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ErfRoughness, _p_ErfRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_FuzzySphere, _p_FuzzySphereTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussSphere, _p_GaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_HemiEllipsoid, _p_HemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalCylinder, _p_HorizontalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormfactor, _p_IFormfactorTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormfactorPolyhedron, _p_IFormfactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormfactorPrism, _p_IFormfactorPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfile1D, _p_IProfile1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfile2D, _p_IProfile2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_Icosahedron, _p_IcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DParacrystal, _p_Interference2DParacrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceRadialParacrystal, _p_InterferenceRadialParacrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_LongBoxGauss, _p_LongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_LongBoxLorentz, _p_LongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_Mesocrystal, _p_MesocrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_PlatonicOctahedron, _p_PlatonicOctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_PlatonicTetrahedron, _p_PlatonicTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_Prism3, _p_Prism3To_p_ICloneable, 0, 0},  {&_swigt__p_Prism6, _p_Prism6To_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DCauchy, _p_Profile1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DCosine, _p_Profile1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DGate, _p_Profile1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DGauss, _p_Profile1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DTriangle, _p_Profile1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DVoigt, _p_Profile1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DCauchy, _p_Profile2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DCone, _p_Profile2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DGate, _p_Profile2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DGauss, _p_Profile2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DVoigt, _p_Profile2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid2, _p_Pyramid2To_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid3, _p_Pyramid3To_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid4, _p_Pyramid4To_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid6, _p_Pyramid6To_p_ICloneable, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_RoughnessModel, _p_RoughnessModelTo_p_ICloneable, 0, 0},  {&_swigt__p_SawtoothRippleBox, _p_SawtoothRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_SawtoothRippleGauss, _p_SawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_SawtoothRippleLorentz, _p_SawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_Sphere, _p_SphereTo_p_ICloneable, 0, 0},  {&_swigt__p_Spheroid, _p_SpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_TanhRoughness, _p_TanhRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_TruncatedCube, _p_TruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_TruncatedSphere, _p_TruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_TruncatedSpheroid, _p_TruncatedSpheroidTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ICloneable[] = {  {&_swigt__p_ICloneable, 0, 0, 0},  {&_swigt__p_BarGauss, _p_BarGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_BarLorentz, _p_BarLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Bipyramid4, _p_Bipyramid4To_p_ICloneable, 0, 0},  {&_swigt__p_Box, _p_BoxTo_p_ICloneable, 0, 0},  {&_swigt__p_CantellatedCube, _p_CantellatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_Compound, _p_CompoundTo_p_ICloneable, 0, 0},  {&_swigt__p_Cone, _p_ConeTo_p_ICloneable, 0, 0},  {&_swigt__p_CoreAndShell, _p_CoreAndShellTo_p_ICloneable, 0, 0},  {&_swigt__p_CosineRippleBox, _p_CosineRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_CosineRippleGauss, _p_CosineRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_CosineRippleLorentz, _p_CosineRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Cylinder, _p_CylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_Dodecahedron, _p_DodecahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_EllipsoidalCylinder, _p_EllipsoidalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ErfInterlayer, _p_ErfInterlayerTo_p_ICloneable, 0, 0},  {&_swigt__p_FuzzySphere, _p_FuzzySphereTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_GaussSphere, _p_GaussSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_HemiEllipsoid, _p_HemiEllipsoidTo_p_ICloneable, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_HorizontalCylinder, _p_HorizontalCylinderTo_p_ICloneable, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormfactor, _p_IFormfactorTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormfactorPolyhedron, _p_IFormfactorPolyhedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IFormfactorPrism, _p_IFormfactorPrismTo_p_ICloneable, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_ICloneable, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfile1D, _p_IProfile1DTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfile2D, _p_IProfile2DTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_ICloneable, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_ICloneable, 0, 0},  {&_swigt__p_Icosahedron, _p_IcosahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DParacrystal, _p_Interference2DParacrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_ICloneable, 0, 0},  {&_swigt__p_InterferenceRadialParacrystal, _p_InterferenceRadialParacrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_InterlayerModel, _p_InterlayerModelTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ICloneable, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ICloneable, 0, 0},  {&_swigt__p_LongBoxGauss, _p_LongBoxGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_LongBoxLorentz, _p_LongBoxLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_Mesocrystal, _p_MesocrystalTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ICloneable, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ICloneable, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ICloneable, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ICloneable, 0, 0},  {&_swigt__p_PlatonicOctahedron, _p_PlatonicOctahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_PlatonicTetrahedron, _p_PlatonicTetrahedronTo_p_ICloneable, 0, 0},  {&_swigt__p_Prism3, _p_Prism3To_p_ICloneable, 0, 0},  {&_swigt__p_Prism6, _p_Prism6To_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DCauchy, _p_Profile1DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DCosine, _p_Profile1DCosineTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DGate, _p_Profile1DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DGauss, _p_Profile1DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DTriangle, _p_Profile1DTriangleTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile1DVoigt, _p_Profile1DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DCauchy, _p_Profile2DCauchyTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DCone, _p_Profile2DConeTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DGate, _p_Profile2DGateTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DGauss, _p_Profile2DGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_Profile2DVoigt, _p_Profile2DVoigtTo_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid2, _p_Pyramid2To_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid3, _p_Pyramid3To_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid4, _p_Pyramid4To_p_ICloneable, 0, 0},  {&_swigt__p_Pyramid6, _p_Pyramid6To_p_ICloneable, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_ICloneable, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_ICloneable, 0, 0},  {&_swigt__p_SawtoothRippleBox, _p_SawtoothRippleBoxTo_p_ICloneable, 0, 0},  {&_swigt__p_SawtoothRippleGauss, _p_SawtoothRippleGaussTo_p_ICloneable, 0, 0},  {&_swigt__p_SawtoothRippleLorentz, _p_SawtoothRippleLorentzTo_p_ICloneable, 0, 0},  {&_swigt__p_Sphere, _p_SphereTo_p_ICloneable, 0, 0},  {&_swigt__p_Spheroid, _p_SpheroidTo_p_ICloneable, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_ICloneable, 0, 0},  {&_swigt__p_TanhInterlayer, _p_TanhInterlayerTo_p_ICloneable, 0, 0},  {&_swigt__p_TruncatedCube, _p_TruncatedCubeTo_p_ICloneable, 0, 0},  {&_swigt__p_TruncatedSphere, _p_TruncatedSphereTo_p_ICloneable, 0, 0},  {&_swigt__p_TruncatedSpheroid, _p_TruncatedSpheroidTo_p_ICloneable, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ICosineRipple[] = {  {&_swigt__p_ICosineRipple, 0, 0, 0},  {&_swigt__p_CosineRippleBox, _p_CosineRippleBoxTo_p_ICosineRipple, 0, 0},  {&_swigt__p_CosineRippleGauss, _p_CosineRippleGaussTo_p_ICosineRipple, 0, 0},  {&_swigt__p_CosineRippleLorentz, _p_CosineRippleLorentzTo_p_ICosineRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormfactor[] = {  {&_swigt__p_IFormfactor, 0, 0, 0},  {&_swigt__p_BarGauss, _p_BarGaussTo_p_IFormfactor, 0, 0},  {&_swigt__p_BarLorentz, _p_BarLorentzTo_p_IFormfactor, 0, 0},  {&_swigt__p_Bipyramid4, _p_Bipyramid4To_p_IFormfactor, 0, 0},  {&_swigt__p_Box, _p_BoxTo_p_IFormfactor, 0, 0},  {&_swigt__p_CantellatedCube, _p_CantellatedCubeTo_p_IFormfactor, 0, 0},  {&_swigt__p_Cone, _p_ConeTo_p_IFormfactor, 0, 0},  {&_swigt__p_CosineRippleBox, _p_CosineRippleBoxTo_p_IFormfactor, 0, 0},  {&_swigt__p_CosineRippleGauss, _p_CosineRippleGaussTo_p_IFormfactor, 0, 0},  {&_swigt__p_CosineRippleLorentz, _p_CosineRippleLorentzTo_p_IFormfactor, 0, 0},  {&_swigt__p_Cylinder, _p_CylinderTo_p_IFormfactor, 0, 0},  {&_swigt__p_Dodecahedron, _p_DodecahedronTo_p_IFormfactor, 0, 0},  {&_swigt__p_EllipsoidalCylinder, _p_EllipsoidalCylinderTo_p_IFormfactor, 0, 0},  {&_swigt__p_FuzzySphere, _p_FuzzySphereTo_p_IFormfactor, 0, 0},  {&_swigt__p_GaussSphere, _p_GaussSphereTo_p_IFormfactor, 0, 0},  {&_swigt__p_HemiEllipsoid, _p_HemiEllipsoidTo_p_IFormfactor, 0, 0},  {&_swigt__p_HorizontalCylinder, _p_HorizontalCylinderTo_p_IFormfactor, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IFormfactor, 0, 0},  {&_swigt__p_IFormfactorPolyhedron, _p_IFormfactorPolyhedronTo_p_IFormfactor, 0, 0},  {&_swigt__p_IFormfactorPrism, _p_IFormfactorPrismTo_p_IFormfactor, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IFormfactor, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_IFormfactor, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IFormfactor, 0, 0},  {&_swigt__p_Icosahedron, _p_IcosahedronTo_p_IFormfactor, 0, 0},  {&_swigt__p_LongBoxGauss, _p_LongBoxGaussTo_p_IFormfactor, 0, 0},  {&_swigt__p_LongBoxLorentz, _p_LongBoxLorentzTo_p_IFormfactor, 0, 0},  {&_swigt__p_PlatonicOctahedron, _p_PlatonicOctahedronTo_p_IFormfactor, 0, 0},  {&_swigt__p_PlatonicTetrahedron, _p_PlatonicTetrahedronTo_p_IFormfactor, 0, 0},  {&_swigt__p_Prism3, _p_Prism3To_p_IFormfactor, 0, 0},  {&_swigt__p_Prism6, _p_Prism6To_p_IFormfactor, 0, 0},  {&_swigt__p_Pyramid2, _p_Pyramid2To_p_IFormfactor, 0, 0},  {&_swigt__p_Pyramid3, _p_Pyramid3To_p_IFormfactor, 0, 0},  {&_swigt__p_Pyramid4, _p_Pyramid4To_p_IFormfactor, 0, 0},  {&_swigt__p_Pyramid6, _p_Pyramid6To_p_IFormfactor, 0, 0},  {&_swigt__p_SawtoothRippleBox, _p_SawtoothRippleBoxTo_p_IFormfactor, 0, 0},  {&_swigt__p_SawtoothRippleGauss, _p_SawtoothRippleGaussTo_p_IFormfactor, 0, 0},  {&_swigt__p_SawtoothRippleLorentz, _p_SawtoothRippleLorentzTo_p_IFormfactor, 0, 0},  {&_swigt__p_Sphere, _p_SphereTo_p_IFormfactor, 0, 0},  {&_swigt__p_Spheroid, _p_SpheroidTo_p_IFormfactor, 0, 0},  {&_swigt__p_TruncatedCube, _p_TruncatedCubeTo_p_IFormfactor, 0, 0},  {&_swigt__p_TruncatedSphere, _p_TruncatedSphereTo_p_IFormfactor, 0, 0},  {&_swigt__p_TruncatedSpheroid, _p_TruncatedSpheroidTo_p_IFormfactor, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormfactorPolyhedron[] = {  {&_swigt__p_IFormfactorPolyhedron, 0, 0, 0},  {&_swigt__p_Bipyramid4, _p_Bipyramid4To_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Box, _p_BoxTo_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_CantellatedCube, _p_CantellatedCubeTo_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Dodecahedron, _p_DodecahedronTo_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_IFormfactorPrism, _p_IFormfactorPrismTo_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Icosahedron, _p_IcosahedronTo_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_PlatonicOctahedron, _p_PlatonicOctahedronTo_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_PlatonicTetrahedron, _p_PlatonicTetrahedronTo_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Prism3, _p_Prism3To_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Prism6, _p_Prism6To_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Pyramid2, _p_Pyramid2To_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Pyramid3, _p_Pyramid3To_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Pyramid4, _p_Pyramid4To_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_Pyramid6, _p_Pyramid6To_p_IFormfactorPolyhedron, 0, 0},  {&_swigt__p_TruncatedCube, _p_TruncatedCubeTo_p_IFormfactorPolyhedron, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IFormfactorPrism[] = {  {&_swigt__p_IFormfactorPrism, 0, 0, 0},  {&_swigt__p_Box, _p_BoxTo_p_IFormfactorPrism, 0, 0},  {&_swigt__p_Prism3, _p_Prism3To_p_IFormfactorPrism, 0, 0},  {&_swigt__p_Prism6, _p_Prism6To_p_IFormfactorPrism, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IInterference[] = {  {&_swigt__p_IInterference, 0, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_Interference2DParacrystal, _p_Interference2DParacrystalTo_p_IInterference, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_IInterference, 0, 0},  {&_swigt__p_InterferenceRadialParacrystal, _p_InterferenceRadialParacrystalTo_p_IInterference, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IMaterialImpl[] = {  {&_swigt__p_IMaterialImpl, 0, 0, 0},  {&_swigt__p_MaterialBySLDImpl, _p_MaterialBySLDImplTo_p_IMaterialImpl, 0, 0},  {&_swigt__p_RefractiveMaterialImpl, _p_RefractiveMaterialImplTo_p_IMaterialImpl, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_BarGauss, _p_BarGaussTo_p_INode, 0, 0},  {&_swigt__p_BarLorentz, _p_BarLorentzTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_INode, 0, 0},  {&_swigt__p_Bipyramid4, _p_Bipyramid4To_p_INode, 0, 0},  {&_swigt__p_Box, _p_BoxTo_p_INode, 0, 0},  {&_swigt__p_CantellatedCube, _p_CantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_Compound, _p_CompoundTo_p_INode, 0, 0},  {&_swigt__p_Cone, _p_ConeTo_p_INode, 0, 0},  {&_swigt__p_CoreAndShell, _p_CoreAndShellTo_p_INode, 0, 0},  {&_swigt__p_CosineRippleBox, _p_CosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_CosineRippleGauss, _p_CosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_CosineRippleLorentz, _p_CosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_Cylinder, _p_CylinderTo_p_INode, 0, 0},  {&_swigt__p_Dodecahedron, _p_DodecahedronTo_p_INode, 0, 0},  {&_swigt__p_EllipsoidalCylinder, _p_EllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_ErfRoughness, _p_ErfRoughnessTo_p_INode, 0, 0},  {&_swigt__p_FuzzySphere, _p_FuzzySphereTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussSphere, _p_GaussSphereTo_p_INode, 0, 0},  {&_swigt__p_HemiEllipsoid, _p_HemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_INode, 0, 0},  {&_swigt__p_HorizontalCylinder, _p_HorizontalCylinderTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_IFormfactor, _p_IFormfactorTo_p_INode, 0, 0},  {&_swigt__p_IFormfactorPolyhedron, _p_IFormfactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_IFormfactorPrism, _p_IFormfactorPrismTo_p_INode, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IProfile1D, _p_IProfile1DTo_p_INode, 0, 0},  {&_swigt__p_IProfile2D, _p_IProfile2DTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_Icosahedron, _p_IcosahedronTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DParacrystal, _p_Interference2DParacrystalTo_p_INode, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_INode, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_INode, 0, 0},  {&_swigt__p_InterferenceRadialParacrystal, _p_InterferenceRadialParacrystalTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_LongBoxGauss, _p_LongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_LongBoxLorentz, _p_LongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_Mesocrystal, _p_MesocrystalTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_PlatonicOctahedron, _p_PlatonicOctahedronTo_p_INode, 0, 0},  {&_swigt__p_PlatonicTetrahedron, _p_PlatonicTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_Prism3, _p_Prism3To_p_INode, 0, 0},  {&_swigt__p_Prism6, _p_Prism6To_p_INode, 0, 0},  {&_swigt__p_Profile1DCauchy, _p_Profile1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_Profile1DCosine, _p_Profile1DCosineTo_p_INode, 0, 0},  {&_swigt__p_Profile1DGate, _p_Profile1DGateTo_p_INode, 0, 0},  {&_swigt__p_Profile1DGauss, _p_Profile1DGaussTo_p_INode, 0, 0},  {&_swigt__p_Profile1DTriangle, _p_Profile1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_Profile1DVoigt, _p_Profile1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_Profile2DCauchy, _p_Profile2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_Profile2DCone, _p_Profile2DConeTo_p_INode, 0, 0},  {&_swigt__p_Profile2DGate, _p_Profile2DGateTo_p_INode, 0, 0},  {&_swigt__p_Profile2DGauss, _p_Profile2DGaussTo_p_INode, 0, 0},  {&_swigt__p_Profile2DVoigt, _p_Profile2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_Pyramid2, _p_Pyramid2To_p_INode, 0, 0},  {&_swigt__p_Pyramid3, _p_Pyramid3To_p_INode, 0, 0},  {&_swigt__p_Pyramid4, _p_Pyramid4To_p_INode, 0, 0},  {&_swigt__p_Pyramid6, _p_Pyramid6To_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_RoughnessModel, _p_RoughnessModelTo_p_INode, 0, 0},  {&_swigt__p_SawtoothRippleBox, _p_SawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_SawtoothRippleGauss, _p_SawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_SawtoothRippleLorentz, _p_SawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_Sphere, _p_SphereTo_p_INode, 0, 0},  {&_swigt__p_Spheroid, _p_SpheroidTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_INode, 0, 0},  {&_swigt__p_TanhRoughness, _p_TanhRoughnessTo_p_INode, 0, 0},  {&_swigt__p_TruncatedCube, _p_TruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_TruncatedSphere, _p_TruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_TruncatedSpheroid, _p_TruncatedSpheroidTo_p_INode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_INode[] = {  {&_swigt__p_INode, 0, 0, 0},  {&_swigt__p_BarGauss, _p_BarGaussTo_p_INode, 0, 0},  {&_swigt__p_BarLorentz, _p_BarLorentzTo_p_INode, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_INode, 0, 0},  {&_swigt__p_Bipyramid4, _p_Bipyramid4To_p_INode, 0, 0},  {&_swigt__p_Box, _p_BoxTo_p_INode, 0, 0},  {&_swigt__p_CantellatedCube, _p_CantellatedCubeTo_p_INode, 0, 0},  {&_swigt__p_Compound, _p_CompoundTo_p_INode, 0, 0},  {&_swigt__p_Cone, _p_ConeTo_p_INode, 0, 0},  {&_swigt__p_CoreAndShell, _p_CoreAndShellTo_p_INode, 0, 0},  {&_swigt__p_CosineRippleBox, _p_CosineRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_CosineRippleGauss, _p_CosineRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_CosineRippleLorentz, _p_CosineRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_INode, 0, 0},  {&_swigt__p_Cylinder, _p_CylinderTo_p_INode, 0, 0},  {&_swigt__p_Dodecahedron, _p_DodecahedronTo_p_INode, 0, 0},  {&_swigt__p_EllipsoidalCylinder, _p_EllipsoidalCylinderTo_p_INode, 0, 0},  {&_swigt__p_ErfInterlayer, _p_ErfInterlayerTo_p_INode, 0, 0},  {&_swigt__p_FuzzySphere, _p_FuzzySphereTo_p_INode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_GaussSphere, _p_GaussSphereTo_p_INode, 0, 0},  {&_swigt__p_HemiEllipsoid, _p_HemiEllipsoidTo_p_INode, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_INode, 0, 0},  {&_swigt__p_HorizontalCylinder, _p_HorizontalCylinderTo_p_INode, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_INode, 0, 0},  {&_swigt__p_IFormfactor, _p_IFormfactorTo_p_INode, 0, 0},  {&_swigt__p_IFormfactorPolyhedron, _p_IFormfactorPolyhedronTo_p_INode, 0, 0},  {&_swigt__p_IFormfactorPrism, _p_IFormfactorPrismTo_p_INode, 0, 0},  {&_swigt__p_IInterference, _p_IInterferenceTo_p_INode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_INode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IProfile1D, _p_IProfile1DTo_p_INode, 0, 0},  {&_swigt__p_IProfile2D, _p_IProfile2DTo_p_INode, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_INode, 0, 0},  {&_swigt__p_IProfileRipple, _p_IProfileRippleTo_p_INode, 0, 0},  {&_swigt__p_IRotation, _p_IRotationTo_p_INode, 0, 0},  {&_swigt__p_ISampleNode, _p_ISampleNodeTo_p_INode, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_INode, 0, 0},  {&_swigt__p_Icosahedron, _p_IcosahedronTo_p_INode, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_INode, 0, 0},  {&_swigt__p_Interference1DLattice, _p_Interference1DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DLattice, _p_Interference2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_Interference2DParacrystal, _p_Interference2DParacrystalTo_p_INode, 0, 0},  {&_swigt__p_Interference2DSuperLattice, _p_Interference2DSuperLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceFinite2DLattice, _p_InterferenceFinite2DLatticeTo_p_INode, 0, 0},  {&_swigt__p_InterferenceHardDisk, _p_InterferenceHardDiskTo_p_INode, 0, 0},  {&_swigt__p_InterferenceNone, _p_InterferenceNoneTo_p_INode, 0, 0},  {&_swigt__p_InterferenceRadialParacrystal, _p_InterferenceRadialParacrystalTo_p_INode, 0, 0},  {&_swigt__p_InterlayerModel, _p_InterlayerModelTo_p_INode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_Lattice2D, _p_Lattice2DTo_p_INode, 0, 0},  {&_swigt__p_Lattice3D, _p_Lattice3DTo_p_INode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_INode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_INode, 0, 0},  {&_swigt__p_LongBoxGauss, _p_LongBoxGaussTo_p_INode, 0, 0},  {&_swigt__p_LongBoxLorentz, _p_LongBoxLorentzTo_p_INode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_Mesocrystal, _p_MesocrystalTo_p_INode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_INode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_INode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_INode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_INode, 0, 0},  {&_swigt__p_PlatonicOctahedron, _p_PlatonicOctahedronTo_p_INode, 0, 0},  {&_swigt__p_PlatonicTetrahedron, _p_PlatonicTetrahedronTo_p_INode, 0, 0},  {&_swigt__p_Prism3, _p_Prism3To_p_INode, 0, 0},  {&_swigt__p_Prism6, _p_Prism6To_p_INode, 0, 0},  {&_swigt__p_Profile1DCauchy, _p_Profile1DCauchyTo_p_INode, 0, 0},  {&_swigt__p_Profile1DCosine, _p_Profile1DCosineTo_p_INode, 0, 0},  {&_swigt__p_Profile1DGate, _p_Profile1DGateTo_p_INode, 0, 0},  {&_swigt__p_Profile1DGauss, _p_Profile1DGaussTo_p_INode, 0, 0},  {&_swigt__p_Profile1DTriangle, _p_Profile1DTriangleTo_p_INode, 0, 0},  {&_swigt__p_Profile1DVoigt, _p_Profile1DVoigtTo_p_INode, 0, 0},  {&_swigt__p_Profile2DCauchy, _p_Profile2DCauchyTo_p_INode, 0, 0},  {&_swigt__p_Profile2DCone, _p_Profile2DConeTo_p_INode, 0, 0},  {&_swigt__p_Profile2DGate, _p_Profile2DGateTo_p_INode, 0, 0},  {&_swigt__p_Profile2DGauss, _p_Profile2DGaussTo_p_INode, 0, 0},  {&_swigt__p_Profile2DVoigt, _p_Profile2DVoigtTo_p_INode, 0, 0},  {&_swigt__p_Pyramid2, _p_Pyramid2To_p_INode, 0, 0},  {&_swigt__p_Pyramid3, _p_Pyramid3To_p_INode, 0, 0},  {&_swigt__p_Pyramid4, _p_Pyramid4To_p_INode, 0, 0},  {&_swigt__p_Pyramid6, _p_Pyramid6To_p_INode, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_INode, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_INode, 0, 0},  {&_swigt__p_RotationY, _p_RotationYTo_p_INode, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_INode, 0, 0},  {&_swigt__p_SawtoothRippleBox, _p_SawtoothRippleBoxTo_p_INode, 0, 0},  {&_swigt__p_SawtoothRippleGauss, _p_SawtoothRippleGaussTo_p_INode, 0, 0},  {&_swigt__p_SawtoothRippleLorentz, _p_SawtoothRippleLorentzTo_p_INode, 0, 0},  {&_swigt__p_Sphere, _p_SphereTo_p_INode, 0, 0},  {&_swigt__p_Spheroid, _p_SpheroidTo_p_INode, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_INode, 0, 0},  {&_swigt__p_TanhInterlayer, _p_TanhInterlayerTo_p_INode, 0, 0},  {&_swigt__p_TruncatedCube, _p_TruncatedCubeTo_p_INode, 0, 0},  {&_swigt__p_TruncatedSphere, _p_TruncatedSphereTo_p_INode, 0, 0},  {&_swigt__p_TruncatedSpheroid, _p_TruncatedSpheroidTo_p_INode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IParticle[] = {  {&_swigt__p_IParticle, 0, 0, 0},  {&_swigt__p_Compound, _p_CompoundTo_p_IParticle, 0, 0},  {&_swigt__p_CoreAndShell, _p_CoreAndShellTo_p_IParticle, 0, 0},  {&_swigt__p_Mesocrystal, _p_MesocrystalTo_p_IParticle, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_IParticle, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IPeakShape[] = {  {&_swigt__p_IPeakShape, 0, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_IPeakShape, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_IPeakShape, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IProfile1D[] = {  {&_swigt__p_IProfile1D, 0, 0, 0},  {&_swigt__p_Profile1DCauchy, _p_Profile1DCauchyTo_p_IProfile1D, 0, 0},  {&_swigt__p_Profile1DCosine, _p_Profile1DCosineTo_p_IProfile1D, 0, 0},  {&_swigt__p_Profile1DGate, _p_Profile1DGateTo_p_IProfile1D, 0, 0},  {&_swigt__p_Profile1DGauss, _p_Profile1DGaussTo_p_IProfile1D, 0, 0},  {&_swigt__p_Profile1DTriangle, _p_Profile1DTriangleTo_p_IProfile1D, 0, 0},  {&_swigt__p_Profile1DVoigt, _p_Profile1DVoigtTo_p_IProfile1D, 0, 0},{0, 0, 0, 0}};
@@ -75344,6 +75344,7 @@ static swig_cast_info _swigc__p_InterferenceFinite2DLattice[] = {  {&_swigt__p_I
 static swig_cast_info _swigc__p_InterferenceHardDisk[] = {  {&_swigt__p_InterferenceHardDisk, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_InterferenceNone[] = {  {&_swigt__p_InterferenceNone, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_InterferenceRadialParacrystal[] = {  {&_swigt__p_InterferenceRadialParacrystal, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_InterlayerModel[] = {  {&_swigt__p_InterlayerModel, 0, 0, 0},  {&_swigt__p_ErfInterlayer, _p_ErfInterlayerTo_p_InterlayerModel, 0, 0},  {&_swigt__p_TanhInterlayer, _p_TanhInterlayerTo_p_InterlayerModel, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IsotropicGaussPeakShape[] = {  {&_swigt__p_IsotropicGaussPeakShape, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IsotropicLorentzPeakShape[] = {  {&_swigt__p_IsotropicLorentzPeakShape, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_Lattice2D[] = {  {&_swigt__p_Lattice2D, 0, 0, 0},  {&_swigt__p_BasicLattice2D, _p_BasicLattice2DTo_p_Lattice2D, 0, 0},  {&_swigt__p_HexagonalLattice2D, _p_HexagonalLattice2DTo_p_Lattice2D, 0, 0},  {&_swigt__p_SquareLattice2D, _p_SquareLattice2DTo_p_Lattice2D, 0, 0},{0, 0, 0, 0}};
@@ -75388,7 +75389,6 @@ static swig_cast_info _swigc__p_RotationX[] = {  {&_swigt__p_RotationX, 0, 0, 0}
 static swig_cast_info _swigc__p_RotationY[] = {  {&_swigt__p_RotationY, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RotationZ[] = {  {&_swigt__p_RotationZ, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_RoughnessMap[] = {  {&_swigt__p_RoughnessMap, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_RoughnessModel[] = {  {&_swigt__p_RoughnessModel, 0, 0, 0},  {&_swigt__p_ErfRoughness, _p_ErfRoughnessTo_p_RoughnessModel, 0, 0},  {&_swigt__p_TanhRoughness, _p_TanhRoughnessTo_p_RoughnessModel, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SawtoothRippleBox[] = {  {&_swigt__p_SawtoothRippleBox, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SawtoothRippleGauss[] = {  {&_swigt__p_SawtoothRippleGauss, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SawtoothRippleLorentz[] = {  {&_swigt__p_SawtoothRippleLorentz, 0, 0, 0},{0, 0, 0, 0}};
@@ -75398,7 +75398,7 @@ static swig_cast_info _swigc__p_Sphere[] = {  {&_swigt__p_Sphere, 0, 0, 0},{0, 0
 static swig_cast_info _swigc__p_Spheroid[] = {  {&_swigt__p_Spheroid, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SpinMatrix[] = {  {&_swigt__p_SpinMatrix, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_SquareLattice2D[] = {  {&_swigt__p_SquareLattice2D, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_TanhRoughness[] = {  {&_swigt__p_TanhRoughness, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_TanhInterlayer[] = {  {&_swigt__p_TanhInterlayer, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_TruncatedCube[] = {  {&_swigt__p_TruncatedCube, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_TruncatedSphere[] = {  {&_swigt__p_TruncatedSphere, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_TruncatedSpheroid[] = {  {&_swigt__p_TruncatedSpheroid, 0, 0, 0},{0, 0, 0, 0}};
@@ -75472,7 +75472,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_Cylinder,
   _swigc__p_Dodecahedron,
   _swigc__p_EllipsoidalCylinder,
-  _swigc__p_ErfRoughness,
+  _swigc__p_ErfInterlayer,
   _swigc__p_FuzzySphere,
   _swigc__p_GaussFisherPeakShape,
   _swigc__p_GaussSphere,
@@ -75507,6 +75507,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_InterferenceHardDisk,
   _swigc__p_InterferenceNone,
   _swigc__p_InterferenceRadialParacrystal,
+  _swigc__p_InterlayerModel,
   _swigc__p_IsotropicGaussPeakShape,
   _swigc__p_IsotropicLorentzPeakShape,
   _swigc__p_Lattice2D,
@@ -75551,7 +75552,6 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_RotationY,
   _swigc__p_RotationZ,
   _swigc__p_RoughnessMap,
-  _swigc__p_RoughnessModel,
   _swigc__p_SawtoothRippleBox,
   _swigc__p_SawtoothRippleGauss,
   _swigc__p_SawtoothRippleLorentz,
@@ -75561,7 +75561,7 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_Spheroid,
   _swigc__p_SpinMatrix,
   _swigc__p_SquareLattice2D,
-  _swigc__p_TanhRoughness,
+  _swigc__p_TanhInterlayer,
   _swigc__p_TruncatedCube,
   _swigc__p_TruncatedSphere,
   _swigc__p_TruncatedSpheroid,
diff --git a/rawEx/fit/specular/Honeycomb_fit.py b/rawEx/fit/specular/Honeycomb_fit.py
index 0ad0010ed02..6d6cc9f956d 100755
--- a/rawEx/fit/specular/Honeycomb_fit.py
+++ b/rawEx/fit/specular/Honeycomb_fit.py
@@ -48,7 +48,7 @@ def get_sample(P, sign, T):
     l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom)
     l_Si = ba.Layer(material_Si)
 
-    roughness_model = ba.ErfRoughness()
+    roughness_model = ba.ErfInterlayer()
     rPyOx = ba.LayerRoughness(P["rPyOx"]*angstrom, roughness_model)
     rPy2 = ba.LayerRoughness(P["rPy2"]*angstrom, roughness_model)
     rPy1 = ba.LayerRoughness(P["rPy1"]*angstrom, roughness_model)
diff --git a/rawEx/specular/RoughnessModel.py b/rawEx/specular/RoughnessModel.py
index e8ea7ba7796..e33449065a8 100755
--- a/rawEx/specular/RoughnessModel.py
+++ b/rawEx/specular/RoughnessModel.py
@@ -57,8 +57,8 @@ def simulate(roughness_model, title):
 
 if __name__ == '__main__':
     results = [
-        simulate(ba.ErfRoughness(), "Névot-Croce"),
-        simulate(ba.TanhRoughness(), "Tanh"),
+        simulate(ba.ErfInterlayer(), "Névot-Croce"),
+        simulate(ba.TanhInterlayer(), "Tanh"),
     ]
 
     bp.plot_multicurve(results)
diff --git a/rawEx/varia/MaterialProfile.py b/rawEx/varia/MaterialProfile.py
index bd7e7d0278d..1f7181a7a4e 100755
--- a/rawEx/varia/MaterialProfile.py
+++ b/rawEx/varia/MaterialProfile.py
@@ -29,7 +29,7 @@ def get_sample():
     # sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    roughness_model = ba.TanhRoughness()
+    roughness_model = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(5*angstrom, 0.5, 10*angstrom, roughness_model)
     for _ in range(4):
         sample.addLayerWithTopRoughness(ti_layer, roughness)
diff --git a/rawEx/varia/RoughSurface.py b/rawEx/varia/RoughSurface.py
index f8e2d559668..77f2dc2c168 100755
--- a/rawEx/varia/RoughSurface.py
+++ b/rawEx/varia/RoughSurface.py
@@ -46,7 +46,7 @@ def plot(h):
 sigma = 1*nm
 alpha = 0.5
 xi = 35*nm
-height_distribution = ba.ErfRoughness()
+height_distribution = ba.ErfInterlayer()
 
 # sample size
 Lx = 1000*nm
-- 
GitLab