...
 
Commits (48)
this is <README>
============================================================================
AFF --- A container for numbers
-------------------------------
$Id$
============================================================================
For compilation instructions see README.1st in the root directory of the tar-ball or
http://gpitrsvn.gpi.uni-karlsruhe.de:8000/TFSoftware/wiki/docs/installation
This software is part of the project Seitosh. See README.1st in the root
directory of the collection or https://git.scc.kit.edu/Seitosh/Seitosh for
general installation instructions.
The AFF (Array of Friederich and Forbriger) is a lightweight class library. It
offers a simple and easy to use container for numbers as is necessary in
......
this is <COPYING>
============================================================================
libfourier
----------
$Id$
============================================================================
Copyright (c) 2002, 2013 by Thomas Forbriger
......
# this is <Makefile>
# ----------------------------------------------------------------------------
# $Id$
#
# Copyright (c) 2002 by Thomas Forbriger (IMG Frankfurt)
#
......@@ -76,6 +75,8 @@ $(LOCLIBDIR)/%: install-include %
#----------------------------------------------------------------------
DOXYTXT=$(wildcard doxygen*txt)
flist: Makefile $(wildcard *.f *.inc *.h *.cc *.c README *.cfg) COPYING \
$(DOXYTXT)
echo $^ | tr ' ' '\n' | sort > $@
......
this is <README>
============================================================================
FOURIER --- Fourier coefficients library
-------------------------------
$Id$
============================================================================
For compilation instructions see README.1st in the root directory of the tar-ball or
http://gpitrsvn.gpi.uni-karlsruhe.de:8000/TFSoftware/wiki/docs/installation
This software is part of the project Seitosh. See README.1st in the root
directory of the collection or https://git.scc.kit.edu/Seitosh/Seitosh for
general installation instructions.
The library provides modules to perform Fourier transformations and to
operate on Fourier transforms.An interface to FFTW is available.Signal
......
......@@ -3,8 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
*
* ----
* libfourier is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -41,8 +39,6 @@
*/
#define TF_CFFTWTEST_C_VERSION \
"TF_CFFTWTEST_C V1.0 "
#define TF_CFFTWTEST_C_CVSID \
"$Id$"
#include<drfftw.h>
#include<stdio.h>
......@@ -105,7 +101,6 @@ void process(int n, int m)
int main()
{
printf("%s\n", TF_CFFTWTEST_C_VERSION);
printf("%s\n", TF_CFFTWTEST_C_CVSID);
/*
* the code provided in the tutorial for rfftw_one produces segmentation
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 16/05/2011
*
......@@ -37,8 +36,6 @@
*/
#define CXXFFTWARTEST_VERSION \
"CXXFFTWARTEST V1.2 test fftw3 array engine"
#define CXXFFTWARTEST_CVSID \
"$Id$"
// use the input/output facilities from the standard library
#include <iostream>
......@@ -140,7 +137,6 @@ int main(int iargc, char* argv[])
// define full help text
char help_text[]=
{
CXXFFTWARTEST_CVSID
"\n"
"input input file name\n"
"output output file name\n"
......@@ -218,7 +214,7 @@ int main(int iargc, char* argv[])
// report program version if in verbose mode
if (opt.verbose)
{ cout << CXXFFTWARTEST_VERSION << endl << CXXFFTWARTEST_CVSID << endl; }
{ cout << CXXFFTWARTEST_VERSION << endl; }
// extract commandline arguments
// here the rest of the command line is parsed; i.e. the names of input
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 12/09/2007
*
......@@ -35,8 +34,6 @@
*/
#define CXXFFTWTEST_VERSION \
"CXXFFTWTEST V1.1 a small test program for fftw when called from C++"
#define CXXFFTWTEST_CVSID \
"$Id$"
#include <iostream>
#include <tfxx/commandline.h>
......@@ -123,7 +120,6 @@ int main(int iargc, char* argv[])
// define full help text
char help_text[]=
{
CXXFFTWTEST_CVSID
"\n"
"-n n set number of samples to n\n"
"-m f set frequency to f\n"
......
......@@ -2,8 +2,6 @@
* \brief C++ library to operate on Fourier transforms (libfourierxx)
*
* ----------------------------------------------------------------------------
*
* $Id$
*
* Copyright (c) 2002 by Thomas Forbriger (IMG Frankfurt)
*
......@@ -34,8 +32,6 @@
/*! \mainpage
\author Thomas Forbriger
\since 2002
\date $Date$
\version $Id$
The library provides modules to perform Fourier transformations and to operate
on Fourier transforms.
......@@ -128,6 +124,14 @@ Further stuff will be collected in this library in the future.
* integral transform, where
* \f$\Delta\omega=2\pi/T\f$ and \f$T=N\Delta t\f$.
*
* The library provides functions which return the appropriate scaling factors
* such that application of a inverse transformation in sequence with a
* forward transformation is an identity-operation.
*
* \sa fourier::fft::DRFFTWAFFArrayEngine::scale_series,
* fourier::fft::DRFFTWAFFArrayEngine::scale_spectrum,
* fourier::fft::DRFFTWAFF::scale_series,
* fourier::fft::DRFFTWAFF::scale_spectrum
*/
// ----- END OF doxygen.txt -----
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 11/09/2007
*
......@@ -35,8 +34,6 @@
*/
#define FOURIER_ERROR_CC_VERSION \
"FOURIER_ERROR_CC V1.1"
#define FOURIER_ERROR_CC_CVSID \
"$Id$"
#include <iostream>
#include <fourier/error.h>
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 11/09/2007
*
......@@ -39,8 +38,6 @@
#define FOURIER_ERROR_H_VERSION \
"FOURIER_ERROR_H V1.0"
#define FOURIER_ERROR_H_CVSID \
"$Id$"
namespace fourier {
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 05/01/2003
*
......@@ -35,8 +34,6 @@
*/
#define TF_FCOMMAND_CC_VERSION \
"TF_FCOMMAND_CC V1.0 "
#define TF_FCOMMAND_CC_CVSID \
"$Id$"
#include <fourier/fcommand.h>
#include <fstream>
......@@ -79,11 +76,8 @@ namespace fourier {
{
os << endl;
os << TF_FCOMMAND_H_VERSION << endl;
os << TF_FCOMMAND_H_CVSID << endl;
os << TF_FILTERS_H_VERSION << endl;
os << TF_FILTERS_H_CVSID << endl;
os << TF_POLESNZEROES_H_VERSION << endl;
os << TF_POLESNZEROES_H_CVSID << endl;
}
}
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 05/01/2003
*
......@@ -39,8 +38,6 @@
#define TF_FCOMMAND_H_VERSION \
"TF_FCOMMAND_H V1.0 "
#define TF_FCOMMAND_H_CVSID \
"$Id$"
#include<iostream>
#include<fourier/filters.h>
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 11/07/2006
*
......@@ -42,8 +41,6 @@
*/
#define TF_FFTWAFF_CC_VERSION \
"TF_FFTWAFF_CC V1.4"
#define TF_FFTWAFF_CC_CVSID \
"$Id$"
#include <iostream>
#include <fourier/fftwaff.h>
......@@ -308,7 +305,15 @@ namespace fourier {
/*----------------------------------------------------------------------*/
//! Return appropriate scaling factor for sampling interval dt.
/*! \brief Return appropriate scaling factor for sampling interval dt.
*
* Factor to be applied when transforming to time domain.
*
* \param[in] dt sampling interval
* \return scalar factor to be applied to all samples
*
* \sa \ref sec_fftw3_integral_transform
*/
DRFFTWAFF::Tsample DRFFTWAFF::scale_series(const Tsample& dt) const
{
return(1./(Msize*dt));
......@@ -316,7 +321,15 @@ namespace fourier {
/*----------------------------------------------------------------------*/
//! Return appropriate scaling factor for sampling interval dt.
/*! \brief Return appropriate scaling factor for sampling interval dt.
*
* Factor to be applied when transforming to Fourier domain.
*
* \param[in] dt sampling interval
* \return scalar factor to be applied to all samples
*
* \sa \ref sec_fftw3_integral_transform
*/
DRFFTWAFF::Tsample DRFFTWAFF::scale_spectrum(const Tsample& dt) const
{
return(dt);
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 11/07/2006
*
......@@ -75,8 +74,6 @@
#define TF_FFTWAFF_H_VERSION \
"TF_FFTWAFF_H V1.3"
#define TF_FFTWAFF_H_CVSID \
"$Id$"
#include<complex>
#ifdef FFTWFALLBACK
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 13/05/2011
*
......@@ -37,8 +36,6 @@
*/
#define TF_FFTWAFFAR_CC_VERSION \
"TF_FFTWAFFAR_CC V1.1"
#define TF_FFTWAFFAR_CC_CVSID \
"$Id$"
#include <iostream>
#include <fourier/fftwaffar.h>
......@@ -253,7 +250,15 @@ namespace fourier {
/*----------------------------------------------------------------------*/
//! Return appropriate scaling factor for sampling interval dt.
/*! \brief Return appropriate scaling factor for sampling interval dt.
*
* Factor to be applied when transforming to time domain.
*
* \param[in] dt sampling interval
* \return scalar factor to be applied to all samples
*
* \sa \ref sec_fftw3_integral_transform
*/
DRFFTWAFFArrayEngine::Tsample
DRFFTWAFFArrayEngine::scale_series(const Tsample& dt) const
{
......@@ -262,7 +267,15 @@ namespace fourier {
/*----------------------------------------------------------------------*/
//! Return appropriate scaling factor for sampling interval dt.
/*! \brief Return appropriate scaling factor for sampling interval dt.
*
* Factor to be applied when transforming to Fourier domain.
*
* \param[in] dt sampling interval
* \return scalar factor to be applied to all samples
*
* \sa \ref sec_fftw3_integral_transform
*/
DRFFTWAFFArrayEngine::Tsample
DRFFTWAFFArrayEngine::scale_spectrum(const Tsample& dt) const
{
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 13/05/2011
*
......@@ -44,8 +43,6 @@
#define TF_FFTWAFFAR_H_VERSION \
"TF_FFTWAFFAR_H V1.2"
#define TF_FFTWAFFAR_H_CVSID \
"$Id$"
#include<complex>
#include<fftw3.h>
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 05/01/2003
*
......@@ -34,16 +33,15 @@
* ============================================================================
*/
#define TF_FILTER_CC_VERSION \
"TF_FILTER_CC V1.0 "
#define TF_FILTER_CC_CVSID \
"$Id$"
"TF_FILTER_CC V1.0"
#include <fourier/filters.h>
#include <fourier/error.h>
#include <cmath>
namespace fourier {
const double Filter::pi;
const double Filter::pi=M_PI;
const Filter::Tcvalue Filter::ime=Tcvalue(0.,1.);
/*----------------------------------------------------------------------*/
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 05/01/2003
*
......@@ -40,9 +39,7 @@
#ifndef TF_FILTERS_H_VERSION
#define TF_FILTERS_H_VERSION \
"TF_FILTERS_H V1.0 "
#define TF_FILTERS_H_CVSID \
"$Id$"
"TF_FILTERS_H V1.0"
#include<fourier/polesnzeroes.h>
......@@ -53,7 +50,7 @@ namespace fourier {
typedef PolesNZeroes Tbase;
typedef Tbase::Tcvalue Tcvalue;
static const double pi=3.141592653589793;
static const double pi;
static const Tcvalue ime;
Filter(): Tbase(), Mfrequency(false) { }
......
c this is <filters.inc>
c ----------------------------------------------------------------------------
c ($Id$)
c
c Copyright (c) 2002 by Thomas Forbriger (IMG Frankfurt)
c
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 05/01/2003
*
......@@ -34,8 +33,6 @@
*/
#define TF_POLESNZEROES_CC_VERSION \
"TF_POLESNZEROES_CC V1.0 "
#define TF_POLESNZEROES_CC_CVSID \
"$Id$"
#include <fourier/polesnzeroes.h>
......
......@@ -3,7 +3,6 @@
*
* ----------------------------------------------------------------------------
*
* $Id$
* \author Thomas Forbriger
* \date 05/01/2003
*
......@@ -38,8 +37,6 @@
#define TF_POLESNZEROES_H_VERSION \
"TF_POLESNZEROES_H V1.0 "
#define TF_POLESNZEROES_H_CVSID \
"$Id$"
#include<cmath>
#include<complex>
......
c this is <polesnzeros.inc>
cS
c ----------------------------------------------------------------------------
c ($Id$)
c
c Copyright (c) 2002 by Thomas Forbriger (IMG Frankfurt)
c
......
this is <README>
============================================================================
SEIFE --- seismic waveform filters
----------------------------------
$Id$
============================================================================
For compilation instructions see README.1st in the root directory of the tar-ball or
http://gpitrsvn.gpi.uni-karlsruhe.de:8000/TFSoftware/wiki/docs/installation
For compilation instructions see README.1st in the root directory.
libseife is a collection of Fortran 77 functions and subroutines for time
series analysis and digital filters. It is a full-grown signal processing
......@@ -37,5 +34,15 @@ Dependencies
external dependencies: -
internal dependencies: -
Arrays in C version
-------------------
The proper definition of arrays and parameters to be passed to the C-API of
libseife becomes obvious in function seife_first, which is defined in cseife.c
A call
seife_first(x, n);
will address elements x[0] to x[n-1] in C-array x.
----- END OF README -----
......@@ -70,7 +70,7 @@ documentation.
User documentation
------------------
The theory behind the Fourier domain least squares engine is outlined by
The theory behind the Fourier domain least squares procedure is outlined by
Lisa Groos (2013, Appendix F, page 146). She also describes a way to find an
approrpiate water level by application of the L-curve criterion (Groos, 2013,
Appendix G, page 148).
......@@ -87,6 +87,9 @@ tests/onlinehelp Provides access to these texts. Just issue
to get access.
A toy example and a step-by-step introduction are provided in subdirectory
src/ts/wf/testcases in README.soutifu
A short descrpition of the library and the accompanying program soutifu is
provided on the OpenTOAST web-page:
http://www.opentoast.de/Data_analysis_code_soutifu_and_libstfinv.php
......
......@@ -40,7 +40,7 @@
"STFINV_DEBUG_H V1.0"
/*! \brief produce debug output
* \ingroup misc_h
* \ingroup group_debug
*
* \param C output will be generated if C == true
* \param N name of function
......@@ -54,8 +54,15 @@
std::cerr.flush(); \
}
/*! \brief report value in a sequence of output operators
* \ingroup group_debug
*
* \param P parameter to dump
*/
#define STFINV_value( P ) #P << "=" << P
/*! \brief report value of expression
* \ingroup misc_h
* \ingroup group_debug
*
* \param P parameter to dump
*/
......
......@@ -104,7 +104,7 @@ processing are described in the \ref page_help.
/*! \brief Engines implemented in libstfinv
\defgroup engines Engines
\defgroup group_engines Engines
\todo
A detailed description for implementers is still missing
......@@ -116,7 +116,7 @@ processing are described in the \ref page_help.
/*! \brief Tools and utilities used by the libstfinv engines
\defgroup tools Internal tools and utilities
\defgroup group_tools Internal tools and utilities
\todo
A detailed description for implementers is still missing
......@@ -136,4 +136,18 @@ processing are described in the \ref page_help.
\date 04.10.2015
*/
/*======================================================================*/
/*! \brief Debug tools
\defgroup group_debug Debugging module
\todo
Selection of debug statements in most parts of the code is done by bits in
the value of the debug variable. E.g∵ The value 16 (bit 4) selects debugging
of the taper function. This is not yet properly documented.
\date 04.10.2015
*/
// ----- END OF doxygen.txt -----
......@@ -94,9 +94,9 @@
Programs using this library will require the following libraries in
addition:
- libfourierxx (available from TFSoftware)
- libfourierxx (available from Seitosh)
- libfftw3
- libaff (available from TFSoftware)
- libaff (available from Seitosh)
C programs will further be required to link against
......
......@@ -29,11 +29,12 @@
*
* REVISIONS and CHANGES
* - 06/05/2011 V1.0 Thomas Forbriger
* - 18/01/2016 V1.1 rename function to secomtospace
*
* ============================================================================
*/
#define STFINV_PARAMETERHANDLER_CC_VERSION \
"STFINV_PARAMETERHANDLER_CC V1.0"
"STFINV_PARAMETERHANDLER_CC V1.1"
#include <algorithm>
#include <stfinv/parameterhandler.h>
......@@ -50,7 +51,7 @@ std::string stfinv::tools::clipstring(std::string& s, const std::string& delim)
s.erase();
}
return(result);
} // std::string stfinv::tools::clipstring^
} // std::string stfinv::tools::clipstring()
/*----------------------------------------------------------------------*/
......@@ -71,11 +72,12 @@ stfinv::tools::Tparamap stfinv::tools::makeparamap(const std::string& p,
/*----------------------------------------------------------------------*/
std::string stfinv::tools::commatospace(std::string s)
std::string stfinv::tools::secomtospace(std::string s)
{
std::replace(s.begin(), s.end(), ',', ' ');
std::replace(s.begin(), s.end(), ';', ' ');
return(s);
} // std::string stfinv::tools::commatospace(const std::string& s)
} // std::string stfinv::tools::secomtospace(const std::string& s)
/*----------------------------------------------------------------------*/
......
......@@ -29,6 +29,7 @@
*
* REVISIONS and CHANGES
* - 06/05/2011 V1.0 Thomas Forbriger
* - 18/01/2016 V1.1 rename function to secomtospace
*
* ============================================================================
*/
......@@ -37,7 +38,7 @@
#ifndef STFINV_PARAMETERHANDLER_H_VERSION
#define STFINV_PARAMETERHANDLER_H_VERSION \
"STFINV_PARAMETERHANDLER_H V1.0"
"STFINV_PARAMETERHANDLER_H V1.1"
#include <string>
#include <map>
......@@ -45,12 +46,12 @@
namespace stfinv {
/*! \brief Namespace for internal tools
* \ingroup tools
* \ingroup group_tools
*/
namespace tools {
/*! strip substring
* \ingroup tools
* \ingroup group_tools
*
* Strips off first substring up to given delimiter.
* The string is passed as a reference and will be modified (i.e. the
......@@ -65,14 +66,14 @@ namespace stfinv {
/*----------------------------------------------------------------------*/
/*! \brief A map to store parameters.
* \ingroup tools
* \ingroup group_tools
*/
typedef std::map<std::string,std::string> Tparamap;
/*----------------------------------------------------------------------*/
/*! \brief Create a parameter map from a parameter string
* \ingroup tools
* \ingroup group_tools
*
* \param p parameter string
* \param delimiter delimiter which separates two parameters
......@@ -85,18 +86,19 @@ namespace stfinv {
/*----------------------------------------------------------------------*/
/*! replace comma by whitespace
* \ingroup tools
/*! replace commas and semicolons by whitespace
* \ingroup group_tools
*
* \param s input string
* \return input string with all commas replaced by whitespace
* \return input string with all commas replaced by whitespace and
* all semicolons replaced by whitespace
*/
std::string commatospace(std::string s);
std::string secomtospace(std::string s);
/*----------------------------------------------------------------------*/
/*! \brief remove leading and trailing whitespace
* \ingroup tools
* \ingroup group_tools
*
* \param s any string
* \return value a input string with any leading and trailing whitespace
......
......@@ -47,7 +47,7 @@
namespace stfinv {
/*! \brief Fourier domain least squares engine
* \ingroup engines
* \ingroup group_engines
*
* \par Concept behind this engine
* If
......
......@@ -30,7 +30,7 @@
namespace stfinv {
/*! \brief Engine to find a finite, causal source time-history in time domain
* \ingroup engines
* \ingroup group_engines
*
* \par Concept behin this engine
*
......
......@@ -44,7 +44,7 @@
namespace stfinv {
/*! \brief Engine to provide a fixed wavelet
* \ingroup engines
* \ingroup group_engines
*/
class STFEngineFixedWavelet: public stfinv::STFFourierDomainEngine {
public:
......
......@@ -32,13 +32,20 @@
* - 30/09/2011 V1.1 implemented handling of additional time series pairs
* - 04/10/2011 V1.2 correction in debug message
* - 14/10/2015 V1.3 new end-user usage functions
* - 28/06/2016 V1.4 introduce taper parameter to taper correction filter
* response in the time domain
* - 22/07/2016 V1.5 thof:
* - provide separate FFT processor addressing just the
* source time function correction filter
* - implement taper function
*
* ============================================================================
*/
#define STFINV_STFINVFOURIER_CC_VERSION \
"STFINV_STFINVFOURIER_CC V1.3"
"STFINV_STFINVFOURIER_CC V1.5"
#include <sstream>
#include <cmath>
#include <stfinv/stfinvfourier.h>
#include <stfinv/stfinvfourier_summary_usage.h>
#include <stfinv/stfinvfourier_description_usage.h>
......@@ -165,13 +172,21 @@ namespace stfinv {
* next integer multiple of the divisor larger than fpad*nsamples.
*
* \par Workspace
* Two FFT engines will be created:
* Two FFT engines will be created.
* They are only used one-way, since input data is not altered during
* processing input time series only have to be transformed once to Fourier
* domain.
* Results of processing have to be transformed to time domain.
* -# One engine (\c STFFourierDomainEngine::Mfftengineinput) being shared
* by recorded data and synthetic data, because both have to be transformed
* to Fourier domain at once.
* Transformation to Fourier domain takes place in
* STFFourierDomainEngine::fftinput.
* -# One engine (\c STFFourierDomainEngine::Mfftengineoutput) being shared
* by the stf and the convolved synthetics, because both have to be
* transformed to the time domain at once.
* Transformation to time domain takes place in
* STFFourierDomainEngine::fftoutput.
*/
void STFFourierDomainEngine::initialize()
{
......@@ -226,6 +241,8 @@ namespace stfinv {
Mfftengineoutput=fourier::fft::DRFFTWAFFArrayEngine(
1+this->nreceivers()+this->npairs(),
nsamples);
Mfftenginestf=fourier::fft::DRFFTWAFFArrayEngine(this->stfseries(),
this->stfspec());
// set time shift for STF if requested
// -----------------------------------
......@@ -234,28 +251,70 @@ namespace stfinv {
is >> Mtshift;
}
Mapplyshift=this->parameterisset("tshift");
// taper definition
// ----------------
{
std::istringstream is(stfinv::tools::secomtospace(
this->parameter("irtap","0.,1.,2.,3.")));
is >> Mtt1 >> Mtt2 >> Mtt3 >> Mtt4;
}
Mapplystftaper=this->parameterisset("irtap");
STFINV_assert((Mtt1<=Mtt2) && (Mtt2<=Mtt3) && (Mtt3<=Mtt4),
"ERROR: taper definition times not in increasing order");
STFINV_debug(Mdebug&1, "STFFourierDomainEngine::initialize()",
"this->nsamples()=" << this->nsamples() << " " <<
"padfactor=" << padfactor << " " <<
"divisor=" << divisor << " " <<
"nsamples=" << nsamples << " " <<
"Mapplyshift=" << Mapplyshift << " " <<
"Mtshift=" << Mtshift << " ");
STFINV_value(this->nsamples()) << "\n " <<
STFINV_value(padfactor) << "\n " <<
STFINV_value(divisor) << "\n " <<
STFINV_value(nsamples) << "\n " <<
STFINV_value(Mapplyshift) << "\n " <<
STFINV_value(Mtshift) << "\n " <<
STFINV_value(Mapplystftaper) << "\n " <<
STFINV_value(Mtt1) << "\n " <<
STFINV_value(Mtt2) << "\n " <<
STFINV_value(Mtt3) << "\n " <<
STFINV_value(Mtt4));
} // void STFFourierDomainEngine::initialize()
/*----------------------------------------------------------------------*/
/*!
* Provide data passed (through the API) by the caller of the library to an
* engine operating in the Fourier domain.
* All input is available as time series data in first place.
* -# Copy time series data to STFFourierDomainEngine::Mfftengineinput
* -# Transform time series data to Fourier domain
* -# Clear output coefficients
*
* This function should be called by the very first statement of the
* exec-function of the derived class (e.g. STFEngineFDLeastSquares::exec).
*/
void STFFourierDomainEngine::fftinput()
{
this->getinput();
Mfftengineinput.r2c();
Mfftengineoutput.series()=0.;
} // void STFFourierDomainEngine::fftinput()
/*----------------------------------------------------------------------*/
/*!
* Provide results of Fourier domain operation to the caller of the library.
* -# Apply time domain taper to correction filter, if requested
* -# Apply convolution with correction filter response to all synthetic
* input data
* -# Apply time shift to impulse response of correction filter, if
* requested
* -# Transform Fourier series to time domain
* -# Copy time series data to buffer array accessible through API
*
* This function should be called by the very last statement of the
* exec-function of the derived class (e.g. STFEngineFDLeastSquares::exec).
*/
void STFFourierDomainEngine::fftoutput()
{
if (this->Mapplystftaper) { this->taperstf(); }
this->convolve();
if (Mapplyshift) { this->stfshift(); }
Mfftengineoutput.c2r();
......@@ -296,6 +355,13 @@ namespace stfinv {
/*----------------------------------------------------------------------*/
STFFourierDomainEngine::TAseries STFFourierDomainEngine::stfseries() const
{
return(Mfftengineoutput.series(this->nreceivers()));
} // STFFourierDomainEngine::Tspectrum STFFourierDomainEngine::stfseries() const
/*----------------------------------------------------------------------*/
STFFourierDomainEngine::TAspectrum
STFFourierDomainEngine::recordingcoeff(const unsigned int& i) const
{
......@@ -353,6 +419,8 @@ namespace stfinv {
void STFFourierDomainEngine::getinput()
{
// clear workspace through reference
// (remark: return value sarray is a reference to an array addressing all
// samples of all time series contained in Mfftengineinput)
TAseries sarray=Mfftengineinput.series();
sarray=0.;
......@@ -379,6 +447,11 @@ namespace stfinv {
/*----------------------------------------------------------------------*/
/*!
* Read out time series data from Mfftengineoutput.
* The time series containers in Mfftengineoutput are expected to be larger
* than those used for the API of the library (because of padding).
*/
void STFFourierDomainEngine::putoutput()
{
// scaling factor for source correction filter
......@@ -415,6 +488,18 @@ namespace stfinv {
/*----------------------------------------------------------------------*/
/*! \brief Convolve all synthetics with the source time function correction
* filter.
*
* The filter response is available in terms of the Fourier coefficients of
* the correction filter as are returned by
* STFFourierDomainEngine::stfspec().
* Convolution takes place in the Fourier domain simply by a multiplication
* of Fourier coefficients.
* Since all Fourier coefficients are expected to be scaled appropriately to
* represent samples for the Fourier integral transform, no scaling has to
* be applied here.
*/
void STFFourierDomainEngine::convolve()
{
TAspectrum synthetic=this->syntheticspec();
......@@ -483,6 +568,96 @@ namespace stfinv {
} // for (unsigned int j=0; j<this->nfreq(); ++j)
} // void STFFourierDomainEngine::stfshift()
/*----------------------------------------------------------------------*/
/*!
* Apply a time domain taper to the impulse response of the source time
* function correction filter.
*/
void STFFourierDomainEngine::taperstf()
{
STFINV_debug(Mdebug&16, "STFFourierDomainEngine::taperstf()",
STFINV_value(Mapplystftaper));
if (this->Mapplystftaper)
{
// transform correction filter to time domain
Mfftenginestf.c2r();
Tfftengine::TAseries thestfseries=this->stfseries();
thestfseries *= Mfftenginestf.scale_series(this->dt());
// apply taper
/*
* Concept of application to periodic time series allowing for negative
* values of taper times:
*
* All samples between t2 and t3 remain unaltered. It is reasonable to
* process the taper starting at t3 passing t4 to t1 and then ending at
* t2. Behind this is the concept that time series are implicitely
* periodic in discrete Fourier transform.
*/
// samples in series
int nsamples=thestfseries.size(0);
// duration of time series
double T=this->dt()*nsamples;
// make sure taper definition is not longer than time series.
STFINV_assert((this->Mtt4-this->Mtt1)<T,
"Taper width is larger than length of time series");
// set taper time values under conpect of periodic series
double tt3=this->Mtt3;
double tt4=this->Mtt4;
double tt1=this->Mtt1+T;
double tt2=this->Mtt2+T;
// sample to start at
int l3=int(std::floor(tt3/this->dt()));
int l2=int(std::ceil(tt2/this->dt()));
STFINV_debug(Mdebug&16, "STFFourierDomainEngine::taperstf()",
STFINV_value(T) << "\n " <<
STFINV_value(this->dt()) << "\n " <<
STFINV_value(nsamples) << "\n " <<
STFINV_value(tt3) << "\n " <<
STFINV_value(tt4) << "\n " <<
STFINV_value(tt1) << "\n " <<
STFINV_value(tt2) << "\n " <<
STFINV_value(l3) << "\n " <<
STFINV_value(l2));
for (int l=l3; l<=l2; ++l)
{
// time of sample
double t=l*this->dt();
// index to series
int rl = l%nsamples;
if (rl < 0) { rl += nsamples; }
STFINV_assert(((rl >= thestfseries.f(0)) &&
(rl <= thestfseries.l(0))),
"Index out of range. Internal programming error! "
"Report as bug!")
// taper factor
double factor=1.;
if ( (t>=tt3) && (t<=tt4) && (tt4>tt3) )
{
factor=0.5+0.5*cos(M_PI*(t-tt3)/(tt4-tt3));
}
else if ( (t>tt4) && (t<tt1) )
{
factor=0.;
}
else if ( (t>=tt1) && (t<=tt2) && (tt2>tt1) )
{
factor=0.5-0.5*cos(M_PI*(t-tt1)/(tt2-tt1));
}
// apply to series
thestfseries(rl) = thestfseries(rl)*factor;
STFINV_debug(Mdebug&16, "STFFourierDomainEngine::taperstf()",
STFINV_value(t) << " " <<
STFINV_value(l) << " " <<
STFINV_value(rl) << " " <<
STFINV_value(factor));
}
// transform correction filter to Fourier domain
Mfftenginestf.r2c();
this->stfspec() *= Mfftenginestf.scale_spectrum(this->dt());
} // if (this->Mapplystftaper)
} // void STFFourierDomainEngine::taperstf()
} // namespace stfinv
/* ----- END OF stfinvfourier.cc ----- */
......@@ -30,6 +30,9 @@
* - 08/05/2011 V1.0 Thomas Forbriger
* - 30/09/2011 V1.1 implemented handling of additional time series pairs
* - 14/10/2015 V1.2 new end-user usage functions
* - 28/06/2016 V1.3 provide time domain tapering of filter response
* - 22/07/2016 V1.4 provide separate FFT processor addressing just the
* source time function correction filter
*
* ============================================================================
*/
......@@ -38,7 +41,7 @@
#ifndef STFINV_STFINVFOURIER_H_VERSION
#define STFINV_STFINVFOURIER_H_VERSION \
"STFINV_STFINVFOURIER_H V1.2"
"STFINV_STFINVFOURIER_H V1.4"
#include <stfinv/stfinvbase.h>
#include <aff/array.h>
......@@ -51,12 +54,19 @@ namespace stfinv {
* This is just a base class.
* The constructor is protected and should only be called from a derived
* class.
* The intention of this class is to provide all processing steps common to
* all engines operating in the Fourier domain in one single base class.
* The individual engines of different Fourier domain approaches then need
* not reimplement these steps.
* They essentially need only provide a specific exec-function (e.g.
* STFEngineFDLeastSquares::exec).
*
* This class maintains a workspace for Fourier transforms.
* It provides the FFT from input signals to the workspace through a member
* functions as well as the convolution of the synthetic data with a given
* source wavelet Fourier transform and a subsequent FFT to time domain for
* the convolved synthetics as well as the source correction filter separately.
* the convolved synthetics as well as the source correction filter
* separately.
*
* \par What STFFourierDomainEngine does for you
* All derived classes call STFFourierDomainEngine::fftinput prior to
......@@ -69,13 +79,27 @@ namespace stfinv {
* \par
* When processing has finished, the derived classes should call
* STFFourierDomainEngine::fftoutput.
* This function convolves the synthetic data with the source correction
* This function first applies a time domain taper to the correction filter
* impulse response if requested (STFFourierDomainEngine::taperstf).
* Then it convolves the synthetic data with the source correction
* filter (STFFourierDomainEngine::convolve).
* Then it applies a time shift to the source correction filter if requested
* (STFFourierDomainEngine::stfshift).
* If requested it applies a time shift to the source correction filter
* as a next step (STFFourierDomainEngine::stfshift).
* The convolved synthetics as well as the source correction filter then are
* transformed to time domain and written to the users workspace
* ((STFFourierDomainEngine::putoutput).
* (STFFourierDomainEngine::putoutput).
*
* \par
* This should take place in the exec-function (e.g.
* STFEngineFDLeastSquares::exec) of the derived class.
* I.e. the first statement in the exec function is a call to function
* STFFourierDomainEngine::fftinput of the base class and the very last
* statement is a call to function STFFourierDomainEngine::fftoutput of the
* base class.
* This also guarantees that STFFourierDomainEngine::fftoutput is only
* called once per derived correction filter response.
* This is necessary, since otherwise the taper function and the time shift
* would be applied twice to the impulse response.
*
* \par Layout of Fourier transform arrays
* The workspace for the Fourier transform engine is initialized by
......@@ -119,6 +143,12 @@ namespace stfinv {
//! \brief return name of engine
virtual const char* name() const;
protected:
/*! \name Access and control functions to be used by derived classes.
*
* These functions are part of the interface implemented in
* STFFourierDomainEngine.
*/
//@{
/*! \brief copy input signals to workspace and
* transform input workspace to Fourier domain
*/
......@@ -150,7 +180,14 @@ namespace stfinv {
double frequency(const unsigned int& i) const;
//! \brief return number of frequencies in use
unsigned int nfreq() const;
//@}
private:
/*! \name Internal processing control functions of.
*
* These functions are part of the interface implemented in
* STFFourierDomainEngine.
*/
//@{
//! \brief initialize work space
void initialize();
/*! \brief copy input time series for recorded data and synthetics
......@@ -167,6 +204,12 @@ namespace stfinv {
/*! \brief apply time shift to stf prior to FFT to time domain
*/
void stfshift();
/*! \brief apply a time domain taper to the correction filter response.
*/
void taperstf();
//! \brief return reference to time series container of stf
TAseries stfseries() const;
//@}
// member data
// -----------
......@@ -223,12 +266,43 @@ namespace stfinv {
* M is returned by function npairs().
*/
Tfftengine Mfftengineoutput;
/*! \brief FFT processor for source time function correction filter
*
* This uses a reference to the source time function correction filter
* data in Mfftengineoutput. It is used in cases, where this data has to
* be transformed alone (like in STFFourierDomainEngine::taperstf).
*
* \note
* This processor does not maintain a separate data space.
* It rather operates on a reference to data space also maintained by
* Mfftengineoutput.
*/
Tfftengine Mfftenginestf;
/*! \brief time shift to be applied to STF in order to expose
* acausal parts
*/
double Mtshift;
//! \brief true if shift must be applied
bool Mapplyshift;
/*! \brief true if time domain taper should be applied to filter
* response.
*/
bool Mapplystftaper;
/*! \brief time values defining taper.
*
* All samples at times
* - t<Mtt1 will be set to zero.
* - Mtt1<=t<=Mtt2 will be scaled by
* 0.5-0.5*cos(pi*(t-Mtt1)/(Mtt2-Mtt1)).
* - Mtt2<t<Mtt3 will remain unaltered.
* - Mtt3<=t<=Mtt4 will be scaled by
* 0.5+0.5*cos(pi*(t-Mtt3)/(Mtt4-Mtt3)).
* - t>Mtt4 will be set to zero.
*
* @{
*/
double Mtt1, Mtt2, Mtt3, Mtt4;
//!@}
}; // class STFFourierDomainEngine
}
......
......@@ -45,7 +45,7 @@
namespace stfinv {
/*! \brief Engine to apply a scalar factor
* \ingroup engines
* \ingroup group_engines
*
* \par Concept behin this engine
* This engine convolves the synthetic data with a discrete delta pulse so
......
......@@ -45,7 +45,7 @@
namespace stfinv {
/*! \brief Normalization engine
* \ingroup engines
* \ingroup group_engines
*
* \par Motivation
* On the down-side of Fourier domain least squares as is implemented
......
/*! \file tools.cc
* \brief tools and utilities (implementation)
*
* \ingroup tools
* \ingroup group_tools
* ----------------------------------------------------------------------------
*
* \author Thomas Forbriger
......
/*! \file tools.h
* \brief tools and utilities (prototypes)
*
* \ingroup tools
* \ingroup group_tools
* ----------------------------------------------------------------------------
*
* \author Thomas Forbriger
......@@ -48,7 +48,7 @@ namespace stfinv {
namespace tools {
/*! \brief function to compare doubles
* \ingroup tools
* \ingroup group_tools
* \param a a double value
* \param b a double value
* \param eps relative residual allowed for \c a and \c b
......@@ -60,7 +60,7 @@ namespace stfinv {
/* ---------------------------------------------------------------------- */
/*! \brief report engine identifier
* \ingroup tools
* \ingroup group_tools
* \param C class to report ID and oneline description
* \param os output stream to send output to
*/
......@@ -78,7 +78,7 @@ namespace stfinv {
/* ---------------------------------------------------------------------- */
/*! \brief report engine identifier with heading
* \ingroup tools
* \ingroup group_tools
* \param C class to report ID and oneline description
* \param os output stream to send output to
*/
......
......@@ -19,6 +19,10 @@ remainder may consist of several control parameters being separated by colons
or may come along with a parameter value. The value is separated from the
parameter by an equal sign (=).
Where several values in an argument to a parameter must be separated (like in
the 'irtap' option of the Fourier domain procedures) white space ( ), commas
(,), and semicolons (;) are allowed as field delimiters, at your convenience.
Examples:
- To select Fourier domain least squares and shift the returned source
correction filter wavelet by 0.4s and switch on verbose mode, pass the
......
......@@ -4,17 +4,31 @@
# Procedures in the Fourier domain
# --------------------------------
Options and parameters in common for procedures in the Fourier domain:
fpow2 use power of two for number of coefficients
fdiv=d use integer multiple of d for number of coefficients
fpad=f padding factor
tshift=d delay source correction filter wavelet by d (in seconds)
in order to expose acausal components
fpow2 use power of two for number of coefficients
fdiv=d use integer multiple of d for number of coefficients
fpad=f padding factor
tshift=d delay source correction filter wavelet by d (in seconds)
in order to expose acausal components
irtap=t1,t2,t3,t4 taper impulse response of correction filter
These options define the number of samples N used for the FFT (Fast Fourier
Transform). This number N should be larger than the number of samples M in the
original input time series to avoid wrap-around. If fpow2 is set, N will be
the next power of 2 larger than M*f. Else if fdiv is set, N will be the next
integer multiple of d larger than M*f.
integer multiple of d larger than M*f. If fdiv is not set explicitely, a
default value for d (commonly 100) is used. If option fpad ist used, N will be
f times larger than without padding. Without explicitely setting fpad, a
default value for f is used (which commonly equals 1.5). When defining the
number of samples N, first padding is considered (fpad), then the either
selection of a power of two (pow2) or the divisor criterion (fdiv) is applied.
The latter is only applied, if pow2 ist not selected.
Input time series with M samples will be padded with (N-M) zeros to create the
time series which actually will be transformed to the Fourier domain. Upon
inverse FFT the additional (N-M) samples of the resulting time series will be
discarded before returning the M remaining samples to the caller. Note, that
this is a form of implicite taper. In particular the caller will not obtain
exactly the filter response, which was used for convolution internally.
The derived correction filter in some cases can contain acausal components.
This means that the impulse response is non-zero for negative time values.
......@@ -22,4 +36,24 @@ Since by definition, the impulse response is output for the time interval of
the input data, these acausal components can remain unnoticed. The option
tshift can be used to shift the impulse response as obtained by inverse FFT in
order to expose acausal components.
A time domain taper can be applied to the impulse response of the correction
filter by using option irtap. Four time values are given in units of seconds:
t1, t2, t3, and t4. They must be in increasing order and (t4-t1) must be
smaller than the total duration of the time series used to represent signals
internally. Times value are allowed to be negative. Time series are understood
to be periodic (due to discrete Fourier transformation). Prior to application
of the correction filter to the time series passed to the algorithm, the
correction filter is transformed to the time domain, tapered, and then
transformed to the Fourier domain again. The values of the taper are:
0 if t < t1
0.5-0.5*cos(pi*(t-t1)/(t2-t1)) if t1 <= t <= t2
1 if t2 < t < t3
0.5+0.5*cos(pi*(t-t3)/(t3-t4)) if t3 <= t <= t4
0 if t > t4
Time values are given in the same unit in which the sampling interval is given
in the input time series. I.e. if sampling interval is specified as a fraction
of seconds (which is standard) then all time values passed as parameters are
also given as fractions or multiples of seconds.
# ----- END OF stfinvfourier_description_usage.txt -----
......@@ -4,8 +4,9 @@
Procedures in the Fourier domain
--------------------------------
Options and parameters in common for procedures in the Fourier domain:
fpow2 use power of two for number of coefficients
fdiv=d use integer multiple of d for number of coefficients
fpad=f padding factor
tshift=d delay source correction filter wavelet by d (in seconds)
fpow2 use power of two for number of coefficients
fdiv=d use integer multiple of d for number of coefficients
fpad=f padding factor
tshift=d delay source correction filter wavelet by d (in seconds)
irtap=t1,t2,t3,t4 taper impulse response of correction filter
# ----- END OF stfinvfourier_summary_usage.txt -----
......@@ -452,7 +452,7 @@ This section covers some general inversion parameters. The maximum number of ite
If models are read from binary files appropriate file extensions are required for the different models (see section \ref{gen_of_mod}). Depending on the data different components of the seismic sections can be back propagated. For two component data (x- and y-component) set ADJOINT\_TYPE=1, only the y-component (ADJOINT\_TYPE=2) and only the x-component (ADJOINT\_TYPE=3). For the inversion of pressure seismograms ADJOINT\_TYPE=4 has to be used.
During the inversion the misfit values are saved in a log file specified in MISFIT\_LOG\_FILE. The log file consists of eight or nine columns and each line corresponds to one iteration step. The used step length is written in the first column. In the second to fourth column the three test step lengths used for the step length estimation are saved. The corresponding misfit values for these test step lengthes and the test shots are written to column five to seven. Column eight corresponds to the total misfit for all shots and if you use frequency filtering then the ninth column corresponds to the corner frequency of the lowpass filter used in the inversion step.
During the inversion the misfit values are saved in a log file specified in MISFIT\_LOG\_FILE. The log file consists of nine or ten columns and each line corresponds to one iteration step. The used step length is written in the first column. In the second to fourth column the three test step lengths used for the step length estimation are saved. The corresponding misfit values for these test step lengthes and the test shots are written to column five to seven. Column eight corresponds to the total misfit for all shots and if you use frequency filtering then the ninth column corresponds to the corner frequency of the lowpass filter used in the inversion step. If TIMEWIN=1 then the tenth column shows the GAMMA value that was used at the current iteration.
In general IFOS2D tries to minimize the misfit in the particle displacement between the observed data and the synthetic data. If you set the switch VELOCITY to 1 the misfit in the particle velocity seismograms is minimized.
......@@ -489,12 +489,12 @@ Default values are:
With the use of a workflow file, you can define different FWI stages. For instance, one FWI stage could refer to one corner frequency of a low-pass filter or to a specific time window. Every line in the workflow file corresponds to one FWI stage. To use a workflow file the switch USE\_WORKFLOW have to be set to 1. The algorithm will automatically change to the next line of the workflow file if the abort criterium of the current line is reached or if no step length could be found which reduces the misfit. The structure of the variables inside the workflow file is as follow: \\
\noindent
\begin{tabular}{lllllllllllll}
\# & INV\_VS & INV\_VP & INV\_RHO & PRO & TIME\_FILT & F\_HIGH\_PASS & F\_LOW\_PASS & WAVETYPE & 0 & 0 & EPRECOND & EPSILON\_WE\\
\begin{tabular}{llllllllllIlll}
\# & INV\_VS & INV\_VP & INV\_RHO & PRO & TIME\_FILT & F\_HIGH\_PASS & F\_LOW\_PASS & WAVETYPE & 0 & 0 & EPRECOND & EPSILON\_WE & GAMMA \\
\end{tabular}
\ \\
The first column is the number of the line. With INV\_* etc. you can activate the inversion for VS, VP or RHO, respectively. The abort criterium in percent for this FWI stage will be the declared in the variable PRO. With TIME\_FILT you can activate the frequency filtering with the corner frequency F\_HIGH\_PASS of the high-pass and F\_LOW\_PASS of the low-pass filter. WAVETYPE can be used to switch between PSV and SH modeling, however it is recommended to use PSV modeling (WAVETYPE==1) due to the current development on SH modeling. The following to zeros are placeholders for an upcoming update. With EPRECOND and EPSILON\_WE you can control the approx. Hessian. Please note, that all features which are used eg. TIME\_FILT (see section \ref{sec:filtering}) within the workflow have to be activated in the .JSON file.
The first column is the number of the line. With INV\_* etc. you can activate the inversion for VS, VP or RHO, respectively. The abort criterium in percent for this FWI stage will be the declared in the variable PRO. With TIME\_FILT you can activate the frequency filtering with the corner frequency F\_HIGH\_PASS of the high-pass and F\_LOW\_PASS of the low-pass filter. WAVETYPE can be used to switch between PSV and SH modeling, however it is recommended to use PSV modeling (WAVETYPE==1) due to the current development on SH modeling. The following two zeros are placeholders for an upcoming update. With EPRECOND and EPSILON\_WE you can control the approx. Hessian. Please note, that all features which are used eg. With GAMMA you can define the exponential taper applied to both synthetic and observed data. TIME\_FILT (see section \ref{sec:filtering}) within the workflow have to be activated in the .JSON file.
For an example of a workflow file, have a look in the par/ folder.
......@@ -642,7 +642,7 @@ To remove the contribution of the unknown source time function (STF) from the wa
"TRKILL_STF" : "0",
"TRKILL_FILE_STF" : "./trace_kill/trace_kill",
"STF_FULL" : "0",
"TRKILL_STF_OFFSET" : "0",
"TRKILL_STF_OFFSET_LOWER" : "10",
"TRKILL_STF_OFFSET_UPPER" : "20",
......@@ -654,13 +654,14 @@ Default values are:
INV_STF=0
\end{verbatim}}}
INV\_STF should be switched to 1 if you want to invert for the source time function.
INV\_STF should be switched to 1 if you want to invert for the source time function. If STF\_FULL is set to 1 then the total wavefield is used to invert for the source time function and the time window is ignored.
\newline
An example for the parameter string provided in PARA is:
\begin{itemize}
\item To select frequency domain least squares (fdlsq), apply offset dependent weights and a waterlevel use\\
\textit{fdlsq:exp=1.0:waterlevel=0.01}
\item For tapering the inverted STF add the option \textit{irtap=t1;t2;t3;t4} to the parameter string. The four values define the taper window. %It is important to use ";", because "," is used by the JSON-parser to separate variables.
\end{itemize}
In most cases the frequency domain least squares engine is the best approach to find a suitable wavelet. There are also other possibilities, if you want to use those a detailed look at the libraries and the acompanying documentation provided in the folder /contrib is recommended. Here only the two main parameters for the fdlsq approach are described.
......@@ -718,7 +719,7 @@ With F\_HIGH\_PASS an additional high pass filter can be applied, where F\_HIGH\
With the parameter PRO (see~\ref{json:abort_criterion}) one has to adjust the criterion that defines at which points the bandwidth of the signals are increased.
With the parameter WRITE\_FILTERED\_DATA it is possible to write the time filtered measured data to disk which are filtered with the same filter as the synthetic data. Therefore this output can be used to visualize the residuals between synthetic and measured data. The filtered data is located in DATA\_DIR and are labeled with "\_measured".
With the parameter WRITE\_FILTERED\_DATA=1 it is possible to write the time filtered measured data to disk which are filtered with the same filter as the synthetic data. Therefore this output can be used to visualize the residuals between synthetic and measured data. The filtered data is located in SEIS\_FILE and the seismograms are labeled with "obs" (synthetic seismograms are labeled with "syn"). By choosing WRITE\_FILTERED\_DATA=2 one can directly output the seismograms that are used for calculating the adjoint sources. Additionally time windowing and integration (see Option VELOCITY) are considered and the label "adj" is added to the seismogram name.
If you are using frequeny filtering (TIME\_FILT==1) during the inversion, you can set a minimum number of iterations per frequency. Within this minimum number of iteration per frequency the abort criterion PRO will receive no consideration.
......@@ -730,7 +731,7 @@ If you are using frequeny filtering (TIME\_FILT==1) during the inversion, you ca
"PICKS_FILE" : "./picked_times/picks"
"TWLENGTH_PLUS" : "0.01",
"TWLENGTH_MINUS" : "0.01",
"GAMMA" : "100000",
"GAMMA" : "30",
\end{verbatim}}}
{\color{red}{\begin{verbatim}