diff --git a/common/wave/element.cpp b/common/wave/element.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fda4158851d5b4cad66517290087865cfbb54cbb --- /dev/null +++ b/common/wave/element.cpp @@ -0,0 +1,57 @@ +//GmshFWI Library +#include "element.h" + +/* +* WaveMultiField +*/ +template<Physic T_Physic> +void WaveMultiField<T_Physic>::initializeField(const WaveField<T_Physic>& field) +{ + _field = field; + for (auto it = _dofValues.begin(); it != _dofValues.end(); it++) + { + it->resize(_field.numberOfDofs()); + } + _isInitialized = true; +} + +template<Physic T_Physic> +const WaveField<T_Physic>& WaveMultiField<T_Physic>::operator[](const unsigned int index) const +{ + _field.setAllVector(_dofValues[index], gmshfem::dofs::RawOrder::Hash); + return _field; +} + +template<Physic T_Physic> +void WaveMultiField<T_Physic>::setValues(const unsigned int index, gmshfem::algebra::Vector< std::complex< double > > &vector) +{ + _dofValues[index] = std::move(vector); +} + +template<Physic T_Physic> +void WaveMultiField<T_Physic>::write(std::string name) const +{ + for (unsigned int s = 0; s < size(); s++) + { + (*this)[s].write(name+"s"+std::to_string(s)); + } +} + +/* +* WaveAuxilaryField +*/ +template<Physic T_Physic> +void WaveAuxilaryField<T_Physic>::assignValues(const std::vector< std::complex<double> > &values) +{ + unsigned int i = 0; + for(auto it = _wmf->_field.begin(); it != _wmf->_field.end(); it++) + { + if(it->first->type() == gmshfem::dofs::Type::Unknown) + { + _wmf->_dofValues[_index][i++] = values[it->first->numDof() - 1]; + } + } +} + +template class WaveMultiField<Physic::acoustic>; +template class WaveAuxilaryField<Physic::acoustic>; diff --git a/common/wave/element.h b/common/wave/element.h index e69260daa5b271a2ff1bb71016ac42eaea033d65..1529b438439dd8058a63a616e8eb69b1213331ad 100644 --- a/common/wave/element.h +++ b/common/wave/element.h @@ -6,70 +6,34 @@ #include "../../specific/wave/element.h" #include "../configuration.h" +//Forward declaration +template<Physic T_Physic> class WaveAuxilaryField; + /* * WaveMultiField */ template<Physic T_Physic> class WaveMultiField { -public: +private: mutable WaveField<T_Physic> _field; bool _isInitialized; std::vector< gmshfem::algebra::Vector< std::complex< double > > > _dofValues; +public: WaveMultiField(unsigned int n) : _field(), _isInitialized(false), _dofValues(n) {}; - void setField(const WaveField<T_Physic>& field) - { - _field = field; - for (auto it = _dofValues.begin(); it != _dofValues.end(); it++) - { - it->resize(_field.numberOfDofs()); - } - _isInitialized = true; - }; - + void initializeField(const WaveField<T_Physic>& field); bool isInitialized() const {return _isInitialized;}; - unsigned int size() const - { - return _dofValues.size(); - } + unsigned int size() const {return _dofValues.size();}; - const WaveField<T_Physic> &operator[](const unsigned int index) const - { - _field.setAllVector(_dofValues[index], gmshfem::dofs::RawOrder::Hash); - return _field; - } + const WaveField<T_Physic> &operator[](const unsigned int index) const; - /* - void setDofs(const std::vector< gmshfem::dofs::RawDof > &dofs) - { - _field->setAllDofVector(dofs, false); - } - */ + void setValues(const unsigned int index, gmshfem::algebra::Vector< std::complex< double > > &vector); - void setValues(const unsigned int index, gmshfem::algebra::Vector< std::complex< double > > &vector) - { - _dofValues[index] = std::move(vector); - } -/* - std::vector< gmshfem::algebra::Vector< std::complex< double > > >::const_iterator begin() const - { - return _dofValues.begin(); - } + void write(std::string name) const; - std::vector< gmshfem::algebra::Vector< std::complex< double > > >::const_iterator end() const - { - return _dofValues.end(); - } -*/ - void write(std::string name) const - { - for (unsigned int s = 0; s < size(); s++) - { - (*this)[s].write(name+"s"+std::to_string(s)); - } - }; + friend class WaveAuxilaryField<T_Physic>; }; /* @@ -85,17 +49,8 @@ public: WaveAuxilaryField(std::string name, gmshfem::domain::Domain domain, std::string gmodel, const wave::Discretization<T_Physic>& w_discret): WaveField<T_Physic>(name,domain,gmodel,w_discret), _wmf(nullptr), _index(0) {}; void setField(WaveMultiField<T_Physic>* wmf){_wmf=wmf;}; void setIndex(unsigned int index){_index=index;}; - virtual void assignValues(const std::vector< std::complex<double> > &values) override - { - unsigned int i = 0; - for(auto it = _wmf->_field.begin(); it != _wmf->_field.end(); it++) - { - if(it->first->type() == gmshfem::dofs::Type::Unknown) - { - _wmf->_dofValues[_index][i++] = values[it->first->numDof() - 1]; - } - } - }; + virtual void assignValues(const std::vector< std::complex<double> > &values) override; }; + #endif // H_COMMON_WAVE_ELEMENT diff --git a/common/wave/equation/equation.cpp b/common/wave/equation/equation.cpp index dd52426c0d171c2d86c09ea361728501c8f5cda4..94001d558ba83265470215814197078ef535ed29 100644 --- a/common/wave/equation/equation.cpp +++ b/common/wave/equation/equation.cpp @@ -104,7 +104,7 @@ DifferentialEquationInterface<T_Physic>::updateWithSystem(WaveMultiField<T_Physi _formulation.removeTerms(); } - if(!output.isInitialized()){output.setField(_v);}; + if(!output.isInitialized()){output.initializeField(_v);}; _v.setField(&output); for (unsigned int s = 0; s < _config->ns(); s++) @@ -178,31 +178,33 @@ const WaveField<T_Physic>& DifferentialEquationInterface<T_Physic>::updateWithGr template<Physic T_Physic> void DifferentialEquationInterface<T_Physic>::updateGreen(const ModelStateEvaluator& m, const std::vector<unsigned int>& p_idx) { -// if(!_systemIsUpToDate) -// { -// _formulation.removeSystem(); -// _formulation.initSystem(); -// -// _systemIsFactorized=false; -// setLHS(m); -// _formulation.pre(); -// _formulation.assemble(); -// _systemIsUpToDate=true; -// _formulation.removeTerms(); -// } -// -// for (auto it = p_idx.begin(); it != p_idx.end(); it++) -// { -// setGreenRHS(*it); -// _formulation.assemble(); -// _formulation.removeTerms(); -// -// _formulation.solve(_systemIsFactorized); -// _systemIsFactorized=true; -// _formulation.setRHSToZero(); -// _g[*it] = _v; -// //_v.getVector(_dofg[*it]); -// } + if(!_systemIsUpToDate) + { + _formulation.removeSystem(); + _formulation.initSystem(); + + _systemIsFactorized=false; + setLHS(m); + _formulation.pre(); + _formulation.assemble(); + _systemIsUpToDate=true; + _formulation.removeTerms(); + } + + if(!_g.isInitialized()){_g.initializeField(_v);}; + _v.setField(&_g); + + for (auto it = p_idx.begin(); it != p_idx.end(); it++) + { + _v.setIndex(*it); + setGreenRHS(*it); + _formulation.assemble(); + _formulation.removeTerms(); + + _formulation.solve(_systemIsFactorized); + _systemIsFactorized=true; + _formulation.setRHSToZero(); + } } template<Physic T_Physic>