diff --git a/include/DataStructures.h b/include/DataStructures.h index a84c32ea..a4f8e573 100644 --- a/include/DataStructures.h +++ b/include/DataStructures.h @@ -355,6 +355,9 @@ std::string get_input_pair_short_desc(int pair); /// Return the long description of an input pair key ("Molar density in mol/m^3, Temperature in K" for instance) std::string get_input_pair_long_desc(int pair); +/// Split an input pair into parameters for the two parts that form the pair +void split_input_pair(input_pairs pair, parameters &p1, parameters &p2); + extern std::string get_mixture_binary_pair_data(const std::string &CAS1, const std::string &CAS2, const std::string ¶m); } /* namespace CoolProp */ diff --git a/src/CoolProp.cpp b/src/CoolProp.cpp index 4bf25c6f..44094580 100644 --- a/src/CoolProp.cpp +++ b/src/CoolProp.cpp @@ -285,6 +285,20 @@ void _PropsSI_outputs(shared_ptr &State, all_trivial_outputs = false; } } + // If all outputs are also inputs, never do a state update + bool all_outputs_in_inputs = true; + // Split the input pair into parameters + parameters p1, p2; + split_input_pair(input_pair, p1, p2); + // See if each parameter is in the output vector and is a normal type input + for (std::size_t j = 0; j < output_parameters.size(); ++j){ + if (output_parameters[j].type != output_parameter::OUTPUT_TYPE_NORMAL){ + all_outputs_in_inputs = false; break; + } + if (!(output_parameters[j].Of1 == p1 || output_parameters[j].Of1 == p2)){ + all_outputs_in_inputs = false; break; + } + } if (get_debug_level() > 100) { @@ -308,7 +322,7 @@ void _PropsSI_outputs(shared_ptr &State, // Iterate over the state variable inputs for (std::size_t i = 0; i < IO.size(); ++i){ try{ - if (input_pair != INPUT_PAIR_INVALID && !all_trivial_outputs){ + if (input_pair != INPUT_PAIR_INVALID && !all_trivial_outputs && !all_outputs_in_inputs){ // Update the state since it is a valid set of inputs State->update(input_pair, in1[i], in2[i]); } @@ -321,6 +335,18 @@ void _PropsSI_outputs(shared_ptr &State, } for (std::size_t j = 0; j < IO[i].size(); ++j){ + // If all the outputs are inputs, there is no need for a state input + if (all_outputs_in_inputs){ + if (p1 == output_parameters[j].Of1){ + IO[i][j] = in1[i]; success = true; continue; + } + else if (p2 == output_parameters[j].Of1){ + IO[i][j] = in2[i]; success = true; continue; + } + else{ + throw ValueError(); + } + } try{ output_parameter &output = output_parameters[j]; switch (output.type){ @@ -357,6 +383,7 @@ void _PropsSImulti(const std::vector &Outputs, std::vector > &IO) { shared_ptr State; + CoolProp::parameters key1, key2; CoolProp::input_pairs input_pair; std::vector output_parameters; std::vector v1, v2; @@ -372,9 +399,7 @@ void _PropsSImulti(const std::vector &Outputs, try{ // Get update pair - CoolProp::parameters key1; is_valid_parameter(Name1, key1); - CoolProp::parameters key2; is_valid_parameter(Name2, key2); input_pair = generate_update_pair(key1, Prop1, key2, Prop2, v1, v2); } diff --git a/src/DataStructures.cpp b/src/DataStructures.cpp index 6899424b..26baa414 100644 --- a/src/DataStructures.cpp +++ b/src/DataStructures.cpp @@ -451,8 +451,45 @@ std::string get_input_pair_long_desc(int pair) { return input_pair_information.long_desc_map[pair]; } - - +void split_input_pair(input_pairs pair, parameters &p1, parameters &p2) +{ + switch(pair){ + case QT_INPUTS: p1 = iQ; p2 = iT; break; + case QSmolar_INPUTS: p1 = iQ; p2 = iSmolar; break; + case QSmass_INPUTS: p1 = iQ; p2 = iSmass; break; + case HmolarQ_INPUTS: p1 = iHmolar; p2 = iQ; break; + case HmassQ_INPUTS: p1 = iHmass; p2 = iQ; break; + case PQ_INPUTS: p1 = iP; p2 = iQ; break; + case PT_INPUTS: p1 = iP; p2 = iT; break; + case DmassT_INPUTS: p1 = iDmass; p2 = iT; break; + case DmolarT_INPUTS: p1 = iDmolar; p2 = iT; break; + case HmassT_INPUTS: p1 = iHmass; p2 = iT; break; + case HmolarT_INPUTS: p1 = iHmolar; p2 = iT; break; + case SmassT_INPUTS: p1 = iSmass; p2 = iT; break; + case SmolarT_INPUTS: p1 = iSmolar; p2 = iT; break; + case TUmass_INPUTS: p1 = iT; p2 = iUmass; break; + case TUmolar_INPUTS: p1 = iT; p2 = iUmolar; break; + case DmassP_INPUTS: p1 = iDmass; p2 = iP; break; + case DmolarP_INPUTS: p1 = iDmolar; p2 = iP; break; + case HmassP_INPUTS: p1 = iHmass; p2 = iP; break; + case HmolarP_INPUTS: p1 = iHmolar; p2 = iP; break; + case PSmass_INPUTS: p1 = iP; p2 = iSmass; break; + case PSmolar_INPUTS: p1 = iP; p2 = iSmolar; break; + case PUmass_INPUTS: p1 = iP; p2 = iUmass; break; + case PUmolar_INPUTS: p1 = iP; p2 = iUmolar; break; + case DmassHmass_INPUTS: p1 = iDmass; p2 = iHmass; break; + case DmolarHmolar_INPUTS: p1 = iDmolar; p2 = iHmolar; break; + case DmassSmass_INPUTS: p1 = iDmass; p2 = iSmass; break; + case DmolarSmolar_INPUTS: p1 = iDmolar; p2 = iSmolar; break; + case DmassUmass_INPUTS: p1 = iDmass; p2 = iUmass; break; + case DmolarUmolar_INPUTS: p1 = iDmolar; p2 = iUmolar; break; + case HmassSmass_INPUTS: p1 = iHmass; p2 = iSmass;break; + case HmolarSmolar_INPUTS: p1 = iHmolar; p2 = iSmolar; break; + case SmassUmass_INPUTS: p1 = iSmass; p2 = iUmass; break; + case SmolarUmolar_INPUTS: p1 = iSmolar; p2 = iUmolar; break; + default: throw ValueError(format("Invalid input pair")); + } +} } /* namespace CoolProp */