I am solving the heat equation in FEniCS with a temperature-dependent specific heat capacity๐ถ๐(๐). Below is the function I use to define ๐ถ๐(๐) to consider latent heat:
def Cp(T):
dependent = True
if dependent:
"""Temperature-dependent specific heat capacity (Cp)."""
# Temperature thresholds
# Add temperature bound at the start
T = fe.conditional(fe.lt(T, fe.Constant(298)), fe.Constant(298), T)
T_solidus = 1400
T_liquidus =1600
Cp_solidus = fe.conditional(fe.lt(T, T_liquidus),fe.conditional(fe.lt(T, fe.Constant(298)), .44 ,T*.000173 + .44),.65)
# Cp_solidus = .5
Cp_liquid = 0.72
# Fraction of solid and liquid
f_l = fe.conditional(fe.lt(T, T_solidus), 0,
fe.conditional(fe.lt(T, T_liquidus),
(T - T_solidus) / (T_liquidus - T_solidus), 1))
f_s = 1-f_l
# Weighted average with latent heat contribution
Cp_eff = f_s * 0.637994 + f_l * Cp_liquid
Cp_eff += (270 / (T_liquidus - T_solidus)) # Add latent heat contribution
Cp_transition = Cp_eff
return fe.conditional(
fe.lt(T, T_solidus), # Below solidus
Cp_solidus,
fe.conditional(
fe.lt(T, T_liquidus), # Between solidus and melting
Cp_transition,
Cp_liquid, # Above melting point
),
)
The weak form of my equation is as follows:
theta = 0.5
u_rhs = theta*u_pre + (1 - theta)*u_crt
residual = rho*Cp(u_rhs)*(u_crt - u_pre) * v * fe.dx + dt * fe.dot(k* fe.grad(u_rhs), fe.grad(v)) * fe.dx \
- dt*q_top * v * ds(2)
solver_parameters = {'newton_solver': {'maximum_iterations': 20, 'linear_solver': 'mumps'}}
fe.solve(residual == 0, u_crt, bcs, solver_parameters=solver_parameters)
However, the solver fails to converge. Could this issue be caused by sharp changes in ๐ถ๐due to the conditional statements, or is there another potential source of the problem? What would be the best way to address this?