From 7b822bf6d264332cc4d1931ff4e979be901516c2 Mon Sep 17 00:00:00 2001
From: Ian Bell <ian.bell@nist.gov>
Date: Thu, 25 Feb 2021 11:51:43 -0500
Subject: [PATCH] Test function evaluation too

---
 include/teqp/models/multifluid.hpp | 51 +++++++++++++++++++-----------
 src/multifluid.cpp                 |  8 +++--
 2 files changed, 39 insertions(+), 20 deletions(-)

diff --git a/include/teqp/models/multifluid.hpp b/include/teqp/models/multifluid.hpp
index a9b7cdb..749f859 100644
--- a/include/teqp/models/multifluid.hpp
+++ b/include/teqp/models/multifluid.hpp
@@ -65,8 +65,8 @@ public:
     {
         RhoType::value_type rhotot_ = (rhotot.has_value()) ? rhotot.value() : std::accumulate(std::begin(rhovec), std::end(rhovec), (decltype(rhovec[0]))0.0);
         auto molefrac = rhovec / rhotot_;
-        auto Tred = redfunc.Tr(molefrac);
-        auto rhored = redfunc.rhor(molefrac);
+        auto Tred = redfunc.get_Tr(molefrac);
+        auto rhored = redfunc.get_rhor(molefrac);
         auto delta = rhotot_ / rhored;
         auto tau = Tred / T;
         using resulttype = decltype(T* rhovec[0]);
@@ -74,13 +74,19 @@ public:
     }
 };
 
+
 class MultiFluidReducingFunction {
 private:
     Eigen::MatrixXd betaT, gammaT, betaV, gammaV, YT, Yv;
+    Eigen::ArrayXd Tc, vc;
 
     template <typename Num>
-    auto cube(Num x) {
-        return x * x * x;
+    auto cube(Num x) const {
+        return x*x*x;
+    }
+    template <typename Num>
+    auto square(Num x) const {
+        return x*x;
     }
 
 public:
@@ -90,7 +96,7 @@ public:
         const Eigen::MatrixXd& betaT, const Eigen::MatrixXd& gammaT,
         const Eigen::MatrixXd& betaV, const Eigen::MatrixXd& gammaV,
         const ArrayLike& Tc, const ArrayLike& vc)
-        : betaT(betaT), gammaT(gammaT), betaV(betaV), gammaV(gammaV) {
+        : betaT(betaT), gammaT(gammaT), betaV(betaV), gammaV(gammaV), Tc(Tc), vc(vc) {
 
         auto N = Tc.size();
 
@@ -107,15 +113,22 @@ public:
     }
 
     template <typename MoleFractions>
-    auto Y(const MoleFractions& z, const Eigen::MatrixXd& Yc, const Eigen::MatrixXd& beta, const Eigen::MatrixXd& Yij) {
-        auto sum2 = 0.0;
+    auto Y(const MoleFractions& z, const Eigen::ArrayXd& Yc, const Eigen::MatrixXd& beta, const Eigen::MatrixXd& Yij) const {
+
         auto N = z.size();
-        for i in range(0, N - 1) {
-            for j in range(i + 1, N) {
-                sum2 += 2 * z[i] * z[j] * (z[i] + z[j]) / (beta[i, j] * *2 * z[i] + z[j]) * Yij[i, j];
+        MoleFractions::value_type sum1 = 0.0;
+        for (auto i = 0; i < N - 1; ++i) {
+            sum1 = sum1 + square(z[i]) * Yc[i];
+        }
+        
+        MoleFractions::value_type sum2 = 0.0;
+        for (auto i = 0; i < N-1; ++i){
+            for (auto j = i+1; j < N; ++j) {
+                sum2 = sum2 + 2*z[i]*z[j]*(z[i] + z[j])/(square(beta(i, j))*z[i] + z[j]) * Yij(i, j);
             }
         }
-        return (z * z * Yc).sum() + sum2;
+
+        return sum1 + sum2;
     }
 
     static auto get_BIPdep(const nlohmann::json& collection, const std::vector<std::string>& components) {
@@ -158,15 +171,17 @@ public:
         return std::make_tuple(betaT, gammaT, betaV, gammaV);
     }
     static auto get_Tcvc(const std::string& coolprop_root, const std::vector<std::string>& components) {
-        std::vector<double> Tc, vc;
+        Eigen::ArrayXd Tc(components.size()), vc(components.size());
         using namespace nlohmann;
+        auto i = 0;
         for (auto& c : components) {
             auto j = json::parse(std::ifstream(coolprop_root + "/dev/fluids/" + c + ".json"));
             auto red = j["EOS"][0]["STATES"]["reducing"];
             double Tc_ = red["T"];
             double rhoc_ = red["rhomolar"];
-            Tc.push_back(Tc_);
-            vc.push_back(1.0 / rhoc_);
+            Tc[i] = Tc_;
+            vc[i] = 1.0 / rhoc_;
+            i++;
         }
         return std::make_tuple(Tc, vc);
     }
@@ -183,8 +198,8 @@ public:
         }
         return F;
     }
-    template<typename MoleFractions> auto get_Tr(const MoleFractions& molefracs) const { return Y(z, Tc, betaT, YT); }
-    template<typename MoleFractions> auto get_rhor(const MoleFractions& molefracs) const { return 1.0 / Y(z, vc, betaV, Yv); }
+    template<typename MoleFractions> auto get_Tr(const MoleFractions& molefracs) const { return Y(molefracs, Tc, betaT, YT); }
+    template<typename MoleFractions> auto get_rhor(const MoleFractions& molefracs) const { return 1.0 / Y(molefracs, vc, betaV, Yv); }
 };
 
 class DummyEOS {
@@ -193,8 +208,8 @@ public:
 };
 class DummyReducingFunction {
 public:
-    template<typename MoleFractions> auto Tr(const MoleFractions& molefracs) const { return molefracs[0]; }
-    template<typename MoleFractions> auto rhor(const MoleFractions& molefracs) const { return molefracs[0]; }
+    template<typename MoleFractions> auto get_Tr(const MoleFractions& molefracs) const { return molefracs[0]; }
+    template<typename MoleFractions> auto get_rhor(const MoleFractions& molefracs) const { return molefracs[0]; }
 };
 auto build_dummy_multifluid_model(const std::vector<std::string>& components) {
     std::vector<DummyEOS> EOSs(2);
diff --git a/src/multifluid.cpp b/src/multifluid.cpp
index df102e5..bc9f8d8 100644
--- a/src/multifluid.cpp
+++ b/src/multifluid.cpp
@@ -7,9 +7,12 @@ auto build_multifluid_model(const std::vector<std::string>& components) {
     auto BIPcollection = json::parse(std::ifstream(coolprop_root + "/dev/mixtures/mixture_binary_pairs.json"));
     
     std::vector<std::vector<DummyEOS>> funcs(2); for (auto i = 0; i < funcs.size(); ++i) { funcs[i].resize(funcs.size()); }
-    
     std::vector<DummyEOS> EOSs(components.size());
 
+    auto f = DummyEOS();
+    auto fd = f.alphar(1.1, 1.1);
+    auto fi = f.alphar(1,1);
+
     auto [Tc, vc] = MultiFluidReducingFunction::get_Tcvc(coolprop_root, components);
     auto F = MultiFluidReducingFunction::get_F_matrix(BIPcollection, components);
     auto [betaT, gammaT, betaV, gammaV] = MultiFluidReducingFunction::get_BIP_matrices(BIPcollection, components);
@@ -26,6 +29,7 @@ auto build_multifluid_model(const std::vector<std::string>& components) {
 int main(){
     test_dummy();
     auto model = build_multifluid_model({ "Methane", "Ethane" });
-    
+    std::valarray<double> rhovec = { 1.0, 2.0 };
+    auto alphar = model.alphar(300.0, rhovec);
     return EXIT_SUCCESS;
 }
-- 
GitLab