stfinvfinitecausal.h 4.54 KB
 thomas.forbriger committed Oct 23, 2015 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 /*! \file stfinvfinitecausal.h * \brief finite and causal stf by time-domain convolution (prototypes) * * ---------------------------------------------------------------------------- * * $Id:$ * \author Thomas Forbriger * \date 15/02/2014 * * finite and causal stf by time-domain convolution (prototypes) * * Copyright (c) 2014 by Thomas Forbriger (BFO Schiltach) * * REVISIONS and CHANGES * - 15/02/2014 V1.0 Thomas Forbriger * * ============================================================================ */ // include guard #ifndef STFINV_STFINVFINITECAUSAL_H_VERSION #define STFINV_STFINVFINITECAUSAL_H_VERSION \ "STFINV_STFINVFINITECAUSAL_H V1.0 " #define STFINV_STFINVFINITECAUSAL_H_CVSID \ "$Id:$" #include namespace stfinv { /*! \brief Engine to find a finite, causal source time-history in time domain * \ingroup engines * * \par Concept behin this engine * * - \f$d_l\f$: data samples * - \f$s_l\f$: raw synthetics * - \f$q_l\f$: source time-history to be derived * - \f$s^c_l=\sum\limits_k s_{(l-k)} q_k\f$: convolved synthetics * - \f$E=\sum\limits_l (d_l-s^c_l)^2\f$: misfit to be minized * * \f[ * \frac{\partial E}{\partial q_j} * =\frac{\partial}{\partial q_j} * \left(\sum\limits_l * \left(d_l-\sum\limits_k s_{(l-k)} q_k\right)^2\right) * = * \sum\limits_l * \frac{\partial}{\partial q_j} * \left(d_l-\sum\limits_k s_{(l-k)} q_k\right)^2 * = * -2 \sum\limits_l * s_{(l-j)} * \left(d_l-\sum\limits_k s_{(l-k)} q_k\right) * = * -2 \sum\limits_l * s_{(l-j)} d_l * +2 \sum\limits_l * s_{(l-j)} \sum\limits_k s_{(l-k)} q_k * \f] * * Least-squares condition: * \f[ * \frac{\partial E}{\partial q_j}\stackrel{!}{=}0,\quad \forall j * \f] * \f[ * \sum\limits_l s_{(l-j)} \sum\limits_k s_{(l-k)} q_k * = * \sum\limits_l s_{(l-j)} d_l ,\quad \forall j * \f] * * System of linear equations: * \f[ * \sum\limits_k * \underbrace{\left(\sum\limits_l s_{(l-j)} s_{(l-k)}\right)}_{=M_{jk}} * q_k = * \underbrace{\sum\limits_l s_{(l-j)} d_l}_{=r_j} * \f] * * Next: * - index range is defined on base of index range for data and desired * finite length of source time-history * - additional traces are to be added by adding further terms to the misfit * function, which results in further terms in the system of linear * equations. * These terms should be given appropriate weights * - data should be normalized, such that a misfit of 1 is meaningful; * this is easily done, by scaling all seismograms samples with the same * factor (data as well as synthetics) * - an additional constraint could be applied to the \f$q_l\f$ by adding a * term \f$\sum\limits_l\left(Q_l q_l\right)^2\f$ to the msifit \f$E\f$; * this will result in a simple additional term on the left-hand-side of * the system of linear equations; * a reasonable weight must be given to this term * * \todo * STFEngineTDCausalConvolution is a rudiment to be filled with reasonable * code. To date the source code file is used to develop the theory. */ class STFEngineFiniteCausal: public stfinv::STFBaseEngine { public: //! \brief typedef to refer to base class typedef stfinv::STFBaseEngine Tbase; //! \brief ID used to select thsi engine static const char* const ID; //! \brief short description of this engine static const char* const description; /*! \brief Constructor. */ STFEngineFiniteCausal(const stfinv::Tvectoroftriples& triples, const stfinv::Waveform& stf, const std::string& parameters) : Tbase(triples, stf, parameters), Mscaleenergy(false) { this->initialize(); } //! \brief abstract base requires virtual destructor virtual ~STFEngineFiniteCausal() { } //! \brief Start engine virtual void exec(); //! \brief print online help virtual void help(std::ostream& os=std::cout) const; //! \brief print online help static void classhelp(std::ostream& os=std::cout); //! \brief return name of engine virtual const char* name() const; private: //! \brief initialize work space void initialize(); // member data private: //! \brief scale energy bool Mscaleenergy; }; // class STFEngineFiniteCausal } #endif // STFINV_STFINVFINITECAUSAL_H_VERSION (includeguard) /* ----- END OF stfinvfinitecausal.h ----- */