Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
assert_allclose(m.Qls, flow_inputs['Qls'])
assert_allclose(m.Qgs, flow_inputs['Qgs'])
with pytest.raises(Exception):
# two compositions specified
Stream(['water', 'ethanol'], ns=[6, 4], ws=[.4, .6], T=300, P=1E5)
with pytest.raises(Exception):
# two flow rates specified
Stream(['water', 'ethanol'], ns=[6, 4], n=10, T=300, P=1E5)
with pytest.raises(Exception):
# no composition
Stream(['water', 'ethanol'], n=1, T=300, P=1E5)
with pytest.raises(Exception):
# no flow rate
Stream(['water', 'ethanol'], zs=[.5, .5], T=300, P=1E5)
assert_allclose(m.n, inputs['n'])
assert_allclose(m.m, inputs['m'])
assert_allclose(m.Q, inputs['Q'])
assert_allclose(m.ns, flow_inputs['ns'])
assert_allclose(m.ms, flow_inputs['ms'])
assert_allclose(m.Qls, flow_inputs['Qls'])
assert_allclose(m.Qgs, flow_inputs['Qgs'])
# Test ordereddict input with flow rates being given as dicts
for key, val in flow_inputs.items():
d = OrderedDict()
for i, j in zip(IDs, val):
d.update({i: j})
m = Stream(T=300, P=1E5, **{key:d})
assert_allclose(m.n, inputs['n'])
assert_allclose(m.m, inputs['m'])
assert_allclose(m.Q, inputs['Q'])
assert_allclose(m.ns, flow_inputs['ns'])
assert_allclose(m.ms, flow_inputs['ms'])
assert_allclose(m.Qls, flow_inputs['Qls'])
assert_allclose(m.Qgs, flow_inputs['Qgs'])
with pytest.raises(Exception):
# two compositions specified
Stream(['water', 'ethanol'], ns=[6, 4], ws=[.4, .6], T=300, P=1E5)
with pytest.raises(Exception):
# two flow rates specified
Stream(['water', 'ethanol'], ns=[6, 4], n=10, T=300, P=1E5)
with pytest.raises(Exception):
m = Stream(T=300, P=1E5, **{key:d})
assert_allclose(m.n, inputs['n'])
assert_allclose(m.m, inputs['m'])
assert_allclose(m.Q, inputs['Q'])
assert_allclose(m.ns, flow_inputs['ns'])
assert_allclose(m.ms, flow_inputs['ms'])
assert_allclose(m.Qls, flow_inputs['Qls'])
assert_allclose(m.Qgs, flow_inputs['Qgs'])
with pytest.raises(Exception):
# two compositions specified
Stream(['water', 'ethanol'], ns=[6, 4], ws=[.4, .6], T=300, P=1E5)
with pytest.raises(Exception):
# two flow rates specified
Stream(['water', 'ethanol'], ns=[6, 4], n=10, T=300, P=1E5)
with pytest.raises(Exception):
# no composition
Stream(['water', 'ethanol'], n=1, T=300, P=1E5)
with pytest.raises(Exception):
# no flow rate
Stream(['water', 'ethanol'], zs=[.5, .5], T=300, P=1E5)
def test_Stream():
Stream(['H2', 'NH3', 'CO', 'Ar', 'CH4', 'N2'],
zs=[.7371, 0, .024, .027, .013, .2475],
T=500, P=20.5E5, m=300)
def test_sub_streams():
with pytest.raises(Exception):
# remove a component not present
Stream(['water', 'ethanol'], ns=[1, 2], T=300, P=1E5) - Stream(['decane'], ns=[.5], T=300, P=1E5)
with pytest.raises(Exception):
# Remove too much of a component
Stream(['water', 'ethanol'], ns=[1, 2], T=300, P=1E5) - Stream(['ethanol'], ns=[3], T=300, P=1E5)
# Take a component completely away
no_ethanol = Stream(['water', 'ethanol'], ns=[1, 2], T=300, P=1E5) - Stream(['ethanol'], ns=[2], T=300, P=1E5)
assert len(no_ethanol.zs) == 1
assert_allclose(no_ethanol.zs, 1)
assert_allclose(no_ethanol.n, 1)
assert_allclose(no_ethanol.m, 0.01801528)
# basic case
m = Stream(['water', 'ethanol'], ns=[1, 2], T=300, P=1E5) - Stream(['ethanol'], ns=[1], T=300, P=1E5)
assert_allclose(m.ns, [1, 1])
# test case
m = Stream(['water', 'ethanol', 'decane', 'pentane'], ns=[1, 2, 3, 1E-9], T=300, P=1E5) - Stream(['ethanol'], ns=[2], T=300, P=1E5)
assert_allclose(m.ns, [1, 3.0, 1e-09])
assert m.CASs == ['7732-18-5', '124-18-5', '109-66-0']
assert_allclose(m.Q, inputs['Q'])
assert_allclose(m.ns, flow_inputs['ns'])
assert_allclose(m.ms, flow_inputs['ms'])
assert_allclose(m.Qls, flow_inputs['Qls'])
assert_allclose(m.Qgs, flow_inputs['Qgs'])
with pytest.raises(Exception):
# two compositions specified
Stream(['water', 'ethanol'], ns=[6, 4], ws=[.4, .6], T=300, P=1E5)
with pytest.raises(Exception):
# two flow rates specified
Stream(['water', 'ethanol'], ns=[6, 4], n=10, T=300, P=1E5)
with pytest.raises(Exception):
# no composition
Stream(['water', 'ethanol'], n=1, T=300, P=1E5)
with pytest.raises(Exception):
# no flow rate
Stream(['water', 'ethanol'], zs=[.5, .5], T=300, P=1E5)
def test_add_streams():
# simple example, same components
ans = {'zs': [0.4, 0.6], 'ws': [0.20679185022051716, 0.7932081497794828], 'm': 0.34847176, 'n': 10}
prod = Stream(['water', 'ethanol'], ns=[1, 2], T=300, P=1E5) + Stream(['water', 'ethanol'], ns=[3, 4], T=300, P=1E5)
assert_allclose(prod.zs, ans['zs'])
assert_allclose(prod.ws, ans['ws'])
assert_allclose(prod.m, ans['m'])
assert_allclose(prod.n, ans['n'])
# add a not a stream
with pytest.raises(Exception):
Stream(['decane', 'octane'], T=300, P=1E5, ns=[4, 5]) +1
# Add two streams, check they're the same if added in a different order
ans = {'zs': [1/6., 1/3., 1/3., 1/6.],
'ws': [0.12364762781718204, 0.3687607770917325, 0.3080280163630483, 0.1995635787280373],
'm': 0.92382298, 'n': 6}
S1 = Stream(['decane', 'octane'], T=300, P=1E5, ns=[2, 1])
S2 = Stream(['Dodecane', 'Tridecane'], T=300, P=1E5, ns=[2, 1])
flow_inputs = {'ns': [2027.0435669809347, 1377.998529332439], 'ms': [36.517757431360295, 63.482242568639705],
'Qls': [0.036643922302061455, 0.08101987400787004], 'Qgs': [48.673177307086064, 32.448784871390714]}
for key1, val1 in compositions.items():
for key2, val2 in inputs.items():
m = Stream(['water', 'ethanol'], T=300, P=1E5, **{key1:val1, key2:val2})
assert_allclose(m.n, inputs['n'])
assert_allclose(m.m, inputs['m'])
assert_allclose(m.Q, inputs['Q'])
assert_allclose(m.ns, flow_inputs['ns'])
assert_allclose(m.ms, flow_inputs['ms'])
assert_allclose(m.Qls, flow_inputs['Qls'])
assert_allclose(m.Qgs, flow_inputs['Qgs'])
for key, val in flow_inputs.items():
m = Stream(['water', 'ethanol'], T=300, P=1E5, **{key:val})
assert_allclose(m.n, inputs['n'])
assert_allclose(m.m, inputs['m'])
assert_allclose(m.Q, inputs['Q'])
assert_allclose(m.ns, flow_inputs['ns'])
assert_allclose(m.ms, flow_inputs['ms'])
assert_allclose(m.Qls, flow_inputs['Qls'])
assert_allclose(m.Qgs, flow_inputs['Qgs'])
# Test ordereddict input
IDs = ['water', 'ethanol']
for key1, val1 in compositions.items():
d = OrderedDict()
for i, j in zip(IDs, val1):
d.update({i: j})
ns_self[i] = 0.
elif relative_difference_product < 1E-12:
ns_self[i] = 0.
else:
ns_self[i] = ns_self[i] - nj
# Remove now-empty streams:
ns_product = []
CASs_product = []
for n, CAS in zip(ns_self, self.CASs):
if n != 0:
ns_product.append(n)
CASs_product.append(CAS)
# Create the resulting stream
return Stream(IDs=CASs_product, ns=ns_product, T=self.T, P=self.P)
def __add__(self, other):
if not isinstance(other, Stream):
raise Exception('Adding to a stream requires that the other object '
'also be a stream.')
if (set(self.CASs) == set(other.CASs)) and (len(self.CASs) == len(other.CASs)):
cmps = self.CASs
else:
cmps = sorted(list(set((self.CASs + other.CASs))))
mole = self.n + other.n
moles = []
for cmp in cmps:
moles.append(0)
if cmp in self.CASs:
ind = self.CASs.index(cmp)
moles[-1] += self.zs[ind]*self.n
if cmp in other.CASs:
ind = other.CASs.index(cmp)