diff --git a/Core/Multilayer/MultiLayer.cpp b/Core/Multilayer/MultiLayer.cpp index 752f60d10e2df2a6a20344c6780adff1fa9fad31..7f463280d16a1ad6c946ea183a471edb4df4434f 100644 --- a/Core/Multilayer/MultiLayer.cpp +++ b/Core/Multilayer/MultiLayer.cpp @@ -33,15 +33,7 @@ MultiLayer::MultiLayer() : m_crossCorrLength(0) } MultiLayer::~MultiLayer() -{ - for (size_t i=0; i<m_layers.size(); i++) - delete m_layers[i]; - m_layers.clear(); - - for (size_t i=0; i<m_interfaces.size(); i++) - delete m_interfaces[i]; - m_interfaces.clear(); -} +{} void MultiLayer::init_parameters() { @@ -50,16 +42,14 @@ void MultiLayer::init_parameters() setUnit("nm").setNonnegative(); } -const ILayout * MultiLayer::layout(size_t i) const +MultiLayer* MultiLayer::clone() const { - if (i >= m_layouts.size()) - return nullptr; - return m_layouts[i]; + return cloneGeneric( [](const Layer* p_layer) { return p_layer->clone(); } ); } -MultiLayer* MultiLayer::clone() const +MultiLayer* MultiLayer::cloneInvertB() const { - return cloneGeneric( [](const Layer* p_layer) { return p_layer->clone(); } ); + return cloneGeneric( [](const Layer* p_layer) { return p_layer->cloneInvertB(); } ); } MultiLayer* MultiLayer::cloneSliced(bool use_average_layers) const @@ -90,11 +80,6 @@ MultiLayer* MultiLayer::cloneSliced(bool use_average_layers) const return P_result.release(); } -MultiLayer* MultiLayer::cloneInvertB() const -{ - return cloneGeneric( [](const Layer* p_layer) { return p_layer->cloneInvertB(); } ); -} - //! Returns pointer to the top interface of the layer. //! nInterfaces = nLayers-1, first layer in multilayer doesn't have interface. const LayerInterface* MultiLayer::layerTopInterface(size_t i_layer) const @@ -119,15 +104,7 @@ void MultiLayer::setLayerMaterial(size_t i_layer, HomogeneousMaterial material) p_layer->setMaterial(material); } -void MultiLayer::addLayout(const ILayout & layout) -{ - ILayout *clone = layout.clone(); - m_layouts.push_back(clone); - registerChild(clone); -} - //! Adds layer with top roughness - void MultiLayer::addLayerWithTopRoughness(const Layer& layer, const LayerRoughness& roughness) { Layer* p_new_layer = layer.clone(); @@ -184,10 +161,10 @@ double MultiLayer::crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k return corr; } -int MultiLayer::indexOfLayer(const Layer* layer) const +int MultiLayer::indexOfLayer(const Layer* p_layer) const { for (size_t i=0; i<numberOfLayers(); ++i) - if (layer == m_layers[i]) + if (p_layer == m_layers[i]) return i; return -1; } @@ -202,8 +179,8 @@ bool MultiLayer::containsMagneticMaterial() const bool MultiLayer::hasRoughness() const { - for (const LayerInterface* face: m_interfaces) - if (face->getRoughness()) + for (auto p_interface: m_interfaces) + if (p_interface->getRoughness()) return true; return false; } @@ -211,14 +188,14 @@ bool MultiLayer::hasRoughness() const size_t MultiLayer::totalNofLayouts() const { size_t ret = 0; - for (const Layer* layer: m_layers) - ret += layer->numberOfLayouts(); + for (auto p_layer: m_layers) + ret += p_layer->numberOfLayouts(); return ret; } bool MultiLayer::containsParticles() const { - for (auto* p_layer: m_layers) + for (auto p_layer: m_layers) if (p_layer->containsParticles()) return true; return false; @@ -227,10 +204,10 @@ bool MultiLayer::containsParticles() const std::vector<const INode*> MultiLayer::getChildren() const { std::vector<const INode*> result; - for(auto layer : m_layers) { - result.push_back(layer); - if(const LayerInterface *interface = layerBottomInterface(indexOfLayer(layer))) - result.push_back(interface); + for(auto p_layer : m_layers) { + result.push_back(p_layer); + if(const LayerInterface* p_interface = layerBottomInterface(indexOfLayer(p_layer))) + result.push_back(p_interface); } return result; } @@ -248,7 +225,7 @@ void MultiLayer::addAndRegisterInterface(LayerInterface* child) registerChild(child); } -void MultiLayer::handleLayerThicknessRegistration() const +void MultiLayer::handleLayerThicknessRegistration() { size_t n_layers = numberOfLayers(); for (size_t i=0; i<numberOfLayers(); ++i) { @@ -292,8 +269,8 @@ MultiLayer* MultiLayer::cloneGeneric(const std::function<Layer*(const Layer*)>& bool MultiLayer::requiresMatrixRTCoefficients() const { - for (auto layer: m_layers) - if (!(layer->material()->isScalarMaterial())) + for (auto p_layer: m_layers) + if (!(p_layer->material()->isScalarMaterial())) return true; return false; } diff --git a/Core/Multilayer/MultiLayer.h b/Core/Multilayer/MultiLayer.h index bd3efa7856462ff33e081855cfd9b2804504d31b..dd25bd05acd55ed817314d2e39bf9e35ce03e0d1 100644 --- a/Core/Multilayer/MultiLayer.h +++ b/Core/Multilayer/MultiLayer.h @@ -85,23 +85,17 @@ public: //! Changes a layer's material void setLayerMaterial(size_t i_layer, HomogeneousMaterial material); - //! Adds a layout of particles to the whole multilayer (particles can be in different layers) - void addLayout(const ILayout& layout); - - size_t numberOfLayouts() const { return m_layouts.size(); } - const ILayout* layout(size_t i) const; - //! Returns a clone of multilayer with clones of all layers and recreated //! interfaces between layers MultiLayer* clone() const final override; + //! Returns a clone with inverted magnetic fields + MultiLayer* cloneInvertB() const; + //! Returns a clone of multilayer where the original layers may be sliced into several sublayers //! for usage with the graded layer approximation MultiLayer* cloneSliced(bool use_average_layers) const; - //! Returns a clone with inverted magnetic fields - MultiLayer* cloneInvertB() const; - //! Sets cross correlation length of roughnesses between interfaces void setCrossCorrLength(double crossCorrLength); @@ -113,7 +107,7 @@ public: double crossCorrSpectralFun(const kvector_t kvec, size_t j, size_t k) const; //! returns layer index - int indexOfLayer(const Layer* layer) const; + int indexOfLayer(const Layer* p_layer) const; //! returns true if contains magnetic materials and matrix calculations are required bool requiresMatrixRTCoefficients() const; @@ -147,7 +141,7 @@ private: void addAndRegisterInterface(LayerInterface* child); //! Handles correct registration of layer thicknesses (not needed for top and bottom layer) - void handleLayerThicknessRegistration() const; + void handleLayerThicknessRegistration(); //! Checks index of layer w.r.t. vector length size_t check_layer_index(size_t i_layer) const; @@ -162,15 +156,13 @@ private: std::vector<ZLimits> calculateLayerZLimits() const; //! stack of layers [nlayers] - std::vector<Layer*> m_layers; + SafePointerVector<Layer> m_layers; //! coordinate of layer's bottoms [nlayers] std::vector<double> m_layers_bottomz; //! stack of layer interfaces [nlayers-1] - std::vector<LayerInterface*> m_interfaces; + SafePointerVector<LayerInterface> m_interfaces; //! cross correlation length (in z direction) between different layers double m_crossCorrLength; - //! independent layouts in this multilayer (not used) - SafePointerVector<ILayout> m_layouts; }; #endif // MULTILAYER_H diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py index 9cc3b39cde0e9585e78acdd47e1cebe1b8316812..6c2a20f4662a79f7f6c74d0790244b65671569a6 100644 --- a/auto/Wrap/libBornAgainCore.py +++ b/auto/Wrap/libBornAgainCore.py @@ -22442,38 +22442,6 @@ class MultiLayer(ISample): return _libBornAgainCore.MultiLayer_setLayerMaterial(self, i_layer, material) - def addLayout(self, layout): - """ - addLayout(MultiLayer self, ILayout layout) - - void MultiLayer::addLayout(const ILayout &layout) - - Adds a layout of particles to the whole multilayer (particles can be in different layers) - - """ - return _libBornAgainCore.MultiLayer_addLayout(self, layout) - - - def numberOfLayouts(self): - """ - numberOfLayouts(MultiLayer self) -> size_t - - size_t MultiLayer::numberOfLayouts() const - - """ - return _libBornAgainCore.MultiLayer_numberOfLayouts(self) - - - def layout(self, i): - """ - layout(MultiLayer self, size_t i) -> ILayout - - const ILayout * MultiLayer::layout(size_t i) const - - """ - return _libBornAgainCore.MultiLayer_layout(self, i) - - def clone(self): """ clone(MultiLayer self) -> MultiLayer @@ -22486,28 +22454,28 @@ class MultiLayer(ISample): return _libBornAgainCore.MultiLayer_clone(self) - def cloneSliced(self, use_average_layers): + def cloneInvertB(self): """ - cloneSliced(MultiLayer self, bool use_average_layers) -> MultiLayer + cloneInvertB(MultiLayer self) -> MultiLayer - MultiLayer * MultiLayer::cloneSliced(bool use_average_layers) const + MultiLayer * MultiLayer::cloneInvertB() const - Returns a clone of multilayer where the original layers may be sliced into several sublayers for usage with the graded layer approximation + Returns a clone with inverted magnetic fields. """ - return _libBornAgainCore.MultiLayer_cloneSliced(self, use_average_layers) + return _libBornAgainCore.MultiLayer_cloneInvertB(self) - def cloneInvertB(self): + def cloneSliced(self, use_average_layers): """ - cloneInvertB(MultiLayer self) -> MultiLayer + cloneSliced(MultiLayer self, bool use_average_layers) -> MultiLayer - MultiLayer * MultiLayer::cloneInvertB() const + MultiLayer * MultiLayer::cloneSliced(bool use_average_layers) const - Returns a clone with inverted magnetic fields. + Returns a clone of multilayer where the original layers may be sliced into several sublayers for usage with the graded layer approximation """ - return _libBornAgainCore.MultiLayer_cloneInvertB(self) + return _libBornAgainCore.MultiLayer_cloneSliced(self, use_average_layers) def setCrossCorrLength(self, crossCorrLength): @@ -22548,16 +22516,16 @@ class MultiLayer(ISample): return _libBornAgainCore.MultiLayer_crossCorrSpectralFun(self, kvec, j, k) - def indexOfLayer(self, layer): + def indexOfLayer(self, p_layer): """ - indexOfLayer(MultiLayer self, Layer layer) -> int + indexOfLayer(MultiLayer self, Layer p_layer) -> int int MultiLayer::indexOfLayer(const Layer *layer) const returns layer index """ - return _libBornAgainCore.MultiLayer_indexOfLayer(self, layer) + return _libBornAgainCore.MultiLayer_indexOfLayer(self, p_layer) def requiresMatrixRTCoefficients(self): diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp index 78ba29943049c5da3a0e44c30a452cdd696da4e7..ca02ea8bb8e7001cfe31bd0fa01fc2208c26a9b5 100644 --- a/auto/Wrap/libBornAgainCore_wrap.cpp +++ b/auto/Wrap/libBornAgainCore_wrap.cpp @@ -95970,93 +95970,29 @@ fail: } -SWIGINTERN PyObject *_wrap_MultiLayer_addLayout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MultiLayer *arg1 = (MultiLayer *) 0 ; - ILayout *arg2 = 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - void *argp2 = 0 ; - int res2 = 0 ; - PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_addLayout",&obj0,&obj1)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_addLayout" "', argument " "1"" of type '" "MultiLayer *""'"); - } - arg1 = reinterpret_cast< MultiLayer * >(argp1); - res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_ILayout, 0 | 0); - if (!SWIG_IsOK(res2)) { - SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MultiLayer_addLayout" "', argument " "2"" of type '" "ILayout const &""'"); - } - if (!argp2) { - SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MultiLayer_addLayout" "', argument " "2"" of type '" "ILayout const &""'"); - } - arg2 = reinterpret_cast< ILayout * >(argp2); - (arg1)->addLayout((ILayout const &)*arg2); - resultobj = SWIG_Py_Void(); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MultiLayer_numberOfLayouts(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MultiLayer *arg1 = (MultiLayer *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - size_t result; - - if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_numberOfLayouts",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_numberOfLayouts" "', argument " "1"" of type '" "MultiLayer const *""'"); - } - arg1 = reinterpret_cast< MultiLayer * >(argp1); - result = ((MultiLayer const *)arg1)->numberOfLayouts(); - resultobj = SWIG_From_size_t(static_cast< size_t >(result)); - return resultobj; -fail: - return NULL; -} - - -SWIGINTERN PyObject *_wrap_MultiLayer_layout(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_MultiLayer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MultiLayer *arg1 = (MultiLayer *) 0 ; - size_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; - size_t val2 ; - int ecode2 = 0 ; PyObject * obj0 = 0 ; - PyObject * obj1 = 0 ; - ILayout *result = 0 ; + MultiLayer *result = 0 ; - if (!PyArg_ParseTuple(args,(char *)"OO:MultiLayer_layout",&obj0,&obj1)) SWIG_fail; + if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_clone",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_layout" "', argument " "1"" of type '" "MultiLayer const *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_clone" "', argument " "1"" of type '" "MultiLayer const *""'"); } arg1 = reinterpret_cast< MultiLayer * >(argp1); - ecode2 = SWIG_AsVal_size_t(obj1, &val2); - if (!SWIG_IsOK(ecode2)) { - SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_layout" "', argument " "2"" of type '" "size_t""'"); - } - arg2 = static_cast< size_t >(val2); - result = (ILayout *)((MultiLayer const *)arg1)->layout(arg2); - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ILayout, 0 | 0 ); + result = (MultiLayer *)((MultiLayer const *)arg1)->clone(); + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 | 0 ); return resultobj; fail: return NULL; } -SWIGINTERN PyObject *_wrap_MultiLayer_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_MultiLayer_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MultiLayer *arg1 = (MultiLayer *) 0 ; void *argp1 = 0 ; @@ -96064,13 +96000,13 @@ SWIGINTERN PyObject *_wrap_MultiLayer_clone(PyObject *SWIGUNUSEDPARM(self), PyOb PyObject * obj0 = 0 ; MultiLayer *result = 0 ; - if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_clone",&obj0)) SWIG_fail; + if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_cloneInvertB",&obj0)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 | 0 ); if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_clone" "', argument " "1"" of type '" "MultiLayer const *""'"); + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_cloneInvertB" "', argument " "1"" of type '" "MultiLayer const *""'"); } arg1 = reinterpret_cast< MultiLayer * >(argp1); - result = (MultiLayer *)((MultiLayer const *)arg1)->clone(); + result = (MultiLayer *)((MultiLayer const *)arg1)->cloneInvertB(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 | 0 ); return resultobj; fail: @@ -96109,28 +96045,6 @@ fail: } -SWIGINTERN PyObject *_wrap_MultiLayer_cloneInvertB(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { - PyObject *resultobj = 0; - MultiLayer *arg1 = (MultiLayer *) 0 ; - void *argp1 = 0 ; - int res1 = 0 ; - PyObject * obj0 = 0 ; - MultiLayer *result = 0 ; - - if (!PyArg_ParseTuple(args,(char *)"O:MultiLayer_cloneInvertB",&obj0)) SWIG_fail; - res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MultiLayer, 0 | 0 ); - if (!SWIG_IsOK(res1)) { - SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_cloneInvertB" "', argument " "1"" of type '" "MultiLayer const *""'"); - } - arg1 = reinterpret_cast< MultiLayer * >(argp1); - result = (MultiLayer *)((MultiLayer const *)arg1)->cloneInvertB(); - resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_MultiLayer, 0 | 0 ); - return resultobj; -fail: - return NULL; -} - - SWIGINTERN PyObject *_wrap_MultiLayer_setCrossCorrLength(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; MultiLayer *arg1 = (MultiLayer *) 0 ; @@ -120859,26 +120773,6 @@ static PyMethodDef SwigMethods[] = { "Changes a layer's material. \n" "\n" ""}, - { (char *)"MultiLayer_addLayout", _wrap_MultiLayer_addLayout, METH_VARARGS, (char *)"\n" - "MultiLayer_addLayout(MultiLayer self, ILayout layout)\n" - "\n" - "void MultiLayer::addLayout(const ILayout &layout)\n" - "\n" - "Adds a layout of particles to the whole multilayer (particles can be in different layers) \n" - "\n" - ""}, - { (char *)"MultiLayer_numberOfLayouts", _wrap_MultiLayer_numberOfLayouts, METH_VARARGS, (char *)"\n" - "MultiLayer_numberOfLayouts(MultiLayer self) -> size_t\n" - "\n" - "size_t MultiLayer::numberOfLayouts() const \n" - "\n" - ""}, - { (char *)"MultiLayer_layout", _wrap_MultiLayer_layout, METH_VARARGS, (char *)"\n" - "MultiLayer_layout(MultiLayer self, size_t i) -> ILayout\n" - "\n" - "const ILayout * MultiLayer::layout(size_t i) const \n" - "\n" - ""}, { (char *)"MultiLayer_clone", _wrap_MultiLayer_clone, METH_VARARGS, (char *)"\n" "MultiLayer_clone(MultiLayer self) -> MultiLayer\n" "\n" @@ -120887,14 +120781,6 @@ static PyMethodDef SwigMethods[] = { "Returns a clone of multilayer with clones of all layers and recreated interfaces between layers \n" "\n" ""}, - { (char *)"MultiLayer_cloneSliced", _wrap_MultiLayer_cloneSliced, METH_VARARGS, (char *)"\n" - "MultiLayer_cloneSliced(MultiLayer self, bool use_average_layers) -> MultiLayer\n" - "\n" - "MultiLayer * MultiLayer::cloneSliced(bool use_average_layers) const\n" - "\n" - "Returns a clone of multilayer where the original layers may be sliced into several sublayers for usage with the graded layer approximation \n" - "\n" - ""}, { (char *)"MultiLayer_cloneInvertB", _wrap_MultiLayer_cloneInvertB, METH_VARARGS, (char *)"\n" "MultiLayer_cloneInvertB(MultiLayer self) -> MultiLayer\n" "\n" @@ -120903,6 +120789,14 @@ static PyMethodDef SwigMethods[] = { "Returns a clone with inverted magnetic fields. \n" "\n" ""}, + { (char *)"MultiLayer_cloneSliced", _wrap_MultiLayer_cloneSliced, METH_VARARGS, (char *)"\n" + "MultiLayer_cloneSliced(MultiLayer self, bool use_average_layers) -> MultiLayer\n" + "\n" + "MultiLayer * MultiLayer::cloneSliced(bool use_average_layers) const\n" + "\n" + "Returns a clone of multilayer where the original layers may be sliced into several sublayers for usage with the graded layer approximation \n" + "\n" + ""}, { (char *)"MultiLayer_setCrossCorrLength", _wrap_MultiLayer_setCrossCorrLength, METH_VARARGS, (char *)"\n" "MultiLayer_setCrossCorrLength(MultiLayer self, double crossCorrLength)\n" "\n" @@ -120930,7 +120824,7 @@ static PyMethodDef SwigMethods[] = { "\n" ""}, { (char *)"MultiLayer_indexOfLayer", _wrap_MultiLayer_indexOfLayer, METH_VARARGS, (char *)"\n" - "MultiLayer_indexOfLayer(MultiLayer self, Layer layer) -> int\n" + "MultiLayer_indexOfLayer(MultiLayer self, Layer p_layer) -> int\n" "\n" "int MultiLayer::indexOfLayer(const Layer *layer) const\n" "\n"