File: powerSpectralDensity2CovarianceFunction.cpp

package info (click to toggle)
groops 0%2Bgit20240830%2Bds-1
  • links: PTS, VCS
  • area: non-free
  • in suites: trixie
  • size: 11,052 kB
  • sloc: cpp: 134,939; fortran: 1,569; makefile: 20
file content (78 lines) | stat: -rw-r--r-- 2,870 bytes parent folder | download | duplicates (2)
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
/***********************************************/
/**
* @file powerSpectralDensity2CovarianceFunction.cpp
*
* @brief Covariance functions from Power Spectral Density (PSD).
*
* @author Matthias Ellmer
* @date 2013-08-27
*/
/***********************************************/

// Latex documentation
#define DOCSTRING docstring
static const char *docstring = R"(
Covariance function from Power Spectral Density (PSD).
The \configFile{inputfilePSD}{matrix} contains in the first column the frequency $[Hz]$, followed by (possibly multiple) PSDs $[unit^2/Hz]$.
The output is a \file{matrix}{matrix}, the first column containing time lag $[s]$ and the other columns the covariance functions $[unit^2]$.
Conversion between PSD $p_j$ and covariance function $c_k$ is performed by discrete cosine transformation:
\begin{equation}
c_k = \frac{1}{4\Delta t (n-1)}\left(p_0 + p_{n-1} (-1)^k + \sum_{j=1}^{n-2} 2 p_j \cos(\pi jk/(n-1))\right).
\end{equation}

See also \program{CovarianceFunction2PowerSpectralDensity}.
)";

/***********************************************/

#include "programs/program.h"
#include "base/fourier.h"
#include "files/fileMatrix.h"

/***** CLASS ***********************************/

/** @brief Covariance functions from Power Spectral Density (PSD).
* @ingroup programsGroup */
class PowerSpectralDensity2CovarianceFunction
{
public:
  void run(Config &config, Parallel::CommunicatorPtr comm);
};

GROOPS_REGISTER_PROGRAM(PowerSpectralDensity2CovarianceFunction, SINGLEPROCESS, "Covariance functions from Power Spectral Density (PSD).", Covariance)
GROOPS_RENAMED_PROGRAM(CovariancePsd2CovarianceFunction, PowerSpectralDensity2CovarianceFunction, date2time(2020, 5, 24))

/***********************************************/

void PowerSpectralDensity2CovarianceFunction::run(Config &config, Parallel::CommunicatorPtr /*comm*/)
{
  try
  {
    FileName fileNameCov, fileNamePsd;

    readConfig(config, "outputfileCovarianceFunction", fileNameCov, Config::MUSTSET, "", "first column: time steps [seconds], following columns: covariance functions");
    readConfig(config, "inputfilePSD",                 fileNamePsd, Config::MUSTSET, "", "first column: frequency [Hz], following columns PSD [unit^2/Hz]");
    if(isCreateSchema(config)) return;

    logStatus<<"read PSD file <"<<fileNamePsd<<">"<<Log::endl;
    Matrix psd;
    readFileMatrix(fileNamePsd, psd);

    Matrix cov(psd.rows(), psd.columns());
    const Double dt = 1./(2*psd(psd.rows()-1, 0));
    for(UInt i=0; i<cov.rows(); i++)
      cov(i,0) = i*dt;

    for(UInt k=1; k<cov.columns(); k++)
      copy(Fourier::psd2covariance(psd.column(k), dt), cov.column(k));

    logStatus<<"write covariance file <"<<fileNameCov<<">"<<Log::endl;
    writeFileMatrix(fileNameCov, cov);
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW(e)
  }
}

/***********************************************/