File indexing completed on 2026-06-02 08:17:12
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include "apfel/doubleexpression.h"
0010 #include "apfel/grid.h"
0011 #include "apfel/matrix.h"
0012 #include "apfel/operator.h"
0013 #include "apfel/doubledistribution.h"
0014 #include "apfel/distributionoperator.h"
0015 #include "apfel/operatordistribution.h"
0016 #include "apfel/config.h"
0017
0018
0019
0020 #ifdef WITH_YAML_CPP
0021 #include <yaml-cpp/yaml.h>
0022 #endif
0023
0024 namespace apfel
0025 {
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035 class DoubleOperator
0036 {
0037 public:
0038 DoubleOperator() = delete;
0039 DoubleOperator(DoubleOperator const&) = default;
0040
0041
0042
0043
0044
0045
0046
0047
0048 DoubleOperator(Grid const& gr1, Grid const& gr2, DoubleExpression const& dexpr, double const& eps = 1e-3);
0049
0050
0051
0052
0053
0054
0055 DoubleOperator(Operator const& O1, Operator const& O2);
0056
0057
0058
0059
0060
0061 DoubleOperator(DoubleObject<Operator> const& DObj);
0062
0063
0064 #ifdef WITH_YAML_CPP
0065
0066
0067
0068
0069
0070
0071
0072 DoubleOperator(YAML::Node const& Node, Grid const& gr1, Grid const& gr2, DoubleExpression const& dexpr);
0073
0074
0075
0076
0077
0078 std::string EmitDoubleOperator() const;
0079 #endif
0080
0081
0082
0083
0084 virtual ~DoubleOperator() {}
0085
0086
0087
0088
0089
0090 DistributionOperator MultiplyFirstBy(Distribution const& d) const;
0091 OperatorDistribution MultiplySecondBy(Distribution const& d) const;
0092 DoubleDistribution operator *= (DoubleDistribution const& d) const;
0093 DoubleOperator& operator *= (double const& s);
0094 DoubleOperator& operator /= (double const& s);
0095 DoubleOperator& operator += (DoubleOperator const& o);
0096 DoubleOperator& operator -= (DoubleOperator const& o);
0097 DoubleOperator& operator *= (DoubleOperator const& o);
0098 DoubleOperator& operator = (DoubleOperator const& o);
0099 DoubleOperator& operator *= (std::function<double(double const&, double const&)> f);
0100 DoubleOperator& operator *= (std::function<double(double const&)> f);
0101
0102
0103
0104
0105
0106
0107 Grid const& GetFirstGrid() const { return _grid1; }
0108
0109
0110
0111
0112
0113 Grid const& GetSecondGrid() const { return _grid2; }
0114
0115
0116
0117
0118 double const& GetIntegrationAccuracy() const { return _eps; }
0119
0120
0121
0122
0123
0124 std::string const& GetDoubleExpressionName() const { return _dexprName; }
0125
0126
0127
0128
0129 std::vector<std::vector<matrix<matrix<double>>>> GetDoubleOperator() const { return _dOperator; }
0130
0131
0132
0133
0134 void Print() const { std::cout << *this << std::endl; }
0135
0136 protected:
0137 Grid const& _grid1;
0138 Grid const& _grid2;
0139 double const _eps;
0140 std::string const _dexprName;
0141 std::vector<std::vector<matrix<matrix<double>>>> _dOperator;
0142
0143 friend std::ostream& operator << (std::ostream& os, DoubleOperator const& dop);
0144 };
0145
0146
0147
0148
0149
0150 DoubleDistribution operator * (DoubleOperator const& lhs, DoubleDistribution const& rhs);
0151 DistributionOperator operator * (Distribution const& lhs, DoubleOperator const& rhs);
0152 OperatorDistribution operator * (DoubleOperator const& lhs, Distribution const& rhs);
0153 DoubleOperator operator * (DoubleOperator lhs, DoubleOperator const& rhs);
0154 DoubleOperator operator * (double const& s, DoubleOperator rhs);
0155 DoubleOperator operator * (DoubleOperator lhs, double const& s);
0156 DoubleOperator operator * (std::function<double(double const&, double const)> f, DoubleOperator rhs);
0157 DoubleOperator operator * (DoubleOperator lhs, std::function<double(double const&, double const)> f);
0158 DoubleOperator operator * (std::function<double(double const&)> f, DoubleOperator rhs);
0159 DoubleOperator operator * (DoubleOperator lhs, std::function<double(double const&)> f);
0160 DoubleOperator operator / (DoubleOperator lhs, double const& s);
0161 DoubleOperator operator + (DoubleOperator lhs, DoubleOperator const& rhs);
0162 DoubleOperator operator - (DoubleOperator lhs, DoubleOperator const& rhs);
0163
0164
0165
0166
0167
0168 std::ostream& operator << (std::ostream& os, DoubleOperator const& dop);
0169 }
0170