#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include "math.h" #include "stdio.h" #include "float.h" #include #include "CoolPropTools.h" double root_sum_square(std::vector x) { double sum = 0; for (unsigned int i=0; i strsplit(std::string s, char del) { std::size_t iL = 0, iR = 0, N = s.size(); std::vector v; // Find the first instance of the delimiter iR = s.find_first_of(del); // Delimiter not found, return the same string again if (iR == std::string::npos){ v.push_back(s); return v; } while (iR != N-1) { v.push_back(s.substr(iL,iR-iL)); iL = iR; iR = s.find_first_of(del,iR+1); // Move the iL to the right to avoid the delimiter iL += 1; if (iR == (int)std::string::npos) { v.push_back(s.substr(iL,N-iL)); break; } } return v; } double interp1d(std::vector *x, std::vector *y, double x0) { std::size_t i,L,R,M; L=0; R=(*x).size()-1; M=(L+R)/2; // Use interval halving to find the indices which bracket the density of interest while (R-L>1) { if (x0 >= (*x)[M]) { L=M; M=(L+R)/2; continue;} if (x0 < (*x)[M]) { R=M; M=(L+R)/2; continue;} } i=L; if (i<(*x).size()-2) { // Go "forwards" with the interpolation range return QuadInterp((*x)[i],(*x)[i+1],(*x)[i+2],(*y)[i],(*y)[i+1],(*y)[i+2],x0); } else { // Go "backwards" with the interpolation range return QuadInterp((*x)[i],(*x)[i-1],(*x)[i-2],(*y)[i],(*y)[i-1],(*y)[i-2],x0); } } double powInt(double x, int y) { // Raise a double to an integer power // Overload not provided in math.h int i; double product=1.0; double x_in; int y_in; if (y==0) { return 1.0; } if (y<0) { x_in=1/x; y_in=-y; } else { x_in=x; y_in=y; } if (y_in==1) { return x_in; } product=x_in; for (i=1;i0 && p<0) { t0 = -2.0*fabs(q)/q*sqrt(-p/3.0)*cosh(1.0/3.0*acosh(-3.0*fabs(q)/(2.0*p)*sqrt(-3.0/p))); } else { t0 = -2.0*sqrt(p/3.0)*sinh(1.0/3.0*asinh(3.0*q/(2.0*p)*sqrt(3.0/p))); } N = 1; x0 = t0-b/(3*a); x1 = t0-b/(3*a); x2 = t0-b/(3*a); } else //(DELTA>0) { // Three real roots double t0 = 2.0*sqrt(-p/3.0)*cos(1.0/3.0*acos(3.0*q/(2.0*p)*sqrt(-3.0/p))-0*2.0*M_PI/3.0); double t1 = 2.0*sqrt(-p/3.0)*cos(1.0/3.0*acos(3.0*q/(2.0*p)*sqrt(-3.0/p))-1*2.0*M_PI/3.0); double t2 = 2.0*sqrt(-p/3.0)*cos(1.0/3.0*acos(3.0*q/(2.0*p)*sqrt(-3.0/p))-2*2.0*M_PI/3.0); N = 3; x0 = t0-b/(3*a); x1 = t1-b/(3*a); x2 = t2-b/(3*a); } } std::string strjoin(std::vector strings, std::string delim) { // Empty input vector if (strings.empty()){return "";} std::string output = strings[0]; for (unsigned int i = 1; i < strings.size(); i++) { output += format("%s%s",delim.c_str(),strings[i].c_str()); } return output; }