Skip to content
Snippets Groups Projects
time_REFPROP.cpp 2.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Ian Bell's avatar
    Ian Bell committed
    // 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;
    }