Merged in sink_20190723 (pull request #8)

Sink 20190723
This commit is contained in:
Miikka Väisälä
2019-09-17 15:14:34 +00:00
committed by jpekkila
25 changed files with 1564 additions and 121 deletions

View File

@@ -5,6 +5,7 @@
#define LTEMPERATURE (0) #define LTEMPERATURE (0)
#define LFORCING (1) #define LFORCING (1)
#define LUPWD (1) #define LUPWD (1)
#define LSINK (0)
#define AC_THERMAL_CONDUCTIVITY (AcReal(0.001)) // TODO: make an actual config parameter #define AC_THERMAL_CONDUCTIVITY (AcReal(0.001)) // TODO: make an actual config parameter
@@ -37,6 +38,16 @@ uniform Scalar AC_star_pos_x;
uniform Scalar AC_star_pos_y; uniform Scalar AC_star_pos_y;
uniform Scalar AC_star_pos_z; uniform Scalar AC_star_pos_z;
uniform Scalar AC_M_star; uniform Scalar AC_M_star;
// properties of sink particle
uniform Scalar AC_sink_pos_x;
uniform Scalar AC_sink_pos_y;
uniform Scalar AC_sink_pos_z;
uniform Scalar AC_M_sink;
uniform Scalar AC_M_sink_init;
uniform Scalar AC_M_sink_Msun;
uniform Scalar AC_soft;
uniform Scalar AC_accretion_range;
uniform Scalar AC_switch_accretion;
// Run params // Run params
uniform Scalar AC_cdt; uniform Scalar AC_cdt;
uniform Scalar AC_cdtv; uniform Scalar AC_cdtv;
@@ -78,8 +89,9 @@ uniform Scalar AC_ff_hel_imx;
uniform Scalar AC_ff_hel_imy; uniform Scalar AC_ff_hel_imy;
uniform Scalar AC_ff_hel_imz; uniform Scalar AC_ff_hel_imz;
// Additional helper params // (deduced from other params do not set these directly!) // Additional helper params // (deduced from other params do not set these directly!)
uniform Scalar AC_G_CONST; uniform Scalar AC_G_const;
uniform Scalar AC_GM_star; uniform Scalar AC_GM_star;
uniform Scalar AC_unit_mass;
uniform Scalar AC_sq2GM_star; uniform Scalar AC_sq2GM_star;
uniform Scalar AC_cs2_sound; uniform Scalar AC_cs2_sound;
uniform Scalar AC_inv_dsx; uniform Scalar AC_inv_dsx;
@@ -116,3 +128,8 @@ uniform ScalarField VTXBUF_UUZ;
#else #else
uniform ScalarField VTXBUF_LNRHO; uniform ScalarField VTXBUF_LNRHO;
#endif #endif
#if LSINK
uniform ScalarField VTXBUF_ACCRETION;
#endif

View File

@@ -23,20 +23,155 @@ gradients(in VectorField uu)
return (Matrix){gradient(uu.x), gradient(uu.y), gradient(uu.z)}; return (Matrix){gradient(uu.x), gradient(uu.y), gradient(uu.z)};
} }
#if LSINK
Vector
sink_gravity(int3 globalVertexIdx){
int accretion_switch = int(AC_switch_accretion);
if (accretion_switch == 1){
Vector force_gravity;
const Vector grid_pos = (Vector){(globalVertexIdx.x - DCONST(AC_nx_min)) * AC_dsx,
(globalVertexIdx.y - DCONST(AC_ny_min)) * AC_dsy,
(globalVertexIdx.z - DCONST(AC_nz_min)) * AC_dsz};
const Scalar sink_mass = AC_M_sink;
const Vector sink_pos = (Vector){AC_sink_pos_x,
AC_sink_pos_y,
AC_sink_pos_z};
const Scalar distance = length(grid_pos - sink_pos);
const Scalar soft = AC_soft;
//MV: The commit 083ff59 had AC_G_const defined wrong here in DSL making it exxessively strong.
//MV: Scalar gravity_magnitude = ... below is correct!
const Scalar gravity_magnitude = (AC_G_const * sink_mass) / pow(((distance * distance) + soft*soft), 1.5);
const Vector direction = (Vector){(sink_pos.x - grid_pos.x) / distance,
(sink_pos.y - grid_pos.y) / distance,
(sink_pos.z - grid_pos.z) / distance};
force_gravity = gravity_magnitude * direction;
return force_gravity;
} else {
return (Vector){0.0, 0.0, 0.0};
}
}
#endif
#if LSINK
// Give Truelove density
Scalar Scalar
continuity(in VectorField uu, in ScalarField lnrho) truelove_density(in ScalarField lnrho){
const Scalar rho = exp(value(lnrho));
const Scalar Jeans_length_squared = (M_PI * AC_cs2_sound) / (AC_G_const * rho);
const Scalar TJ_rho = ((M_PI) * ((AC_dsx * AC_dsx) / Jeans_length_squared) * AC_cs2_sound) / (AC_G_const * AC_dsx * AC_dsx);
//TODO: AC_dsx will cancel out, deal with it later for optimization.
Scalar accretion_rho = TJ_rho;
return accretion_rho;
}
// This controls accretion of density/mass to the sink particle.
Scalar
sink_accretion(int3 globalVertexIdx, in ScalarField lnrho, Scalar dt){
const Vector grid_pos = (Vector){(globalVertexIdx.x - DCONST(AC_nx_min)) * AC_dsx,
(globalVertexIdx.y - DCONST(AC_ny_min)) * AC_dsy,
(globalVertexIdx.z - DCONST(AC_nz_min)) * AC_dsz};
const Vector sink_pos = (Vector){AC_sink_pos_x,
AC_sink_pos_y,
AC_sink_pos_z};
const Scalar profile_range = AC_accretion_range;
const Scalar accretion_distance = length(grid_pos - sink_pos);
int accretion_switch = AC_switch_accretion;
Scalar accretion_density;
Scalar weight;
if (accretion_switch == 1){
if ((accretion_distance) <= profile_range){
//weight = Scalar(1.0);
//Hann window function
Scalar window_ratio = accretion_distance/profile_range;
weight = Scalar(0.5)*(Scalar(1.0) - cos(Scalar(2.0)*M_PI*window_ratio));
} else {
weight = Scalar(0.0);
}
//Truelove criterion is used as a kind of arbitrary density floor.
const Scalar lnrho_min = log(truelove_density(lnrho));
Scalar rate;
if (value(lnrho) > lnrho_min) {
rate = (exp(value(lnrho)) - exp(lnrho_min)) / dt;
} else {
rate = Scalar(0.0);
}
accretion_density = weight * rate ;
} else {
accretion_density = Scalar(0.0);
}
return accretion_density;
}
// This controls accretion of velocity to the sink particle.
Vector
sink_accretion_velocity(int3 globalVertexIdx, in VectorField uu, Scalar dt) {
const Vector grid_pos = (Vector){(globalVertexIdx.x - DCONST(AC_nx_min)) * AC_dsx,
(globalVertexIdx.y - DCONST(AC_ny_min)) * AC_dsy,
(globalVertexIdx.z - DCONST(AC_nz_min)) * AC_dsz};
const Vector sink_pos = (Vector){AC_sink_pos_x,
AC_sink_pos_y,
AC_sink_pos_z};
const Scalar profile_range = AC_accretion_range;
const Scalar accretion_distance = length(grid_pos - sink_pos);
int accretion_switch = AC_switch_accretion;
Vector accretion_velocity;
if (accretion_switch == 1){
Scalar weight;
// Step function weighting
// Arch of a cosine function?
// Cubic spline x^3 - x in range [-0.5 , 0.5]
if ((accretion_distance) <= profile_range){
//weight = Scalar(1.0);
//Hann window function
Scalar window_ratio = accretion_distance/profile_range;
weight = Scalar(0.5)*(Scalar(1.0) - cos(Scalar(2.0)*M_PI*window_ratio));
} else {
weight = Scalar(0.0);
}
Vector rate;
// MV: Could we use divergence here ephasize velocitie which are compressive and
// MV: not absorbins stuff that would not be accreted anyway?
if (length(value(uu)) > Scalar(0.0)) {
rate = (Scalar(1.0)/dt) * value(uu);
} else {
rate = (Vector){0.0, 0.0, 0.0};
}
accretion_velocity = weight * rate ;
} else {
accretion_velocity = (Vector){0.0, 0.0, 0.0};
}
return accretion_velocity;
}
#endif
Scalar
continuity(int3 globalVertexIdx, in VectorField uu, in ScalarField lnrho, Scalar dt)
{ {
return -dot(value(uu), gradient(lnrho)) return -dot(value(uu), gradient(lnrho))
#if LUPWD #if LUPWD
// This is a corrective hyperdiffusion term for upwinding. // This is a corrective hyperdiffusion term for upwinding.
+ upwd_der6(uu, lnrho) + upwd_der6(uu, lnrho)
#endif
#if LSINK
- sink_accretion(globalVertexIdx, lnrho, dt) / exp(value(lnrho))
#endif #endif
- divergence(uu); - divergence(uu);
} }
#if LENTROPY #if LENTROPY
Vector Vector
momentum(in VectorField uu, in ScalarField lnrho, in ScalarField ss, in VectorField aa) momentum(int3 globalVertexIdx, in VectorField uu, in ScalarField lnrho, in ScalarField ss, in VectorField aa, Scalar dt)
{ {
const Matrix S = stress_tensor(uu); const Matrix S = stress_tensor(uu);
const Scalar cs2 = AC_cs2_sound * exp(AC_gamma * value(ss) / AC_cp_sound + const Scalar cs2 = AC_cs2_sound * exp(AC_gamma * value(ss) / AC_cp_sound +
@@ -55,12 +190,22 @@ momentum(in VectorField uu, in ScalarField lnrho, in ScalarField ss, in VectorFi
AC_nu_visc * AC_nu_visc *
(laplace_vec(uu) + Scalar(1. / 3.) * gradient_of_divergence(uu) + (laplace_vec(uu) + Scalar(1. / 3.) * gradient_of_divergence(uu) +
Scalar(2.) * mul(S, gradient(lnrho))) + Scalar(2.) * mul(S, gradient(lnrho))) +
AC_zeta * gradient_of_divergence(uu); AC_zeta * gradient_of_divergence(uu)
#if LSINK
//Gravity term
+ sink_gravity(globalVertexIdx)
//Corresponding loss of momentum
- //(Scalar(1.0) / Scalar( (AC_dsx*AC_dsy*AC_dsz) * exp(value(lnrho)))) * // Correction factor by unit mass
sink_accretion_velocity(globalVertexIdx, uu, dt) // As in Lee et al.(2014)
;
#else
;
#endif
return mom; return mom;
} }
#elif LTEMPERATURE #elif LTEMPERATURE
Vector Vector
momentum(in VectorField uu, in ScalarField lnrho, in ScalarField tt) momentum(int3 globalVertexIdx, in VectorField uu, in ScalarField lnrho, in ScalarField tt)
{ {
Vector mom; Vector mom;
@@ -72,17 +217,21 @@ momentum(in VectorField uu, in ScalarField lnrho, in ScalarField tt)
mom = -mul(gradients(uu), value(uu)) - pressure_term + mom = -mul(gradients(uu), value(uu)) - pressure_term +
AC_nu_visc * (laplace_vec(uu) + Scalar(1. / 3.) * gradient_of_divergence(uu) + AC_nu_visc * (laplace_vec(uu) + Scalar(1. / 3.) * gradient_of_divergence(uu) +
Scalar(2.) * mul(S, gradient(lnrho))) + Scalar(2.) * mul(S, gradient(lnrho))) +
AC_zeta * gradient_of_divergence(uu); AC_zeta * gradient_of_divergence(uu)
#if LSINK
+ sink_gravity(globalVertexIdx);
#else
;
#endif
#if LGRAVITY #if LGRAVITY
mom = mom - (Vector){0, 0, -10.0}; mom = mom - (Vector){0, 0, -10.0};
#endif #endif
return mom; return mom;
} }
#else #else
Vector Vector
momentum(in VectorField uu, in ScalarField lnrho) momentum(int3 globalVertexIdx, in VectorField uu, in ScalarField lnrho, Scalar dt)
{ {
Vector mom; Vector mom;
@@ -93,7 +242,16 @@ momentum(in VectorField uu, in ScalarField lnrho)
mom = -mul(gradients(uu), value(uu)) - AC_cs2_sound * gradient(lnrho) + mom = -mul(gradients(uu), value(uu)) - AC_cs2_sound * gradient(lnrho) +
AC_nu_visc * (laplace_vec(uu) + Scalar(1. / 3.) * gradient_of_divergence(uu) + AC_nu_visc * (laplace_vec(uu) + Scalar(1. / 3.) * gradient_of_divergence(uu) +
Scalar(2.) * mul(S, gradient(lnrho))) + Scalar(2.) * mul(S, gradient(lnrho))) +
AC_zeta * gradient_of_divergence(uu); AC_zeta * gradient_of_divergence(uu)
#if LSINK
+ sink_gravity(globalVertexIdx)
//Corresponding loss of momentum
- //(Scalar(1.0) / Scalar( (AC_dsx*AC_dsy*AC_dsz) * exp(value(lnrho)))) * // Correction factor by unit mass
sink_accretion_velocity(globalVertexIdx, uu, dt) // As in Lee et al.(2014)
;
#else
;
#endif
#if LGRAVITY #if LGRAVITY
mom = mom - (Vector){0, 0, -10.0}; mom = mom - (Vector){0, 0, -10.0};
@@ -184,15 +342,23 @@ heat_transfer(in VectorField uu, in ScalarField lnrho, in ScalarField tt)
#if LFORCING #if LFORCING
Vector Vector
simple_vortex_forcing(Vector a, Vector b, Scalar magnitude) simple_vortex_forcing(Vector a, Vector b, Scalar magnitude){
{ int accretion_switch = AC_switch_accretion;
return magnitude * cross(normalized(b - a), (Vector){0, 0, 1}); // Vortex
} if (accretion_switch == 0){
return magnitude * cross(normalized(b - a), (Vector){ 0, 0, 1}); // Vortex
} else {
return (Vector){0,0,0};
}
}
Vector Vector
simple_outward_flow_forcing(Vector a, Vector b, Scalar magnitude) simple_outward_flow_forcing(Vector a, Vector b, Scalar magnitude){
{ int accretion_switch = AC_switch_accretion;
return magnitude * (1 / length(b - a)) * normalized(b - a); // Outward flow if (accretion_switch == 0){
return magnitude * (1 / length(b - a)) * normalized(b - a); // Outward flow
} else {
return (Vector){0,0,0};
}
} }
// The Pencil Code forcing_hel_noshear(), manual Eq. 222, inspired forcing function with adjustable // The Pencil Code forcing_hel_noshear(), manual Eq. 222, inspired forcing function with adjustable
@@ -234,38 +400,42 @@ helical_forcing(Scalar magnitude, Vector k_force, Vector xx, Vector ff_re, Vecto
Vector Vector
forcing(int3 globalVertexIdx, Scalar dt) forcing(int3 globalVertexIdx, Scalar dt)
{ {
Vector a = Scalar(.5) * (Vector){globalGridN.x * AC_dsx, globalGridN.y * AC_dsy, int accretion_switch = AC_switch_accretion;
globalGridN.z * AC_dsz}; // source (origin) if (accretion_switch == 0){
Vector xx = (Vector){(globalVertexIdx.x - DCONST(AC_nx_min)) * AC_dsx,
(globalVertexIdx.y - DCONST(AC_ny_min)) * AC_dsy,
(globalVertexIdx.z - DCONST(AC_nz_min)) * AC_dsz}; // sink (current index)
const Scalar cs2 = AC_cs2_sound;
const Scalar cs = sqrt(cs2);
// Placeholders until determined properly Vector a = Scalar(.5) * (Vector){globalGridN.x * AC_dsx,
Scalar magnitude = AC_forcing_magnitude; globalGridN.y * AC_dsy,
Scalar phase = AC_forcing_phase; globalGridN.z * AC_dsz}; // source (origin)
Vector k_force = (Vector){AC_k_forcex, AC_k_forcey, AC_k_forcez}; Vector xx = (Vector){(globalVertexIdx.x - DCONST(AC_nx_min)) * AC_dsx,
Vector ff_re = (Vector){AC_ff_hel_rex, AC_ff_hel_rey, AC_ff_hel_rez}; (globalVertexIdx.y - DCONST(AC_ny_min)) * AC_dsy,
Vector ff_im = (Vector){AC_ff_hel_imx, AC_ff_hel_imy, AC_ff_hel_imz}; (globalVertexIdx.z - DCONST(AC_nz_min)) * AC_dsz}; // sink (current index)
const Scalar cs2 = AC_cs2_sound;
// Determine that forcing funtion type at this point. const Scalar cs = sqrt(cs2);
// Vector force = simple_vortex_forcing(a, xx, magnitude);
// Vector force = simple_outward_flow_forcing(a, xx, magnitude); //Placeholders until determined properly
Vector force = helical_forcing(magnitude, k_force, xx, ff_re, ff_im, phase); Scalar magnitude = AC_forcing_magnitude;
Scalar phase = AC_forcing_phase;
// Scaling N = magnitude*cs*sqrt(k*cs/dt) * dt Vector k_force = (Vector){AC_k_forcex, AC_k_forcey, AC_k_forcez};
const Scalar NN = cs * sqrt(AC_kaver * cs); Vector ff_re = (Vector){AC_ff_hel_rex, AC_ff_hel_rey, AC_ff_hel_rez};
// MV: Like in the Pencil Code. I don't understandf the logic here. Vector ff_im = (Vector){AC_ff_hel_imx, AC_ff_hel_imy, AC_ff_hel_imz};
force.x = sqrt(dt) * NN * force.x;
force.y = sqrt(dt) * NN * force.y;
force.z = sqrt(dt) * NN * force.z; //Determine that forcing funtion type at this point.
//Vector force = simple_vortex_forcing(a, xx, magnitude);
if (is_valid(force)) { //Vector force = simple_outward_flow_forcing(a, xx, magnitude);
return force; Vector force = helical_forcing(magnitude, k_force, xx, ff_re,ff_im, phase);
}
else { //Scaling N = magnitude*cs*sqrt(k*cs/dt) * dt
return (Vector){0, 0, 0}; const Scalar NN = cs*sqrt(AC_kaver*cs);
//MV: Like in the Pencil Code. I don't understandf the logic here.
force.x = sqrt(dt)*NN*force.x;
force.y = sqrt(dt)*NN*force.y;
force.z = sqrt(dt)*NN*force.z;
if (is_valid(force)) { return force; }
else { return (Vector){0, 0, 0}; }
} else {
return (Vector){0,0,0};
} }
} }
#endif // LFORCING #endif // LFORCING
@@ -293,24 +463,29 @@ in ScalarField tt(VTXBUF_TEMPERATURE);
out ScalarField out_tt(VTXBUF_TEMPERATURE); out ScalarField out_tt(VTXBUF_TEMPERATURE);
#endif #endif
#if LSINK
in ScalarField accretion(VTXBUF_ACCRETION);
out ScalarField out_accretion(VTXBUF_ACCRETION);
#endif
Kernel void Kernel void
solve() solve()
{ {
Scalar dt = AC_dt; Scalar dt = AC_dt;
out_lnrho = rk3(out_lnrho, lnrho, continuity(uu, lnrho), dt); out_lnrho = rk3(out_lnrho, lnrho, continuity(globalVertexIdx, uu, lnrho, dt), dt);
#if LMAGNETIC #if LMAGNETIC
out_aa = rk3(out_aa, aa, induction(uu, aa), dt); out_aa = rk3(out_aa, aa, induction(uu, aa), dt);
#endif #endif
#if LENTROPY #if LENTROPY
out_uu = rk3(out_uu, uu, momentum(uu, lnrho, ss, aa), dt); out_uu = rk3(out_uu, uu, momentum(globalVertexIdx, uu, lnrho, ss, aa, dt), dt);
out_ss = rk3(out_ss, ss, entropy(ss, uu, lnrho, aa), dt); out_ss = rk3(out_ss, ss, entropy(ss, uu, lnrho, aa), dt);
#elif LTEMPERATURE #elif LTEMPERATURE
out_uu = rk3(out_uu, uu, momentum(uu, lnrho, tt), dt); out_uu = rk3(out_uu, uu, momentum(globalVertexIdx, uu, lnrho, tt, dt), dt);
out_tt = rk3(out_tt, tt, heat_transfer(uu, lnrho, tt), dt); out_tt = rk3(out_tt, tt, heat_transfer(uu, lnrho, tt), dt);
#else #else
out_uu = rk3(out_uu, uu, momentum(uu, lnrho), dt); out_uu = rk3(out_uu, uu, momentum(globalVertexIdx, uu, lnrho, dt), dt);
#endif #endif
#if LFORCING #if LFORCING
@@ -318,4 +493,12 @@ solve()
out_uu = out_uu + forcing(globalVertexIdx, dt); out_uu = out_uu + forcing(globalVertexIdx, dt);
} }
#endif #endif
#if LSINK
out_accretion = rk3(out_accretion, accretion, sink_accretion(globalVertexIdx, lnrho, dt), dt);// unit now is rho!
if (step_number == 2) {
out_accretion = out_accretion * AC_dsx * AC_dsy * AC_dsz;// unit is now mass!
}
#endif
} }

View File

@@ -78,6 +78,8 @@ class Mesh:
if self.ok: if self.ok:
self.ss, timestamp, ok = read_bin('VTXBUF_ENTROPY', fdir, fnum, self.minfo) self.ss, timestamp, ok = read_bin('VTXBUF_ENTROPY', fdir, fnum, self.minfo)
self.accretion, timestamp, ok = read_bin('VTXBUF_ACCRETION', fdir, fnum, self.minfo)
#TODO Generalize is a dict. Do not hardcode! #TODO Generalize is a dict. Do not hardcode!
uux, timestamp, ok = read_bin('VTXBUF_UUX', fdir, fnum, self.minfo) uux, timestamp, ok = read_bin('VTXBUF_UUX', fdir, fnum, self.minfo)
@@ -116,6 +118,7 @@ def parse_ts(fdir, fname):
line[i] = line[i].replace('VTXBUF_', "") line[i] = line[i].replace('VTXBUF_', "")
line[i] = line[i].replace('UU', "uu") line[i] = line[i].replace('UU', "uu")
line[i] = line[i].replace('_total', "tot") line[i] = line[i].replace('_total', "tot")
line[i] = line[i].replace('ACCRETION', "acc")
line[i] = line[i].replace('A', "aa") line[i] = line[i].replace('A', "aa")
line[i] = line[i].replace('LNRHO', "lnrho") line[i] = line[i].replace('LNRHO', "lnrho")
line[i] = line[i].replace('ENTROPY', "ss") line[i] = line[i].replace('ENTROPY', "ss")

View File

@@ -32,7 +32,7 @@ def plot_min_man_rms(ts, xaxis, yaxis1, yaxis2, yaxis3):
plt.xlabel(xaxis) plt.xlabel(xaxis)
plt.legend() plt.legend()
def plot_ts(ts, show_all=False, lnrho=False, uutot=False, uux=False, uuy=False, uuz=False, ss=False): def plot_ts(ts, show_all=False, lnrho=False, uutot=False, uux=False, uuy=False, uuz=False, ss=False, acc=False, sink=False):
if show_all: if show_all:
lnrho=True lnrho=True
@@ -41,6 +41,8 @@ def plot_ts(ts, show_all=False, lnrho=False, uutot=False, uux=False, uuy=False,
uuy=True uuy=True
uuz=True uuz=True
ss=True ss=True
acc=True
sink=True
if lnrho: if lnrho:
plt.figure() plt.figure()
@@ -89,5 +91,27 @@ def plot_ts(ts, show_all=False, lnrho=False, uutot=False, uux=False, uuy=False,
yaxis2 = 'ss_min' yaxis2 = 'ss_min'
yaxis3 = 'ss_max' yaxis3 = 'ss_max'
plot_min_man_rms(ts, xaxis, yaxis1, yaxis2, yaxis3) plot_min_man_rms(ts, xaxis, yaxis1, yaxis2, yaxis3)
if acc:
plt.figure()
xaxis = 't_step'
yaxis1 = 'acc_rms'
yaxis2 = 'acc_min'
yaxis3 = 'acc_max'
plot_min_man_rms(ts, xaxis, yaxis1, yaxis2, yaxis3)
plt.figure()
xaxis = 't_step'
yaxis1 = 'sink_mass'
yaxis2 = 'sink_mass'
yaxis3 = 'sink_mass'
plot_min_man_rms(ts, xaxis, yaxis1, yaxis2, yaxis3)
plt.figure()
xaxis = 't_step'
yaxis1 = 'accreted_mass'
yaxis2 = 'accreted_mass'
yaxis3 = 'accreted_mass'
plot_min_man_rms(ts, xaxis, yaxis1, yaxis2, yaxis3)
plt.show() plt.show()

View File

@@ -24,8 +24,7 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"meshdir = \"/scratch/data/mvaisala/forcingtest/\"\n", "meshdir = \"/home/mvaisala/astaroth/build/\""
"#meshdir = \"/scratch/data/mvaisala/normaltest/\""
] ]
}, },
{ {
@@ -35,7 +34,7 @@
"outputs": [], "outputs": [],
"source": [ "source": [
"#imesh = 30000\n", "#imesh = 30000\n",
"imesh = 100\n", "imesh = 0\n",
"mesh = ad.read.Mesh(imesh, fdir=meshdir)" "mesh = ad.read.Mesh(imesh, fdir=meshdir)"
] ]
}, },
@@ -74,10 +73,12 @@
"vis.slices.plot_3(mesh, mesh.uu[0], title = r'$u_x$')\n", "vis.slices.plot_3(mesh, mesh.uu[0], title = r'$u_x$')\n",
"vis.slices.plot_3(mesh, mesh.uu[1], title = r'$u_y$')\n", "vis.slices.plot_3(mesh, mesh.uu[1], title = r'$u_y$')\n",
"vis.slices.plot_3(mesh, mesh.uu[2], title = r'$u_z$')\n", "vis.slices.plot_3(mesh, mesh.uu[2], title = r'$u_z$')\n",
"vis.slices.plot_3(mesh, mesh.lnrho, title = r'$\\ln_\\rho$')\n", "vis.slices.plot_3(mesh, mesh.lnrho, title = r'$\\ln_\\rho$')#, colrange=[0,0.1])\n",
"vis.slices.plot_3(mesh, np.exp(mesh.lnrho), title = r'$\\rho$')\n", "vis.slices.plot_3(mesh, np.exp(mesh.lnrho), title = r'$\\rho$')\n",
"vis.slices.plot_3(mesh, np.exp(mesh.lnrho), title = r'$N_\\mathrm{col}$', slicetype = 'sum')\n", "vis.slices.plot_3(mesh, np.exp(mesh.lnrho), title = r'$N_\\mathrm{col}$', slicetype = 'sum')#, colrange=[130,139])\n",
"vis.slices.plot_3(mesh, mesh.ss, title = r'$s$')\n" "vis.slices.plot_3(mesh, uu_tot, title = r'$\\Sigma \\|u\\|$', slicetype = 'sum')#, colrange=[130,139])\n",
"#vis.slices.plot_3(mesh, mesh.ss, title = r'$s$')\n",
"vis.slices.plot_3(mesh, mesh.accretion, title = r'$Accretion buffer$')\n"
] ]
}, },
{ {
@@ -102,8 +103,16 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"vis.lineplot.plot_ts(ts, lnrho=1, uutot=1, uux=1, uuy=1, uuz=1, ss=1)" "vis.lineplot.plot_ts(ts, lnrho=True, acc=True, uux=True)\n",
"\n"
] ]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
} }
], ],
"metadata": { "metadata": {
@@ -122,7 +131,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.2" "version": "3.7.3"
} }
}, },
"nbformat": 4, "nbformat": 4,

View File

@@ -45,7 +45,7 @@ print("sys.argv", sys.argv)
#meshdir = "/tiara/home/mvaisala/astaroth-code/astaroth_2.0/build/" #meshdir = "/tiara/home/mvaisala/astaroth-code/astaroth_2.0/build/"
#meshdir = "/tiara/ara/data/mvaisala/tmp/astaroth-code/astaroth_2.0/build/" #meshdir = "/tiara/ara/data/mvaisala/tmp/astaroth-code/astaroth_2.0/build/"
#meshdir = "/tiara/ara/data/mvaisala/asth_testbed_double/" #meshdir = "/tiara/ara/data/mvaisala/asth_testbed_double/"
meshdir = "/scratch/data/mvaisala/forcingtest/" meshdir = "/home/mvaisala/astaroth/build/"
if "xtopbound" in sys.argv: if "xtopbound" in sys.argv:
for i in range(0, 171): for i in range(0, 171):
@@ -199,6 +199,6 @@ if 'sl' in sys.argv:
if 'ts' in sys.argv: if 'ts' in sys.argv:
ts = ad.read.TimeSeries(fdir=meshdir) ts = ad.read.TimeSeries(fdir=meshdir)
vis.lineplot.plot_ts(ts, lnrho=1, uutot=1, uux=1, ss=1) vis.lineplot.plot_ts(ts, show_all=True)

View File

@@ -49,6 +49,22 @@ AC_gamma = 0.5
AC_lnT0 = 1.2 AC_lnT0 = 1.2
AC_lnrho0 = 1.3 AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
AC_M_sink_Msun = 1.0
AC_soft = 0.12
// Accretion Parameters
// profile_range is multiple of dsx
AC_accretion_range = 2.0
// Physical properties of the domain
AC_unit_velocity = 1.0
AC_unit_density = 1.0
AC_unit_length = 1.0
/* /*
* ============================================================================= * =============================================================================
* Initial conditions * Initial conditions

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 128
AC_ny = 128
AC_nz = 128
AC_dsx = 0.04908738521
AC_dsy = 0.04908738521
AC_dsz = 0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 20001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 2e10

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 128
AC_ny = 128
AC_nz = 128
AC_dsx = 0.04908738521
AC_dsy = 0.04908738521
AC_dsz = 0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 501
AC_save_steps = 1
AC_bin_steps = 100
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1.0 // 1e-4 //1e-5
AC_soft = 0.25
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 1.2
AC_ampl_uu = 1.0

View File

@@ -0,0 +1,77 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 128
AC_ny = 128
AC_nz = 128
AC_dsx = 0.04908738521
AC_dsy = 0.04908738521
AC_dsz = 0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 1001
AC_save_steps = 1
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-3
AC_cs_sound = 1.0
AC_zeta = 0.01
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-5
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-10
AC_soft = 0.36
// Accretion Parameters
// profile_range shoul be close to a multiple of dsx. E.g. 4*dsx
AC_accretion_range = 0.2
// Physical properties of the domain
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3
AC_unit_density = 3e-22
// using 10,000 AU
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 0.0

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 128
AC_ny = 128
AC_nz = 128
AC_dsx = 0.04908738521
AC_dsy = 0.04908738521
AC_dsz = 0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 20001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 0.0

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 128
AC_ny = 128
AC_nz = 128
AC_dsx = 0.04908738521
AC_dsy = 0.04908738521
AC_dsz = 0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 20001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 2e10

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 256
AC_ny = 256
AC_nz = 256
AC_dsx = 0.0245436926 //0.04908738521
AC_dsy = 0.0245436926 //0.04908738521
AC_dsz = 0.0245436926 //0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 40001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 0.0

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 256
AC_ny = 256
AC_nz = 256
AC_dsx = 0.0245436926 //0.04908738521
AC_dsy = 0.0245436926 //0.04908738521
AC_dsz = 0.0245436926 //0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 40001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 2e10

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 256
AC_ny = 256
AC_nz = 256
AC_dsx = 0.0245436926 //0.04908738521
AC_dsy = 0.0245436926 //0.04908738521
AC_dsz = 0.0245436926 //0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 40001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 2.5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 2e10

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 512
AC_ny = 512
AC_nz = 512
AC_dsx = 0.0122718463 //0.0245436926 //0.04908738521
AC_dsy = 0.0122718463 //0.0245436926 //0.04908738521
AC_dsz = 0.0122718463 //0.0245436926 //0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 80001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 0.0

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 512
AC_ny = 512
AC_nz = 512
AC_dsx = 0.0122718463 //0.0245436926 //0.04908738521
AC_dsy = 0.0122718463 //0.0245436926 //0.04908738521
AC_dsz = 0.0122718463 //0.0245436926 //0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 80001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 2e10

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 512
AC_ny = 512
AC_nz = 512
AC_dsx = 0.0122718463 //0.0245436926 //0.04908738521
AC_dsy = 0.0122718463 //0.0245436926 //0.04908738521
AC_dsz = 0.0122718463 //0.0245436926 //0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 80001
AC_save_steps = 50
AC_bin_steps = 1000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 1.25e-4
AC_cs_sound = 1.0
AC_zeta = 0.0
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-4 //1e-5
AC_soft = 0.36
AC_accretion_range = 0.25
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 2e10

View File

@@ -0,0 +1,75 @@
/*
* =============================================================================
* "Compile-time" params
* =============================================================================
*/
AC_nx = 128
AC_ny = 128
AC_nz = 128
AC_dsx = 0.04908738521
AC_dsy = 0.04908738521
AC_dsz = 0.04908738521
/*
* =============================================================================
* Run-time params
* =============================================================================
*/
AC_max_steps = 1800001
AC_save_steps = 100
AC_bin_steps = 2000
AC_bin_save_t = 1e666
// Hydro
AC_cdt = 0.4
AC_cdtv = 0.3
AC_cdts = 1.0
AC_nu_visc = 5e-3
AC_cs_sound = 1.0
AC_zeta = 0.01
// Magnetic
AC_eta = 5e-3
AC_mu0 = 1.4
AC_chi = 0.0001
// Forcing
AC_relhel = 0.0
AC_forcing_magnitude = 1e-20
AC_kmin = 0.8
AC_kmax = 1.2
// Entropy
AC_cp_sound = 1.0
AC_gamma = 0.5
AC_lnT0 = 1.2
AC_lnrho0 = 1.3
// Sink Particle
AC_sink_pos_x = 3.14
AC_sink_pos_y = 3.14
AC_sink_pos_z = 3.14
//AC_M_sink_Msun = 0.005
AC_M_sink_Msun = 1e-10
AC_soft = 0.36
AC_accretion_range = 0.15
// Physical properties of the domain
// Typical 1km/s velocity
AC_unit_velocity = 1e5
// using density estimate of 100 H2 molecules per cm^3.
AC_unit_density = 3e-20
// using 100,000 A.U.
AC_unit_length = 1.5e17
/*
* =============================================================================
* Initial conditions
* =============================================================================
*/
AC_ampl_lnrho = 0.0
AC_ampl_uu = 0.0

View File

@@ -81,3 +81,103 @@ Make is possible for the particle to accrete momentum in addition to mass, and t
Create sink particles dynamically and allow the presence of multiple sinks. Create sink particles dynamically and allow the presence of multiple sinks.
### Suggestion writen by JP:
Add to ```acc/mhd_solver/stencil_defines.h```:
```
// Scalar mass
#define AC_FOR_USER_REAL_PARAM_TYPES(FUNC) \
...
...
FUNC(AC_sink_particle_mass),
// Vector position
// NOTE: This makes an AcReal3 constant parameter
// This is a completely new type that has not yet been
// tested. Accessible from the DSL with
// DCONST_REAL3(AC_sink_particle_pos)
#define AC_FOR_USER_REAL3_PARAM_TYPES(FUNC) \
...
...
FUNC(AC_sink_particle_pos),
```
Currently we do not do it like that as AcReal3 constant parameter. However, would be good thing to implement eventually.
```
// Vertex buffer for accretion
#define AC_FOR_VTXBUF_HANDLES(FUNC) \
...
FUNC(VTXBUF_ACCRETION),
```
Add to ```acc/mhd_solver/stencil_process.sps```:
```
Scalar
your_accretion_function(int3 globalVertexIdx)
{
Scalar mass = DCONST_REAL(AC_sink_particle_mass);
Vector pos0 = DCONST_REAL3(AC_sink_particle_pos);
Vector pos1 = (Vector){ (globalVertexIdx.x - nx_min) * dsx), ...};
return *accretion from the current cell at globalVertexIdx*
}
```
This step will require that we calculate the acctetion as **mass** in a grid cell volume. This is to eventually take an advantage of nonunifrorm grid. OIOn that way we do not need to worry about it in the collective operation stage.
```
// This should have a global scope
out Scalar out_accretion = VTXBUF_ACCRETION;
Kernel void
solve(Scalar dt) {
...
...
out_accretion = your_accretion_function(globalVertexIdx);
}
```
Important to note that we need to take into account the reduction of density with other equations of motion. Or apply analogous style to forcing.
Create new file ```src/standalone/model/host_accretion.cc```:
```
#include "astaroth.h"
void
updateAccretion(AcMeshInfo* info)
{
AcReal previous_mass = info->real_params[AC_sink_particle_mass];
AcReal accreted_mass = acReduceScal(RTYPE_SUM, VTXBUF_ACCRETION);
// Note: RTYPE_SUM does not yet exist (but is easy to add)
AcReal mass = previous_mass + accreted_mass;
info->real_params[AC_sink_particle_mass] = mass; // Save for the next iteration
acLoadDeviceConstant(AC_sink_particle_mass, mass); // Load to the GPUs
}
```
We assume that acReduceScal will sum up the mass in the accretion buffer.
Call from```src/standalone/simulation.cc```:
```
#include "model/host_accretion.h"
int
run_simulation(void)
{
...
while (simulation_running) {
...
...
updateAccretion(&mesh_info);
}
}
```

View File

@@ -125,22 +125,25 @@ update_config(AcMeshInfo* config)
config->real_params[AC_gamma]; config->real_params[AC_gamma];
AcReal G_CONST_CGS = AcReal( AcReal G_CONST_CGS = AcReal(
6.674e-8); // g/cm3/s GGS definition //TODO define in a separate module 6.674e-8); // cm^3/(g*s^2) GGS definition //TODO define in a separate module
AcReal M_sun = AcReal(1.989e33); // g solar mass AcReal M_sun = AcReal(1.989e33); // g solar mass
config->real_params[AC_M_star] = config->real_params[AC_M_star] * M_sun / config->real_params[AC_unit_mass] = (config->real_params[AC_unit_length] *
((config->real_params[AC_unit_length] * config->real_params[AC_unit_length] *
config->real_params[AC_unit_length] * config->real_params[AC_unit_length]) *
config->real_params[AC_unit_length]) * config->real_params[AC_unit_density];
config->real_params[AC_unit_density]);
config->real_params[AC_G_CONST] = G_CONST_CGS / ((config->real_params[AC_unit_velocity] * config->real_params[AC_M_sink] = config->real_params[AC_M_sink_Msun] * M_sun /
config->real_params[AC_unit_mass];
config->real_params[AC_M_sink_init] = config->real_params[AC_M_sink_Msun] * M_sun /
config->real_params[AC_unit_mass];
config->real_params[AC_G_const] = G_CONST_CGS / ((config->real_params[AC_unit_velocity] *
config->real_params[AC_unit_velocity]) / config->real_params[AC_unit_velocity]) /
(config->real_params[AC_unit_density] * (config->real_params[AC_unit_density] *
config->real_params[AC_unit_length] *
config->real_params[AC_unit_length])); config->real_params[AC_unit_length]));
config->real_params[AC_GM_star] = config->real_params[AC_M_star] *
config->real_params[AC_G_CONST];
config->real_params[AC_sq2GM_star] = AcReal(sqrt(AcReal(2) * config->real_params[AC_GM_star])); config->real_params[AC_sq2GM_star] = AcReal(sqrt(AcReal(2) * config->real_params[AC_GM_star]));
#if VERBOSE_PRINTING // Defined in astaroth.h #if VERBOSE_PRINTING // Defined in astaroth.h

View File

@@ -71,7 +71,7 @@ acmesh_create(const AcMeshInfo& mesh_info)
return mesh; return mesh;
} }
static void void
vertex_buffer_set(const VertexBufferHandle& key, const AcReal& val, AcMesh* mesh) vertex_buffer_set(const VertexBufferHandle& key, const AcReal& val, AcMesh* mesh)
{ {
const int n = acVertexBufferSize(mesh->info); const int n = acVertexBufferSize(mesh->info);
@@ -207,6 +207,83 @@ inflow_vedge(AcMesh* mesh)
} }
} }
// This is the initial condition type for the infalling vedge in the pseudodisk
// model.
void
simple_uniform_core(AcMesh* mesh)
{
const int mx = mesh->info.int_params[AC_mx];
const int my = mesh->info.int_params[AC_my];
const int mz = mesh->info.int_params[AC_mz];
const double DX = mesh->info.real_params[AC_dsx];
const double DY = mesh->info.real_params[AC_dsy];
const double DZ = mesh->info.real_params[AC_dsz];
const double ampl_lnrho = mesh->info.real_params[AC_ampl_lnrho];
const double xorig = mesh->info.real_params[AC_xorig];
const double yorig = mesh->info.real_params[AC_yorig];
const double zorig = mesh->info.real_params[AC_zorig];
const double G_const = mesh->info.real_params[AC_G_const];
const double M_sink_init = mesh->info.real_params[AC_M_sink_init];
const double cs2_sound = mesh->info.real_params[AC_cs2_sound];
const double RR_inner_bound = mesh->info.real_params[AC_soft]/AcReal(2.0);
const double core_coeff = (exp(ampl_lnrho) * cs2_sound) / (double(4.0)*M_PI * G_const);
double xx, yy, zz, RR;
double core_profile;
//TEMPORARY TEST INPUT PARAMETERS
const double core_radius = DX*32.0;
const double trans = DX*12.0;
//const double epsilon = DX*2.0;
const double vel_scale = mesh->info.real_params[AC_ampl_uu];
double abso_vel;
RR = 1.0;
printf("%e %e %e \n", RR, trans, core_radius);
for (int k = 0; k < mz; k++) {
for (int j = 0; j < my; j++) {
for (int i = 0; i < mx; i++) {
int idx = i + j*mx + k*mx*my;
xx = DX * double(i) - xorig;
yy = DY * double(j) - yorig;
zz = DZ * double(k) - zorig;
RR = sqrt(xx*xx + yy*yy + zz*zz);
if (RR >= RR_inner_bound) {
abso_vel = vel_scale * sqrt(2.0 * G_const
* M_sink_init / RR);
core_profile = pow(RR, -2.0); //double(1.0);
} else {
abso_vel = vel_scale * sqrt(2.0 * AC_G_const
* AC_M_sink_init / RR_inner_bound);
core_profile = pow(RR_inner_bound, -2.0); //double(1.0);
}
if (RR <= sqrt(DX*DX + DY*DY + DZ*DZ)) {
abso_vel = 0.0;
RR = 1.0;
}
mesh->vertex_buffer[VTXBUF_LNRHO][idx] = AcReal(log(core_coeff*core_profile));
mesh->vertex_buffer[VTXBUF_UUX][idx] = AcReal(-abso_vel * (yy / RR));
mesh->vertex_buffer[VTXBUF_UUY][idx] = AcReal( abso_vel * (xx / RR));
mesh->vertex_buffer[VTXBUF_UUZ][idx] = AcReal(0.0);
}
}
}
}
// This is the initial condition type for the infalling vedge in the pseudodisk // This is the initial condition type for the infalling vedge in the pseudodisk
// model. // model.
void void
@@ -564,6 +641,7 @@ acmesh_init_to(const InitType& init_type, AcMesh* mesh)
} }
case INIT_TYPE_GAUSSIAN_RADIAL_EXPL: case INIT_TYPE_GAUSSIAN_RADIAL_EXPL:
acmesh_clear(mesh); acmesh_clear(mesh);
vertex_buffer_set(VTXBUF_LNRHO, mesh->info.real_params[AC_ampl_lnrho], mesh);
// acmesh_init_to(INIT_TYPE_RANDOM, mesh); // acmesh_init_to(INIT_TYPE_RANDOM, mesh);
gaussian_radial_explosion(mesh); gaussian_radial_explosion(mesh);
@@ -581,6 +659,10 @@ acmesh_init_to(const InitType& init_type, AcMesh* mesh)
} }
} }
break; break;
case INIT_TYPE_SIMPLE_CORE:
acmesh_clear(mesh);
simple_uniform_core(mesh);
break;
case INIT_TYPE_VEDGE: case INIT_TYPE_VEDGE:
acmesh_clear(mesh); acmesh_clear(mesh);
inflow_vedge_freefall(mesh); inflow_vedge_freefall(mesh);

View File

@@ -34,6 +34,7 @@
FUNC(INIT_TYPE_XWAVE), \ FUNC(INIT_TYPE_XWAVE), \
FUNC(INIT_TYPE_GAUSSIAN_RADIAL_EXPL), \ FUNC(INIT_TYPE_GAUSSIAN_RADIAL_EXPL), \
FUNC(INIT_TYPE_ABC_FLOW) , \ FUNC(INIT_TYPE_ABC_FLOW) , \
FUNC(INIT_TYPE_SIMPLE_CORE), \
FUNC(INIT_TYPE_VEDGE), \ FUNC(INIT_TYPE_VEDGE), \
FUNC(INIT_TYPE_VEDGEX), \ FUNC(INIT_TYPE_VEDGEX), \
FUNC(INIT_TYPE_RAYLEIGH_TAYLOR), \ FUNC(INIT_TYPE_RAYLEIGH_TAYLOR), \
@@ -48,6 +49,8 @@ extern const char* init_type_names[]; // Defined in host_memory.cc
AcMesh* acmesh_create(const AcMeshInfo& mesh_info); AcMesh* acmesh_create(const AcMeshInfo& mesh_info);
void vertex_buffer_set(const VertexBufferHandle& key, const AcReal& val, AcMesh* mesh);
void acmesh_clear(AcMesh* mesh); void acmesh_clear(AcMesh* mesh);
void acmesh_init_to(const InitType& type, AcMesh* mesh); void acmesh_init_to(const InitType& type, AcMesh* mesh);

View File

@@ -41,6 +41,10 @@
#include "src/core/math_utils.h" #include "src/core/math_utils.h"
#include "timer_hires.h" #include "timer_hires.h"
// NEED TO BE DEFINED HERE. IS NOT NOTICED BY compile_acc call.
#define LFORCING (1)
#define LSINK (0)
// Window // Window
SDL_Renderer* renderer = NULL; SDL_Renderer* renderer = NULL;
static SDL_Window* window = NULL; static SDL_Window* window = NULL;
@@ -293,6 +297,7 @@ renderer_quit(void)
} }
static int init_type = INIT_TYPE_GAUSSIAN_RADIAL_EXPL; static int init_type = INIT_TYPE_GAUSSIAN_RADIAL_EXPL;
// static int init_type = INIT_TYPE_SIMPLE_CORE;
static bool static bool
running(AcMesh* mesh) running(AcMesh* mesh)
@@ -359,6 +364,10 @@ run_renderer(void)
AcMesh* mesh = acmesh_create(mesh_info); AcMesh* mesh = acmesh_create(mesh_info);
acmesh_init_to(InitType(init_type), mesh); acmesh_init_to(InitType(init_type), mesh);
#if LSINK
vertex_buffer_set(VTXBUF_ACCRETION, 0.0, mesh);
#endif
acInit(mesh_info); acInit(mesh_info);
acLoad(*mesh); acLoad(*mesh);
@@ -375,6 +384,9 @@ run_renderer(void)
int steps = 0; int steps = 0;
k_slice = mesh->info.int_params[AC_mz] / 2; k_slice = mesh->info.int_params[AC_mz] / 2;
k_slice_max = mesh->info.int_params[AC_mz]; k_slice_max = mesh->info.int_params[AC_mz];
#if LSINK
AcReal accreted_mass = 0.0;
#endif
while (running(mesh)) { while (running(mesh)) {
/* Input */ /* Input */
@@ -382,15 +394,25 @@ run_renderer(void)
timer_reset(&io_timer); timer_reset(&io_timer);
/* Step the simulation */ /* Step the simulation */
#if 1 #if LSINK
const AcReal umax = acReduceVec(RTYPE_MAX, VTXBUF_UUX, VTXBUF_UUY, VTXBUF_UUZ); const AcReal sum_mass = acReduceScal(RTYPE_SUM, VTXBUF_ACCRETION);
const AcReal dt = host_timestep(umax, mesh_info); accreted_mass = accreted_mass + sum_mass;
AcReal sink_mass = mesh_info.real_params[AC_M_sink_init] + accreted_mass;
printf("sink mass is: %e \n", sink_mass);
printf("accreted mass is: %e \n", accreted_mass);
acLoadDeviceConstant(AC_M_sink, sink_mass);
vertex_buffer_set(VTXBUF_ACCRETION, 0.0, mesh);
#endif
#if LFORCING #if LFORCING
const ForcingParams forcing_params = generateForcingParams(mesh->info); const ForcingParams forcing_params = generateForcingParams(mesh->info);
loadForcingParamsToDevice(forcing_params); loadForcingParamsToDevice(forcing_params);
#endif #endif
#if 1
const AcReal umax = acReduceVec(RTYPE_MAX, VTXBUF_UUX, VTXBUF_UUY, VTXBUF_UUZ);
const AcReal dt = host_timestep(umax, mesh_info);
acIntegrate(dt); acIntegrate(dt);
#else #else
ModelMesh* model_mesh = modelmesh_create(mesh->info); ModelMesh* model_mesh = modelmesh_create(mesh->info);

View File

@@ -40,6 +40,10 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
// NEED TO BE DEFINED HERE. IS NOT NOTICED BY compile_acc call.
#define LFORCING (1)
#define LSINK (0)
// Write all setting info into a separate ascii file. This is done to guarantee // Write all setting info into a separate ascii file. This is done to guarantee
// that we have the data specifi information in the thing, even though in // that we have the data specifi information in the thing, even though in
// principle these things are in the astaroth.conf. // principle these things are in the astaroth.conf.
@@ -56,37 +60,76 @@ write_mesh_info(const AcMeshInfo* config)
infotxt = fopen("mesh_info.list", "w"); infotxt = fopen("mesh_info.list", "w");
/*
// JP: this could be done shorter and with smaller chance for errors with the following
// (modified from acPrintMeshInfo() in astaroth.cu)
for (int i = 0; i < NUM_INT_PARAMS; ++i)
fprintf(infotxt, "int %s: %d\n", intparam_names[i], config.int_params[i]);
for (int i = 0; i < NUM_INT3_PARAMS; ++i)
fprintf(infotxt, "int3 %s: (%d, %d, %d)\n", int3param_names[i], config.int3_params[i].x,
config.int3_params[i].y,
config.int3_params[i].z);
for (int i = 0; i < NUM_REAL_PARAMS; ++i)
fprintf(infotxt, "real %s: %g\n", realparam_names[i], double(config.real_params[i]));
for (int i = 0; i < NUM_REAL3_PARAMS; ++i)
fprintf(infotxt, "real %s: (%g, %g, %g)\n", real3param_names[i],
double(config.real3_params[i].x),
double(config.real3_params[i].y),
double(config.real3_params[i].z));
*/
// Total grid dimensions // Total grid dimensions
fprintf(infotxt, "int AC_mx %i \n", config->int_params[AC_mx]); fprintf(infotxt, "int AC_mx %i \n", config->int_params[AC_mx]);
fprintf(infotxt, "int AC_my %i \n", config->int_params[AC_my]); fprintf(infotxt, "int AC_my %i \n", config->int_params[AC_my]);
fprintf(infotxt, "int AC_mz %i \n", config->int_params[AC_mz]); fprintf(infotxt, "int AC_mz %i \n", config->int_params[AC_mz]);
// Bounds for the computational domain, i.e. nx_min <= i < nx_max // Bounds for the computational domain, i.e. nx_min <= i < nx_max
fprintf(infotxt, "int AC_nx_min %i \n", config->int_params[AC_nx_min]); fprintf(infotxt, "int AC_nx_min %i \n", config->int_params[AC_nx_min]);
fprintf(infotxt, "int AC_nx_max %i \n", config->int_params[AC_nx_max]); fprintf(infotxt, "int AC_nx_max %i \n", config->int_params[AC_nx_max]);
fprintf(infotxt, "int AC_ny_min %i \n", config->int_params[AC_ny_min]); fprintf(infotxt, "int AC_ny_min %i \n", config->int_params[AC_ny_min]);
fprintf(infotxt, "int AC_ny_max %i \n", config->int_params[AC_ny_max]); fprintf(infotxt, "int AC_ny_max %i \n", config->int_params[AC_ny_max]);
fprintf(infotxt, "int AC_nz_min %i \n", config->int_params[AC_nz_min]); fprintf(infotxt, "int AC_nz_min %i \n", config->int_params[AC_nz_min]);
fprintf(infotxt, "int AC_nz_max %i \n", config->int_params[AC_nz_max]); fprintf(infotxt, "int AC_nz_max %i \n", config->int_params[AC_nz_max]);
// Spacing // Spacing
fprintf(infotxt, "real AC_dsx %e \n", (double)config->real_params[AC_dsx]); fprintf(infotxt, "real AC_dsx %e \n", (double)config->real_params[AC_dsx]);
fprintf(infotxt, "real AC_dsy %e \n", (double)config->real_params[AC_dsy]); fprintf(infotxt, "real AC_dsy %e \n", (double)config->real_params[AC_dsy]);
fprintf(infotxt, "real AC_dsz %e \n", (double)config->real_params[AC_dsz]); fprintf(infotxt, "real AC_dsz %e \n", (double)config->real_params[AC_dsz]);
fprintf(infotxt, "real AC_inv_dsx %e \n", (double)config->real_params[AC_inv_dsx]); fprintf(infotxt, "real AC_inv_dsx %e \n", (double)config->real_params[AC_inv_dsx]);
fprintf(infotxt, "real AC_inv_dsy %e \n", (double)config->real_params[AC_inv_dsy]); fprintf(infotxt, "real AC_inv_dsy %e \n", (double)config->real_params[AC_inv_dsy]);
fprintf(infotxt, "real AC_inv_dsz %e \n", (double)config->real_params[AC_inv_dsz]); fprintf(infotxt, "real AC_inv_dsz %e \n", (double)config->real_params[AC_inv_dsz]);
fprintf(infotxt, "real AC_dsmin %e \n", (double)config->real_params[AC_dsmin]); fprintf(infotxt, "real AC_dsmin %e \n", (double)config->real_params[AC_dsmin]);
/* Additional helper params */ /* Additional helper params */
// Int helpers // Int helpers
fprintf(infotxt, "int AC_mxy %i \n", config->int_params[AC_mxy]); fprintf(infotxt, "int AC_mxy %i \n", config->int_params[AC_mxy]);
fprintf(infotxt, "int AC_nxy %i \n", config->int_params[AC_nxy]); fprintf(infotxt, "int AC_nxy %i \n", config->int_params[AC_nxy]);
fprintf(infotxt, "int AC_nxyz %i \n", config->int_params[AC_nxyz]); fprintf(infotxt, "int AC_nxyz %i \n", config->int_params[AC_nxyz]);
// Real helpers // Real helpers
fprintf(infotxt, "real AC_cs2_sound %e \n", (double)config->real_params[AC_cs2_sound]); fprintf(infotxt, "real AC_cs2_sound %e \n", (double)config->real_params[AC_cs2_sound]);
fprintf(infotxt, "real AC_cv_sound %e \n", (double)config->real_params[AC_cv_sound]); fprintf(infotxt, "real AC_cv_sound %e \n", (double)config->real_params[AC_cv_sound]);
// Physical units
fprintf(infotxt, "real AC_unit_density %e \n", (double)config->real_params[AC_unit_density]);
fprintf(infotxt, "real AC_unit_velocity %e \n", (double)config->real_params[AC_unit_velocity]);
fprintf(infotxt, "real AC_unit_mass %e \n", (double)config->real_params[AC_unit_mass]);
fprintf(infotxt, "real AC_unit_length %e \n", (double)config->real_params[AC_unit_length]);
// Here I'm still trying to copy the structure of the code above, and see if this will work for
// sink particle. I haven't fully undertand what these lines do but I'll read up on them soon.
// This is still yet experimental.
// Sink particle
fprintf(infotxt, "real AC_sink_pos_x %e \n", (double)config->real_params[AC_sink_pos_x]);
fprintf(infotxt, "real AC_sink_pos_y %e \n", (double)config->real_params[AC_sink_pos_y]);
fprintf(infotxt, "real AC_sink_pos_z %e \n", (double)config->real_params[AC_sink_pos_z]);
fprintf(infotxt, "real AC_M_sink %e \n", (double)config->real_params[AC_M_sink]);
fprintf(infotxt, "real AC_soft %e \n", (double)config->real_params[AC_soft]);
fprintf(infotxt, "real AC_G_const %e \n", (double)config->real_params[AC_G_const]);
fclose(infotxt); fclose(infotxt);
} }
@@ -135,7 +178,8 @@ save_mesh(const AcMesh& save_mesh, const int step, const AcReal t_step)
// This function prints out the diagnostic values to std.out and also saves and // This function prints out the diagnostic values to std.out and also saves and
// appends an ascii file to contain all the result. // appends an ascii file to contain all the result.
static inline void static inline void
print_diagnostics(const int step, const AcReal dt, const AcReal t_step, FILE* diag_file) print_diagnostics(const int step, const AcReal dt, const AcReal t_step, FILE* diag_file,
const AcReal sink_mass, const AcReal accreted_mass)
{ {
AcReal buf_rms, buf_max, buf_min; AcReal buf_rms, buf_max, buf_min;
@@ -165,6 +209,10 @@ print_diagnostics(const int step, const AcReal dt, const AcReal t_step, FILE* di
fprintf(diag_file, "%e %e %e ", double(buf_min), double(buf_rms), double(buf_max)); fprintf(diag_file, "%e %e %e ", double(buf_min), double(buf_rms), double(buf_max));
} }
if ((sink_mass >= AcReal(0.0)) || (accreted_mass >= AcReal(0.0))) {
fprintf(diag_file, "%e %e ", double(sink_mass), double(accreted_mass));
}
fprintf(diag_file, "\n"); fprintf(diag_file, "\n");
} }
@@ -184,6 +232,11 @@ run_simulation(void)
AcMesh* mesh = acmesh_create(mesh_info); AcMesh* mesh = acmesh_create(mesh_info);
// TODO: This need to be possible to define in astaroth.conf // TODO: This need to be possible to define in astaroth.conf
acmesh_init_to(INIT_TYPE_GAUSSIAN_RADIAL_EXPL, mesh); acmesh_init_to(INIT_TYPE_GAUSSIAN_RADIAL_EXPL, mesh);
// acmesh_init_to(INIT_TYPE_SIMPLE_CORE, mesh); //Initial condition for a collapse test
#if LSINK
vertex_buffer_set(VTXBUF_ACCRETION, 0.0, mesh);
#endif
acInit(mesh_info); acInit(mesh_info);
acLoad(*mesh); acLoad(*mesh);
@@ -199,11 +252,17 @@ run_simulation(void)
fprintf(diag_file, "%s_min %s_rms %s_max ", vtxbuf_names[i], vtxbuf_names[i], fprintf(diag_file, "%s_min %s_rms %s_max ", vtxbuf_names[i], vtxbuf_names[i],
vtxbuf_names[i]); vtxbuf_names[i]);
} }
#if LSINK
fprintf(diag_file, "sink_mass accreted_mass ");
#endif
fprintf(diag_file, "\n"); fprintf(diag_file, "\n");
write_mesh_info(&mesh_info); write_mesh_info(&mesh_info);
print_diagnostics(0, AcReal(.0), t_step, diag_file); #if LSINK
print_diagnostics(0, AcReal(.0), t_step, diag_file, mesh_info.real_params[AC_M_sink_init], 0.0);
#else
print_diagnostics(0, AcReal(.0), t_step, diag_file, -1.0, -1.0);
#endif
acBoundcondStep(); acBoundcondStep();
acStore(mesh); acStore(mesh);
@@ -228,35 +287,52 @@ run_simulation(void)
// acUpdate_sink_particle() will do the similar trick to the device. // acUpdate_sink_particle() will do the similar trick to the device.
/* Step the simulation */ /* Step the simulation */
AcReal accreted_mass = 0.0;
AcReal sink_mass = 0.0;
for (int i = 1; i < max_steps; ++i) { for (int i = 1; i < max_steps; ++i) {
const AcReal umax = acReduceVec(RTYPE_MAX, VTXBUF_UUX, VTXBUF_UUY, VTXBUF_UUZ); const AcReal umax = acReduceVec(RTYPE_MAX, VTXBUF_UUX, VTXBUF_UUY, VTXBUF_UUZ);
const AcReal dt = host_timestep(umax, mesh_info); const AcReal dt = host_timestep(umax, mesh_info);
#if LSINK
const AcReal sum_mass = acReduceScal(RTYPE_SUM, VTXBUF_ACCRETION);
accreted_mass = accreted_mass + sum_mass;
sink_mass = 0.0;
sink_mass = mesh_info.real_params[AC_M_sink_init] + accreted_mass;
acLoadDeviceConstant(AC_M_sink, sink_mass);
vertex_buffer_set(VTXBUF_ACCRETION, 0.0, mesh);
int on_off_switch;
if (i < 1) {
on_off_switch = 0; // accretion is off till certain amount of steps.
}
else {
on_off_switch = 1;
}
acLoadDeviceConstant(AC_switch_accretion, on_off_switch);
// MV: Old TODOs to remind of eventual future directions.
// TODO_SINK acUpdate_sink_particle()
// 3. Velocity of the particle)
// TODO_SINK acAdvect_sink_particle()
// 1. Calculate the equation of motion for the sink particle.
// NOTE: Might require embedding with acIntegrate(dt).
// TODO_SINK acAccrete_sink_particle()
// 2. Transfer momentum into sink particle
// (OPTIONAL: Affection the motion of the particle)
// NOTE: Might require embedding with acIntegrate(dt).
// This is the hardest part. Please see Lee et al. ApJ 783 (2014) for reference.
#else
accreted_mass = -1.0;
sink_mass = -1.0;
#endif
#if LFORCING #if LFORCING
const ForcingParams forcing_params = generateForcingParams(mesh_info); const ForcingParams forcing_params = generateForcingParams(mesh_info);
loadForcingParamsToDevice(forcing_params); loadForcingParamsToDevice(forcing_params);
#endif #endif
// TODO_SINK acUpdate_sink_particle()
// Update properties of the sing particle for acIntegrate(). Essentially:
// 1. Location of the particle
// 2. Mass of the particle
// (3. Velocity of the particle)
// These can be used for calculating he gravitational field.
acIntegrate(dt); acIntegrate(dt);
// TODO_SINK acAdvect_sink_particle()
// THIS IS OPTIONAL. We will start from unmoving particle.
// 1. Calculate the equation of motion for the sink particle.
// NOTE: Might require embedding with acIntegrate(dt).
// TODO_SINK acAccrete_sink_particle()
// Calculate accretion of the sink particle from the surrounding medium
// 1. Transfer density into sink particle mass
// 2. Transfer momentum into sink particle
// (OPTIONAL: Affection the motion of the particle)
// NOTE: Might require embedding with acIntegrate(dt).
// This is the hardest part. Please see Lee et al. ApJ 783 (2014) for reference.
t_step += dt; t_step += dt;
@@ -269,8 +345,11 @@ run_simulation(void)
timeseries.ts. timeseries.ts.
*/ */
print_diagnostics(i, dt, t_step, diag_file); print_diagnostics(i, dt, t_step, diag_file, sink_mass, accreted_mass);
#if LSINK
printf("sink mass is: %.15e \n", double(sink_mass));
printf("accreted mass is: %.15e \n", double(accreted_mass));
#endif
/* /*
We would also might want an XY-average calculating funtion, We would also might want an XY-average calculating funtion,
which can be very useful when observing behaviour of turbulent which can be very useful when observing behaviour of turbulent