Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/hyddown/examples/LPG.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ vessel:
heat_capacity: 500
density: 7700
thickness: 0.01185
liquid_level: 0.4668
liquid_level: 0.4668 #1.15
initial:
temperature: 298.15
temperature: 279
pressure: 550000
fluid: "propane"
calculation:
type: "energybalance"
time_step: 1
end_time: 900.
end_time: 660.
valve:
flow: "discharge"
type: "psv"
Expand Down
27 changes: 27 additions & 0 deletions src/hyddown/examples/LPG_small.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
vessel:
length: 2.26
diameter: 0.51
orientation: "horizontal"
heat_capacity: 500
density: 7700
thickness: 0.008
liquid_level: 0.2 #0.4668 #1.15
initial:
temperature: 279
pressure: 550000
fluid: "propane"
calculation:
type: "energybalance"
time_step: 1
end_time: 360.
valve:
flow: "discharge"
type: "psv"
diameter: 0.014
discharge_coef: 0.975
set_pressure: 1690000
blowdown: 0.10
back_pressure: 101300.
heat_transfer:
type: "s-b"
fire: "scandpower_pool"
155 changes: 139 additions & 16 deletions src/hyddown/hdclass.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ def __init__(self, input):
self.validate_input()
self.read_input()
self.initialize()
# sb_heat_load = np.loadtxt(
# "C:\\Users\\AndersAndreasen\\Documents\\GitHub\\HydDown\\src\\hyddown\\examples\\LPG-heat_load.txt"
# )
# self.sb_heat_load = lambda x: np.interp(
# x, sb_heat_load[:, 0], sb_heat_load[:, 1]
# )

def validate_input(self):
"""
Expand Down Expand Up @@ -229,7 +235,8 @@ def initialize(self):
self.surf_area_inner = self.inner_vol.A

self.fluid = CP.AbstractState("HEOS", self.comp)
# self.fluid.specify_phase(CP.iphase_gas)
if "&" in self.comp:
self.fluid.specify_phase(CP.iphase_gas)
self.fluid.set_mole_fractions(self.molefracs)

self.transport_fluid = CP.AbstractState("HEOS", self.compSRK)
Expand All @@ -241,7 +248,7 @@ def initialize(self):
self.transport_fluid_wet.set_mole_fractions(self.molefracs)

self.vent_fluid = CP.AbstractState("HEOS", self.comp)
# self.vent_fluid.specify_phase(CP.iphase_gas)
self.vent_fluid.specify_phase(CP.iphase_gas)
self.vent_fluid.set_mole_fractions(self.molefracs)

if "liquid_level" in self.input["vessel"]:
Expand Down Expand Up @@ -287,6 +294,7 @@ def initialize(self):
self.T_outer_wall = np.zeros(data_len)
self.T_outer_wall_wetted = np.zeros(data_len)
self.T_bonded_wall = np.zeros(data_len)
self.T_bonded_wall_wetted = np.zeros(data_len)
self.Q_outer = np.zeros(data_len)
self.Q_inner = np.zeros(data_len)
self.Q_outer_wetted = np.zeros(data_len)
Expand Down Expand Up @@ -481,6 +489,7 @@ def run(self, disable_pbar=True):
self.T_inner_wall_wetted[0] = self.T0
self.T_outer_wall_wetted[0] = self.T0
self.T_bonded_wall[0] = self.T0
self.T_bonded_wall_wetted[0] = self.T0
self.liquid_level[0] = self.liquid_level0
if self.input["valve"]["flow"] == "discharge":
self.T_vent[0] = self.T0
Expand Down Expand Up @@ -795,8 +804,11 @@ def run(self, disable_pbar=True):
mesh = tm.Mesh(
z, tm.LinearElement
) # Or `QuadraticElement` to

mesh_w = tm.Mesh(
z, tm.LinearElement
) # Or `QuadraticElement` to
cpeek = tm.isothermal_model(k, rho, cp)
cpeek_w = tm.isothermal_model(k, rho, cp)

if type(T_profile) == type(int()) and T_profile == 0:
bc = [
Expand All @@ -813,10 +825,36 @@ def run(self, disable_pbar=True):
"theta": theta,
}
t_bonded, T_profile = tm.solve_ht(domain, solver)

bc_w = [
{"T": self.T0},
{"T": self.Tamb},
]
domain_w = tm.Domain(mesh_w, [cpeek_w], bc_w)
domain_w.set_T(
(self.Tamb + self.T0)
/ 2
* np.ones(len(mesh_w.nodes))
)
solver_w = {
"dt": 100,
"t_end": 10000,
"theta": theta,
}
t_bonded, T_profile = tm.solve_ht(domain, solver)
t_bonded_w, T_profile_w = tm.solve_ht(
domain_w, solver_w
)
else:
bc = [
{"q": self.Q_outer[i] / self.surf_area_outer},
{"q": -self.Q_inner[i] / self.surf_area_inner},
{
"q": self.Q_outer[i]
/ (self.surf_area_inner - wetted_area)
},
{
"q": -self.Q_inner[i]
/ (self.surf_area_inner - wetted_area)
},
]
domain = tm.Domain(mesh, [cpeek], bc)
domain.set_T(T_profile[-1, :])
Expand All @@ -826,18 +864,38 @@ def run(self, disable_pbar=True):
"theta": theta,
}
t_bonded, T_profile = tm.solve_ht(domain, solver)
bc_w = [
{"q": self.Q_outer_wetted[i] / wetted_area},
{"q": -self.Q_inner_wetted[i] / wetted_area},
]
domain_w = tm.Domain(mesh_w, [cpeek_w], bc_w)
domain_w.set_T(T_profile_w[-1, :])
solver = {
"dt": dt,
"t_end": self.tstep,
"theta": theta,
}
t_bonded_w, T_profile_w = tm.solve_ht(
domain_w, solver_w
)
solver = {"dt": dt, "t_end": self.tstep, "theta": theta}
t, T_profile = tm.solve_ht(domain, solver)
solver_w = {"dt": dt, "t_end": self.tstep, "theta": theta}
t_w, T_profile_w = tm.solve_ht(domain_w, solver_w)

self.temp_profile.append(T_profile[-1, :])
self.T_outer_wall[i] = T_profile[-1, 0]
self.T_inner_wall[i] = T_profile[-1, -1]
self.T_outer_wall_wetted[i] = T_profile_w[-1, 0]
self.T_inner_wall_wetted[i] = T_profile_w[-1, -1]
else:
k_liner = self.input["vessel"]["liner_thermal_conductivity"]
rho_liner = self.input["vessel"]["liner_density"]
cp_liner = self.input["vessel"]["liner_heat_capacity"]
liner = tm.isothermal_model(k_liner, rho_liner, cp_liner)
shell = tm.isothermal_model(k, rho, cp)
liner_w = tm.isothermal_model(k_liner, rho_liner, cp_liner)
shell_w = tm.isothermal_model(k, rho, cp)

thk = self.input["vessel"]["thickness"] # thickness in m
nn = 11 # number of nodes
Expand All @@ -848,9 +906,11 @@ def run(self, disable_pbar=True):
z2 = np.hstack((z_liner, z_shell[1:]))
self.z = z2
mesh2 = tm.Mesh(z2, tm.LinearElement)
mesh2_w = tm.Mesh(z2, tm.LinearElement)
for j, elem in enumerate(mesh2.elem):
if elem.nodes.mean() > 0.0:
mesh2.subdomain[j] = 1
mesh2_w.subdomain[j] = 1

if type(T_profile2) == type(int()) and T_profile2 == 0:
bc = [
Expand All @@ -869,10 +929,34 @@ def run(self, disable_pbar=True):
"theta": theta,
}
t_bonded, T_profile2 = tm.solve_ht(domain2, solver2)
bc_w = [
{"T": self.T0},
{"T": self.Tamb},
]
domain2_w = tm.Domain(mesh2_w, [liner_w, shell_w], bc_w)
domain2_w.set_T(
(self.Tamb + self.T0)
/ 2
* np.ones(len(mesh2.nodes))
)
solver2_w = {
"dt": 100,
"t_end": 10000,
"theta": theta,
}
t_bonded_w, T_profile2_w = tm.solve_ht(
domain2_w, solver2_w
)
else:
bc = [
{"q": -self.Q_inner[i] / self.surf_area_inner},
{"q": self.Q_outer[i] / self.surf_area_outer},
{
"q": -self.Q_inner[i]
/ (self.surf_area_inner - wetted_area)
},
{
"q": self.Q_outer[i]
/ (self.surf_area_outer - wetted_area)
},
]
domain2 = tm.Domain(mesh2, [liner, shell], bc)
domain2.set_T(T_profile2[-1, :])
Expand All @@ -882,10 +966,26 @@ def run(self, disable_pbar=True):
"theta": theta,
}
t_bonded, T_profile2 = tm.solve_ht(domain2, solver2)

bc_w = [
{"q": -self.Q_inner_wetted[i] / (wetted_area)},
{"q": self.Q_outer_wetted[i] / wetted_area},
]
domain2_w = tm.Domain(mesh2_w, [liner_w, shell_w], bc_w)
domain2_w.set_T(T_profile2_w[-1, :])
solver2_w = {
"dt": dt,
"t_end": self.tstep,
"theta": theta,
}
t_bonded_w, T_profile2_w = tm.solve_ht(
domain2_w, solver2_w
)
self.T_outer_wall[i] = T_profile2[-1, -1]
self.T_inner_wall[i] = T_profile2[-1, 0]
self.T_bonded_wall[i] = T_profile2[-1, (nn - 1)]
self.T_outer_wall_wetted[i] = T_profile2_w[-1, -1]
self.T_inner_wall_wetted[i] = T_profile2_w[-1, 0]
self.T_bonded_wall_wetted[i] = T_profile2_w[-1, (nn - 1)]
self.temp_profile.append(T_profile2[-1, :])
else:
self.T_inner_wall[i] = self.T_vessel[i]
Expand Down Expand Up @@ -942,21 +1042,38 @@ def run(self, disable_pbar=True):

self.Q_outer[i] = (
fire.sb_fire(self.T_vessel[i - 1], self.fire_type)
# (
# self.sb_heat_load(self.time_array[i])
# - 0.85 * 5.67e-8 * self.T_vessel[i - 1] ** 4
# )
* (self.surf_area_inner - wetted_area)
* self.surf_area_outer
/ self.surf_area_inner
)

self.q_outer[i] = fire.sb_fire(self.T_vessel[i - 1], self.fire_type)
# (
# self.sb_heat_load(self.time_array[i])
# - 0.85 * 5.67e-8 * self.T_vessel[i - 1] ** 4
# )

self.Q_outer_wetted[i] = (
fire.sb_fire(self.T_vessel_wetted[i - 1], self.fire_type)
# (
# self.sb_heat_load(self.time_array[i])
# - 0.85 * 5.67e-8 * self.T_vessel_wetted[i - 1] ** 4
# )
* wetted_area
* self.surf_area_outer
/ self.surf_area_inner
)
self.q_outer_wetted[i] = fire.sb_fire(
self.T_vessel_wetted[i - 1], self.fire_type
)
# (
# self.sb_heat_load(self.time_array[i])
# - 0.85 * 5.67e-8 * self.T_vessel_wetted[i - 1] ** 4
# )

if np.isnan(self.Q_outer_wetted[i]):
self.Q_outer_wetted[i] = 0
Expand Down Expand Up @@ -1325,14 +1442,20 @@ def plot(self, filename=None, verbose=True):
color="darkorange",
label="Vessel wall wetted",
)
if "liner_thermal_conductivity" in self.input["vessel"].keys():
plt.plot(
self.time_array,
self.T_bonded_wall - 273.15,
"g",
label="Liner/composite",
)

if "thermal_conductivity" in self.input["vessel"].keys():
if "liner_thermal_conductivity" in self.input["vessel"].keys():
plt.plot(
self.time_array,
self.T_bonded_wall - 273.15,
"g",
label="Liner/composite",
)
plt.plot(
self.time_array,
self.T_bonded_wall_wetted - 273.15,
color="darkorange",
label="Liner/composite wetted",
)
plt.plot(
self.time_array, self.T_inner_wall - 273.15, "g--", label="Inner wall"
)
Expand Down
10 changes: 5 additions & 5 deletions src/hyddown/test_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,12 +323,12 @@ def test_sim_filling():
hdown.run()


# def test_multicomponent():
# from hyddown import HydDown
def test_multicomponent():
from hyddown import HydDown

# input = get_example_input("ng.yml")
# hdown = HydDown(input)
# hdown.run()
input = get_example_input("ng.yml")
hdown = HydDown(input)
hdown.run()


def test_sim_stefan_boltzmann():
Expand Down
5 changes: 3 additions & 2 deletions src/hyddown/transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,8 +348,9 @@ def h_inside_wetted(L, Tvessel, Tfluid, fluid, master_fluid):
h_boil = 0

h_conv = h_inside_liquid(L, Tvessel, Tfluid, fluid)
return max(h_boil, h_conv)
# return min(max(h_boil, h_conv, 1000), 3000)
# return min(h_boil, h_conv)
# return h_conv
return min(max(h_boil, h_conv), 3000)


def gas_release_rate(P1, P2, rho, k, CD, area):
Expand Down
Loading