From f5761370c019819fe58a88943cce017acc5f6692 Mon Sep 17 00:00:00 2001 From: Ian Bell <ian.bell@nist.gov> Date: Thu, 14 Oct 2021 19:29:59 -0400 Subject: [PATCH] Add a view to the mole fractions rather than a copy in C interface --- interface/C/teqpc.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/interface/C/teqpc.cpp b/interface/C/teqpc.cpp index b62e7fa..3ae632f 100644 --- a/interface/C/teqpc.cpp +++ b/interface/C/teqpc.cpp @@ -1,3 +1,8 @@ +/*** + * Although this is a C-language interface, the code itself is of course written in C++ + * to allow for features only available in C++ and avoiding C memory management + */ + #include <unordered_map> #include <variant> @@ -6,6 +11,7 @@ #include "teqp/derivs.hpp" // TODO: actually make new UUID for each model instance +// TODO: catch tests using vad = std::valarray<double>; using cub = decltype(canonical_PR(vad{}, vad{}, vad{})); @@ -81,12 +87,12 @@ int free_model(char* uuid, char* errmsg, int errmsg_length) { int get_Arxy(char* uuid, const int NT, const int ND, const double T, const double rho, const double* molefrac, const int Ncomp, double *val, char* errmsg, int errmsg_length) { int errcode = 0; try { - // Copy the double buffer into a valarray - std::valarray molefrac_(molefrac, Ncomp); + // Make an Eigen view of the double buffer + Eigen::Map<const Eigen::ArrayXd> molefrac_(molefrac, Ncomp); // Lambda function to extract the given derivative from the thing contained in the variant auto f = [&](auto& model) { - using tdx = TDXDerivatives<decltype(model), double, std::valarray<double>>; + using tdx = TDXDerivatives<decltype(model), double, decltype(molefrac_)>; return tdx::get_Ar(NT, ND, model, T, rho, molefrac_); }; @@ -102,11 +108,11 @@ int get_Arxy(char* uuid, const int NT, const int ND, const double T, const doubl int main() { constexpr int errmsg_length = 300; char uuid[300] = "", errmsg[errmsg_length] = ""; + double val = -1; + std::valarray<double> molefrac = { 1.0 }; { - std::string j = R"({"kind":"vdW1", "model":{"a":1.0, "rb":2.0}})"; + std::string j = R"({"kind":"vdW1", "model":{"a":1.0, "b":2.0}})"; int errcode1 = build_model(j.c_str(), uuid, errmsg, errmsg_length); - double val = -1; - std::valarray<double> molefrac = { 1.0 }; int errcode11 = get_Arxy(uuid, 0, 0, 300, 3.0e-6, &(molefrac[0]), molefrac.size(), &val, errmsg, errmsg_length); int errcode2 = free_model(uuid, errmsg, errmsg_length); int rrr = 0; @@ -123,8 +129,6 @@ int main() { } )"; int errcode1 = build_model(j.c_str(), uuid, errmsg, errmsg_length); - double val = -1; - std::valarray<double> molefrac = { 1.0 }; int errcode11 = get_Arxy(uuid, 0, 0, 300, 3.0e-6, &(molefrac[0]), molefrac.size(), &val, errmsg, errmsg_length); int errcode2 = free_model(uuid, errmsg, errmsg_length); int rrr = 0; @@ -141,8 +145,6 @@ int main() { } )"; int errcode1 = build_model(j.c_str(), uuid, errmsg, errmsg_length); - double val = -1; - std::valarray<double> molefrac = { 1.0 }; int errcode11 = get_Arxy(uuid, 0, 1, 300, 3.0e-6, &(molefrac[0]), molefrac.size(), &val, errmsg, errmsg_length); int errcode2 = free_model(uuid, errmsg, errmsg_length); int rrr = 0; -- GitLab