sandbox/ecipriano/run/nucleate.c
Nucleate Boiling with Conjugate Heat Transfer
Simulation setup for nucleate boiling with conjugate heat transfer. This setup is very similar to bubblcecontact.c but including the solution of the energy equation within the solid heater and the energy transfer at the fluid–solid interface.
This setup aims to replicate the conditions described by Torres et al., 2024 focusing on the expansion of an FC-72 bubble in microgravity. The experiments for this configuration were conducted as a part of the RUBI project, which enabled boiling experiments aboard the International Space Station. The absence of gravity in this environment allows the bubble to expand without the influence of buoyancy-driven flows, which would typically cause the bubble to detach from the solid surface quickly.
The simulation shows that the Joule effect, localized on the top of the solid heater, increases the solid temperature and it is responsible for the heating of the fluid environment. After a few seconds, a small bubble is nucleated and it starts growing on the solid surface with the specified contact angle. The physical consistency of the oscillations observed around the contact line should be further investigated.
Evolution of the interface and temperature field from the numerical simulation
#include "axi.h"
#if JUMP
# include "navier-stokes/velocity-jump.h"
#else
# include "navier-stokes/low-mach.h"
#endif
#include "contact.h"
#include "two-phase.h"
#include "tension.h"
#include "boiling.h"
#include "conjugate.h"
#include "view.h"Boundary Conditions
Top and right sides are open boundaries, while no-slip conditions are imposed on the left boundary which represents the solid wall.
u.n[top] = neumann (0.);
u.t[top] = neumann (0.);
p[top] = dirichlet (0.);
u.n[right] = neumann (0.);
u.t[right] = neumann (0.);
p[right] = dirichlet (0.);
u.n[left] = dirichlet (0.);
u.t[left] = dirichlet (0.);
p[left] = neumann (0.);A constant contact angle model is used.
double theta0 = 27.;
vector h[];
h.t[left] = contact_angle (theta0*pi/180.);Simulation setup
We initialize the maximum level of refinement, and the radius of the nucleus: since we cannot simulate the nucleation process from the molecular scale, we just create a very small bubble at a specific time instant.
int maxlevel = 7;
double R0 = 0.25e-3;We define a function that adds sources to the solid temperature equation.
void joule_effect (scalar i, scalar e) {
foreach_boundary (left)
e[] += 1e+4/Delta*cm[];
boundary ({i,e});
}
int main (void) {We set properties of the technical fluid FC-72, in liquid (1) and in gas (2) phase. The solid (3) is sapphire.
rho1 = 1653.9, rho2 = 7.02, rho3 = 4890.;
mu1 = 5.49e-4, mu2 = 1.228e-5;
cp1 = 1069.2, cp2 = 2034., cp3 = 410.;
lambda1 = 5.44e-2, lambda2 = 0.024, lambda3 = 10.9;
dhev = 89.77e+3;The solid heats up the fluid system through Joule effect, whose thermal power is set and included in the solution of the solid temperature equation.
energy_sources = joule_effect;The interface is set to the saturation temperature (considering P = 500 mbar), All the other initial temperatures are set to 0.5 K above the saturation. See Torres et al., 2024 for a comprehensive discussion about it.
TIntVal = 310.85;
TL0 = TIntVal + 0.5, TG0 = TIntVal, TS0 = TL0;We add the possibility to include an interfacial heat transfer
resistance, computed using Hertz-Knudsen theory, and with a pre-factor
acc which is a function of the accommodation coefficient.
It is not the accommodation coefficient itself because different works
have different definitions of such quantity.
RInt = sqrt (2.*pi*8.314*pow (TIntVal, 3.)/0.338)/rho2/sq (dhev);
acc = 0;
f.height = h;
#if JUMP
nv = 2;
#else
nv = 1;
#endif
DT = 0.01;
size (8e-3);
for (maxlevel = 7; maxlevel <= 7; maxlevel++) {
init_grid (1 << maxlevel);
run();
}
}
#define circle(x,y,R) (sq(R) - sq(x) - sq(y))
event init (i = 0) {We initialize the solid heater geometry similarly to what we do with embed.
The boundary conditions for temperature are set here because the
phase model initializes those in the defaults event. Both
the solid and the fluid temperature boundary conditions are set to the
temperature of the solid boundary and the temperatures of the fluid
boundaries, respectively. Those values are computed in conjugate.h.
scalar TL = liq->T, TG = gas->T;
TS[left] = dirichlet (TSB[]);
TL[left] = dirichlet (TLB[]);
TG[left] = dirichlet (TGB[]);
TL[right] = dirichlet (TL0);
}Nucleation
After 5 seconds of simulation we create a small bubble. The surface tension is set here in order to avoid to reduce the time step when the interface is not present.
event nucleation (t = 5) {
#if TREE
refine (circle (x, y, 2.*R0) > 0. && level < maxlevel);
#endif
fraction (f, -circle (x - R0*cos(theta0*pi/180.), y, R0));
f.sigma = 9.91e-3;
scalar TL = liq->T, TG = gas->T;
foreach() {
TL[] *= f[];
TG[] = (1. - f[])*TG0;
T[] = TL[] + TG[];
}
}Adaptive grid
We adapt the simulation according to the interface, fluid temperature, and the velocity field. Do we need to include also the solid temperature? I think that it might be unnecessary since the fluid temperature will automatically refine the region around the solid-fluid interface (the left boundary in this case). This is convenient because we avoid introducing additional fluid cells due to the solution of the solid phase on the same grid.
#if TREE
event adapt (i++) {
adapt_wavelet_leave_interface ({T,u.x,u.y}, {f},
(double[]){1e-3,1e-2,1e-2}, maxlevel, 5, 2);
}
#endifPost-processing
We output the bubble equivalent diameter in time.
event logger (t += 0.01) {
if (t >= 5) {
double volume = 0.;
foreach (reduction(+:volume))
volume += (1. - f[])*dv();
double deq = cbrt (12.*volume);
fprintf (stderr, "level %d %.4g %.4g %.4g\n", maxlevel, t, volume, deq),
fflush (stderr);
}
}We write a video with the evolution of the interface and the temperature fields in the fluid and solid phases.
#include "custom-cmaps.h"
trace
bool draw_line (coord o, coord d, float lc[3] = {0}, float lw = 1.) {
bview * view = draw();
draw_lines (view, lc, lw) {
glBegin (GL_LINES);
glvertex2d (view, o.x, o.y);
glvertex2d (view, d.x, d.y);
glEnd ();
}
return true;
}
event movie (t += 0.05; t <= 8) {
clear();
view (theta = 0., phi = 0., psi = -pi/2., ty = -0.3);
squares ("T", spread = -1, map = RdBu);
draw_vof ("f", lw = 2);
draw_line ({0.,0.}, {0.,L0}, lw = 2.);
mirror ({0,1}) {
squares ("T", spread = -1, map = RdBu);
draw_vof ("f", lw = 2);
draw_line ({0.,0.}, {0.,L0}, lw = 2.);
}
mirror ({1,0}) {
draw_vof ("cw", "fw", filled = -1, fc = {1.,1.,1.});
draw_vof ("cw", "fw", lw = 2);
squares ("TS", spread = -1, map = RdBu);
mirror ({0,1}) {
draw_vof ("cw", "fw", filled = -1, fc = {1.,1.,1.});
draw_vof ("cw", "fw", lw = 2);
squares ("TS", spread = -1, map = RdBu);
}
}
save ("movie.mp4");
}Results
set xr[0:3]
set yr[0:8]
set xlabel "time [s]"
set ylabel "d_{eq} [mm]"
set grid
set size square
set key left top
plot "<grep 'level 7' log" u ($3-5):($5*1e3) w l t "Basilisk", \
"../data/torres2024/rubi-exp.csv" w p t "Experiments", \
"../data/torres2024/rubi-nmr.csv" w p t "Torres-NMR"References
| [torres2024] |
Loric Torres, Annafederica Urbano, Catherine Colin, and Sébastien Tanguy. On the coupling between direct numerical simulation of nucleate boiling and a micro-region model at the contact line. Journal of Computational Physics, 497:112602, 2024. |
