diff --git a/examples/MHDTests/FastRotor/FastRotor_schemes.yml b/examples/MHDTests/FastRotor/FastRotor_schemes.yml index f4910bd237aac733d4520e35fb2c24dcb05dedc4..7885ced39a8332e961375ee8056c138d55e78ad1 100644 --- a/examples/MHDTests/FastRotor/FastRotor_schemes.yml +++ b/examples/MHDTests/FastRotor/FastRotor_schemes.yml @@ -9,7 +9,7 @@ InternalUnitSystem: # Parameters governing the time integration TimeIntegration: time_begin: 0. # The starting time of the simulation (in internal units). - time_end: 0.3 # The end time of the simulation (in internal units). + time_end: 0.1 # The end time of the simulation (in internal units). dt_min: 1e-9 # The minimal time-step size of the simulation (in internal units). dt_max: 1e-3 # The maximal time-step size of the simulation (in internal units). @@ -26,17 +26,20 @@ Statistics: # Parameters for the hydrodynamics scheme SPH: - resolution_eta: 1.2348 # Target smoothing length in units of the mean inter-particle separation (1.2348 == 48Ngbs with the cubic spline kernel$ + resolution_eta: 1.7 #1.595 #1.487 # 1.2348 # Target smoothing length in units of the mean inter-particle separation (1.2348 == 48Ngbs with the cubic spline kernel$ CFL_condition: 0.075 # Courant-Friedrich-Levy condition for time integration. +# viscosity_alpha: 10.0 +# viscosity_alpha_max: 20 + # Parameters for MHD schemes MHD: monopole_subtraction: 1.0 - artificial_diffusion: 1.0 + artificial_diffusion: 0.0 hyperbolic_dedner: 1.0 hyperbolic_dedner_divv: 0.5 parabolic_dedner: 1.0 - resistive_eta: 0.001 + resistive_eta: 0.01 # Physical parameters PhysicalConstants: diff --git a/examples/MHDTests/FastRotor/makeIC_schemes.py b/examples/MHDTests/FastRotor/makeIC_schemes.py index 503aa4e1b190f4af5cc08e53212ab85297b5d5b2..17d76aa7a41a529abee38fe535b063a2d9a81fbd 100644 --- a/examples/MHDTests/FastRotor/makeIC_schemes.py +++ b/examples/MHDTests/FastRotor/makeIC_schemes.py @@ -27,7 +27,7 @@ unit_cell = glass["/PartType0/Coordinates"][:, :] h_unit_cell = glass["/PartType0/SmoothingLength"][:] N_unit_cell = len(h_unit_cell) -times = 2 +times = 4 ratio = np.cbrt(rho_in_0 / rho_out_0) @@ -36,6 +36,7 @@ ratio = np.cbrt(rho_in_0 / rho_out_0) cx_out = times cy_out = times cz_out = 1 +cz_out = times cx_in = int(np.ceil(ratio * cx_out)) cy_in = int(np.ceil(ratio * cy_out)) @@ -144,6 +145,7 @@ u[N_out_f:] = P_0 / (rho_in_0 * (gamma - 1)) v[N_out_f:, 0] = -rot[N_out_f:] * omega_0 * np.sin(theta[N_out_f:]) v[N_out_f:, 1] = rot[N_out_f:] * omega_0 * np.cos(theta[N_out_f:]) +v[N_out_f:, 2] = 0.0 # B[:, 0] = B_0 @@ -164,7 +166,7 @@ hh[N:] = h h = hh vel = np.zeros((N2, 3)) vel[:N, :] = v[:, :] -vel[N:, :] = v[:, :] +vel[N:, :] = -v[:, :] v = vel ids = np.linspace(1, N2, N2) m = np.ones(N2) * rho_out_0 * vol / N_out diff --git a/examples/MHDTests/FastRotor/plot_schemes.py b/examples/MHDTests/FastRotor/plot_schemes.py index 029b29197d38161f15d1cc560ca33f427d1c94d2..047dd8369bb14fe3e5fe212bdee9da7d1724a248 100644 --- a/examples/MHDTests/FastRotor/plot_schemes.py +++ b/examples/MHDTests/FastRotor/plot_schemes.py @@ -78,12 +78,14 @@ for ii in range(nini, nfin): B = data.gas.magnetic_flux_densities divB = data.gas.magnetic_divergences + #divB = data.gas.vector_potential_divergences + #divB = data.gas.velocities[:,2] P_mag = (B[:, 0] ** 2 + B[:, 1] ** 2 + B[:, 2] ** 2) / 2 h = data.gas.smoothing_lengths normB = np.sqrt(B[:, 0] ** 2 + B[:, 1] ** 2 + B[:, 2] ** 2) - data.gas.DivB_error = np.maximum(h * abs(divB) / normB, 1e-10) + data.gas.DivB_error = np.maximum(h * abs(divB) / normB, 1e-10) # Then create a mass-weighted B error dataset data.gas.mass_weighted_magnetic_divB_error = data.gas.masses * data.gas.DivB_error diff --git a/examples/MHDTests/FastRotor/run_schemes.sh b/examples/MHDTests/FastRotor/run_schemes.sh index 7955066cd13c2e64fb0e9b9b1bf2e22bb3546455..704fe27ddfc07ccceb0b746cda9eb9e5f6c8b120 100755 --- a/examples/MHDTests/FastRotor/run_schemes.sh +++ b/examples/MHDTests/FastRotor/run_schemes.sh @@ -53,7 +53,8 @@ case $WHAT in SCHEME_Nr=4 ;; all) - SCHEME_Nr=( 0 1 2 3 4 ) +# SCHEME_Nr=( 0 1 2 3 4 ) + SCHEME_Nr=( 0 1 2 ) ;; *) echo $WHAT" wrong scheme" @@ -80,14 +81,14 @@ do cur_dir=`pwd` cd ../../../../ pwd - ./TestAllMHD.sh $IDD "--with-adiabatic-index=7/5" + ./TestAllMHD.sh $IDD "--with-adiabatic-index=7/5 --with-kernel=wendland-C2 --disable-hand-vec" cd $cur_dir cp ../../../../sw_$ID . fi cat <<-EOF > ./run.sh #!/bin/bash # Run SWIFT - ./sw_$ID --hydro --threads=4 ../FastRotor_schemes.yml 2>&1 > out.log + ./sw_$ID --hydro --threads=12 ../FastRotor_schemes.yml 2>&1 > out.log # Plot the evolution python3 ../plot_schemes.py 0 61 2>&1 > plot.log diff --git a/src/mhd/VPotential/mhd.h b/src/mhd/VPotential/mhd.h index 965e0a529bf2b48879e5beb7d51ba82a9c933ab7..1f79c0de38216c873463373e6d0177d0ad23e0c1 100644 --- a/src/mhd/VPotential/mhd.h +++ b/src/mhd/VPotential/mhd.h @@ -127,22 +127,15 @@ __attribute__((always_inline)) INLINE static float mhd_compute_timestep( const struct hydro_props *hydro_properties, const struct cosmology *cosmo, const float mu_0) { - //const float afac_divB = pow(cosmo->a, -mhd_comoving_factor - 0.5f); //(cosmo->a / cosmo->a_factor_sound_speed); const float afac_divB = (cosmo->a / cosmo->a_factor_sound_speed); const float afac_resistive = cosmo->a * cosmo->a; /* Dt from 1/DivOperator(Alfven speed) */ - float dt_divA = - p->mhd_data.divA != 0.0f - ? afac_divB * hydro_properties->CFL_condition * p->h * - sqrtf(p->rho / (p->mhd_data.divA * p->mhd_data.divA) * mu_0) - : FLT_MAX; float dt_divB = p->mhd_data.divB != 0.0f ? afac_divB * hydro_properties->CFL_condition * sqrtf(p->rho / (p->mhd_data.divB * p->mhd_data.divB) * mu_0) : FLT_MAX; - dt_divB = fminf(dt_divA, dt_divB); const float resistive_eta = p->mhd_data.resistive_eta; const float dt_eta = resistive_eta != 0.0f ? afac_resistive * hydro_properties->CFL_condition * @@ -244,9 +237,46 @@ __attribute__((always_inline)) INLINE static float mhd_signal_velocity( mhd_get_fast_magnetosonic_wave_phase_velocity(dx, pj, a, mu_0); */ - const float v_sig = v_sigi + v_sigj - beta * mu_ij; + const float v_sig = v_sigi + v_sigj - beta/2.f * mu_ij; return v_sig; +/* const float a_fac = + 2.f * mhd_comoving_factor + 3.f + 3.f * (hydro_gamma - 1.f); + const float ci = pi->force.soundspeed; + const float cj = pj->force.soundspeed; + const float r2 = (dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2]); + const float r_inv = r2 ? 1.f / sqrt(r2) : 0.0f; + + const float b2_i = (pi->mhd_data.BPred[0] * pi->mhd_data.BPred[0] + + pi->mhd_data.BPred[1] * pi->mhd_data.BPred[1] + + pi->mhd_data.BPred[2] * pi->mhd_data.BPred[2]); + const float b2_j = (pj->mhd_data.BPred[0] * pj->mhd_data.BPred[0] + + pj->mhd_data.BPred[1] * pj->mhd_data.BPred[1] + + pj->mhd_data.BPred[2] * pj->mhd_data.BPred[2]); + const float vcsa2_i = ci * ci + pow(a, a_fac) * b2_i / pi->rho * 0.5 / mu_0; + const float vcsa2_j = cj * cj + pow(a, a_fac) * b2_j / pj->rho * 0.5 / mu_0; + float Bpro2_i = + (pi->mhd_data.BPred[0] * dx[0] + pi->mhd_data.BPred[1] * dx[1] + + pi->mhd_data.BPred[2] * dx[2]) * + r_inv; + Bpro2_i *= Bpro2_i; + float mag_speed_i = sqrtf( + 0.5 * (vcsa2_i + + sqrtf(max((vcsa2_i * vcsa2_i - 4.f * ci * ci * pow(a, a_fac) * + Bpro2_i / pi->rho * 0.5 / mu_0), + 0.f)))); + float Bpro2_j = + (pj->mhd_data.BPred[0] * dx[0] + pj->mhd_data.BPred[1] * dx[1] + + pj->mhd_data.BPred[2] * dx[2]) * + r_inv; + Bpro2_j *= Bpro2_j; + float mag_speed_j = sqrtf( + 0.5 * (vcsa2_j + + sqrtf(max((vcsa2_j * vcsa2_j - 4.f * cj * cj * pow(a, a_fac) * + Bpro2_j / pj->rho * 0.5 / mu_0), + 0.f)))); + + return (mag_speed_i + mag_speed_j - beta * mu_ij);*/ } /** @@ -259,10 +289,7 @@ __attribute__((always_inline)) INLINE static float mhd_signal_velocity( * @param p The particle to act upon */ __attribute__((always_inline)) INLINE static void mhd_init_part( - struct part *p) - - { - + struct part *p) { p->mhd_data.divA = 0.f; // XXX todo, really is not the predicted variable will be the full step p->mhd_data.BPred[0] = 0.f; @@ -288,7 +315,7 @@ __attribute__((always_inline)) INLINE static void mhd_end_density( const float h_inv_dim_plus_one = pow_dimension_plus_one(1.f / p->h); /*1/h^(d+1) */ const float rho_inv = 1.f / p->rho; - //p->mhd_data.divA *= h_inv_dim_plus_one * rho_inv; + p->mhd_data.divA *= h_inv_dim_plus_one * rho_inv; for (int i = 0; i < 3; i++) p->mhd_data.BPred[i] *= h_inv_dim_plus_one * rho_inv; } @@ -321,7 +348,6 @@ __attribute__((always_inline)) INLINE static void mhd_prepare_gradient( */ __attribute__((always_inline)) INLINE static void mhd_reset_gradient( struct part *p) { - p->mhd_data.divA = 0.f; p->mhd_data.divB = 0.f; p->mhd_data.BSmooth[0] = 0.f; @@ -395,21 +421,23 @@ __attribute__((always_inline)) INLINE static void mhd_part_has_no_neighbours( */ __attribute__((always_inline)) INLINE static float hydro_get_dGau_dt( const struct part *restrict p, const float Gauge, const struct cosmology *c) - //, const float mu_0) { //const float v_sig = mhd_get_magnetosonic_speed(p, c->a, mu_0); //const float v_sig = p->viscosity.v_sig; const float v_sig = hydro_get_signal_velocity(p); + //const float v_sig = p->mhd_data.MaxVsig; const float afac1 = pow(c->a_factor_sound_speed, 2.f) * c->a * c->a; const float afac2 = c->a_factor_sound_speed * c->a; // Everything is with a2 for the time integration /* Hyperbolic term */ - const float Source_Term = 1.f * afac1 * p->mhd_data.divA * (v_sig * v_sig); + const float Source_Term = 0.1 * afac1 * p->mhd_data.divA * (v_sig * v_sig); + //const float Source_Term = 0.1 * afac1 * p->mhd_data.divB * p->h * (v_sig * v_sig); + //const float Source_Term = 0.1 * afac1 * p->mhd_data.divA * p->h * v_sig; /* Parabolic evolution term */ - const float Damping_Term = 4.f * afac2 * v_sig * Gauge / p->h; + const float Damping_Term = 2.f * afac2 * v_sig * Gauge / p->h; /* Density change term */ - const float DivV_Term = hydro_get_div_v(p) * Gauge * c->a * c->a ; + const float DivV_Term = 0.f * hydro_get_div_v(p) * Gauge * c->a * c->a ; /* Cosmological term */ const float Hubble_Term = (2.f + mhd_comoving_factor + 3.f) * c->H * c->a * c->a * Gauge; @@ -438,33 +466,25 @@ __attribute__((always_inline)) INLINE static void mhd_prepare_force( const struct hydro_props *hydro_props, const float dt_alpha, const float mu_0) { -// const float mu_0_1 = 1.f / mu_0; -// const float pressure = hydro_get_comoving_pressure(p); -// const float b2 = (p->mhd_data.BPred[0] * p->mhd_data.BPred[0] + -// p->mhd_data.BPred[1] * p->mhd_data.BPred[1] + -// p->mhd_data.BPred[2] * p->mhd_data.BPred[2]); + const float mu_0_1 = 1.f / mu_0; + const float pressure = hydro_get_comoving_pressure(p); + const float b2 = (p->mhd_data.BPred[0] * p->mhd_data.BPred[0] + + p->mhd_data.BPred[1] * p->mhd_data.BPred[1] + + p->mhd_data.BPred[2] * p->mhd_data.BPred[2]); /* Estimation of the tensile instability due divB */ -// p->mhd_data.Q0 = pressure / (b2 / 2.0f * mu_0_1); // Plasma Beta -// p->mhd_data.Q0 = -// p->mhd_data.Q0 < 10.0f ? 1.0f : 0.0f; // No correction if not magnetized + p->mhd_data.Q0 = pressure / (b2 / 2.0f * mu_0_1); // Plasma Beta + p->mhd_data.Q0 = + p->mhd_data.Q0 < 10.0f ? 1.0f : 0.0f; // No correction if not magnetized /* divB contribution */ -// const float ACC_corr = fabs(p->mhd_data.divB * sqrt(b2) * mu_0_1); + const float ACC_corr = fabs(p->mhd_data.divB * sqrt(b2) * mu_0_1); // this should go with a /p->h, but I // take simplify becasue of ACC_mhd also. /* isotropic magnetic presure */ // add the correct hydro acceleration? -// const float ACC_mhd = (b2 / p->h) * mu_0_1; + const float ACC_mhd = (b2 / p->h) * mu_0_1; /* Re normalize the correction in the momentum from the DivB errors*/ -// p->mhd_data.Q0 = -// ACC_corr > ACC_mhd ? p->mhd_data.Q0 * ACC_mhd / ACC_corr : p->mhd_data.Q0; - //float delim = 1.f; - //float change_Gau = - // hydro_get_dGau_dt(p, xp->mhd_data.Gau_full, cosmo) * dt_alpha; - //delim = fabs(change_Gau/xp->mhd_data.Gau_full) < 0.25f ? 1.f : 0.25f * fabs(xp->mhd_data.Gau_full / change_Gau); - - //xp->mhd_data.Gau_full += change_Gau * delim; - - //p->mhd_data.Gau = xp->mhd_data.Gau_full; + p->mhd_data.Q0 = + ACC_corr > ACC_mhd ? p->mhd_data.Q0 * ACC_mhd / ACC_corr : p->mhd_data.Q0; } /** @@ -509,9 +529,6 @@ __attribute__((always_inline)) INLINE static void mhd_reset_predicted_values( p->mhd_data.APred[1] = xp->mhd_data.Afull[1]; p->mhd_data.APred[2] = xp->mhd_data.Afull[2]; p->mhd_data.Gau = xp->mhd_data.Gau_full; - ///xp->mhd_data.Afull[0] = p->mhd_data.APred[0] ; - ///xp->mhd_data.Afull[1] = p->mhd_data.APred[1] ; - ///xp->mhd_data.Afull[2] = p->mhd_data.APred[2] ; } /** @@ -539,14 +556,10 @@ __attribute__((always_inline)) INLINE static void mhd_predict_extra( p->mhd_data.APred[0] += p->mhd_data.dAdt[0] * dt_therm; p->mhd_data.APred[1] += p->mhd_data.dAdt[1] * dt_therm; p->mhd_data.APred[2] += p->mhd_data.dAdt[2] * dt_therm; - ///xp->mhd_data.Afull[0] += p->mhd_data.dAdt[0] * dt_therm; - ///xp->mhd_data.Afull[1] += p->mhd_data.dAdt[1] * dt_therm; - ///xp->mhd_data.Afull[2] += p->mhd_data.dAdt[2] * dt_therm; - float delim = 1.f; + float change_Gau = - hydro_get_dGau_dt(p, xp->mhd_data.Gau_full, cosmo) * dt_therm; - //float delim = fabs(change_Gau/p->mhd_data.Gau) < 0.25f ? 1.f : 0.25f * fabs(p->mhd_data.Gau / change_Gau); - p->mhd_data.Gau += change_Gau * delim; + hydro_get_dGau_dt(p, p->mhd_data.Gau, cosmo) * dt_therm; + p->mhd_data.Gau += change_Gau; } /** @@ -593,29 +606,11 @@ __attribute__((always_inline)) INLINE static void mhd_kick_extra( const struct cosmology *cosmo, const struct hydro_props *hydro_props, const struct entropy_floor_properties *floor_props) { // Slope delimiter - /*const float dAdt_2 = - p->mhd_data.dAdt[0] * p->mhd_data.dAdt[0] + - p->mhd_data.dAdt[1] * p->mhd_data.dAdt[1] + - p->mhd_data.dAdt[2] * p->mhd_data.dAdt[2] ; - const float Afull_2 = - xp->mhd_data.Afull[0] * xp->mhd_data.Afull[0] + - xp->mhd_data.Afull[1] * xp->mhd_data.Afull[1] + - xp->mhd_data.Afull[2] * xp->mhd_data.Afull[2]; - float delim = dAdt_2 * dt_therm * dt_therm / Afull_2 < 1.0f ? 1.f : sqrt(Afull_2 / dAdt_2) / dt_therm ; - */ - float delim = 1.f; - xp->mhd_data.Afull[0] += p->mhd_data.dAdt[0] * dt_therm * delim; - xp->mhd_data.Afull[1] += p->mhd_data.dAdt[1] * dt_therm * delim; - xp->mhd_data.Afull[2] += p->mhd_data.dAdt[2] * dt_therm * delim; - ///p->mhd_data.APred[0] += p->mhd_data.dAdt[0] * dt_therm * delim; - ///p->mhd_data.APred[1] += p->mhd_data.dAdt[1] * dt_therm * delim; - ///p->mhd_data.APred[2] += p->mhd_data.dAdt[2] * dt_therm * delim; - - float change_Gau = - hydro_get_dGau_dt(p, xp->mhd_data.Gau_full, cosmo) * dt_therm; - //delim = fabs(change_Gau/xp->mhd_data.Gau_full) < 0.25f ? 1.f : 0.25f * fabs(xp->mhd_data.Gau_full / change_Gau); - xp->mhd_data.Gau_full += change_Gau * delim; - + xp->mhd_data.Afull[0] += p->mhd_data.dAdt[0] * dt_therm; + xp->mhd_data.Afull[1] += p->mhd_data.dAdt[1] * dt_therm; + xp->mhd_data.Afull[2] += p->mhd_data.dAdt[2] * dt_therm; + float change_Gau = hydro_get_dGau_dt(p, p->mhd_data.Gau, cosmo) * dt_therm; + xp->mhd_data.Gau_full += change_Gau; } /** @@ -648,9 +643,9 @@ __attribute__((always_inline)) INLINE static void mhd_convert_quantities( xp->mhd_data.Afull[1] = p->mhd_data.APred[1]; xp->mhd_data.Afull[2] = p->mhd_data.APred[2]; - xp->mhd_data.Gau_full = 0.f; - p->mhd_data.Gau = 0.f; - + p->mhd_data.dAdt[0] = 0.0; + p->mhd_data.dAdt[1] = 0.0; + p->mhd_data.dAdt[2] = 0.0; } /** @@ -666,6 +661,12 @@ __attribute__((always_inline)) INLINE static void mhd_convert_quantities( __attribute__((always_inline)) INLINE static void mhd_first_init_part( struct part *restrict p, struct xpart *restrict xp, const struct mhd_global_data *mhd_data, const double Lsize) { + xp->mhd_data.Gau_full = 0.0f; + p->mhd_data.divB = 0.0f; + + p->mhd_data.dAdt[0] = 0.0; + p->mhd_data.dAdt[1] = 0.0; + p->mhd_data.dAdt[2] = 0.0; mhd_reset_acceleration(p); mhd_init_part(p); diff --git a/src/mhd/VPotential/mhd_iact.h b/src/mhd/VPotential/mhd_iact.h index 38b0c71d648a632ca6708aef5782106f370ff784..d987db5e6d9bb90968f651ec95836a7ad1150307 100644 --- a/src/mhd/VPotential/mhd_iact.h +++ b/src/mhd/VPotential/mhd_iact.h @@ -61,22 +61,20 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_density( for (int i = 0; i < 3; ++i) dA[i] = pi->mhd_data.APred[i] - pj->mhd_data.APred[i]; - //const double dAdr = dA[0] * dx[0] + dA[1] * dx[1] + dA[2] * dx[2]; - - //pi->mhd_data.divA -= faci * dAdr; - //pj->mhd_data.divA -= facj * dAdr; - ///// - // bi = dj ak - dk aj - // bj = dk ai - di ak - // bk = di aj - dj ai - // - for (int i = 0; i < 3; ++i) { - pi->mhd_data.BPred[i] += faci * (dA[(i + 1) % 3] * dx[(i + 2) % 3] - + const double dAdr = dA[0] * dx[0] + dA[1] * dx[1] + dA[2] * dx[2]; + pi->mhd_data.divA -= faci * dAdr; + pj->mhd_data.divA -= facj * dAdr; + ///// + // bi = dj ak - dk aj + // bj = dk ai - di ak + // bk = di aj - dj ai + // + for (int i = 0; i < 3; ++i) { + pi->mhd_data.BPred[i] += faci * (dA[(i + 1) % 3] * dx[(i + 2) % 3] - dA[(i + 2) % 3] * dx[(i + 1) % 3]); - pj->mhd_data.BPred[i] += facj * (dA[(i + 1) % 3] * dx[(i + 2) % 3] - + pj->mhd_data.BPred[i] += facj * (dA[(i + 1) % 3] * dx[(i + 2) % 3] - dA[(i + 2) % 3] * dx[(i + 1) % 3]); - } - return; + } } @@ -113,13 +111,12 @@ runner_iact_nonsym_mhd_density(const float r2, const float dx[3], double dA[3]; for (int i = 0; i < 3; ++i) dA[i] = pi->mhd_data.APred[i] - pj->mhd_data.APred[i]; - //const double dAdr = dA[0] * dx[0] + dA[1] * dx[1] + dA[2] * dx[2]; - //pi->mhd_data.divA -= faci * dAdr; + const double dAdr = dA[0] * dx[0] + dA[1] * dx[1] + dA[2] * dx[2]; + pi->mhd_data.divA -= faci * dAdr; for (int i = 0; i < 3; ++i) pi->mhd_data.BPred[i] += faci * (dA[(i + 1) % 3] * dx[(i + 2) % 3] - dA[(i + 2) % 3] * dx[(i + 1) % 3]); - return; } /** @@ -158,12 +155,9 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_gradient( const float rhoj = pj->rho; float Bi[3], Bj[3]; - float Ai[3], Aj[3]; for (int i = 0; i < 3; ++i) { Bi[i] = pi->mhd_data.BPred[i]; Bj[i] = pj->mhd_data.BPred[i]; - Ai[i] = pi->mhd_data.APred[i]; - Aj[i] = pj->mhd_data.APred[i]; } /* Get the kernel for hi. */ @@ -187,9 +181,6 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_gradient( /* B dot r. */ const float Bri = Bi[0] * dx[0] + Bi[1] * dx[1] + Bi[2] * dx[2]; const float Brj = Bj[0] * dx[0] + Bj[1] * dx[1] + Bj[2] * dx[2]; - /* A dot r. */ - const float Ari = Ai[0] * dx[0] + Ai[1] * dx[1] + Ai[2] * dx[2]; - const float Arj = Aj[0] * dx[0] + Aj[1] * dx[1] + Aj[2] * dx[2]; /* Compute gradient terms */ const float over_rho_i = 1.0f / rhoi * f_ij; const float over_rho_j = 1.0f / rhoj * f_ji; @@ -199,11 +190,6 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_gradient( float B_mon_j = -over_rho_j * (Bri - Brj) * wj_dr * r_inv; pi->mhd_data.divB += mj * B_mon_i; pj->mhd_data.divB += mi * B_mon_j; - /* Calculate divergence term */ - float A_mon_i = -over_rho_i * (Ari - Arj) * wi_dr * r_inv; - float A_mon_j = -over_rho_j * (Ari - Arj) * wj_dr * r_inv; - pi->mhd_data.divA += mj * A_mon_i; - pj->mhd_data.divA += mi * A_mon_j; /* dB */ float dB[3]; @@ -227,8 +213,6 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_gradient( for (int k = 0; k < 3; k++) { pi->mhd_data.curlB[k] += mj * over_rho_i * wi_dr * r_inv * dB_cross_dx[k]; pj->mhd_data.curlB[k] += mi * over_rho_j * wj_dr * r_inv * dB_cross_dx[k]; - //pi->mhd_data.BSmooth[k] += mj * over_rho_i * wi_dr * r_inv * dA_cross_dx[k]; - //pj->mhd_data.BSmooth[k] += mi * over_rho_j * wj_dr * r_inv * dA_cross_dx[k]; pi->mhd_data.BSmooth[k] += mj * wi * Bi[k]; pj->mhd_data.BSmooth[k] += mi * wj * Bj[k]; } @@ -283,12 +267,9 @@ runner_iact_nonsym_mhd_gradient(const float r2, const float dx[3], const float rhoi = pi->rho; float Bi[3], Bj[3]; - float Ai[3], Aj[3]; for (int i = 0; i < 3; ++i) { Bi[i] = pi->mhd_data.BPred[i]; Bj[i] = pj->mhd_data.BPred[i]; - Ai[i] = pi->mhd_data.APred[i]; - Aj[i] = pj->mhd_data.APred[i]; } /* Get the kernel for hi. */ @@ -304,18 +285,13 @@ runner_iact_nonsym_mhd_gradient(const float r2, const float dx[3], /* B dot r. */ const float Bri = (Bi[0] * dx[0] + Bi[1] * dx[1] + Bi[2] * dx[2]); const float Brj = (Bj[0] * dx[0] + Bj[1] * dx[1] + Bj[2] * dx[2]); - /* A dot r. */ - const float Ari = Ai[0] * dx[0] + Ai[1] * dx[1] + Ai[2] * dx[2]; - const float Arj = Aj[0] * dx[0] + Aj[1] * dx[1] + Aj[2] * dx[2]; + /* Compute gradient terms */ const float over_rho_i = 1.0f / rhoi * f_ij; /* Calculate divergence term */ float B_mon_i = -over_rho_i * (Bri - Brj) * wi_dr * r_inv; pi->mhd_data.divB += mj * B_mon_i; - /* Calculate divergence term */ - float A_mon_i = -over_rho_i * (Ari - Arj) * wi_dr * r_inv; - pi->mhd_data.divA += mj * A_mon_i; /* dB */ float dB[3]; @@ -338,7 +314,6 @@ runner_iact_nonsym_mhd_gradient(const float r2, const float dx[3], /* Calculate Curl */ for (int k = 0; k < 3; k++) { pi->mhd_data.curlB[k] += mj * over_rho_i * wi_dr * r_inv * dB_cross_dx[k]; - //pi->mhd_data.BSmooth[k] += mj * over_rho_i * wi_dr * r_inv * dA_cross_dx[k]; pi->mhd_data.BSmooth[k] += mj * wi * Bi[k]; } pi->mhd_data.Q0 += pj->mass * wi; @@ -376,8 +351,8 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_force( /* Recover some data */ const float mi = pi->mass; const float mj = pj->mass; - const float Pi = pi->force.pressure; - const float Pj = pj->force.pressure; +// const float Pi = pi->force.pressure; +// const float Pj = pj->force.pressure; const float rhoi = pi->rho; const float rhoj = pj->rho; @@ -414,8 +389,8 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_force( Bi[i] = pi->mhd_data.BPred[i]; Bj[i] = pj->mhd_data.BPred[i]; } - const float B2i = Bi[0] * Bi[0] + Bi[1] * Bi[1] + Bi[2] * Bi[2]; - const float B2j = Bj[0] * Bj[0] + Bj[1] * Bj[1] + Bj[2] * Bj[2]; +// const float B2i = Bi[0] * Bi[0] + Bi[1] * Bi[1] + Bi[2] * Bi[2]; +// const float B2j = Bj[0] * Bj[0] + Bj[1] * Bj[1] + Bj[2] * Bj[2]; ///////////////////////////// FORCE MAXWELL TENSOR @@ -428,14 +403,14 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_force( mm_i[j][j] -= 0.5 * (Bi[0] * Bi[0] + Bi[1] * Bi[1] + Bi[2] * Bi[2]); mm_j[j][j] -= 0.5 * (Bj[0] * Bj[0] + Bj[1] * Bj[1] + Bj[2] * Bj[2]); } - const float plasma_beta_i = B2i != 0.0f ? 2.0f * mu_0 * Pi / B2i : FLT_MAX; +/* const float plasma_beta_i = B2i != 0.0f ? 2.0f * mu_0 * Pi / B2i : FLT_MAX; const float plasma_beta_j = B2j != 0.0f ? 2.0f * mu_0 * Pj / B2j : FLT_MAX; const float scale_i = 0.125f * (10.0f - plasma_beta_i); const float scale_j = 0.125f * (10.0f - plasma_beta_j); pi->mhd_data.Q0 = fmaxf(0.0f, fminf(scale_i, 1.0f)); - pj->mhd_data.Q0 = fmaxf(0.0f, fminf(scale_j, 1.0f)); + pj->mhd_data.Q0 = fmaxf(0.0f, fminf(scale_j, 1.0f));*/ //////////////////////////// Apply to the Force and DIVB TERM SUBTRACTION for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { @@ -477,23 +452,18 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_force( dv[1] = pi->v[1] - pj->v[1]; dv[2] = pi->v[2] - pj->v[2]; - const float sourceAi = dv[0] * pi->mhd_data.APred[0] + - dv[1] * pi->mhd_data.APred[1] + - dv[2] * pi->mhd_data.APred[2]; - const float sourceAj = dv[0] * pj->mhd_data.APred[0] + - dv[1] * pj->mhd_data.APred[1] + - dv[2] * pj->mhd_data.APred[2]; - -// float SAi = sourceAi + a * a * (pi->mhd_data.Gau - pj->mhd_data.Gau); -// float SAj = sourceAj + a * a * (pi->mhd_data.Gau - pj->mhd_data.Gau); + const float sAi = dv[0] * pi->mhd_data.APred[0] + dv[1] * pi->mhd_data.APred[1] + dv[2] * pi->mhd_data.APred[2]; + const float sAj = dv[0] * pj->mhd_data.APred[0] + dv[1] * pj->mhd_data.APred[1] + dv[2] * pj->mhd_data.APred[2]; +// const float sAi = -(dA[0] * pi->v[0] + dA[1] * pi->v[1] + dA[2] * pi->v[2]); +// const float sAj = -(dA[0] * pj->v[0] + dA[1] * pj->v[1] + dA[2] * pj->v[2]); + const float sourceAi = sAi + a * a * (pi->mhd_data.Gau - pj->mhd_data.Gau); + const float sourceAj = sAj + a * a * (pi->mhd_data.Gau - pj->mhd_data.Gau); for (int i = 0; i < 3; i++) { -// pi->mhd_data.dAdt[i] += mj * mag_VPIndi * SAi * dx[i]; -// pj->mhd_data.dAdt[i] += mi * mag_VPIndj * SAj * dx[i]; pi->mhd_data.dAdt[i] += mj * mag_VPIndi * sourceAi * dx[i]; pj->mhd_data.dAdt[i] += mi * mag_VPIndj * sourceAj * dx[i]; - pi->mhd_data.dAdt[i] += mj * a * a * (mag_VPIndi * pi->mhd_data.Gau + mag_VPIndj * pj->mhd_data.Gau) * dx[i]; - pj->mhd_data.dAdt[i] += mi * a * a * (mag_VPIndi * pi->mhd_data.Gau + mag_VPIndj * pj->mhd_data.Gau) * dx[i]; +// pi->mhd_data.dAdt[i] += mj * dA[i] * mag_VPIndi * (dv[0] * dx[0] + dv[1] * dx[1] + dv[2] * dx[2]); +// pj->mhd_data.dAdt[i] += mi * dA[i] * mag_VPIndj * (dv[0] * dx[0] + dv[1] * dx[1] + dv[2] * dx[2]); } /// DISSSIPATION const float mag_Disi = @@ -511,8 +481,6 @@ __attribute__((always_inline)) INLINE static void runner_iact_mhd_force( for (int i = 0; i < 3; i++) { pi->mhd_data.Adv_A_source[i] += mj * mag_VPIndi * sourceAi * dx[i]; pj->mhd_data.Adv_A_source[i] += mi * mag_VPIndj * sourceAj * dx[i]; - pi->mhd_data.Adv_A_source[i] += mj * a * a * (mag_VPIndi * pi->mhd_data.Gau + mag_VPIndj * pj->mhd_data.Gau) * dx[i]; - pj->mhd_data.Adv_A_source[i] += mi * a * a * (mag_VPIndi * pi->mhd_data.Gau + mag_VPIndj * pj->mhd_data.Gau) * dx[i]; pi->mhd_data.Diff_A_source[i] += mj * 8.0 * pi->mhd_data.resistive_eta * mag_Disi * dA[i]; pj->mhd_data.Diff_A_source[i] -= mi * 8.0 * pj->mhd_data.resistive_eta * mag_Disj * dA[i]; pi->mhd_data.Delta_A[i] += mj * 8.0 * mag_Disi * dA[i]; @@ -549,7 +517,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_mhd_force( const float mi = pi->mass; const float mj = pj->mass; - const float Pi = pi->force.pressure; +// const float Pi = pi->force.pressure; const float rhoi = pi->rho; const float rhoj = pj->rho; @@ -590,8 +558,8 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_mhd_force( Bi[i] = pi->mhd_data.BPred[i]; Bj[i] = pj->mhd_data.BPred[i]; } - const float B2i = Bi[0] * Bi[0] + Bi[1] * Bi[1] + Bi[2] * Bi[2]; - +// const float B2i = Bi[0] * Bi[0] + Bi[1] * Bi[1] + Bi[2] * Bi[2]; +// ///////////////////////////// FORCE MAXWELL TENSOR for (int i = 0; i < 3; i++) @@ -603,9 +571,9 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_mhd_force( mm_i[j][j] -= 0.5 * (Bi[0] * Bi[0] + Bi[1] * Bi[1] + Bi[2] * Bi[2]); mm_j[j][j] -= 0.5 * (Bj[0] * Bj[0] + Bj[1] * Bj[1] + Bj[2] * Bj[2]); } - const float plasma_beta_i = B2i != 0.0f ? 2.0f * mu_0 * Pi / B2i : FLT_MAX; - const float scale_i = 0.125f * (10.0f - plasma_beta_i); - pi->mhd_data.Q0 = fmaxf(0.0f, fminf(scale_i, 1.0f)); +// const float plasma_beta_i = B2i != 0.0f ? 2.0f * mu_0 * Pi / B2i : FLT_MAX; +// const float scale_i = 0.125f * (10.0f - plasma_beta_i); +// pi->mhd_data.Q0 = fmaxf(0.0f, fminf(scale_i, 1.0f)); //////////////////////////// Apply to the Force and DIVB TERM SUBTRACTION for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { @@ -628,7 +596,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_mhd_force( /////////////////////////// VP INDUCTION const float mag_VPIndi = wi_dr * r_inv / rhoi; - const float mag_VPIndj = wj_dr * r_inv / rhoj; +// const float mag_VPIndj = wj_dr * r_inv / rhoj; // Normal Gauge double dA[3]; for (int i = 0; i < 3; i++) @@ -638,15 +606,16 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_mhd_force( dv[1] = pi->v[1] - pj->v[1]; dv[2] = pi->v[2] - pj->v[2]; - const float sourceAi = dv[0] * pi->mhd_data.APred[0] + - dv[1] * pi->mhd_data.APred[1] + - dv[2] * pi->mhd_data.APred[2]; - - // float SAi = sourceAi + a * a * (pi->mhd_data.Gau - pj->mhd_data.Gau); - for (int i = 0; i < 3; i++) + const float sAi = dv[0] * pi->mhd_data.APred[0] + dv[1] * pi->mhd_data.APred[1] + + dv[2] * pi->mhd_data.APred[2]; +// const float sAj = dv[0] * pj->mhd_data.APred[0] + dv[1] * pj->mhd_data.APred[1] + dv[2] * pj->mhd_data.APred[2]; +// const float sAi = -(dA[0] * pi->v[0] + dA[1] * pi->v[1] + dA[2] * pi->v[2]); + const float sourceAi = sAi + a * a * (pi->mhd_data.Gau - pj->mhd_data.Gau); +// const float sourceAj = sAj + a * a * (pi->mhd_data.Gau - pj->mhd_data.Gau); + for (int i = 0; i < 3; i++){ pi->mhd_data.dAdt[i] += mj * mag_VPIndi * sourceAi * dx[i]; - for (int i = 0; i < 3; i++) - pi->mhd_data.dAdt[i] += mj * a * a * (mag_VPIndi * pi->mhd_data.Gau + mag_VPIndj * pj->mhd_data.Gau) * dx[i]; +// pi->mhd_data.dAdt[i] += mj * dA[i] * mag_VPIndi * (dv[0] * dx[0] + dv[1] * dx[1] + dv[2] * dx[2]); + } /// DISSSIPATION const float mag_Disi = (wi_dr + wj_dr) / 2.f * r_inv * rhoi / (rho_ij * rho_ij); @@ -656,7 +625,6 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_mhd_force( /* Save induction sources */ for (int i = 0; i < 3; i++) { pi->mhd_data.Adv_A_source[i] += mj * mag_VPIndi * sourceAi * dx[i]; - pi->mhd_data.Adv_A_source[i] += mj * a * a * (mag_VPIndi * pi->mhd_data.Gau + mag_VPIndj * pj->mhd_data.Gau) * dx[i]; pi->mhd_data.Diff_A_source[i] += mj * 8.0 * pi->mhd_data.resistive_eta * mag_Disi * dA[i]; pi->mhd_data.Delta_A[i] += mj * 8.0 * mag_Disi * dA[i]; } diff --git a/src/mhd/VPotential/mhd_struct.h b/src/mhd/VPotential/mhd_struct.h index 558b3ef12d9e6d9e61f4e5548d1adb5c60132cf6..9cdbcd0d4406063bcf8032689187061d419d10be 100644 --- a/src/mhd/VPotential/mhd_struct.h +++ b/src/mhd/VPotential/mhd_struct.h @@ -54,6 +54,7 @@ struct mhd_part_data { float Diff_A_source[3]; /* Laplacian A */ float Delta_A[3]; + float MaxVsig; }; /**