#include #include class EOSFitter; #include "DataTypes.h" #include "Fitter.h" double NonlinearExperimentalDataPoint::residual(const std::vector& n) { double summer = a_0(n); for (unsigned int i = 1; i < n.size(); i++) { summer -= n[i] * a_i(i); } return summer; } double LinearExperimentalDataPoint::residual(const std::vector& n) { double summer = a_0(); for (unsigned int i = 1; i < n.size(); i++) { summer -= n[i] * a_i(i); } return summer; } PressureDataPoint::PressureDataPoint(EOSFitter* EOS, double T, double rho, double p, double variance) { this->EOS = EOS; this->T = T; this->rho = rho; this->p = p; this->tau = EOS->Tr / this->T; this->delta = this->rho / EOS->rhor; this->log_tau = log(tau); this->log_delta = log(delta); this->variance = variance; } /// The part that does not depend on the coefficients double PressureDataPoint::a_0() { double rhoRT = this->rho * EOS->R * this->T; return this->p / rhoRT - 1; } /// The part that multiplies the coefficients double PressureDataPoint::a_i(int i) { return delta * EOS->dA_dDelta(log_tau, log_delta, delta, i); } SpecificHeatCPDataPoint::SpecificHeatCPDataPoint(EOSFitter* EOS, double T, double rho, double cp, double variance) { this->EOS = EOS; this->T = T; this->rho = rho; this->cp = cp; this->cp_over_R = this->cp / EOS->R; this->tau = EOS->Tr / this->T; this->delta = this->rho / EOS->rhor; this->log_tau = log(tau); this->log_delta = log(delta); this->variance = variance; } /// The part that does not depend on the coefficients /// Here it requires that the coefficients be passed in to calculate the precorrelation factor double SpecificHeatCPDataPoint::a_0(const std::vector& n) { // Only calculate this function once to save on calls double _dalpha_ddelta = EOS->dalphar_dDelta(log_tau, log_delta, delta); // The precorrelation factor double e_cp = (pow(1 + delta * _dalpha_ddelta - delta * tau * EOS->d2alphar_dDelta_dTau(log_tau, log_delta, delta), (int)2) / (1 + 2 * delta * _dalpha_ddelta + delta * delta * EOS->d2alphar_dDelta2(log_tau, log_delta, delta))); // The a_0 term return cp_over_R + tau * tau * EOS->d2alpha0_dTau2(tau, delta) - e_cp; }; /// The part that multiplies the coefficients double SpecificHeatCPDataPoint::a_i(int i) { return -pow(tau, (int)2) * EOS->d2A_dTau2(log_tau, log_delta, delta, i); }