Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Only this file gets the implementation
#define REFPROP_IMPLEMENTATION
#define REFPROP_FUNCTION_MODIFIER
#include "REFPROP_lib.h"
#undef REFPROP_FUNCTION_MODIFIER
#undef REFPROP_IMPLEMENTATION
#include <stdlib.h>
#include <stdio.h>
#include <chrono>
#include <iostream>
#include <valarray>
#include <random>
#include <numeric>
int main()
{
// You may need to change this path to suit your installation
// Note: forward-slashes are recommended.
std::string path = "C:/Program Files (x86)/REFPROP";
std::string DLL_name = "REFPRP64.dll";
// Load the shared library and set up the fluid
std::string err;
bool loaded_REFPROP = load_REFPROP(err, path, DLL_name);
printf("Loaded refprop: %s @ address %zu\n", loaded_REFPROP ? "true" : "false", REFPROP_address());
if (!loaded_REFPROP){return EXIT_FAILURE; }
SETPATHdll(const_cast<char*>(path.c_str()), 400);
int ierr = 0, nc = 1;
char herr[255], hfld[10000] = "METHANE", hhmx[255] = "HMX.BNC", href[4] = "DEF";
SETUPdll(nc, hfld, hhmx, href, ierr, herr, 10000, 255, 3, 255);
if (ierr != 0) printf("This ierr: %d herr: %s\n", ierr, herr);
{
double d = 1.0;
double z[20] = {1.0}, p = -1;
// Random speed testing
std::default_random_engine re;
std::valarray<double> Ts(100000);
{
std::uniform_real_distribution<double> unif(89, 360);
std::transform(std::begin(Ts), std::end(Ts), std::begin(Ts), [&unif, &re](double x) { return unif(re); });
}
std::valarray<double> ds(Ts.size()); {
std::uniform_real_distribution<double> unif(1, 1.001);
std::transform(std::begin(ds), std::end(ds), std::begin(ds), [&unif, &re](double x) { return unif(re); });
}
int itau = 0, idelta = 0;
for (auto repeat = 0; repeat < 10; ++repeat) {
std::valarray<double> ps = 0.0 * Ts;
auto tic = std::chrono::high_resolution_clock::now();
for (auto i = 0; i < Ts.size(); ++i) {
PHIXdll(itau, idelta, Ts[i], ds[i], z, p); ps[i] = p;
}
auto toc = std::chrono::high_resolution_clock::now();
double elap_us = std::chrono::duration<double>(toc - tic).count() / Ts.size() * 1e6;
std::cout << elap_us << " us/call for PRESSdll; " << std::accumulate(std::begin(ps), std::end(ps), 0.0) << std::endl;
}
}
return EXIT_SUCCESS;
}