diff --git a/App/src/TestDiffuseScattering.cpp b/App/src/TestDiffuseScattering.cpp index e87edff764e161a5f3877bf134903ac2b54905eb..71e9a3d907374fc7866cbc4af775e8ad8f9a54cf 100644 --- a/App/src/TestDiffuseScattering.cpp +++ b/App/src/TestDiffuseScattering.cpp @@ -26,22 +26,17 @@ void TestDiffuseScattering::execute() { std::cout << "TestDiffuseScattering::execute() -> Info." << std::endl; - std::cout << "TestFresnelCoeff::execute() -> Info." << std::endl; - - + // creation of materials MaterialManager &matManager = MaterialManager::instance(); - - - MultiLayer mySample; - - // creation of materials and layers const IMaterial *mAmbience = matManager.addHomogeneousMaterial("ambience",complex_t(1.0, 0.0) ); const IMaterial *mAg1 = matManager.addHomogeneousMaterial( "Ag1",complex_t(0.99999653774962993, 0) ); const IMaterial *mCr1 = matManager.addHomogeneousMaterial("Cr1",complex_t(0.99999701914797656, 0) ); const IMaterial *mSubstrate = matManager.addHomogeneousMaterial("substrate", complex_t(0.99999692440971188, 0) ); - matManager.print(); + // create layers + MultiLayer mySample; + Layer lAmbience; lAmbience.setMaterial(mAmbience, 0); @@ -55,16 +50,27 @@ void TestDiffuseScattering::execute() lSubstrate.setMaterial(mSubstrate, 0); // adding layers - mySample.add(lAmbience); + mySample.addLayer(lAmbience); const unsigned nrepetitions = 4; for(unsigned i=0; i<nrepetitions; ++i) { mySample.addLayerWithTopRoughness(lAg1, LayerRoughness(3.,4.,5.) ); - mySample.add(lCr1); + mySample.addLayer(lCr1); } - mySample.add(lSubstrate); + mySample.addLayer(lSubstrate); mySample.print(); + std::cout << "--- Attempt to clone MultiLayer" << std::endl; + + MultiLayer *newSample = mySample.clone(); + newSample->print(); + + MultiLayer *newSample2 = newSample->clone(); + + delete newSample; + + newSample2->print(); + } diff --git a/App/src/TestFresnelCoeff.cpp b/App/src/TestFresnelCoeff.cpp index e17657bf03d4b838a650d44a0c693db8913bc77b..6bb54a57024fee55a070d974095b73400ad32200 100644 --- a/App/src/TestFresnelCoeff.cpp +++ b/App/src/TestFresnelCoeff.cpp @@ -48,14 +48,14 @@ void TestFresnelCoeff::execute() lSubstrate.setMaterial(&mSubstrate, 0); // adding layers - mySample.add(lAmbience); + mySample.addLayer(lAmbience); const unsigned nrepetitions = 4; for(unsigned i=0; i<nrepetitions; ++i) { - mySample.add(lAg1); - mySample.add(lCr1); + mySample.addLayer(lAg1); + mySample.addLayer(lCr1); } - mySample.add(lSubstrate); + mySample.addLayer(lSubstrate); // ------------------- // calculation of Fresnel coefficients for multi-layers system diff --git a/Core/inc/LayerInterface.h b/Core/inc/LayerInterface.h index 95a39f0c9c29f6e9a8ddd1f6fb45ab3816fb4a07..89f95f11947666d5f168d251c170ce0b989e5e59 100644 --- a/Core/inc/LayerInterface.h +++ b/Core/inc/LayerInterface.h @@ -50,6 +50,9 @@ public: //! set roughness of the interface inline void setRoughness(const LayerRoughness &roughness) { m_roughness = roughness; } + //! get roughness of the interface + inline const LayerRoughness &getRoughness() { return m_roughness; } + //! get top layer inline const Layer *getLayerTop() const { return m_LayerTop; } diff --git a/Core/inc/MultiLayer.h b/Core/inc/MultiLayer.h index 134e32e8cc1e020e54c00db010ae7cc1ed095075..858d7134eed5ea30fd49ab4e3f08f3c9babf48e5 100644 --- a/Core/inc/MultiLayer.h +++ b/Core/inc/MultiLayer.h @@ -25,7 +25,7 @@ /// @class MultiLayer /// @brief Stack of layers one on top of the other /// -/// Example of system of 4 layers: +/// Example of system of 4 layers (3 interfaces): /// /// ambience layer #0 z=getLayerBottomZ(0)=0.0 /// --------- interface #0 @@ -46,13 +46,13 @@ public: inline size_t getNumberOfLayers() const { return m_layers.size(); } /// add object to multilayer, overrides from ISample - virtual void add(const ISample &p_child); + void addLayer(const Layer &p_child); /// add layer with top roughness void addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness); /// return layer with given index - const Layer *getLayer(size_t i_layer) const { return &m_layers[ check_layer_index(i_layer) ]; } + const Layer *getLayer(size_t i_layer) const { return m_layers[ check_layer_index(i_layer) ]; } /// return z-coordinate of the layer's bottom double getLayerBottomZ(size_t i_layer) const { return m_layers_z[ check_layer_index(i_layer) ]; } @@ -73,10 +73,8 @@ public: void print(); private: - /// hiding copy constructor + /// hiding copy constructor & assignment operator MultiLayer(const MultiLayer &); - - /// hiding assignment operator MultiLayer &operator=(const MultiLayer &); /// check index of layer w.r.t. vector length @@ -85,7 +83,7 @@ private: /// check index of interface w.r.t. vector length inline size_t check_interface_index(size_t i_interface) const { return i_interface < m_interfaces.size() ? i_interface : throw OutOfBoundsException("Interface index is out of bounds"); } - std::vector<Layer > m_layers; ///< stack of layers [nlayers] + std::vector<Layer *> m_layers; ///< stack of layers [nlayers] std::vector<double > m_layers_z; ///< coordinate of layer's bottoms [nlayers] std::vector<LayerInterface *> m_interfaces; ///< stack of layer interfaces [nlayers-1] }; diff --git a/Core/src/MultiLayer.cpp b/Core/src/MultiLayer.cpp index 7e4352eda67698ba27c4a606e9014ad21be13a34..ab9f3db9939c11d557a0eedfc8aeed4e39a02151 100644 --- a/Core/src/MultiLayer.cpp +++ b/Core/src/MultiLayer.cpp @@ -9,31 +9,9 @@ MultiLayer::MultiLayer() } -//MultiLayer::MultiLayer(const MultiLayer &other) : ISample(other) -//{ -// m_layers = other.m_layers; -// m_layers_z = other.m_layers_z; -// m_interfaces = other.m_interfaces; -//} - - -//MultiLayer &MultiLayer::operator=(const MultiLayer &other) -//{ -// if( this != &other) -// { - -// clean(); -// m_layers = other.m_layers; -// m_layers_z = other.m_layers_z; -// //m_interfaces = other.m_interfaces; -// } -// return *this; -//} - - MultiLayer::~MultiLayer() { - + clear(); } @@ -42,50 +20,65 @@ MultiLayer::~MultiLayer() /* ************************************************************************* */ void MultiLayer::clear() { + for(size_t i=0; i<m_layers.size(); i++) { + if( m_layers[i] ) delete m_layers[i]; + } m_layers.clear(); - m_layers_z.clear(); - for(size_t i=0; i<m_interfaces.size(); i++) - { - if( m_interfaces[i] ) { - delete m_interfaces[i]; - m_interfaces[i] = 0; - } - m_interfaces.clear(); + + for(size_t i=0; i<m_interfaces.size(); i++) { + if( m_interfaces[i] ) delete m_interfaces[i]; } + m_interfaces.clear(); + + m_layers_z.clear(); } /* ************************************************************************* */ -// clear MultiLayer contents including interfaces +// clone MultiLayer contents including interfaces /* ************************************************************************* */ MultiLayer *MultiLayer::clone() { -// MultiLayer -// m_layers.clear(); -// m_layers_z.clear(); -// for(size_t i=0; i<m_interfaces.size(); i++) -// { -// if( m_interfaces[i] ) { -// delete m_interfaces[i]; -// m_interfaces[i] = 0; -// } -// m_interfaces.clear(); -// } - return 0; -} + MultiLayer *newMultiLayer = new MultiLayer(); -const LayerInterface *MultiLayer::getLayerBottomInterface(size_t i_layer) -{ - return i_layer<m_interfaces.size() ? m_interfaces[ check_interface_index(i_layer) ] : 0; + newMultiLayer->m_layers_z = m_layers_z; + + for(size_t i=0; i<m_layers.size(); i++) { + newMultiLayer->m_layers.push_back( new Layer( *m_layers[i] ) ); + } + + for(size_t i=0; i<m_interfaces.size(); i++) { + const Layer *topLayer = newMultiLayer->m_layers[i]; + const Layer *bottomLayer = newMultiLayer->m_layers[i+1]; + + LayerInterface *newInterface = LayerInterface::createRoughInterface(topLayer, bottomLayer, m_interfaces[i]->getRoughness() ); + newMultiLayer->m_interfaces.push_back( newInterface ); + } + + return newMultiLayer; } +/* ************************************************************************* */ +// return pointer to the top interface of the layer +// (nInterfaces = nLayers-1, first layer in multilayer doesn't have interface) +/* ************************************************************************* */ const LayerInterface *MultiLayer::getLayerTopInterface(size_t i_layer) { return i_layer>0 ? m_interfaces[ check_interface_index(i_layer-1) ] : 0; } +/* ************************************************************************* */ +// return pointer to the bottom interface of the layer +// (nInterfaces = nLayers-1, i.e. last layer in multilayer doesn't have interface) +/* ************************************************************************* */ +const LayerInterface *MultiLayer::getLayerBottomInterface(size_t i_layer) +{ + return i_layer<m_interfaces.size() ? m_interfaces[ check_interface_index(i_layer) ] : 0; +} + + /* ************************************************************************* */ // print content of multilayer on the screen /* ************************************************************************* */ @@ -108,7 +101,7 @@ void MultiLayer::print() if(interface) { std::cout << " " << " layers(" << " " << std::setw(16) << interface->getLayerTop() - << "," << std::setw(16) << interface->getLayerTop() << ")"; + << "," << std::setw(16) << interface->getLayerBottom() << ")"; } std::cout << std::endl; } @@ -121,28 +114,25 @@ void MultiLayer::print() /* ************************************************************************* */ void MultiLayer::addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness) { + Layer *p_new_layer = new Layer(layer); if (getNumberOfLayers()) { - //const Layer *p_last_layer = getLayer( getNumberOfLayers()-1 ); - const Layer *p_previous_layer = &m_layers[m_layers.size() -1 ]; - m_layers.push_back(layer); - const Layer *p_new_layer = &m_layers[m_layers.size() -1 ]; - std::cout << "XXX" << p_previous_layer << " " << p_new_layer << std::endl; - LayerInterface *interface = LayerInterface::createRoughInterface( p_previous_layer, p_new_layer, roughness); + const Layer *p_last_layer = m_layers.back(); + LayerInterface *interface = LayerInterface::createRoughInterface( p_last_layer, p_new_layer, roughness); + m_layers.push_back( p_new_layer ); m_interfaces.push_back(interface); m_layers_z.push_back(m_layers_z.back() - layer.getThickness() ); return; } - m_layers.push_back(layer); + m_layers.push_back(p_new_layer); m_layers_z.push_back(0.0); } -void MultiLayer::add(const ISample &p_child) +void MultiLayer::addLayer(const Layer &p_child) { - LayerRoughness defRough; - const Layer &layer = dynamic_cast<const Layer&>(p_child); - addLayerWithTopRoughness(layer, defRough); + const Layer &layer = dynamic_cast<const Layer &>(p_child); + addLayerWithTopRoughness(layer, LayerRoughness()); }