diff --git a/src/gravity/Default/gravity.h b/src/gravity/Default/gravity.h index 8fcfe6490c539732b885a9c102f011aebb0aaeff..0906c2e344671bb58cc7fbdb0a5a86028e083578 100644 --- a/src/gravity/Default/gravity.h +++ b/src/gravity/Default/gravity.h @@ -28,9 +28,12 @@ __attribute__((always_inline)) INLINE static float gravity_compute_timestep(struct gpart* gp) { + float dt = FLT_MAX; - /* Currently no limit is imposed */ - return FLT_MAX; +#ifdef EXTERNAL_POTENTIAL_POINTMASS + dt = fminf(dt, external_gravity_pointmass_timestep(gp)); +#endif + return dt; } /** @@ -66,6 +69,7 @@ __attribute__((always_inline)) INLINE static void external_gravity(struct gpart #ifdef EXTERNAL_POTENTIAL_POINTMASS external_gravity_pointmass(g); #endif +} /** * @brief Kick the additional variables @@ -76,3 +80,6 @@ __attribute__((always_inline)) INLINE static void external_gravity(struct gpart */ __attribute__((always_inline)) INLINE static void gravity_kick_extra( struct gpart* gp, float dt, float half_dt) {} + +__attribute__((always_inline)) INLINE static void gravity_end_force( + struct gpart* gp) {} diff --git a/src/gravity/Default/gravity_part.h b/src/gravity/Default/gravity_part.h index 47aadd19585a71d04443403245cc76e28f46d80b..6a33f786cd2ee1bb6fdbba20e544fa4b9d2dd556 100644 --- a/src/gravity/Default/gravity_part.h +++ b/src/gravity/Default/gravity_part.h @@ -31,9 +31,6 @@ struct gpart { /* Particle acceleration. */ float a_grav[3]; - /* Gravity acceleration */ - float a_grav_external[3]; - /* Particle mass. */ float mass; diff --git a/src/gravity/Default/potentials.h b/src/gravity/Default/potentials.h index 39cde2d1dd50631615ab5474b15d85b4302b0746..9930b66ec246a18cdb9b71414f919baeaeb274c4 100644 --- a/src/gravity/Default/potentials.h +++ b/src/gravity/Default/potentials.h @@ -25,7 +25,7 @@ __attribute__((always_inline)) INLINE static float external_gravity_pointmass_ti const float dota_y = const_G * External_Potential_Mass * rinv * rinv * rinv * (-g->v_full[1] + 3.f * rinv * rinv * drdv * dy); const float dota_z = const_G * External_Potential_Mass * rinv * rinv * rinv * (-g->v_full[2] + 3.f * rinv * rinv * drdv * dz); const float dota_2 = dota_x * dota_x + dota_y * dota_y + dota_z * dota_z; - const float a_2 = g->a_grav_external[0] * g->a_grav_external[0] + g->a_grav_external[1] * g->a_grav_external[1] + g->a_grav_external[2] * g->a_grav_external[2]; + const float a_2 = g->a_grav[0] * g->a_grav[0] + g->a_grav[1] * g->a_grav[1] + g->a_grav[2] * g->a_grav[2]; return 0.03f * sqrtf(a_2/dota_2); } @@ -38,9 +38,9 @@ __attribute__((always_inline)) INLINE static void external_gravity_pointmass(str const float rinv = 1.f / sqrtf(dx*dx + dy*dy + dz*dz); - g->a_grav_external[0] += - const_G * External_Potential_Mass * dx * rinv * rinv * rinv; - g->a_grav_external[1] += - const_G * External_Potential_Mass * dy * rinv * rinv * rinv; - g->a_grav_external[2] += - const_G * External_Potential_Mass * dz * rinv * rinv * rinv; + g->a_grav[0] += - const_G * External_Potential_Mass * dx * rinv * rinv * rinv; + g->a_grav[1] += - const_G * External_Potential_Mass * dy * rinv * rinv * rinv; + g->a_grav[2] += - const_G * External_Potential_Mass * dz * rinv * rinv * rinv; } diff --git a/src/runner.c b/src/runner.c index 3341f3213261ff8d81625e9dc2103148b169bd32..b6da14bfe34b1ec3415fcdaabec227d130e995d6 100644 --- a/src/runner.c +++ b/src/runner.c @@ -139,16 +139,16 @@ void runner_dograv_external(struct runner *r, struct cell *c) { const float rinv = 1.f / sqrtf(dx*dx + dy*dy + dz*dz); /* /\* current acceleration *\/ */ - /* g->a_grav_external[0] = - const_G * External_Potential_Mass * dx * rinv * rinv * rinv; */ - /* g->a_grav_external[1] = - const_G * External_Potential_Mass * dy * rinv * rinv * rinv; */ - /* g->a_grav_external[2] = - const_G * External_Potential_Mass * dz * rinv * rinv * rinv; */ + /* g->a_grav[0] = - const_G * External_Potential_Mass * dx * rinv * rinv * rinv; */ + /* g->a_grav[1] = - const_G * External_Potential_Mass * dy * rinv * rinv * rinv; */ + /* g->a_grav[2] = - const_G * External_Potential_Mass * dz * rinv * rinv * rinv; */ const int current_dti = g->ti_end - g->ti_begin; const float dt = 0.5f * current_dti * r->e->timeBase; - const float vx = g->v_full[0] + dt * g->a_grav_external[0]; - const float vy = g->v_full[1] + dt * g->a_grav_external[1]; - const float vz = g->v_full[2] + dt * g->a_grav_external[2]; + const float vx = g->v_full[0] + dt * g->a_grav[0]; + const float vy = g->v_full[1] + dt * g->a_grav[1]; + const float vz = g->v_full[2] + dt * g->a_grav[2]; /* E/L */ E = 0.5 * ((vx*vx) + (vy*vy) + (vz*vz)) - const_G * External_Potential_Mass * rinv; @@ -158,7 +158,7 @@ void runner_dograv_external(struct runner *r, struct cell *c) { if(abs(g->id) == 1) { float v2 = vx*vx + vy*vy + vz*vz; float fg = const_G * External_Potential_Mass * rinv; - float fga = sqrtf((g->a_grav_external[0]*g->a_grav_external[0]) + (g->a_grav_external[1]*g->a_grav_external[1]) + (g->a_grav_external[2]*g->a_grav_external[2])) * dr; + float fga = sqrtf((g->a_grav[0]*g->a_grav[0]) + (g->a_grav[1]*g->a_grav[1]) + (g->a_grav[2]*g->a_grav[2])) * dr; //message("grav_external time= %f\t V_c^2= %f GM/r= %f E= %f L[2]= %f x= %f y= %f vx= %f vy= %f\n", r->e->time, v2, fg, E, L[2], g->x[0], g->x[1], vx, vy); message("%f\t %f %f %f %f %f %f %f %f %f %f %f %f\n", r->e->time, g->tx, g->tv, dt, v2, fg, fga, E, L[2], g->x[0], g->x[1], vx, vy); // message(" G=%e M=%e\n", const_G, External_Potential_Mass); @@ -955,6 +955,10 @@ void runner_dokick(struct runner *r, struct cell *c, int timer) { const double dt = (ti_end - ti_start) * timeBase; const double half_dt = (ti_end - gp->ti_end) * timeBase; + /* Move particle forward in time */ + gp->ti_begin = gp->ti_end; + gp->ti_end = gp->ti_begin + new_dti; + /* Kick particles in momentum space */ gp->v_full[0] += gp->a_grav[0] * dt; gp->v_full[1] += gp->a_grav[1] * dt; @@ -966,6 +970,11 @@ void runner_dokick(struct runner *r, struct cell *c, int timer) { /* Number of updated g-particles */ g_updated++; } + + /* Minimal time for next end of time-step */ + ti_end_min = min(gp->ti_end, ti_end_min); + ti_end_max = max(gp->ti_end, ti_end_max); + } /* Now do the hydro ones... */