Skip to content
Snippets Groups Projects
multifluid_ancillaries.hpp 1.56 KiB
Newer Older
  • Learn to ignore specific revisions
  • #pragma once
    
    #include <valarray>
    #include "nlohmann/json.hpp"
    
    #include "teqp/exceptions.hpp"
    
    
    namespace teqp{
    
    	struct VLEAncillary{
    
    		const double T_r, Tmax, Tmin;
    
    		const std::string type, description;
    		const std::valarray<double> n, t;
    
    		const double reducing_value;
    
    		const bool using_tau_r, noexp;
    	
    		VLEAncillary(const nlohmann::json &j) :
    			T_r(j.at("T_r")),
                Tmax(j.at("Tmax")),
                Tmin(j.at("Tmin")),
    
                type(j.at("type")),
    
                description(j.at("description")),
                n(j.at("n").get<std::valarray<double>>()),
                t(j.at("t").get<std::valarray<double>>()),
                reducing_value(j.at("reducing_value")),
                using_tau_r(j.at("using_tau_r")),
                noexp(type == "rhoLnoexp"){};
    
    		double operator() (double T) const{
    
    			if (T > T_r) {
    				throw teqp::InvalidArgument("Input temperature of " + std::to_string(T) + " K is above the reducing temperature of " + std::to_string(T_r) + " K");
    			}
    
    			auto Theta = 1-T/T_r;
    			auto RHS = (pow(Theta, t)*n).sum();
    			if (using_tau_r){
    				RHS *= T_r/T;
    			}
    			if (noexp){
    	            return reducing_value*(1+RHS);
    			}
    	        else{
    	            return exp(RHS)*reducing_value;
    	        }
    		};
    	};
    
    	struct MultiFluidVLEAncillaries {
    		const VLEAncillary rhoL, rhoV, pL, pV;
    		MultiFluidVLEAncillaries(const nlohmann::json& j) :
    			rhoL(VLEAncillary(j.at("rhoL"))),
    			rhoV(VLEAncillary(j.at("rhoV"))),
    			pL((j.contains("pS")) ? VLEAncillary(j.at("pS")) : VLEAncillary(j.at("pL"))),
    			pV((j.contains("pS")) ? VLEAncillary(j.at("pS")) : VLEAncillary(j.at("pV"))){}
    	};
    }