Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
SWIFT
SWIFTsim
Commits
f01a4e0c
Commit
f01a4e0c
authored
Apr 27, 2017
by
James Willis
Browse files
Merge branch 'master' into dopair-vectorisation-merge
parents
ed2260b9
c2c61436
Changes
38
Hide whitespace changes
Inline
Side-by-side
.gitignore
View file @
f01a4e0c
...
...
@@ -91,6 +91,7 @@ theory/SPH/*.pdf
theory/paper_pasc/pasc_paper.pdf
theory/Multipoles/fmm.pdf
theory/Multipoles/fmm_standalone.pdf
theory/Multipoles/potential.pdf
m4/libtool.m4
m4/ltoptions.m4
...
...
README
View file @
f01a4e0c
...
...
@@ -27,6 +27,7 @@ Valid options are:
-f {int} Overwrite the CPU frequency (Hz) to be used for time measurements.
-g Run with an external gravitational potential.
-G Run with self-gravity.
-M Reconstruct the multipoles every time-step.
-n {int} Execute a fixed number of time steps. When unset use the time_end parameter to stop.
-s Run with hydrodynamics.
-S Run with stars.
...
...
configure.ac
View file @
f01a4e0c
...
...
@@ -215,6 +215,21 @@ elif test "$gravity_force_checks" != "no"; then
AC_DEFINE_UNQUOTED([SWIFT_GRAVITY_FORCE_CHECKS], [$enableval] ,[Enable gravity brute-force checks])
fi
# Check if we want to zero the gravity forces for all particles below some ID.
AC_ARG_ENABLE([no-gravity-below-id],
[AS_HELP_STRING([--enable-no-gravity-below-id],
[Zeros the gravitational acceleration of all particles with an ID smaller than @<:@N@:>@]
)],
[no_gravity_below_id="$enableval"],
[no_gravity_below_id="no"]
)
if test "$no_gravity_below_id" == "yes"; then
AC_MSG_ERROR(Need to specify the ID below which particles get zero forces when using --enable-no-gravity-below-id!)
elif test "$no_gravity_below_id" != "no"; then
AC_DEFINE_UNQUOTED([SWIFT_NO_GRAVITY_BELOW_ID], [$enableval] ,[Particles with smaller ID than this will have zero gravity forces])
fi
# Define HAVE_POSIX_MEMALIGN if it works.
AX_FUNC_POSIX_MEMALIGN
...
...
@@ -854,12 +869,14 @@ AC_MSG_RESULT([
Adiabatic index : $with_gamma
Riemann solver : $with_riemann
Cooling function : $with_cooling
External potential : $with_potential
Multipole order : $with_multipole_order
Task debugging : $enable_task_debugging
Debugging checks : $enable_debugging_checks
Gravity checks : $gravity_force_checks
External potential : $with_potential
Multipole order : $with_multipole_order
No gravity below ID : $no_gravity_below_id
Task debugging : $enable_task_debugging
Debugging checks : $enable_debugging_checks
Gravity checks : $gravity_force_checks
])
# Make sure the latest git revision string gets included
...
...
examples/main.c
View file @
f01a4e0c
...
...
@@ -82,6 +82,8 @@ void print_help_message() {
"Run with an external gravitational potential."
);
printf
(
" %2s %8s %s
\n
"
,
"-F"
,
""
,
"Run with feedback."
);
printf
(
" %2s %8s %s
\n
"
,
"-G"
,
""
,
"Run with self-gravity."
);
printf
(
" %2s %8s %s
\n
"
,
"-M"
,
""
,
"Reconstruct the multipoles every time-step."
);
printf
(
" %2s %8s %s
\n
"
,
"-n"
,
"{int}"
,
"Execute a fixed number of time steps. When unset use the time_end "
"parameter to stop."
);
...
...
@@ -164,6 +166,7 @@ int main(int argc, char *argv[]) {
int
with_stars
=
0
;
int
with_fp_exceptions
=
0
;
int
with_drift_all
=
0
;
int
with_mpole_reconstruction
=
0
;
int
verbose
=
0
;
int
nr_threads
=
1
;
int
with_verbose_timers
=
0
;
...
...
@@ -172,7 +175,8 @@ int main(int argc, char *argv[]) {
/* Parse the parameters */
int
c
;
while
((
c
=
getopt
(
argc
,
argv
,
"acCdDef:FgGhn:sSt:Tv:y:"
))
!=
-
1
)
switch
(
c
)
{
while
((
c
=
getopt
(
argc
,
argv
,
"acCdDef:FgGhMn:sSt:Tv:y:"
))
!=
-
1
)
switch
(
c
)
{
case
'a'
:
with_aff
=
1
;
break
;
...
...
@@ -210,6 +214,9 @@ int main(int argc, char *argv[]) {
case
'h'
:
if
(
myrank
==
0
)
print_help_message
();
return
0
;
case
'M'
:
with_mpole_reconstruction
=
1
;
break
;
case
'n'
:
if
(
sscanf
(
optarg
,
"%d"
,
&
nsteps
)
!=
1
)
{
if
(
myrank
==
0
)
printf
(
"Error parsing fixed number of steps.
\n
"
);
...
...
@@ -521,6 +528,8 @@ int main(int argc, char *argv[]) {
/* Construct the engine policy */
int
engine_policies
=
ENGINE_POLICY
|
engine_policy_steal
;
if
(
with_drift_all
)
engine_policies
|=
engine_policy_drift_all
;
if
(
with_mpole_reconstruction
)
engine_policies
|=
engine_policy_reconstruct_mpoles
;
if
(
with_hydro
)
engine_policies
|=
engine_policy_hydro
;
if
(
with_self_gravity
)
engine_policies
|=
engine_policy_self_gravity
;
if
(
with_external_gravity
)
engine_policies
|=
engine_policy_external_gravity
;
...
...
@@ -628,7 +637,7 @@ int main(int argc, char *argv[]) {
for
(
int
k
=
0
;
k
<
timer_count
;
k
++
)
printf
(
"%.3f
\t
"
,
clocks_from_ticks
(
timers
[
k
]));
printf
(
"
\n
"
);
timers_reset
(
0xFFFFFFFF
ll
u
);
timers_reset
(
timers_mask_a
ll
);
}
#ifdef SWIFT_DEBUG_TASKS
...
...
src/Makefile.am
View file @
f01a4e0c
...
...
@@ -46,7 +46,7 @@ include_HEADERS = space.h runner.h queue.h task.h lock.h cell.h part.h const.h \
hydro_properties.h riemann.h threadpool.h cooling.h cooling_struct.h sourceterms.h
\
sourceterms_struct.h statistics.h memswap.h cache.h runner_doiact_vec.h profiler.h
\
dump.h logger.h active.h timeline.h xmf.h gravity_properties.h gravity_derivatives.h
\
vector_power.h collectgroup.h hydro_space.h sort_part.h
gravity_softened_derivatives.h
vector_power.h collectgroup.h hydro_space.h sort_part.h
# Common source files
AM_SOURCES
=
space.c runner.c queue.c task.c cell.c engine.c
\
...
...
src/cell.c
View file @
f01a4e0c
...
...
@@ -129,6 +129,7 @@ int cell_unpack(struct pcell *pc, struct cell *c, struct space *s) {
temp
->
depth
=
c
->
depth
+
1
;
temp
->
split
=
0
;
temp
->
dx_max
=
0
.
f
;
temp
->
dx_max_sort
=
0
.
f
;
temp
->
nodeID
=
c
->
nodeID
;
temp
->
parent
=
c
;
c
->
progeny
[
k
]
=
temp
;
...
...
@@ -1103,33 +1104,93 @@ void cell_reset_task_counters(struct cell *c) {
}
/**
* @brief Checks whether the cells are direct neighbours ot not. Both cells have
* to be of the same size
* @brief Recursively construct all the multipoles in a cell hierarchy.
*
* @param ci First #cell.
* @param cj Second #cell.
*
* @todo Deal with periodicity.
* @param c The #cell.
* @param ti_current The current integer time.
*/
int
cell_are_neighbours
(
const
struct
cell
*
restrict
ci
,
const
struct
cell
*
restrict
cj
)
{
void
cell_make_multipoles
(
struct
cell
*
c
,
integertime_t
ti_current
)
{
#ifdef SWIFT_DEBUG_CHECKS
if
(
ci
->
width
[
0
]
!=
cj
->
width
[
0
])
error
(
"Cells of different size !"
);
#endif
/* Reset everything */
gravity_reset
(
c
->
multipole
);
/* Maximum allowed distance */
const
double
min_dist
=
1
.
2
*
ci
->
width
[
0
];
/* 1.2 accounts for rounding errors */
if
(
c
->
split
)
{
/* (Manhattan) Distance between the cells */
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
const
double
center_i
=
ci
->
loc
[
k
];
const
double
center_j
=
cj
->
loc
[
k
];
if
(
fabs
(
center_i
-
center_j
)
>
min_dist
)
return
0
;
/* Compute CoM of all progenies */
double
CoM
[
3
]
=
{
0
.,
0
.,
0
.};
double
mass
=
0
.;
for
(
int
k
=
0
;
k
<
8
;
++
k
)
{
if
(
c
->
progeny
[
k
]
!=
NULL
)
{
const
struct
gravity_tensors
*
m
=
c
->
progeny
[
k
]
->
multipole
;
CoM
[
0
]
+=
m
->
CoM
[
0
]
*
m
->
m_pole
.
M_000
;
CoM
[
1
]
+=
m
->
CoM
[
1
]
*
m
->
m_pole
.
M_000
;
CoM
[
2
]
+=
m
->
CoM
[
2
]
*
m
->
m_pole
.
M_000
;
mass
+=
m
->
m_pole
.
M_000
;
}
}
c
->
multipole
->
CoM
[
0
]
=
CoM
[
0
]
/
mass
;
c
->
multipole
->
CoM
[
1
]
=
CoM
[
1
]
/
mass
;
c
->
multipole
->
CoM
[
2
]
=
CoM
[
2
]
/
mass
;
/* Now shift progeny multipoles and add them up */
struct
multipole
temp
;
double
r_max
=
0
.;
for
(
int
k
=
0
;
k
<
8
;
++
k
)
{
if
(
c
->
progeny
[
k
]
!=
NULL
)
{
const
struct
cell
*
cp
=
c
->
progeny
[
k
];
const
struct
multipole
*
m
=
&
cp
->
multipole
->
m_pole
;
/* Contribution to multipole */
gravity_M2M
(
&
temp
,
m
,
c
->
multipole
->
CoM
,
cp
->
multipole
->
CoM
);
gravity_multipole_add
(
&
c
->
multipole
->
m_pole
,
&
temp
);
/* Upper limit of max CoM<->gpart distance */
const
double
dx
=
c
->
multipole
->
CoM
[
0
]
-
cp
->
multipole
->
CoM
[
0
];
const
double
dy
=
c
->
multipole
->
CoM
[
1
]
-
cp
->
multipole
->
CoM
[
1
];
const
double
dz
=
c
->
multipole
->
CoM
[
2
]
-
cp
->
multipole
->
CoM
[
2
];
const
double
r2
=
dx
*
dx
+
dy
*
dy
+
dz
*
dz
;
r_max
=
max
(
r_max
,
cp
->
multipole
->
r_max
+
sqrt
(
r2
));
}
}
/* Alternative upper limit of max CoM<->gpart distance */
const
double
dx
=
c
->
multipole
->
CoM
[
0
]
>
c
->
loc
[
0
]
+
c
->
width
[
0
]
/
2
.
?
c
->
multipole
->
CoM
[
0
]
-
c
->
loc
[
0
]
:
c
->
loc
[
0
]
+
c
->
width
[
0
]
-
c
->
multipole
->
CoM
[
0
];
const
double
dy
=
c
->
multipole
->
CoM
[
1
]
>
c
->
loc
[
1
]
+
c
->
width
[
1
]
/
2
.
?
c
->
multipole
->
CoM
[
1
]
-
c
->
loc
[
1
]
:
c
->
loc
[
1
]
+
c
->
width
[
1
]
-
c
->
multipole
->
CoM
[
1
];
const
double
dz
=
c
->
multipole
->
CoM
[
2
]
>
c
->
loc
[
2
]
+
c
->
width
[
2
]
/
2
.
?
c
->
multipole
->
CoM
[
2
]
-
c
->
loc
[
2
]
:
c
->
loc
[
2
]
+
c
->
width
[
2
]
-
c
->
multipole
->
CoM
[
2
];
/* Take minimum of both limits */
c
->
multipole
->
r_max
=
min
(
r_max
,
sqrt
(
dx
*
dx
+
dy
*
dy
+
dz
*
dz
));
}
else
{
if
(
c
->
gcount
>
0
)
{
gravity_P2M
(
c
->
multipole
,
c
->
gparts
,
c
->
gcount
);
const
double
dx
=
c
->
multipole
->
CoM
[
0
]
>
c
->
loc
[
0
]
+
c
->
width
[
0
]
/
2
.
?
c
->
multipole
->
CoM
[
0
]
-
c
->
loc
[
0
]
:
c
->
loc
[
0
]
+
c
->
width
[
0
]
-
c
->
multipole
->
CoM
[
0
];
const
double
dy
=
c
->
multipole
->
CoM
[
1
]
>
c
->
loc
[
1
]
+
c
->
width
[
1
]
/
2
.
?
c
->
multipole
->
CoM
[
1
]
-
c
->
loc
[
1
]
:
c
->
loc
[
1
]
+
c
->
width
[
1
]
-
c
->
multipole
->
CoM
[
1
];
const
double
dz
=
c
->
multipole
->
CoM
[
2
]
>
c
->
loc
[
2
]
+
c
->
width
[
2
]
/
2
.
?
c
->
multipole
->
CoM
[
2
]
-
c
->
loc
[
2
]
:
c
->
loc
[
2
]
+
c
->
width
[
2
]
-
c
->
multipole
->
CoM
[
2
];
c
->
multipole
->
r_max
=
sqrt
(
dx
*
dx
+
dy
*
dy
+
dz
*
dz
);
}
else
{
gravity_multipole_init
(
&
c
->
multipole
->
m_pole
);
c
->
multipole
->
CoM
[
0
]
=
c
->
loc
[
0
]
+
c
->
width
[
0
]
/
2
.;
c
->
multipole
->
CoM
[
1
]
=
c
->
loc
[
1
]
+
c
->
width
[
1
]
/
2
.;
c
->
multipole
->
CoM
[
2
]
=
c
->
loc
[
2
]
+
c
->
width
[
2
]
/
2
.;
c
->
multipole
->
r_max
=
0
.;
}
}
return
1
;
c
->
ti_old_multipole
=
ti_current
;
}
/**
...
...
@@ -1145,6 +1206,8 @@ void cell_check_multipole(struct cell *c, void *data) {
struct
gravity_tensors
ma
;
const
double
tolerance
=
1e-3
;
/* Relative */
return
;
/* First recurse */
if
(
c
->
split
)
for
(
int
k
=
0
;
k
<
8
;
k
++
)
...
...
@@ -1244,28 +1307,45 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
/* Un-skip the density tasks involved with this cell. */
for
(
struct
link
*
l
=
c
->
density
;
l
!=
NULL
;
l
=
l
->
next
)
{
struct
task
*
t
=
l
->
t
;
const
struct
cell
*
ci
=
t
->
ci
;
const
struct
cell
*
cj
=
t
->
cj
;
struct
cell
*
ci
=
t
->
ci
;
struct
cell
*
cj
=
t
->
cj
;
scheduler_activate
(
s
,
t
);
/* Set the correct sorting flags */
if
(
t
->
type
==
task_type_pair
)
{
if
(
ci
->
dx_max_sort
>
space_maxreldx
*
ci
->
dmin
)
{
for
(
struct
cell
*
finger
=
ci
;
finger
!=
NULL
;
finger
=
finger
->
parent
)
finger
->
sorted
=
0
;
}
if
(
cj
->
dx_max_sort
>
space_maxreldx
*
cj
->
dmin
)
{
for
(
struct
cell
*
finger
=
cj
;
finger
!=
NULL
;
finger
=
finger
->
parent
)
finger
->
sorted
=
0
;
}
if
(
!
(
ci
->
sorted
&
(
1
<<
t
->
flags
)))
{
atomic_or
(
&
ci
->
sorts
->
flags
,
(
1
<<
t
->
flags
));
#ifdef SWIFT_DEBUG_CHECKS
if
(
!
(
ci
->
sorts
->
flags
&
(
1
<<
t
->
flags
)))
error
(
"bad flags in sort task."
);
#endif
scheduler_activate
(
s
,
ci
->
sorts
);
if
(
ci
->
nodeID
==
engine_rank
)
scheduler_activate
(
s
,
ci
->
drift
);
}
if
(
!
(
cj
->
sorted
&
(
1
<<
t
->
flags
)))
{
atomic_or
(
&
cj
->
sorts
->
flags
,
(
1
<<
t
->
flags
));
#ifdef SWIFT_DEBUG_CHECKS
if
(
!
(
cj
->
sorts
->
flags
&
(
1
<<
t
->
flags
)))
error
(
"bad flags in sort task."
);
#endif
scheduler_activate
(
s
,
cj
->
sorts
);
if
(
cj
->
nodeID
==
engine_rank
)
scheduler_activate
(
s
,
cj
->
drift
);
}
}
/*
Check whether there was too much particle motion
*/
/*
Only interested in pair interactions as of here.
*/
if
(
t
->
type
==
task_type_pair
||
t
->
type
==
task_type_sub_pair
)
{
/* Check whether there was too much particle motion, i.e. the
cell neighbour conditions were violated. */
if
(
t
->
tight
&&
(
max
(
ci
->
h_max
,
cj
->
h_max
)
+
ci
->
dx_max
+
cj
->
dx_max
>
cj
->
dmin
||
ci
->
dx_max
>
space_maxreldx
*
ci
->
h_max
||
cj
->
dx_max
>
space_maxreldx
*
cj
->
h_max
))
max
(
ci
->
h_max
,
cj
->
h_max
)
+
ci
->
dx_max
+
cj
->
dx_max
>
cj
->
dmin
)
rebuild
=
1
;
#ifdef WITH_MPI
...
...
@@ -1287,10 +1367,12 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
if
(
l
==
NULL
)
error
(
"Missing link to send_xv task."
);
scheduler_activate
(
s
,
l
->
t
);
if
(
cj
->
super
->
drift
)
scheduler_activate
(
s
,
cj
->
super
->
drift
);
/* Drift both cells, the foreign one at the level which it is sent. */
if
(
l
->
t
->
ci
->
drift
)
scheduler_activate
(
s
,
l
->
t
->
ci
->
drift
);
else
error
(
"Drift task missing !"
);
if
(
t
->
type
==
task_type_pair
)
scheduler_activate
(
s
,
cj
->
drift
);
if
(
cell_is_active
(
cj
,
e
))
{
for
(
l
=
cj
->
send_rho
;
l
!=
NULL
&&
l
->
t
->
cj
->
nodeID
!=
ci
->
nodeID
;
...
...
@@ -1323,10 +1405,12 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
if
(
l
==
NULL
)
error
(
"Missing link to send_xv task."
);
scheduler_activate
(
s
,
l
->
t
);
if
(
ci
->
super
->
drift
)
scheduler_activate
(
s
,
ci
->
super
->
drift
);
/* Drift both cells, the foreign one at the level which it is sent. */
if
(
l
->
t
->
ci
->
drift
)
scheduler_activate
(
s
,
l
->
t
->
ci
->
drift
);
else
error
(
"Drift task missing !"
);
if
(
t
->
type
==
task_type_pair
)
scheduler_activate
(
s
,
ci
->
drift
);
if
(
cell_is_active
(
ci
,
e
))
{
for
(
l
=
ci
->
send_rho
;
l
!=
NULL
&&
l
->
t
->
cj
->
nodeID
!=
cj
->
nodeID
;
...
...
@@ -1341,6 +1425,14 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
if
(
l
==
NULL
)
error
(
"Missing link to send_ti task."
);
scheduler_activate
(
s
,
l
->
t
);
}
}
else
if
(
t
->
type
==
task_type_pair
)
{
scheduler_activate
(
s
,
ci
->
drift
);
scheduler_activate
(
s
,
cj
->
drift
);
}
#else
if
(
t
->
type
==
task_type_pair
)
{
scheduler_activate
(
s
,
ci
->
drift
);
scheduler_activate
(
s
,
cj
->
drift
);
}
#endif
}
...
...
@@ -1355,7 +1447,6 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) {
scheduler_activate
(
s
,
l
->
t
);
if
(
c
->
extra_ghost
!=
NULL
)
scheduler_activate
(
s
,
c
->
extra_ghost
);
if
(
c
->
ghost
!=
NULL
)
scheduler_activate
(
s
,
c
->
ghost
);
if
(
c
->
init
!=
NULL
)
scheduler_activate
(
s
,
c
->
init
);
if
(
c
->
init_grav
!=
NULL
)
scheduler_activate
(
s
,
c
->
init_grav
);
if
(
c
->
drift
!=
NULL
)
scheduler_activate
(
s
,
c
->
drift
);
if
(
c
->
kick1
!=
NULL
)
scheduler_activate
(
s
,
c
->
kick1
);
...
...
@@ -1409,7 +1500,9 @@ void cell_drift_particles(struct cell *c, const struct engine *e) {
/* Drift from the last time the cell was drifted to the current time */
const
double
dt
=
(
ti_current
-
ti_old
)
*
timeBase
;
float
dx_max
=
0
.
f
,
dx2_max
=
0
.
f
,
cell_h_max
=
0
.
f
;
float
dx_max
=
0
.
f
,
dx2_max
=
0
.
f
;
float
dx_max_sort
=
0
.
0
f
,
dx2_max_sort
=
0
.
f
;
float
cell_h_max
=
0
.
f
;
/* Check that we are actually going to move forward. */
if
(
ti_current
<
ti_old
)
error
(
"Attempt to drift to the past"
);
...
...
@@ -1421,8 +1514,13 @@ void cell_drift_particles(struct cell *c, const struct engine *e) {
for
(
int
k
=
0
;
k
<
8
;
k
++
)
if
(
c
->
progeny
[
k
]
!=
NULL
)
{
struct
cell
*
cp
=
c
->
progeny
[
k
];
/* Collect */
cell_drift_particles
(
cp
,
e
);
/* Update */
dx_max
=
max
(
dx_max
,
cp
->
dx_max
);
dx_max_sort
=
max
(
dx_max_sort
,
cp
->
dx_max_sort
);
cell_h_max
=
max
(
cell_h_max
,
cp
->
h_max
);
}
...
...
@@ -1443,6 +1541,11 @@ void cell_drift_particles(struct cell *c, const struct engine *e) {
gp
->
x_diff
[
1
]
*
gp
->
x_diff
[
1
]
+
gp
->
x_diff
[
2
]
*
gp
->
x_diff
[
2
];
dx2_max
=
max
(
dx2_max
,
dx2
);
/* Init gravity force fields. */
if
(
gpart_is_active
(
gp
,
e
))
{
gravity_init_gpart
(
gp
);
}
}
/* Loop over all the gas particles in the cell */
...
...
@@ -1464,9 +1567,18 @@ void cell_drift_particles(struct cell *c, const struct engine *e) {
xp
->
x_diff
[
1
]
*
xp
->
x_diff
[
1
]
+
xp
->
x_diff
[
2
]
*
xp
->
x_diff
[
2
];
dx2_max
=
max
(
dx2_max
,
dx2
);
const
float
dx2_sort
=
xp
->
x_diff_sort
[
0
]
*
xp
->
x_diff_sort
[
0
]
+
xp
->
x_diff_sort
[
1
]
*
xp
->
x_diff_sort
[
1
]
+
xp
->
x_diff_sort
[
2
]
*
xp
->
x_diff_sort
[
2
];
dx2_max_sort
=
max
(
dx2_max_sort
,
dx2_sort
);
/* Maximal smoothing length */
cell_h_max
=
max
(
cell_h_max
,
p
->
h
);
/* Get ready for a density calculation */
if
(
part_is_active
(
p
,
e
))
{
hydro_init_part
(
p
,
&
e
->
s
->
hs
);
}
}
/* Loop over all the star particles in the cell */
...
...
@@ -1484,16 +1596,19 @@ void cell_drift_particles(struct cell *c, const struct engine *e) {
/* Now, get the maximal particle motion from its square */
dx_max
=
sqrtf
(
dx2_max
);
dx_max_sort
=
sqrtf
(
dx2_max_sort
);
}
else
{
cell_h_max
=
c
->
h_max
;
dx_max
=
c
->
dx_max
;
dx_max_sort
=
c
->
dx_max_sort
;
}
/* Store the values */
c
->
h_max
=
cell_h_max
;
c
->
dx_max
=
dx_max
;
c
->
dx_max_sort
=
dx_max_sort
;
/* Update the time of the last drift */
c
->
ti_old
=
ti_current
;
...
...
src/cell.h
View file @
f01a4e0c
...
...
@@ -148,9 +148,6 @@ struct cell {
/*! Linked list of the tasks computing this cell's gravity forces. */
struct
link
*
grav
;
/*! The particle initialistation task */
struct
task
*
init
;
/*! The multipole initialistation task */
struct
task
*
init_grav
;
...
...
@@ -239,6 +236,9 @@ struct cell {
/*! Last (integer) time the cell's particle was drifted forward in time. */
integertime_t
ti_old
;
/*! Last (integer) time the cell's sort arrays were updated. */
integertime_t
ti_sort
;
/*! Last (integer) time the cell's multipole was drifted forward in time. */
integertime_t
ti_old_multipole
;
...
...
@@ -248,6 +248,9 @@ struct cell {
/*! Maximum particle movement in this cell since last construction. */
float
dx_max
;
/*! Maximum particle movement in this cell since the last sort. */
float
dx_max_sort
;
/*! Nr of #part in this cell. */
int
count
;
...
...
@@ -351,8 +354,7 @@ int cell_link_gparts(struct cell *c, struct gpart *gparts);
int
cell_link_sparts
(
struct
cell
*
c
,
struct
spart
*
sparts
);
void
cell_convert_hydro
(
struct
cell
*
c
,
void
*
data
);
void
cell_clean_links
(
struct
cell
*
c
,
void
*
data
);
int
cell_are_neighbours
(
const
struct
cell
*
restrict
ci
,
const
struct
cell
*
restrict
cj
);
void
cell_make_multipoles
(
struct
cell
*
c
,
integertime_t
ti_current
);
void
cell_check_multipole
(
struct
cell
*
c
,
void
*
data
);
void
cell_clean
(
struct
cell
*
c
);
void
cell_check_particle_drift_point
(
struct
cell
*
c
,
void
*
data
);
...
...
src/drift.h
View file @
f01a4e0c
...
...
@@ -101,10 +101,12 @@ __attribute__((always_inline)) INLINE static void drift_part(
/* Predict the values of the extra fields */
hydro_predict_extra
(
p
,
xp
,
dt
);
/* Compute offset since last cell construction */
xp
->
x_diff
[
0
]
-=
xp
->
v_full
[
0
]
*
dt
;
xp
->
x_diff
[
1
]
-=
xp
->
v_full
[
1
]
*
dt
;
xp
->
x_diff
[
2
]
-=
xp
->
v_full
[
2
]
*
dt
;
/* Compute offsets since last cell construction */
for
(
int
k
=
0
;
k
<
3
;
k
++
)
{
const
float
dx
=
xp
->
v_full
[
k
]
*
dt
;
xp
->
x_diff
[
k
]
-=
dx
;
xp
->
x_diff_sort
[
k
]
-=
dx
;
}
}
/**
...
...
src/engine.c
View file @
f01a4e0c
...
...
@@ -144,10 +144,6 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c) {
/* Local tasks only... */
if
(
c
->
nodeID
==
e
->
nodeID
)
{
/* Add the init task. */
c
->
init
=
scheduler_addtask
(
s
,
task_type_init
,
task_subtype_none
,
0
,
0
,
c
,
NULL
,
0
);
/* Add the two half kicks */
c
->
kick1
=
scheduler_addtask
(
s
,
task_type_kick1
,
task_subtype_none
,
0
,
0
,
c
,
NULL
,
0
);
...
...
@@ -162,12 +158,6 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c) {
scheduler_addunlock
(
s
,
c
->
kick2
,
c
->
timestep
);
scheduler_addunlock
(
s
,
c
->
timestep
,
c
->
kick1
);
/* Add the drift task and its dependencies. */
c
->
drift
=
scheduler_addtask
(
s
,
task_type_drift
,
task_subtype_none
,
0
,
0
,
c
,
NULL
,
0
);
scheduler_addunlock
(
s
,
c
->
drift
,
c
->
init
);
if
(
is_self_gravity
)
{
/* Initialisation of the multipoles */
...
...
@@ -1020,10 +1010,6 @@ void engine_addtasks_send(struct engine *e, struct cell *ci, struct cell *cj,
/* Create the tasks and their dependencies? */
if
(
t_xv
==
NULL
)
{
if
(
ci
->
super
->
drift
==
NULL
)
ci
->
super
->
drift
=
scheduler_addtask
(
s
,
task_type_drift
,
task_subtype_none
,
0
,
0
,
ci
->
super
,
NULL
,
0
);
t_xv
=
scheduler_addtask
(
s
,
task_type_send
,
task_subtype_xv
,
4
*
ci
->
tag
,
0
,
ci
,
cj
,
0
);
t_rho
=
scheduler_addtask
(
s
,
task_type_send
,
task_subtype_rho
,
...
...
@@ -1063,7 +1049,10 @@ void engine_addtasks_send(struct engine *e, struct cell *ci, struct cell *cj,
#endif
/* Drift before you send */
scheduler_addunlock
(
s
,
ci
->
super
->
drift
,
t_xv
);
if
(
ci
->
drift
==
NULL
)
ci
->
drift
=
scheduler_addtask
(
s
,
task_type_drift
,
task_subtype_none
,
0
,
0
,
ci
,
NULL
,
0
);
scheduler_addunlock
(
s
,
ci
->
drift
,
t_xv
);
/* The super-cell's timestep task should unlock the send_ti task. */
scheduler_addunlock
(
s
,
ci
->
super
->
timestep
,
t_ti
);
...
...
@@ -1693,7 +1682,7 @@ void engine_make_self_gravity_tasks(struct engine *e) {
/* Are the cells to close for a MM interaction ? */
if
(
!
gravity_multipole_accept
(
ci
->
multipole
,
cj
->
multipole
,
theta_crit_inv
))
theta_crit_inv
,
1
))
scheduler_addtask
(
sched
,
task_type_pair
,
task_subtype_grav
,
0
,
0
,
ci
,
cj
,
1
);
}
...
...
@@ -1816,15 +1805,22 @@ void engine_count_and_link_tasks(struct engine *e) {
struct
cell
*
const
ci
=
t
->
ci
;
struct
cell
*
const
cj
=
t
->
cj
;
/* Link sort tasks together. */
if
(
t
->
type
==
task_type_sort
&&
ci
->
split
)
for
(
int
j
=
0
;
j
<
8
;
j
++
)
if
(
ci
->
progeny
[
j
]
!=
NULL
&&
ci
->
progeny
[
j
]
->
sorts
!=
NULL
)
{
scheduler_addunlock
(
sched
,
ci
->
progeny
[
j
]
->
sorts
,
t
);
}
/* Link sort tasks to the next-higher sort task. */
if
(
t
->
type
==
task_type_sort
)
{
struct
cell
*
finger
=
t
->
ci
->
parent
;
while
(
finger
!=
NULL
&&
finger
->
sorts
==
NULL
)
finger
=
finger
->
parent
;
if
(
finger
!=
NULL
)
scheduler_addunlock
(
sched
,
t
,
finger
->
sorts
);
}
/* Link drift tasks to the next-higher drift task. */
else
if
(
t
->
type
==
task_type_drift
)
{
struct
cell
*
finger
=
ci
->
parent
;
while
(
finger
!=
NULL
&&
finger
->
drift
==
NULL
)
finger
=
finger
->
parent
;
if
(
finger
!=
NULL
)
scheduler_addunlock
(
sched
,
t
,
finger
->
drift
);
}
/* Link self tasks to cells. */
if
(
t
->
type
==
task_type_self
)
{
else
if
(
t
->
type
==
task_type_self
)
{
atomic_inc
(
&
ci
->
nr_tasks
);
if
(
t
->
subtype
==
task_subtype_density
)
{
engine_addlink
(
e
,
&
ci
->
density
,
t
);
...
...
@@ -1895,7 +1891,6 @@ static inline void engine_make_self_gravity_dependencies(
struct
scheduler
*
sched
,
struct
task
*
gravity
,
struct
cell
*
c
)
{
/* init --> gravity --> grav_down --> kick */
scheduler_addunlock
(
sched
,
c
->
super
->
init
,
gravity
);
scheduler_addunlock
(
sched
,
c
->
super
->
init_grav
,
gravity
);
scheduler_addunlock
(
sched
,
gravity
,
c
->
super
->
grav_down
);
}
...
...
@@ -1912,7 +1907,7 @@ static inline void engine_make_external_gravity_dependencies(
struct
scheduler
*
sched
,
struct
task
*
gravity
,
struct
cell
*
c
)
{
/* init --> external gravity --> kick */
scheduler_addunlock
(
sched
,
c
->
super
->
ini
t
,
gravity
);
scheduler_addunlock
(
sched
,
c
->
drif
t
,
gravity
);
scheduler_addunlock
(
sched
,
gravity
,
c
->
super
->
kick2
);
}
...
...
@@ -2008,9 +2003,8 @@ static inline void engine_make_hydro_loops_dependencies(
struct
scheduler
*
sched
,
struct
task
*
density
,
struct
task
*
gradient
,
struct
task
*
force
,
struct
cell
*
c
,
int
with_cooling
)
{
/*
init -->
density loop --> ghost --> gradient loop --> extra_ghost */
/* density loop --> ghost --> gradient loop --> extra_ghost */
/* extra_ghost --> force loop */
scheduler_addunlock
(
sched
,
c
->
super
->
init
,
density
);
scheduler_addunlock
(
sched
,
density
,
c
->
super
->
ghost
);
scheduler_addunlock
(
sched
,
c
->
super
->
ghost
,
gradient
);
scheduler_addunlock
(
sched
,
gradient
,
c
->
super
->
extra_ghost
);
...
...
@@ -2041,8 +2035,7 @@ static inline void engine_make_hydro_loops_dependencies(struct scheduler *sched,
struct
task
*
force
,
struct
cell
*
c
,
int
with_cooling
)
{
/* init --> density loop --> ghost --> force loop */
scheduler_addunlock
(
sched
,
c
->
super
->
init
,
density
);
/* density loop --> ghost --> force loop */
scheduler_addunlock
(
sched
,
density
,
c
->
super
->
ghost
);
scheduler_addunlock
(
sched
,
c
->
super
->
ghost
,
force
);
...
...
@@ -2078,8 +2071,16 @@ void engine_make_extra_hydroloop_tasks(struct engine *e) {