MethaneClass::MethaneClass() { double _n[] = {0, 4.367901028E-02, 6.709236199E-01, -1.765577859E+00, 8.582330241E-01, -1.206513052E+00, 5.120467220E-01, -4.000010791E-04, -1.247842423E-02, 3.100269701E-02, 1.754748522E-03, -3.171921605E-06, -2.240346840E-06, 2.947056156E-07, 1.830487909E-01, 1.511883679E-01, -4.289363877E-01, 6.894002446E-02, -1.408313996E-02, -3.063054830E-02, -2.969906708E-02, -1.932040831E-02, -1.105739959E-01, 9.952548995E-02, 8.548437825E-03, -6.150555662E-02, -4.291792423E-02, -1.813207290E-02, 3.445904760E-02, -2.385919450E-03, -1.159094939E-02, 6.641693602E-02, -2.371549590E-02, -3.961624905E-02, -1.387292044E-02, 3.389489599E-02, -2.927378753E-03, 9.324799946E-05, -6.287171518E+00, 1.271069467E+01, -6.423953466E+00}; double _d[] = {0, 1, 1, 1, 2, 2, 2, 2, 3, 4, 4, 8, 9, 10, 1, 1, 1, 2, 4, 5, 6, 1, 2, 3, 4, 4, 3, 5, 5, 8, 2, 3, 4, 4, 4, 5, 6, 2, 0, 0, 0}; double _t[] = {0, -0.5, 0.5, 1, 0.5, 1, 1.5, 4.5, 0, 1, 3, 1, 3, 3, 0, 1, 2, 0, 0, 2, 2, 5, 5, 5, 2, 4, 12, 8, 10, 10, 10, 14, 12, 18, 22, 18, 14, 2, 0, 1, 2}; double _l[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2}; double _eta[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 40, 40, 40}; double _epsilon[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}; double _beta[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 250, 250, 250}; double _gamma[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.07, 1.11, 1.11, 1.11}; std::vector<double> n_v(_n,_n+sizeof(_n)/sizeof(double)); std::vector<double> d_v(_d,_d+sizeof(_d)/sizeof(double)); std::vector<double> t_v(_t,_t+sizeof(_t)/sizeof(double)); std::vector<double> l_v(_l,_l+sizeof(_l)/sizeof(double)); std::vector<double> eta_v(_eta,_eta+sizeof(_eta)/sizeof(double)); std::vector<double> epsilon_v(_epsilon,_epsilon+sizeof(_epsilon)/sizeof(double)); std::vector<double> beta_v(_beta,_beta+sizeof(_beta)/sizeof(double)); std::vector<double> gamma_v(_gamma,_gamma+sizeof(_gamma)/sizeof(double)); //Critical parameters crit.rho = 10.139128*16.0428; //[kg/m^3] crit.p = PressureUnit(4599.2,UNIT_KPA); //[kPa] crit.T = 190.564; //[K] crit.v = 1/crit.rho; // Reducing parameters used in EOS reduce.p = PressureUnit(4599.2, UNIT_KPA); reduce.T = 190.564; //[K] reduce.rho = 10.139128*16.0428; //[kg/m^3] reduce.v = 1.0/reduce.rho; preduce = &reduce; // Other fluid parameters params.molemass = 16.0428; params.Ttriple = 90.6941; params.ptriple = 11.696; params.accentricfactor = 0.01142; params.R_u = 8.31451; // Limits of EOS limits.Tmin = params.Ttriple; limits.Tmax = 500.0; limits.pmax = 100000.0; limits.rhomax = 1000000.0*params.molemass; phirlist.push_back(new phir_power( n_v,d_v,t_v,l_v,1,36)); phirlist.push_back(new phir_gaussian( n_v,d_v,t_v,eta_v,epsilon_v,beta_v,gamma_v,37,40)); double _theta [] ={0,0,0,0,3.400432401,10.26951575,20.43932747,29.93744884,79.13351945}; std::vector<double> theta_v (_theta,_theta+sizeof(_theta)/sizeof(double)); double _n0 [] ={0,9.91243972,-6.33270087,3.0016,0.008449,4.6942,3.4865,1.6572,1.4115}; std::vector<double> n0_v (_n0,_n0+sizeof(_n0)/sizeof(double)); // lead term: log(delta)+c+m*tau phi0list.push_back(new phi0_lead(n0_v[1], n0_v[2])); phi0list.push_back(new phi0_logtau(n0_v[3])); phi0list.push_back(new phi0_Planck_Einstein(n0_v,theta_v,4,8)); EOSReference.assign("Setzmann, U. and Wagner, W., \"A New Equation of State and Tables of Thermodynamic Properties for Methane Covering the Range from the Melting Line to 625 K at Pressures up to 1000 MPa,\" J. Phys. Chem. Ref. Data, 20(6):1061-1151, 1991."); TransportReference.assign("Using ECS in fully predictive mode"); name.assign("Methane"); aliases.push_back("CH4"); aliases.push_back("methane"); aliases.push_back("METHANE"); REFPROPname.assign("METHANE"); BibTeXKeys.EOS = "Setzmann-JPCRD-1991"; BibTeXKeys.SURFACE_TENSION = "Mulero-JPCRD-2012"; }
IsoButaneClass::IsoButaneClass() { double _n [] = {0, 2.0686820727966E+00, -3.6400098615204E+00, 5.1968754427244E-01, 1.7745845870123E-01, -1.2361807851599E-01, 4.5145314010528E-02, 3.0476479965980E-02, 7.5508387706302E-01, -8.5885381015629E-01, 3.6324009830684E-02, -1.9548799450550E-02, -4.4452392904960E-03, 4.6410763666460E-03, -7.1444097992825E-02, -8.0765060030713E-02, 1.5560460945053E-01, 2.0318752160332E-03, -1.0624883571689E-01, 3.9807690546305E-02, 1.6371431292386E-02, 5.3212200682628E-04, -7.8681561156387E-03, -3.0981191888963E-03, -4.2276036810382E-02, -5.3001044558079E-03}; double _l[]= {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0}; double _d[]= {0, 1, 1, 1, 2, 3, 4, 4, 1, 1, 2, 7, 8, 8, 1, 2, 3, 3, 4, 5, 5, 10, 2, 6, 1, 2}; double _t[]= {0, 0.5, 1, 1.5, 0, 0.5, 0.5, 0.75, 2, 2.5, 2.5, 1.5, 1, 1.5, 4, 7, 3, 7, 3, 1, 6, 0, 6, 13, 2, 0}; double _eta[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10}; double _epsilon[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.85, 1}; double _beta[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 200}; double _gamma[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.16, 1.13}; std::vector<double> n_v(_n,_n+sizeof(_n)/sizeof(double)); std::vector<double> d_v(_d,_d+sizeof(_d)/sizeof(double)); std::vector<double> t_v(_t,_t+sizeof(_t)/sizeof(double)); std::vector<double> l_v(_l,_l+sizeof(_l)/sizeof(double)); std::vector<double> eta_v(_eta,_eta+sizeof(_eta)/sizeof(double)); std::vector<double> epsilon_v(_epsilon,_epsilon+sizeof(_epsilon)/sizeof(double)); std::vector<double> beta_v(_beta,_beta+sizeof(_beta)/sizeof(double)); std::vector<double> gamma_v(_gamma,_gamma+sizeof(_gamma)/sizeof(double)); //Critical parameters crit.rho = 225.5; //[kg/m^3] crit.p = PressureUnit(3629,UNIT_KPA); //[kPa] crit.T = 407.817; //[K] crit.v = 1/crit.rho; // Other fluid parameters params.molemass = 58.12220; params.Ttriple = 113.73; params.ptriple = 2.28968758984e-05; params.accentricfactor = 0.183531783208; params.R_u = 8.314472; // Limits of EOS limits.Tmin = params.Ttriple; limits.Tmax = 500.0; limits.pmax = 100000.0; limits.rhomax = 1000000.0*params.molemass; phirlist.push_back(new phir_power( n_v,d_v,t_v,l_v,1,23)); phirlist.push_back(new phir_gaussian( n_v,d_v,t_v,eta_v,epsilon_v,beta_v,gamma_v,24,25)); double _theta [] ={0,0,0,0,0.951277902,2.387895885,4.346904269,10.36885864}; std::vector<double> theta_v (_theta,_theta+sizeof(_theta)/sizeof(double)); double _n0 [] ={0,11.60865546,-5.29450411,3.05956619,4.94641014,4.09475197,15.6632824,9.73918122}; std::vector<double> n0_v (_n0,_n0+sizeof(_n0)/sizeof(double)); // lead term: log(delta)+c+m*tau phi0list.push_back(new phi0_lead(n0_v[1], n0_v[2])); phi0list.push_back(new phi0_logtau(n0_v[3])); phi0list.push_back(new phi0_Planck_Einstein(n0_v,theta_v,4,7)); EOSReference.assign("Buecker, D. and Wagner, W. \"Reference Equations of State for the Thermodynamic Properties of Fluid Phase n-Butane and Isobutane,\" J. Phys. Chem. Ref. Data, Vol. 35, No. 2, 2006, 929-1019."); TransportReference.assign("Using ECS in fully predictive mode"); name.assign("IsoButane"); aliases.push_back("isobutane"); aliases.push_back("Isobutane"); aliases.push_back("ISOBUTANE"); aliases.push_back("R600A"); aliases.push_back("R600a"); REFPROPname.assign("ISOBUTAN"); // Adjust to the IIR reference state (h=200 kJ/kg, s = 1 kJ/kg for sat. liq at 0C) params.HSReferenceState = "IIR"; BibTeXKeys.EOS = "Buecker-JPCRD-2006B"; BibTeXKeys.VISCOSITY = "Vogel-IJT-2000"; BibTeXKeys.ECS_LENNARD_JONES = "Vogel-IJT-2000"; BibTeXKeys.CONDUCTIVITY = "Perkins-JCED-2002B"; BibTeXKeys.SURFACE_TENSION = "Mulero-JPCRD-2012"; }
nButaneClass::nButaneClass() { double _n [] = {0, 2.5536998241635E+00, -4.4585951806696E+00, 8.2425886369063E-01, 1.1215007011442E-01, -3.5910933680333E-02, 1.6790508518103E-02, 3.2734072508724E-02, 9.5571232982005E-01, -1.0003385753419E+00, 8.5581548803855E-02, -2.5147918369616E-02, -1.5202958578918E-03, 4.7060682326420E-03, -9.7845414174006E-02, -4.8317904158760E-02, 1.7841271865468E-01, 1.8173836739334E-02, -1.1399068074953E-01, 1.9329896666669E-02, 1.1575877401010E-03, 1.5253808698116E-04, -4.3688558458471E-02, -8.2403190629989E-03, -2.8390056949441E-02, 1.4904666224681E-03}; double _l[]= {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0}; double _d[]= {0, 1, 1, 1, 2, 3, 4, 4, 1, 1, 2, 7, 8, 8, 1, 2, 3, 3, 4, 5, 5, 10, 2, 6, 1, 2}; double _t[]= {0, 0.5, 1, 1.5, 0, 0.5, 0.5, 0.75, 2, 2.5, 2.5, 1.5, 1, 1.5, 4, 7, 3, 7, 3, 1, 6, 0, 6, 13, 2, 0}; double _eta[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10}; double _epsilon[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.85, 1}; double _beta[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 200}; double _gamma[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.16, 1.13}; std::vector<double> n_v(_n,_n+sizeof(_n)/sizeof(double)); std::vector<double> d_v(_d,_d+sizeof(_d)/sizeof(double)); std::vector<double> t_v(_t,_t+sizeof(_t)/sizeof(double)); std::vector<double> l_v(_l,_l+sizeof(_l)/sizeof(double)); std::vector<double> eta_v(_eta,_eta+sizeof(_eta)/sizeof(double)); std::vector<double> epsilon_v(_epsilon,_epsilon+sizeof(_epsilon)/sizeof(double)); std::vector<double> beta_v(_beta,_beta+sizeof(_beta)/sizeof(double)); std::vector<double> gamma_v(_gamma,_gamma+sizeof(_gamma)/sizeof(double)); //Critical parameters crit.rho = 228; //[kg/m^3] crit.p = PressureUnit(3796,UNIT_KPA); //[kPa] crit.T = 425.125; //[K] crit.v = 1/crit.rho; // Other fluid parameters params.molemass = 58.12220; params.Ttriple = 134.895; params.ptriple = 0.000665785834101; params.accentricfactor = 0.200810094644; params.R_u = 8.314472; // Limits of EOS limits.Tmin = params.Ttriple; limits.Tmax = 500.0; limits.pmax = 100000.0; limits.rhomax = 1000000.0*params.molemass; phirlist.push_back(new phir_power( n_v,d_v,t_v,l_v,1,23)); phirlist.push_back(new phir_gaussian( n_v,d_v,t_v,eta_v,epsilon_v,beta_v,gamma_v,24,25)); double _theta [] ={0,0,0,0,0.774840445,3.340602552,4.970513096,9.975553778}; std::vector<double> theta_v (_theta,_theta+sizeof(_theta)/sizeof(double)); double _n0 [] ={0, 12.54882924,-5.46976878,3.24680487,5.54913289,11.4648996,7.59987584,9.66033239}; std::vector<double> n0_v (_n0,_n0+sizeof(_n0)/sizeof(double)); // lead term: log(delta)+c+m*tau phi0list.push_back(new phi0_lead(n0_v[1], n0_v[2])); phi0list.push_back(new phi0_logtau(n0_v[3])); phi0list.push_back(new phi0_Planck_Einstein(n0_v,theta_v,4,7)); EOSReference.assign("Buecker, D. and Wagner, W. \"Reference Equations of State for the Thermodynamic Properties of Fluid Phase n-Butane and Isobutane,\" J. Phys. Chem. Ref. Data, Vol. 35, No. 2, 2006, 929-1019."); TransportReference.assign("Using ECS in fully predictive mode"); name.assign("n-Butane"); aliases.push_back("nButane"); aliases.push_back("butane"); aliases.push_back("BUTANE"); aliases.push_back("N-BUTANE"); REFPROPname.assign("BUTANE"); BibTeXKeys.EOS = "Buecker-JPCRD-2006B"; BibTeXKeys.VISCOSITY = "Vogel-HTHP-1999"; BibTeXKeys.CONDUCTIVITY = "Perkins-JCED-2002A"; BibTeXKeys.SURFACE_TENSION = "Mulero-JPCRD-2012"; BibTeXKeys.ECS_LENNARD_JONES = "Vogel-HTHP-1999"; }
EthaneClass::EthaneClass() { double n[] = {0.0, 0.83440745735241, //[1] -1.4287360607171, //[2] 0.34430242210927, //[3] -0.42096677920265, //[4] 0.012094500886549, //[5] -0.57976201597341, //[6] -0.033127037870838, //[7] -0.1175165489413, //[8] -0.11160957833067, //[9] 0.062181592654406, //[10] 0.098481795434443, //[11] -0.098268582682358, //[12] -0.00023977831007049, //[13] 0.00069885663328821, //[14] 0.000019665987803305, //[15] -0.014586152207928, //[16] 0.046354100536781, //[17] 0.0060764622180645, //[18] -0.0026447330147828, //[19] -0.042931872689904, //[20] 0.0029987786517263, //[21] 0.005291933517501, //[22] -0.0010383897798198, //[23] -0.054260348214694, //[24] -0.21959362918493, //[25] 0.35362456650354, //[26] -0.12477390173714, //[27] 0.18425693591517, //[28] -0.16192256436754, //[29] -0.082770876149064, //[30] 0.050160758096437, //[31] 0.0093614326336655, //[32] -0.00027839186242864, //[33] 0.000023560274071481, //[34] 0.0039238329738527, //[35] -0.00076488325813618, //[36] -0.004994430444073, //[37] 0.0018593386407186, //[38] -0.00061404353331199, //[39] -0.0023312179367924, //[40] 0.002930104790876, //[41] -0.00026912472842883, //[42] 184.13834111814, //[43] -10.397127984854, //[44] }; double d[] = {0, 1, //[1] 1, //[2] 2, //[3] 2, //[4] 4, //[5] 1, //[6] 1, //[7] 2, //[8] 2, //[9] 3, //[10] 6, //[11] 6, //[12] 7, //[13] 9, //[14] 10, //[15] 2, //[16] 4, //[17] 4, //[18] 5, //[19] 5, //[20] 6, //[21] 8, //[22] 9, //[23] 2, //[24] 3, //[25] 3, //[26] 3, //[27] 4, //[28] 4, //[29] 5, //[30] 5, //[31] 6, //[32] 11, //[33] 14, //[34] 3, //[35] 3, //[36] 4, //[37] 8, //[38] 10, //[39] 1, //[40] 1, //[41] 3, //[42] 3, //[43] 2 //[44] }; double t[] = {0, 0.25, //[1] 1, //[2] 0.25, //[3] 0.75, //[4] 0.75, //[5] 2, //[6] 4.25, //[7] 0.75, //[8] 2.25, //[9] 3, //[10] 1, //[11] 1.25, //[12] 2.75, //[13] 1, //[14] 2, //[15] 2.5, //[16] 5.5, //[17] 7, //[18] 0.5, //[19] 5.5, //[20] 2.5, //[21] 4, //[22] 2, //[23] 10, //[24] 16, //[25] 18, //[26] 20, //[27] 14, //[28] 18, //[29] 12, //[30] 19, //[31] 7, //[32] 15, //[33] 9, //[34] 26, //[35] 28, //[36] 28, //[37] 22, //[38] 13, //[39] 0, //[40] 3, //[41] 3, //[42] 0, //[43] 3, //[44] }; double l[] = {0, 0, //[1] 0, //[2] 0, //[3] 0, //[4] 0, //[5] 1, //[6] 1, //[7] 1, //[8] 1, //[9] 1, //[10] 1, //[11] 1, //[12] 1, //[13] 1, //[14] 1, //[15] 2, //[16] 2, //[17] 2, //[18] 2, //[19] 2, //[20] 2, //[21] 2, //[22] 2, //[23] 3, //[24] 3, //[25] 3, //[26] 3, //[27] 3, //[28] 3, //[29] 3, //[30] 3, //[31] 3, //[32] 3, //[33] 3, //[34] 4, //[35] 4, //[36] 4, //[37] 4, //[38] 4, //[39] 0, //[40] 0, //[41] 0, //[42] 0, //[43] 0, //[44] }; double eta [] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //[indices 0-39] 15, //[40] 15, //[41] 15, //[42] 20, //[43] 20, //[44] }; double epsilon [] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //[indices 0-39] 1, //[40] 1, //[41] 1, //[42] 1, //[43] 1, //[44] }; double beta [] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //[indices 0-39] 150, //[40] 150, //[41] 150, //[42] 275, //[43] 400, //[44] }; double gamma [] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //[indices 0-39] 1.05, //[40] 1.05, //[41] 1.05, //[42] 1.22, //[43] 1.16, //[44] }; std::vector<double> n_v(n,n+sizeof(n)/sizeof(double)); std::vector<double> d_v(d,d+sizeof(d)/sizeof(double)); std::vector<double> t_v(t,t+sizeof(t)/sizeof(double)); std::vector<double> l_v(l,l+sizeof(l)/sizeof(double)); std::vector<double> eta_v(eta,eta+sizeof(eta)/sizeof(double)); std::vector<double> epsilon_v(epsilon,epsilon+sizeof(epsilon)/sizeof(double)); std::vector<double> beta_v(beta,beta+sizeof(beta)/sizeof(double)); std::vector<double> gamma_v(gamma,gamma+sizeof(gamma)/sizeof(double)); //Critical parameters crit.rho = 6.856886685*30.06904;// 206.18; //[kg/m^3] crit.p = PressureUnit(4872.2,UNIT_KPA); //[kPa] crit.T = 305.322; //[K] crit.v = 1/crit.rho; // Other fluid parameters params.molemass = 30.06904; params.Ttriple = 90.368; params.ptriple = 0.00114240920349; params.accentricfactor = 0.099; params.R_u = 8.314472; // Limits of EOS limits.Tmin = params.Ttriple; limits.Tmax = 500.0; limits.pmax = 100000.0; limits.rhomax = 1000000.0*params.molemass; phirlist.push_back(new phir_power( n_v,d_v,t_v,l_v,1,39)); phirlist.push_back(new phir_gaussian( n_v,d_v,t_v,eta_v,epsilon_v,beta_v,gamma_v,40,44)); double _theta [] ={0,0,0,0,1.409105233,4.009917071,6.596709834,13.97981027}; std::vector<double> theta_v (_theta,_theta+sizeof(_theta)/sizeof(double)); double _n0 [] ={0,9.212802589,-4.68224855,3.003039265,1.117433359,3.467773215,6.94194464,5.970850948}; std::vector<double> n0_v (_n0,_n0+sizeof(_n0)/sizeof(double)); // lead term: log(delta)+c+m*tau phi0list.push_back(new phi0_lead(n0_v[1], n0_v[2])); phi0list.push_back(new phi0_logtau(n0_v[3])); phi0list.push_back(new phi0_Planck_Einstein(n0_v,theta_v,4,7)); EOSReference.assign("Buecker, D. and Wagner, W. \"A Reference Equation of State for the Thermodynamic Properties of Ethane for Temperatures from the Melting Line to 675 K and Pressures up to 900 MPa,\" J. Phys. Chem. Ref. Data, 35(1):205-266, 2006."); TransportReference.assign("Using ECS in fully predictive mode"); name.assign("Ethane"); aliases.push_back("ethane"); aliases.push_back("ETHANE"); REFPROPname.assign("ETHANE"); BibTeXKeys.EOS = "Buecker-JPCRD-2006"; BibTeXKeys.VISCOSITY = "Friend-JPCRD-1991"; BibTeXKeys.CONDUCTIVITY = "Friend-JPCRD-1991"; BibTeXKeys.ECS_LENNARD_JONES = "Friend-JPCRD-1991"; BibTeXKeys.SURFACE_TENSION = "Mulero-JPCRD-2012"; }
SulfurHexafluorideClass::SulfurHexafluorideClass() { double _n [] = {0, 0.54958259132835, -0.87905033269396, -0.84656969731452, 0.27692381593529, -0.49864958372345e1, 0.48879127058055e1, 0.36917081634281e-1, 0.37030130305087e-3, 0.39389132911585e-1, 0.42477413690006e-3, -0.24150013863890e-1, 0.59447650642255e-1, -0.38302880142267, 0.32606800951983, -0.29955940562031e-1, -0.86579186671173e-1, 0.41600684707562e1, -0.41398128855814e1, -0.55842159922714, 0.56531382776891, 0.82612463415545e-2, -0.10200995338080e-1, -0.21662523861406e-1, 0.34650943893908e-1, -0.28694281385812e-1, 0.84007238998053e-2, -0.26969359922498, 0.90415215646344e1, -0.37233103557977e1, -0.27524670823704e4, 0.57711861697319e4, -0.30234003119748e4, 0.22252778435360e7, -0.23056065559032e7, 0.63918852944475e7, -0.60792091415592e7}; double _l [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; double _d [] = {0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 6, 1, 2, 2, 2, 3, 6, 2, 2, 4, 4, 2, 2, 1, 3, 4, 1, 1, 4, 3, 4, 4, 4, 1, 1, 3, 3}; double _t [] = {0, 0.125, 1.25, 1.875, 0.125, 1.5, 1.625, 1.5, 5.625, 0.625, 0.25, 6, 0.25, 4.75, 5.375, 5.875, 2, 5.875, 6, 5.625, 5.75, 0, 0.5, 4, 1, 3, 2, 4, 3, 4, 1, 2, 3, 3, 4, 3, 4}; double _eta [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 11, 25, 30, 30, 30, 30, 30, 30, 30, 30}; double _beta [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 150, 150, 150, 225, 300, 350, 350, 350, 350, 400, 400, 400, 400}; double _gamma [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.13, 1.13, 1.13, 1.16, 1.19, 1.19, 1.16, 1.16, 1.16, 1.16, 1.22, 1.22, 1.22, 1.22}; double _epsilon [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.85, 0.85, 0.85, 0.85, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; std::vector<double> n_v(_n,_n+sizeof(_n)/sizeof(double)); std::vector<double> d_v(_d,_d+sizeof(_d)/sizeof(double)); std::vector<double> t_v(_t,_t+sizeof(_t)/sizeof(double)); std::vector<double> l_v(_l,_l+sizeof(_l)/sizeof(double)); std::vector<double> eta_v(_eta,_eta+sizeof(_eta)/sizeof(double)); std::vector<double> epsilon_v(_epsilon,_epsilon+sizeof(_epsilon)/sizeof(double)); std::vector<double> beta_v(_beta,_beta+sizeof(_beta)/sizeof(double)); std::vector<double> gamma_v(_gamma,_gamma+sizeof(_gamma)/sizeof(double)); //Critical parameters crit.rho = 742.3; //[kg/m^3] crit.p = PressureUnit(3754.983, UNIT_KPA); //[kPa] crit.T = 318.7232; //[K] crit.v = 1/crit.rho; // Other fluid parameters params.molemass = 146.0554192; params.Ttriple = 223.555; params.ptriple = 231.42447394906830; params.accentricfactor = 0.21; params.R_u = 8.314472; // Limits of EOS limits.Tmin = params.Ttriple; limits.Tmax = 500.0; limits.pmax = 100000.0; limits.rhomax = 1000000.0*params.molemass; phirlist.push_back(new phir_power( n_v,d_v,t_v,l_v,1,22)); phirlist.push_back(new phir_gaussian( n_v,d_v,t_v,eta_v,epsilon_v,beta_v,gamma_v,23,36)); double _theta [] ={0, 0, 0, 0, 1.617282065, 2.747115139, 4.232907175}; std::vector<double> theta_v (_theta,_theta+sizeof(_theta)/sizeof(double)); double _n0 [] ={0, 11.638611086, -6.392241811, 3.000000000, 3.661182320, 7.878851030, 3.459816790}; std::vector<double> n0_v (_n0,_n0+sizeof(_n0)/sizeof(double)); // lead term: log(delta)+c+m*tau phi0list.push_back(new phi0_lead(n0_v[1], n0_v[2])); phi0list.push_back(new phi0_logtau(n0_v[3])); phi0list.push_back(new phi0_Planck_Einstein(n0_v,theta_v,4,6)); EOSReference.assign("Guder C., and W. Wagner, \"A Reference Equation of State for the Thermodynamic Properties of Sulfur Hexafluoride SF6 for Temperatures from the Melting Line to 625 K and Pressures up to 150 MPa,\" J. Phys. Chem. Ref. Data, Vol. 38, No. 1, 2009"); TransportReference.assign("Using ECS in fully predictive mode"); name.assign("SulfurHexafluoride"); aliases.push_back("SF6"); REFPROPname.assign("SF6"); BibTeXKeys.EOS = "Guder-JPCRD-2009"; BibTeXKeys.VISCOSITY = "QuinonesCisneros-JPCRD-2012"; BibTeXKeys.CONDUCTIVITY = "Assael-JPCRD-2012"; BibTeXKeys.SURFACE_TENSION = "Mulero-JPCRD-2012"; BibTeXKeys.ECS_LENNARD_JONES = "QuinonesCisneros-JPCRD-2012"; }
SES36Class::SES36Class() { //Constants for ideal gas expression static const double a0[]={0.0,13.09,85.26}; static const double b0 = 2197; static const double n[]={0, 0.0675748, //[1] 1.76939, //[2] -2.7609, //[3] -0.566938, //[4] 0.243576, //[5] -1.50937, //[6] -0.774081, //[7] 0.953907, //[8] -1.43736, //[9] -0.0458514, //[10] 2.46053, //[11] -0.903158, //[12] -0.288664, //[13] 0.061038, //[14] }; // d used for consistency with CO2 correlation (corresponds to i from Span) static const double d[]={0, 4, //[1] 1, //[2] 1, //[3] 2, //[4] 3, //[5] 1, //[6] 3, //[7] 2, //[8] 2, //[9] 7, //[10] 1, //[11] 1, //[12] 3, //[13] 3, //[14] }; // t used for consistency with CO2 correlation (corresponds to j from Span) static const double t[]={0.00, 1, //[1] 0.3, //[2] 0.947, //[3] 1.08, //[4] 0.44, //[5] 1.7, //[6] 1.5, //[7] 1.35, //[8] 2.1, //[9] 0.97, //[10] 0.8, //[11] 2, //[12] 2.5, //[13] 4, //[14] }; // c used for consistency with CO2 correlation (corresponds to l from Span) static const double c[]={0, 0, //[1] 0, //[2] 0, //[3] 0, //[4] 0, //[5] 2, //[6] 2, //[7] 1, //[8] 2, //[9] 1, //[10] }; // alpha is used here for consistency with the definitions in R744.c upon which Nitrogen.c is based // is phi_k from Span static const double eta[]={ 0,0,0,0,0,0,0,0,0,0,0, // indices [0-10] 1.023, //[11] 1.383, //[12] 1, //[13] 7, //[14] }; static const double GAMMA[]={ 0,0,0,0,0,0,0,0,0,0,0, // indices [0-10] 1.1, //[11] 0.64, //[12] 0.5, //[13] 1.26, //[14] }; // epsilon is used here for consistency with the definitions in R744.c upon which Nitrogen.c is based // is the value unity in Span static const double beta[]={ 0,0,0,0,0,0,0,0,0,0,0, // indices [0-10] 1.7, //[11] 1.55, //[12] 1.07, //[13] 87, //[14] }; // GAMMA is used here for consistency with the definitions in R744.c upon which Nitrogen.c is based static const double epsilon[]={ 0,0,0,0,0,0,0,0,0,0,0, // indices [0-10] 0.713, //[11] 0.917, //[12] 0.69, //[13] 0.748, //[14] }; std::vector<double> eta_v(eta,eta+sizeof(eta)/sizeof(double)); std::vector<double> epsilon_v(epsilon,epsilon+sizeof(epsilon)/sizeof(double)); std::vector<double> beta_v(beta,beta+sizeof(beta)/sizeof(double)); std::vector<double> gamma_v(GAMMA,GAMMA+sizeof(GAMMA)/sizeof(double)); phirlist.push_back(new phir_power(n,d,t,c,1,10,11)); phirlist.push_back(new phir_gaussian(n,d,t,eta,epsilon,beta,GAMMA,11,14,15)); // phi0=log(delta)+a0[1]*log(tau)+a0[2]*log(1-exp(-b0*tau)); phi0list.push_back(new phi0_lead(0,0)); // phi0_lead is like log(delta)+a1+a2*tau with a1=0, a2=0 phi0list.push_back(new phi0_logtau(a0[1]-1)); // -1 value needed to yield the correct values for the ideal gas part phi0list.push_back(new phi0_Planck_Einstein(a0[2],b0/450.7)); // Critical parameters crit.rho = 2.8*184.85; crit.p = PressureUnit(2849,UNIT_KPA); crit.T = 450.7; crit.v = 1.0/crit.rho; // Other fluid parameters params.molemass = 184.85; params.Ttriple = 200; // No value given, taken from PPF Refprop file params.ptriple = 0.573325755702; //Evaluated at 200 K params.accentricfactor = 0.352; params.R_u = 8.314472; isPure = false; // Limits of EOS limits.Tmin = params.Ttriple; limits.Tmax = 2000.0; limits.pmax = 2200000.0; limits.rhomax = 53.15*params.molemass; EOSReference.assign("Unpublished report: Monika Thol, Eric W. Lemmon, Roland Span, \"Equation of State for a Refrigerant Mixture of R365mfc (1,1,1,3,3-Pentafluorobutane) and Galden® HT 55 (Perfluoropolyether)\", "); TransportReference.assign("Using ECS in predictive mode\n\n" "Surface Tension: A. P. Fröba, H. Kremer, A. Leipertz, F. Flohr and C. Meurer, " "\"Thermophysical Properties of a Refrigerant Mixture of R365mfc (1,1,1,3,3-Pentafluorobutane) " "and Galden® HT 55 (Perfluoropolyether)\", International Journal of Thermophysics, Volume 28, " "Number 2 (2007), 449-480, DOI: 10.1007/s10765-007-0178-y"); name.assign("SES36"); BibTeXKeys.EOS = "Thol-2012"; }
cv::Mat WavefrontSensor::WavefrontSensing(const std::vector<cv::Mat>& d, const double& meanPowerNoise) { unsigned int numberOfZernikes = 20; //total number of zernikes to be considered int M = numberOfZernikes; int K = d.size(); cv::Mat Q2; //We introduce here the lineal relationship between parameter phases of each optical path partlyKnownDifferencesInPhaseConstraints(M, K, Q2); std::vector<cv::Mat> Q2_v = {Q2, cv::Mat::zeros(Q2.size(), Q2.type())}; cv::Mat LEC; //Linear equality constraints cv::merge(Q2_v, LEC); //Build also the complex version of Q2 //process each patch independently cv::Mat dd; std::vector<cv::Mat> d_w; std::vector<Metric> mtrc_v; std::vector<std::pair<cv::Range,cv::Range> > rngs; unsigned int pixelsBetweenTiles = (int)(d.front().cols); unsigned int tileSize = 34; OpticalSetup tsettings( tileSize ); std::shared_ptr<Zernike> zrnk = std::make_shared<Zernike>(tsettings.pupilRadiousPixels(), tileSize, numberOfZernikes); divideIntoTiles(d.front().size(), pixelsBetweenTiles, tileSize, rngs); //Random row selector: Pick incoherent measurements cv::Mat eye_nn = cv::Mat::eye(K*tileSize*tileSize, K*tileSize*tileSize, cv::DataType<double>::type); unsigned int a = 400; //number of incoheren measurements cv::Mat shuffle_eye; shuffleRows(eye_nn, shuffle_eye); //Split 'a' into rngs.size() pieces std::vector<cv::Mat> A_v = {shuffle_eye(cv::Range(0, a), cv::Range::all()), cv::Mat::zeros(a, K*tileSize*tileSize, cv::DataType<double>::type)}; cv::Mat A; cv::merge(A_v, A); std::cout << "Number of anisoplanatic patches to annalize at once: " << rngs.size() << std::endl; for(auto rng_i : rngs) { cv::Mat d_col; //get ready dataset format std::vector<cv::Mat> D; std::vector<cv::Mat> d_col_v; for(cv::Mat di : d) { cv::Mat Di; cv::dft(di(rng_i.first, rng_i.second), Di, cv::DFT_COMPLEX_OUTPUT + cv::DFT_SCALE); fftShift(Di); D.push_back(Di); cv::Mat Di_t(Di.t()); d_col_v.push_back(Di_t.reshape(0, Di_t.total() )); } cv::vconcat(d_col_v, d_col); cv::gemm(A, d_col, 1.0, cv::Mat(), 1.0, d_col); //Picks rows randomly d_w.push_back( d_col ); mtrc_v.push_back( Metric(D, zrnk, meanPowerNoise) ); } cv::vconcat(d_w, dd); //-----------------------BY MEANS OF CONVEX OPTIMIZATION: //Objective function and gradient of the objective function if(false) { for(auto mtrc : mtrc_v) { std::function<double(cv::Mat)> func = std::bind(&Metric::objective, &mtrc, std::placeholders::_1); std::function<cv::Mat(cv::Mat)> dfunc = std::bind(&Metric::gradient, &mtrc, std::placeholders::_1); ConvexOptimization minimizationKit; cv::Mat x0_conv = cv::Mat::zeros(M*K, 1, cv::DataType<double>::type); //reset starting point //Lambda function that turn minimize function + constraints problem into minimize function lower dimension problem auto F_constrained = [] (cv::Mat x, std::function<double(cv::Mat)> func, const cv::Mat& Q2) -> double { return func(Q2*x); }; auto DF_constrained = [] (cv::Mat x, std::function<cv::Mat(cv::Mat)> dfunc, const cv::Mat& Q2) -> cv::Mat { return Q2.t() * dfunc(Q2*x); }; std::function<double(cv::Mat)> f_constrained = std::bind(F_constrained, std::placeholders::_1, func, Q2); std::function<cv::Mat(cv::Mat)> df_constrained = std::bind(DF_constrained, std::placeholders::_1, dfunc, Q2); //Define a new starting point with lower dimensions after reduction with contraints cv::Mat p_constrained = Q2.t() * x0_conv; ConvexOptimization min; min.perform_BFGS(p_constrained, f_constrained, df_constrained); x0_conv = Q2 * p_constrained; //Go back to original dimensional std::cout << "mimumum: " << x0_conv.t() << std::endl; } std::cout << "END OF CONVEX OPTIMIZATION" << std::endl; } //-----------------------BY MEANS OF SPARSE RECOVERY: //Create phase_div bias: only for the case of two diversity images!! // cv::Mat phase_div = cv::Mat::zeros(rngs.size()*M*K, 1, cv::DataType<double>::type); // phase_div.at<double>(M + 3, 0) = tsettings.k() * 3.141592/(2.0*std::sqrt(3.0)); cv::Mat x0 = cv::Mat::zeros(rngs.size()*M*K, 1, cv::DataType<double>::type); //Starting point std::vector<double> gamma_v(M*K, 1.0); for(unsigned int count=0;count<600;++count) { std::vector<cv::Mat> x0_vvv; cv::split(x0, x0_vvv); x0_vvv.at(0).copyTo(x0); cv::Mat_<std::complex<double> > blockMatrix_M; std::vector<cv::Mat> De_v; for(unsigned int t=0; t < rngs.size(); ++t) { cv::Mat jacob_i; mtrc_v.at(t).jacobian( x0(cv::Range(t*M*K, (t*M*K) + (M*K)), cv::Range::all()), jacob_i ); cv::gemm(A, jacob_i, 1.0, cv::Mat(), 1.0, jacob_i); //Picks rows randomly cv::gemm(jacob_i, LEC, 1.0, cv::Mat(), 1.0, jacob_i); //Apply constraints LECs cv::copyMakeBorder(blockMatrix_M, blockMatrix_M, 0, jacob_i.size().height, 0, jacob_i.size().width, cv::BORDER_CONSTANT, cv::Scalar(0.0, 0.0) ); cv::Rect rect(cv::Point(t*jacob_i.size().width, t*jacob_i.size().height), jacob_i.size() ); jacob_i.copyTo(blockMatrix_M( rect )); cv::Mat De_i; mtrc_v.at(t).phi( x0(cv::Range(t*M*K, (t*M*K) + (M*K)), cv::Range::all()), De_i ); cv::gemm(A, De_i, 1.0, cv::Mat(), 1.0, De_i); //Picks rows randomly De_v.push_back( De_i ); } cv::Mat De; cv::vconcat(De_v, De); std::vector<cv::Mat> x0_v = {x0, cv::Mat::zeros(x0.size(), x0.type())}; cv::merge(x0_v, x0); //Apply algorithm to get solution unsigned int blkLen = rngs.size(); cv::Mat blockMatrix_M_r; reorderColumns(blockMatrix_M, M, blockMatrix_M_r); //reorder columns so correlated data form a single block gamma_v = std::vector<double>(M*K, 1.0); //cv::Mat coeffs = perform_BSBL(blockMatrix_M_r, dd - De, NoiseLevel::Noiseless, gamma_v, blkLen); //Noiseless, LittleNoise //cv::Mat coeffs = perform_SBL(blockMatrix_M_r, dd - De, NoiseLevel::Noiseless, gamma_v); //Noiseless, LittleNoise cv::Mat coeffs = perform_projection(blockMatrix_M_r, dd - De); //Noiseless, LittleNoise cv::Mat coeffs_r; reorderColumns(coeffs.t(), blockMatrix_M.cols/M, coeffs_r); cv::Mat coeffs_r_n(coeffs_r.t()); //Undo constraints cv::Mat sol = cv::Mat::zeros(x0.size(), cv::DataType<std::complex<double> >::type); for(unsigned int t=0; t < rngs.size(); ++t) { cv::Mat sol_i; cv::gemm(LEC, coeffs_r_n(cv::Range(t*LEC.cols, (t*LEC.cols) + (LEC.cols)), cv::Range::all()), 1.0, cv::Mat(), 1.0, sol_i); sol_i.copyTo(sol(cv::Range(t*M*K, (t*M*K) + (M*K)), cv::Range::all())); } std::cout << "cv::norm(sol): " << cv::norm(sol) << std::endl; if(cv::norm(sol) < 1e-4 ) {std::cout << "Solution found" << std::endl; break;} x0 = x0 - sol; std::cout << "Solution number: " << count << std::endl; std::cout << "x0: " << x0.t() << std::endl; } return cv::Mat(); //mtrc.F(); }