diff --git a/common/sensitivity/state.h b/common/sensitivity/state.h index ddf4a1bc1c23bcc2ef859379c96de97b0645fcfc..7d0221700dfc0434b5d6e96c72c6ad430476d832 100644 --- a/common/sensitivity/state.h +++ b/common/sensitivity/state.h @@ -1,11 +1,13 @@ #ifndef H_COMMON_SENSITIVITY_STATE #define H_COMMON_SENSITIVITY_STATE +//Standerd Library +#include <array> + //GmshFWI Library #include "element.h" #include "../enum.h" -#include <array> /* * SensitivityStateEvaluator diff --git a/common/wave/element.h b/common/wave/element.h index 4613bae011df52d134ce5b8559ac57f4f418adea..e69260daa5b271a2ff1bb71016ac42eaea033d65 100644 --- a/common/wave/element.h +++ b/common/wave/element.h @@ -13,48 +13,88 @@ template<Physic T_Physic> class WaveMultiField { public: - mutable WaveField<T_Physic> *_field; + mutable WaveField<T_Physic> _field; + bool _isInitialized; std::vector< gmshfem::algebra::Vector< std::complex< double > > > _dofValues; - WaveMultiField(unsigned int n,const WaveField<T_Physic>& other) : _field(), _dofValues(n) {}; - + 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; + }; + + bool isInitialized() const {return _isInitialized;}; + 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; + _field.setAllVector(_dofValues[index], gmshfem::dofs::RawOrder::Hash); + return _field; } - - void setDofs(const std::vector< gmshfem::dofs::RawDof > &dofs) + + /* + 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) { _dofValues[index] = std::move(vector); } - +/* std::vector< gmshfem::algebra::Vector< std::complex< double > > >::const_iterator begin() const { return _dofValues.begin(); } - + std::vector< gmshfem::algebra::Vector< std::complex< double > > >::const_iterator end() const { return _dofValues.end(); } - +*/ void write(std::string name) const { -// unsigned int s = 0; -// for (auto it = this->begin(); it != this->end(); it++) -// { -// it->write(name+"s"+std::to_string(s++)); -// } + for (unsigned int s = 0; s < size(); s++) + { + (*this)[s].write(name+"s"+std::to_string(s)); + } + }; +}; + +/* +* WaveAuxilaryField +*/ +template<Physic T_Physic> +class WaveAuxilaryField : public WaveField<T_Physic> +{ +private: + WaveMultiField<T_Physic>* _wmf; + unsigned int _index; +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]; + } + } }; }; diff --git a/common/wave/equation/equation.cpp b/common/wave/equation/equation.cpp index ac10edc4441fb05f474cfd9dcab9ad3e3d8a4b35..dd52426c0d171c2d86c09ea361728501c8f5cda4 100644 --- a/common/wave/equation/equation.cpp +++ b/common/wave/equation/equation.cpp @@ -68,22 +68,28 @@ std::complex<double> EquationInterface<T_Physic>::directional(const Sensitivity& */ template<Physic T_Physic> DifferentialEquationInterface<T_Physic>::DifferentialEquationInterface(const ConfigurationInterface* const config, const wave::Discretization<T_Physic>& w_discret, const GmshFem& gmshFem, std::string suffix) -: EquationInterface<T_Physic>(config, gmshFem, suffix), _w_discret(w_discret), _v("_v",_config->wave_evaldomain(),_config->wave_gmodel(),_w_discret),_g(_config->np(),_v),/* _dofg(_config->np(),gmshfem::algebra::Vector<std::complex<double>>()),*/_geAreUpToDate(false),_grAreUpToDate(false), _formulation("wave_formulation"),_systemIsUpToDate(false),_systemIsFactorized(false) +: EquationInterface<T_Physic>(config, gmshFem, suffix), _w_discret(w_discret), _v("_v",_config->wave_evaldomain(),_config->wave_gmodel(),_w_discret),_g(_config->np()),/* _dofg(_config->np(),gmshfem::algebra::Vector<std::complex<double>>()),*/_geAreUpToDate(false),_grAreUpToDate(false), _formulation("wave_formulation"),_systemIsUpToDate(false),_systemIsFactorized(false) { + /* unsigned int useGreen_buffer = 0; gmshFem.userDefinedParameter(useGreen_buffer,"useGreen"); _useGreen = ((bool) useGreen_buffer); + */ } template<Physic T_Physic> -const WaveField<T_Physic>& DifferentialEquationInterface<T_Physic>::update_wave(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& d, const ModelStateEvaluator& m, const WaveStateEvaluator<T_Physic>& w) +void DifferentialEquationInterface<T_Physic>::update_wave(WaveMultiField<T_Physic>& output, Type type, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) { + /* if(_useGreen){return updateWithGreen(type,s,d,m,w);} else {return updateWithSystem(type,s,d,m,w);} + */ + updateWithSystem(output,type,ds,ms,ws); } template<Physic T_Physic> -const WaveField<T_Physic>& DifferentialEquationInterface<T_Physic>::updateWithSystem(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& d, const ModelStateEvaluator& m, const WaveStateEvaluator<T_Physic>& w) +void +DifferentialEquationInterface<T_Physic>::updateWithSystem(WaveMultiField<T_Physic>& output, Type type, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) { if(!_systemIsUpToDate) { @@ -91,22 +97,27 @@ const WaveField<T_Physic>& DifferentialEquationInterface<T_Physic>::updateWithSy _formulation.initSystem(); _systemIsFactorized=false; - setLHS(m); + setLHS(ms); _formulation.pre(); _formulation.assemble(); _systemIsUpToDate=true; _formulation.removeTerms(); } - setRHS(type,s,d,m,w); - _formulation.assemble(); - _formulation.removeTerms(); + if(!output.isInitialized()){output.setField(_v);}; + _v.setField(&output); - _formulation.solve(_systemIsFactorized); - _systemIsFactorized=true; - _formulation.setRHSToZero(); + for (unsigned int s = 0; s < _config->ns(); s++) + { + _v.setIndex(s); + setRHS(type,s,ds,ms,ws); + _formulation.assemble(); + _formulation.removeTerms(); - return _v; + _formulation.solve(_systemIsFactorized); + _systemIsFactorized=true; + _formulation.setRHSToZero(); + } } /* @@ -136,7 +147,7 @@ multiplyAddAssignementEmitters(algebra::Vector<std::complex<double>>& dofv, cons } } */ - +/* template<Physic T_Physic> const WaveField<T_Physic>& DifferentialEquationInterface<T_Physic>::updateWithGreen(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& d, const ModelStateEvaluator& m, const WaveStateEvaluator<T_Physic>& w) { @@ -146,28 +157,24 @@ const WaveField<T_Physic>& DifferentialEquationInterface<T_Physic>::updateWithGr case Type::F: { if(!_geAreUpToDate){updateGreenEmitter(m);} - /* - algebra::Vector<std::complex<double>> _dofv(_v.size()); - multiplyAddAssignementEmitters(_dofv,_dofg,_config,s); - _v.setVector(_dofv); - */ + //algebra::Vector<std::complex<double>> _dofv(_v.size()); + //multiplyAddAssignementEmitters(_dofv,_dofg,_config,s); + //_v.setVector(_dofv); return _v; } case Type::A: { if(!_grAreUpToDate){updateGreenReceiver(m);} - /* - algebra::Vector<std::complex<double>> _dofv(_v.size()); - multiplyAddAssignementReceivers(_dofv,_dofg,d.state(Type::A),_config,s); - _v.setVector(_dofv); - */ + //algebra::Vector<std::complex<double>> _dofv(_v.size()); + //multiplyAddAssignementReceivers(_dofv,_dofg,d.state(Type::A),_config,s); + //_v.setVector(_dofv); return _v; } case Type::PF: case Type::PA: default: return updateWithSystem(type,s,d,m,w); } } - +*/ template<Physic T_Physic> void DifferentialEquationInterface<T_Physic>::updateGreen(const ModelStateEvaluator& m, const std::vector<unsigned int>& p_idx) { @@ -276,10 +283,11 @@ ParametrizedEquation<T_Physic>::ParametrizedEquation(const ConfigurationInterfac //Wave related template<Physic T_Physic> -const WaveField<T_Physic>& ParametrizedEquation<T_Physic>::update_wave(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) +void +ParametrizedEquation<T_Physic>::update_wave(WaveMultiField<T_Physic>& output, Type type, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) { update_model(ms); - return _equation->update_wave(type,s,ds,_msc,ws); + _equation->update_wave(output,type,ds,_msc,ws); } //Model/sensitivity related diff --git a/common/wave/equation/equation.h b/common/wave/equation/equation.h index b49264f9b1760154310e670ba6261fb946c6d62a..90ac03c5ad3299808712df818c773a2b7d7756f4 100644 --- a/common/wave/equation/equation.h +++ b/common/wave/equation/equation.h @@ -34,7 +34,7 @@ public: virtual bool compatible(const ParametrizationInterface* const parametrization) const = 0; //Wave related - virtual const WaveField<T_Physic>& update_wave(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) = 0; + virtual void update_wave(WaveMultiField<T_Physic>& output, Type type, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) = 0; //Model/sensitivity related virtual Sensitivity update_sensitivity(Order order, Support support, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) = 0; @@ -55,9 +55,9 @@ protected: using EquationInterface<T_Physic>::_config; const wave::Discretization<T_Physic> _w_discret; - WaveField<T_Physic> _v; + WaveAuxilaryField<T_Physic> _v; - bool _useGreen; + //bool _useGreen; WaveMultiField<T_Physic> _g; //std::vector< gmshfem::algebra::Vector<std::complex<double>> > _dofg; bool _geAreUpToDate; @@ -70,12 +70,12 @@ public: DifferentialEquationInterface(const ConfigurationInterface* const config, const wave::Discretization<T_Physic>& w_discret, const gmshfem::common::GmshFem& gmshFem,std::string suffix = ""); //Wave related - virtual const WaveField<T_Physic>& update_wave(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& d, const ModelStateEvaluator& m, const WaveStateEvaluator<T_Physic>& w); + virtual void update_wave(WaveMultiField<T_Physic>& output, Type type, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws); bool modelIsObsolete() override;//Returns true, if sensitivity[DIAG] depends on model protected: - const WaveField<T_Physic>& updateWithSystem(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws); - const WaveField<T_Physic>& updateWithGreen(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws); + void updateWithSystem(WaveMultiField<T_Physic>& output, Type type, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws); + //const WaveField<T_Physic>& updateWithGreen(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws); virtual void setLHS(const ModelStateEvaluator& m) = 0; virtual void setRHS(Type type,unsigned int s, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws) = 0; @@ -124,7 +124,7 @@ public: virtual bool compatible(const ParametrizationInterface* const parametrization) const {return false;}; //Wave related - virtual const WaveField<T_Physic>& update_wave(Type type, unsigned int s, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws); + virtual void update_wave(WaveMultiField<T_Physic>& output, Type type, const DataStateEvaluator<T_Physic>& ds, const ModelStateEvaluator& ms, const WaveStateEvaluator<T_Physic>& ws); //Model/sensitivity related void update_model(const ModelStateEvaluator& ms); diff --git a/common/wave/state.h b/common/wave/state.h index 7cebb3a5d813d4bc480acd7da8fbcc1aaee885a1..8a9506c93798eb0d13aa49dad4e277c1281c7d42 100644 --- a/common/wave/state.h +++ b/common/wave/state.h @@ -37,10 +37,10 @@ private: public: WaveState(const ConfigurationInterface* const config): _state{ - WaveMultiField<T_Physic>(config->ns(),WaveField<T_Physic>()), - WaveMultiField<T_Physic>(config->ns(),WaveField<T_Physic>()), - WaveMultiField<T_Physic>(config->ns(),WaveField<T_Physic>()), - WaveMultiField<T_Physic>(config->ns(),WaveField<T_Physic>()) + WaveMultiField<T_Physic>(config->ns()), + WaveMultiField<T_Physic>(config->ns()), + WaveMultiField<T_Physic>(config->ns()), + WaveMultiField<T_Physic>(config->ns()) }, _isUpToDate{false,false,false,false} {}; virtual const WaveMultiField<T_Physic>& state(Type type) const; diff --git a/common/wave/updater.cpp b/common/wave/updater.cpp index 2eaacdb85c5561a6e8a477ea1a941a6c79d89710..ef3abeeb0cf0cf20bf68c815f0de29be5613be94 100644 --- a/common/wave/updater.cpp +++ b/common/wave/updater.cpp @@ -36,27 +36,12 @@ void WaveUpdater<T_Physic>::update(Type type, const ModelStateEvaluator& m) break; } - unsigned int s = 0; - for (auto it = _ws._state[type].begin(); it != _ws._state[type].end(); it++) + if( (_du==nullptr) && (type != Type::F) ) { - if( (_du==nullptr) && (type != Type::F) ) - { - throw Exception("Wave updater can only update forward state when no data updater is provided (_du = nullptr)"); - } - WaveField<T_Physic> &wfield = const_cast< WaveField<T_Physic> & >(_equation->update_wave(type,s,_du->get(dataNeedToBeUpToDate,m),m,_ws)); - if(s == 0) { - _ws._state[type]._field = &wfield; -// std::vector< gmshfem::dofs::RawDof > dofs; -// wfield.getAllDofVector(dofs); -// _ws._state[type].setDofs(dofs); - } - - gmshfem::algebra::Vector< std::complex< double > > vector; - wfield.getAllVector(vector, gmshfem::dofs::RawOrder::Hash); - _ws._state[type].setValues(s, vector); - - s++; + throw Exception("Wave updater can only update forward state when no data updater is provided (_du = nullptr)"); } + + _equation->update_wave(_ws._state[type],type,_du->get(dataNeedToBeUpToDate,m),m,_ws); _ws._isUpToDate[type] = true; }