1#ifndef __COMPLEX_ARRAY_H__
2#define __COMPLEX_ARRAY_H__
4#include <boost/archive/text_iarchive.hpp>
5#include <boost/archive/text_oarchive.hpp>
6#include <boost/serialization/shared_ptr.hpp>
8#include <gsl/gsl_errno.h>
9#include <gsl/gsl_fft_complex.h>
13#define REAL(z, i) ((z)[2 * (i)])
14#define IMAG(z, i) ((z)[2 * (i) + 1])
15namespace mspass::algorithms::deconvolution {
16typedef std::complex<double> Complex64;
17typedef std::complex<float> Complex32;
30template <
class Archive>
31void serialize(Archive &ar,
FortranComplex64 &z,
const unsigned int version) {
71 template <
class T>
ComplexArray(
int nsamp, std::vector<T> d);
118 double *
ptr(
int sample);
153 std::vector<double>
abs()
const;
157 double norm2()
const;
159 std::vector<double>
phase()
const;
182 std::shared_ptr<FortranComplex64[]> data;
184 friend boost::serialization::access;
185 template <
class Archive>
186 void save(Archive &ar,
const unsigned int version)
const {
187 std::vector<FortranComplex64> dv;
188 dv.reserve(this->nsamp);
189 for (
auto i = 0; i < nsamp; ++i)
190 dv.push_back(this->data[i]);
194 template <
class Archive>
void load(Archive &ar,
const unsigned int version) {
196 std::vector<FortranComplex64> dv;
197 dv.reserve(this->nsamp);
201 for (
auto i = 0; i < this->nsamp; ++i)
202 this->data[i] = dv[i];
204 BOOST_SERIALIZATION_SPLIT_MEMBER()
235 if (nsamp > d.size()) {
237 for (std::size_t i = 0; i < d.size(); i++) {
238 this->data[i].real = d[i];
239 this->data[i].imag = 0.0;
241 for (std::size_t i = d.size(); i < nsamp; i++) {
242 this->data[i].real = 0.0;
243 this->data[i].imag = 0.0;
247 for (std::size_t i = 0; i < nsamp; i++) {
248 this->data[i].real = d[i];
249 this->data[i].imag = 0.0;
256 for (std::size_t i = 0; i < nsamp; i++) {
257 this->data[i].real = d;
258 this->data[i].imag = 0.0;
Interfacing object to ease conversion between FORTRAN and C++ complex.
Definition ComplexArray.h:41
const ComplexArray operator*(const ComplexArray &other) const noexcept(false)
Definition ComplexArray.cc:221
ComplexArray()
Definition ComplexArray.cc:8
double rms() const
Definition ComplexArray.cc:253
double norm2() const
Definition ComplexArray.cc:261
int size() const
Definition ComplexArray.cc:275
const ComplexArray operator/(const ComplexArray &other) const noexcept(false)
Definition ComplexArray.cc:231
ComplexArray & operator=(const ComplexArray &parent)
Definition ComplexArray.cc:94
std::vector< double > abs() const
Definition ComplexArray.cc:245
ComplexArray & operator-=(const ComplexArray &other) noexcept(false)
Definition ComplexArray.cc:135
void conj()
Definition ComplexArray.cc:241
Complex64 operator[](int sample)
Definition ComplexArray.cc:117
double * ptr()
Definition ComplexArray.cc:111
ComplexArray & operator+=(const ComplexArray &other) noexcept(false)
Definition ComplexArray.cc:120
const ComplexArray operator+(const ComplexArray &other) const noexcept(false)
Definition ComplexArray.cc:201
ComplexArray & operator/=(const ComplexArray &other) noexcept(false)
Definition ComplexArray.cc:168
std::vector< double > phase() const
Definition ComplexArray.cc:268
const ComplexArray operator-(const ComplexArray &other) const noexcept(false)
Definition ComplexArray.cc:211
~ComplexArray()
Definition ComplexArray.cc:106
ComplexArray & operator*=(const ComplexArray &other) noexcept(false)
Definition ComplexArray.cc:150
FORTRAN-compatible single-precision complex value.
Definition ComplexArray.h:20
float imag
Definition ComplexArray.h:22
float real
Definition ComplexArray.h:21
FORTRAN-compatible double-precision complex value.
Definition ComplexArray.h:25
double imag
Definition ComplexArray.h:27
double real
Definition ComplexArray.h:26