teqp 0.19.1
Loading...
Searching...
No Matches
deriv_adapter.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "teqp/derivs.hpp"
5#include "teqp/exceptions.hpp"
6
7namespace teqp{
8namespace cppinterface{
9namespace adapter{
10
13template<typename ModelType>
14struct Owner{
15private:
16 ModelType model;
17public:
18 auto& get_ref(){ return model; };
19 const auto& get_cref() const { return model; };
20 const std::type_index index;
21 Owner(ModelType&& m) : model(m), index(std::type_index(typeid(ModelType))) {};
22};
23
26template<typename ModelType>
28private:
29 const ModelType& model;
30public:
31 auto& get_ref(){ return model; };
32 const auto& get_cref() const { return model; };
33 const std::type_index index;
34 ConstViewer(ModelType& m) : model(m), index(std::type_index(typeid(ModelType))) {};
35};
36
37namespace internal{
38 template<class T>struct tag{using type=T;};
39}
40
48template<typename ModelPack>
50private:
51 ModelPack mp;
52public:
53 auto& get_ModelPack_ref(){ return mp; }
54 const auto& get_ModelPack_cref() const { return mp; }
55
56 template<typename T>
57 DerivativeAdapter(internal::tag<T> /*tag_*/, const T&& mp): mp(mp) {} ;
58
59 const std::type_index& get_type_index() const override {
60 return mp.index;
61 };
62
63// template<typename T>
64// DerivativeAdapter(const Owner<T>&& mp): mp(mp) {} ;
65//
66// template<typename T>
67// DerivativeAdapter(const ConstViewer<T>&& mp): mp(mp) {} ;
68
69 virtual double get_R(const EArrayd& molefrac) const override {
70 return mp.get_cref().R(molefrac);
71 };
72
73 virtual double get_Arxy(const int NT, const int ND, const double T, const double rhomolar, const EArrayd& molefrac) const override{
74 return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_Ar(NT, ND, mp.get_cref(), T, rhomolar, molefrac);
75 };
76
77 // Here X-Macros are used to create functions like get_Ar00, get_Ar01, ....
78#define X(i,j) virtual double get_Ar ## i ## j(const double T, const double rho, const REArrayd& molefrac) const override { return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::template get_Arxy<i,j>(mp.get_cref(), T, rho, molefrac); };
80#undef X
81 // And like get_Ar01n, get_Ar02n, ....
82#define X(i) virtual EArrayd get_Ar0 ## i ## n(const double T, const double rho, const REArrayd& molefrac) const override { auto vals = TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::template get_Ar0n<i>(mp.get_cref(), T, rho, molefrac); return Eigen::Map<Eigen::ArrayXd>(&(vals[0]), vals.size()); };
84#undef X
85
86 // Virial derivatives
87 virtual double get_B2vir(const double T, const EArrayd& z) const override {
88 return VirialDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_B2vir(mp.get_cref(), T, z);
89 };
90 virtual std::map<int, double> get_Bnvir(const int Nderiv, const double T, const EArrayd& z) const override {
91 return VirialDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_Bnvir_runtime(Nderiv, mp.get_cref(), T, z);
92 };
93 virtual double get_B12vir(const double T, const EArrayd& z) const override {
94 return VirialDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_B12vir(mp.get_cref(), T, z);
95 };
96 virtual double get_dmBnvirdTm(const int Nderiv, const int NTderiv, const double T, const EArrayd& molefrac) const override {
97 return VirialDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_dmBnvirdTm_runtime(Nderiv, NTderiv, mp.get_cref(), T, molefrac);
98 };
99
100 // Composition derivatives with temperature and density as the working variables
101 virtual double get_ATrhoXi(const double T, const int NT, const double rhomolar, const int ND, const EArrayd& molefrac, const int i, const int NXi) const override {
102 return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_ATrhoXi_runtime(mp.get_cref(), T, NT, rhomolar, ND, molefrac, i, NXi);
103 };
104 virtual double get_ATrhoXiXj(const double T, const int NT, const double rhomolar, const int ND, const EArrayd& molefrac, const int i, const int NXi, const int j, const int NXj) const override {
105 return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_ATrhoXiXj_runtime(mp.get_cref(), T, NT, rhomolar, ND, molefrac, i, NXi, j, NXj);
106 };
107 virtual double get_ATrhoXiXjXk(const double T, const int NT, const double rhomolar, const int ND, const EArrayd& molefrac, const int i, const int NXi, const int j, const int NXj, const int k, const int NXk) const override {
108 return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_ATrhoXiXjXk_runtime(mp.get_cref(), T, NT, rhomolar, ND, molefrac, i, NXi, j, NXj, k, NXk);
109 };
110
111 // Composition derivatives with tau and delta as the working variables
112 virtual double get_AtaudeltaXi(const double tau, const int NT, const double delta, const int ND, const EArrayd& molefrac, const int i, const int NXi) const override {
113 return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_AtaudeltaXi_runtime(mp.get_cref(), tau, NT, delta, ND, molefrac, i, NXi);
114 };
115 virtual double get_AtaudeltaXiXj(const double tau, const int NT, const double delta, const int ND, const EArrayd& molefrac, const int i, const int NXi, const int j, const int NXj) const override {
116 return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_AtaudeltaXiXj_runtime(mp.get_cref(), tau, NT, delta, ND, molefrac, i, NXi, j, NXj);
117 };
118 virtual double get_AtaudeltaXiXjXk(const double tau, const int NT, const double delta, const int ND, const EArrayd& molefrac, const int i, const int NXi, const int j, const int NXj, const int k, const int NXk) const override {
119 return TDXDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_AtaudeltaXiXjXk_runtime(mp.get_cref(), tau, NT, delta, ND, molefrac, i, NXi, j, NXj, k, NXk);
120 };
121
122 // Derivatives from isochoric thermodynamics (all have the same signature within each block), and they differ by their output argument
123#define X(f) virtual double f(const double T, const EArrayd& rhovec) const override { return IsochoricDerivatives<decltype(mp.get_cref()), double, EArrayd>::f(mp.get_cref(), T, rhovec); };
125#undef X
126#define X(f) virtual EArrayd f(const double T, const EArrayd& rhovec) const override { return IsochoricDerivatives<decltype(mp.get_cref()), double, EArrayd>::f(mp.get_cref(), T, rhovec); };
128#undef X
129#define X(f) virtual EMatrixd f(const double T, const EArrayd& rhovec) const override { return IsochoricDerivatives<decltype(mp.get_cref()), double, EArrayd>::f(mp.get_cref(), T, rhovec); };
131#undef X
132#define X(f) virtual std::tuple<double, Eigen::ArrayXd, Eigen::MatrixXd> f(const double T, const EArrayd& rhovec) const override { return IsochoricDerivatives<decltype(mp.get_cref()), double, EArrayd>::f(mp.get_cref(), T, rhovec); };
134#undef X
135 virtual Eigen::ArrayXd get_Psir_sigma_derivs(const double T, const EArrayd& rhovec, const EArrayd& v) const override{
136 return IsochoricDerivatives<decltype(mp.get_cref()), double, EArrayd>::get_Psir_sigma_derivs(mp.get_cref(), T, rhovec, v);
137 };
138
139 virtual EArray33d get_deriv_mat2(const double T, double rho, const EArrayd& z ) const override {
140 return DerivativeHolderSquare<2>(mp.get_cref(), T, rho, z).derivs;
141 };
142};
143
144template<typename TemplatedModel> auto view(const TemplatedModel& tp){
145 ConstViewer cv{tp};
146 return new DerivativeAdapter<decltype(cv)>(internal::tag<decltype(cv)>{}, std::move(cv));
147}
148template<typename TemplatedModel> auto own(const TemplatedModel&& tp){
149 Owner o(std::move(tp));
150 return new DerivativeAdapter<decltype(o)>(internal::tag<decltype(o)>{}, std::move(o));
151}
152
153template<typename TemplatedModel> auto make_owned(const TemplatedModel& tmodel){
154 using namespace teqp::cppinterface;
155 return std::unique_ptr<AbstractModel>(own(std::move(tmodel)));
156};
157
158template<typename TemplatedModel> auto make_cview(const TemplatedModel& tmodel){
159 using namespace teqp::cppinterface;
160 return std::unique_ptr<AbstractModel>(view(tmodel));
161};
162
168template<typename ModelType>
169const ModelType& get_model_cref(const AbstractModel *am)
170{
171 if (am == nullptr){
172 throw teqp::InvalidArgument("Argument to get_model_cref is a nullptr");
173 }
174 const auto* mptr = dynamic_cast<const DerivativeAdapter<ConstViewer<const ModelType>>*>(am);
175 const auto* mptr2 = dynamic_cast<const DerivativeAdapter<Owner<const ModelType>>*>(am);
176 if (mptr != nullptr){
177 return mptr->get_ModelPack_cref().get_cref();
178 }
179 else if (mptr2 != nullptr){
180 return mptr2->get_ModelPack_cref().get_cref();
181 }
182 else{
183 throw teqp::InvalidArgument("Unable to cast model to desired type");
184 }
185}
186
192template<typename ModelType>
194{
195 if (am == nullptr){
196 throw teqp::InvalidArgument("Argument to get_model_ref is a nullptr");
197 }
198 auto* mptr2 = dynamic_cast<DerivativeAdapter<Owner<ModelType>>*>(am);
199 if (mptr2 != nullptr){
200 return mptr2->get_ModelPack_ref().get_ref();
201 }
202 else{
203 throw teqp::InvalidArgument("Unable to cast model to desired type; only the Owner ownership model is allowed");
204 }
205}
206
207}
208}
209}
Eigen::Array< double, Nderivsmax+1, Nderivsmax+1 > derivs
Definition derivs.hpp:1508
virtual ISOCHORIC_multimatrix_args Eigen::ArrayXd get_Psir_sigma_derivs(const double T, const EArrayd &rhovec, const EArrayd &v) const override
virtual double get_AtaudeltaXi(const double tau, const int NT, const double delta, const int ND, const EArrayd &molefrac, const int i, const int NXi) const override
const std::type_index & get_type_index() const override
virtual double get_dmBnvirdTm(const int Nderiv, const int NTderiv, const double T, const EArrayd &molefrac) const override
virtual EArray33d get_deriv_mat2(const double T, double rho, const EArrayd &z) const override
virtual double get_AtaudeltaXiXjXk(const double tau, const int NT, const double delta, const int ND, const EArrayd &molefrac, const int i, const int NXi, const int j, const int NXj, const int k, const int NXk) const override
virtual double get_ATrhoXiXjXk(const double T, const int NT, const double rhomolar, const int ND, const EArrayd &molefrac, const int i, const int NXi, const int j, const int NXj, const int k, const int NXk) const override
virtual std::map< int, double > get_Bnvir(const int Nderiv, const double T, const EArrayd &z) const override
virtual double get_Arxy(const int NT, const int ND, const double T, const double rhomolar, const EArrayd &molefrac) const override
virtual double get_AtaudeltaXiXj(const double tau, const int NT, const double delta, const int ND, const EArrayd &molefrac, const int i, const int NXi, const int j, const int NXj) const override
virtual double get_R(const EArrayd &molefrac) const override
virtual AR0N_args double get_B2vir(const double T, const EArrayd &z) const override
virtual double get_B12vir(const double T, const EArrayd &z) const override
virtual double get_ATrhoXiXj(const double T, const int NT, const double rhomolar, const int ND, const EArrayd &molefrac, const int i, const int NXi, const int j, const int NXj) const override
DerivativeAdapter(internal::tag< T >, const T &&mp)
virtual double get_ATrhoXi(const double T, const int NT, const double rhomolar, const int ND, const EArrayd &molefrac, const int i, const int NXi) const override
auto make_cview(const TemplatedModel &tmodel)
auto own(const TemplatedModel &&tp)
auto view(const TemplatedModel &tp)
ModelType & get_model_ref(AbstractModel *am)
Get a mutable reference to the model.
auto make_owned(const TemplatedModel &tmodel)
const ModelType & get_model_cref(const AbstractModel *am)
Get a const reference to the model that is being held in a DerivativeAdapter instance.
#define AR0N_args
Definition teqpcpp.hpp:39
#define ISOCHORIC_matrix_args
Definition teqpcpp.hpp:63
#define ISOCHORIC_double_args
Definition teqpcpp.hpp:49
Eigen::Array< double, 3, 3 > EArray33d
Definition teqpcpp.hpp:17
#define ISOCHORIC_multimatrix_args
Definition teqpcpp.hpp:67
#define ISOCHORIC_array_args
Definition teqpcpp.hpp:54
Eigen::ArrayX< double > EArrayd
Definition teqpcpp.hpp:16
#define ARXY_args
Definition teqpcpp.hpp:22