Skip to content
GitLab
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
4338bd27
Commit
4338bd27
authored
Dec 07, 2015
by
Matthieu Schaller
Browse files
Formatting....
parent
838eb3d6
Changes
6
Hide whitespace changes
Inline
Side-by-side
examples/main.c
View file @
4338bd27
...
...
@@ -396,7 +396,7 @@ int main(int argc, char *argv[]) {
/* Take a step. */
engine_step
(
&
e
);
if
(
j
==
1
)
break
;
if
(
j
==
2
)
break
;
if
(
with_outputs
&&
j
%
100
==
0
)
{
...
...
@@ -505,7 +505,7 @@ int main(int argc, char *argv[]) {
#endif
/* Say goodbye. */
if
(
myrank
==
0
)
message
(
"done."
);
if
(
myrank
==
0
)
message
(
"done.
Bye.
"
);
/* All is calm, all is bright. */
return
0
;
...
...
src/const.h
View file @
4338bd27
...
...
@@ -48,7 +48,7 @@
#define const_eta_kernel \
1.2349f
/* Corresponds to 48 ngbs with the cubic spline kernel */
#define const_delta_nwneigh 1.f
#define const_smoothing_max_iter 3
#define const_smoothing_max_iter 3
0
#define CUBIC_SPLINE_KERNEL
/* Gravity stuff. */
...
...
src/runner.c
View file @
4338bd27
...
...
@@ -51,13 +51,12 @@
#endif
#include
"runner_iact_grav.h"
#define PRINT_PART if(p->id==1000) { \
message("p->id=%lld p->h=%f p->N_ngb=%f p->rho=%f p->t_beg=%f p->t_end=%f",\
p->id, p->h, p->density.wcount, p->rho, p->t_begin, p->t_end); \
}
#define PRINT_PART \
if (p->id == 1000) { \
message( \
"p->id=%lld p->h=%f p->N_ngb=%f p->rho=%f p->t_beg=%f p->t_end=%f", \
p->id, p->h, p->density.wcount, p->rho, p->t_begin, p->t_end); \
}
/* Convert cell location to ID. */
#define cell_getid(cdim, i, j, k) \
...
...
@@ -197,8 +196,8 @@ void runner_dosort(struct runner *r, struct cell *c, int flags, int clock) {
TIMER_TIC
// message("sort!");
// message("sort!");
/* Clean-up the flags, i.e. filter out what's already been sorted. */
flags
&=
~
c
->
sorted
;
if
(
flags
==
0
)
return
;
...
...
@@ -540,7 +539,6 @@ void runner_doinit(struct runner *r, struct cell *c) {
}
PRINT_PART
;
}
}
...
...
@@ -567,7 +565,7 @@ void runner_doghost(struct runner *r, struct cell *c) {
TIMER_TIC
;
//message("start");
//
message("start");
/* Recurse? */
if
(
c
->
split
)
{
...
...
@@ -582,7 +580,8 @@ void runner_doghost(struct runner *r, struct cell *c) {
for
(
k
=
0
;
k
<
count
;
k
++
)
pid
[
k
]
=
k
;
/* While there are particles that need to be updated... */
for
(
num_reruns
=
0
;
count
>
0
&&
num_reruns
<
const_smoothing_max_iter
;
num_reruns
++
)
{
for
(
num_reruns
=
0
;
count
>
0
&&
num_reruns
<
const_smoothing_max_iter
;
num_reruns
++
)
{
// message("count=%d redo=%d", count, redo);
...
...
@@ -613,11 +612,10 @@ void runner_doghost(struct runner *r, struct cell *c) {
wcount_dh
=
p
->
density
.
wcount_dh
*
ih
*
(
4
.
0
f
/
3
.
0
*
M_PI
*
kernel_gamma3
);
PRINT_PART
;
//if(p->id==1000)
// message("wcount_dh=%f", wcount_dh);
PRINT_PART
;
// if(p->id==1000)
// message("wcount_dh=%f", wcount_dh);
/* If no derivative, double the smoothing length. */
if
(
wcount_dh
==
0
.
0
f
)
h_corr
=
p
->
h
;
...
...
@@ -637,8 +635,8 @@ void runner_doghost(struct runner *r, struct cell *c) {
/* Ok, correct then */
p
->
h
+=
h_corr
;
//message("Not converged: wcount=%f", p->density.wcount);
//
message("Not converged: wcount=%f", p->density.wcount);
/* And flag for another round of fun */
pid
[
redo
]
=
pid
[
i
];
redo
+=
1
;
...
...
@@ -651,7 +649,7 @@ void runner_doghost(struct runner *r, struct cell *c) {
continue
;
}
/* We now have a particle whose smoothing length has converged */
/* We now have a particle whose smoothing length has converged */
/* Pre-compute some stuff for the balsara switch. */
normDiv_v
=
fabs
(
p
->
density
.
div_v
/
rho
*
ih4
);
...
...
@@ -708,16 +706,16 @@ void runner_doghost(struct runner *r, struct cell *c) {
count
=
redo
;
if
(
count
>
0
)
{
message
(
"count=%d"
,
count
);
fflush
(
stdout
);
//
message("count=%d", count);fflush(stdout);
/* Climb up the cell hierarchy. */
for
(
finger
=
c
;
finger
!=
NULL
;
finger
=
finger
->
parent
)
{
/* Run through this cell's density interactions. */
for
(
struct
link
*
l
=
finger
->
link_density
;
l
!=
NULL
;
l
=
l
->
next
)
{
//message("link: %p next: %p", l, l->next); fflush(stdout);
//
message("link: %p next: %p", l, l->next); fflush(stdout);
/* Self-interaction? */
if
(
l
->
t
->
type
==
task_type_self
)
runner_doself_subset_density
(
r
,
finger
,
parts
,
pid
,
count
);
...
...
@@ -725,8 +723,8 @@ void runner_doghost(struct runner *r, struct cell *c) {
/* Otherwise, pair interaction? */
else
if
(
l
->
t
->
type
==
task_type_pair
)
{
//message("pair");
//
message("pair");
/* Left or right? */
if
(
l
->
t
->
ci
==
finger
)
runner_dopair_subset_density
(
r
,
finger
,
parts
,
pid
,
count
,
...
...
@@ -740,8 +738,8 @@ void runner_doghost(struct runner *r, struct cell *c) {
/* Otherwise, sub interaction? */
else
if
(
l
->
t
->
type
==
task_type_sub
)
{
//message("sub");
//
message("sub");
/* Left or right? */
if
(
l
->
t
->
ci
==
finger
)
runner_dosub_subset_density
(
r
,
finger
,
parts
,
pid
,
count
,
...
...
@@ -751,16 +749,14 @@ void runner_doghost(struct runner *r, struct cell *c) {
l
->
t
->
ci
,
-
1
,
1
);
}
}
error
(
"done"
);
//
error("done");
}
}
}
if
(
count
)
message
(
"Smoothing length failed to converge on %i particles."
,
count
);
if
(
count
)
message
(
"Smoothing length failed to converge on %i particles."
,
count
);
#ifdef TIMER_VERBOSE
message
(
"runner %02i: %i parts at depth %i took %.3f ms."
,
r
->
id
,
c
->
count
,
c
->
depth
,
((
double
)
TIMER_TOC
(
timer_doghost
))
/
CPU_TPS
*
1000
);
...
...
@@ -801,7 +797,7 @@ void runner_dodrift(struct runner *r, struct cell *c, int timer) {
ih
=
1
.
0
f
/
h
;
PRINT_PART
;
/* Drift... */
p
->
x
[
0
]
+=
xp
->
v_full
[
0
]
*
dt
;
p
->
x
[
1
]
+=
xp
->
v_full
[
1
]
*
dt
;
...
...
@@ -825,12 +821,12 @@ void runner_dodrift(struct runner *r, struct cell *c, int timer) {
u
=
p
->
u
*=
expf
(
w
);
/* Predict smoothing length */
//w = p->force.h_dt * ih * dt;
//if (fabsf(w) < 0.01f)
//
w = p->force.h_dt * ih * dt;
//
if (fabsf(w) < 0.01f)
// h = p->h *=
// 1.0f +
// w * (1.0f + w * (0.5f + w * (1.0f / 6.0f + 1.0f / 24.0f * w)));
//else
//
else
// h = p->h *= expf(w);
/* Predict density */
...
...
@@ -940,8 +936,8 @@ void runner_dokick(struct runner *r, struct cell *c, int timer) {
p
->
t_begin
=
p
->
t_end
;
p
->
t_end
=
p
->
t_begin
+
dt
;
PRINT_PART
PRINT_PART
/* Kick particles in momentum space */
xp
->
v_full
[
0
]
+=
p
->
a
[
0
]
*
dt
;
xp
->
v_full
[
1
]
+=
p
->
a
[
1
]
*
dt
;
...
...
@@ -1068,8 +1064,9 @@ void *runner_main(void *data) {
struct
part
*
parts
;
int
k
,
nr_parts
;
message
(
"here"
);
fflush
(
stdout
);
message
(
"here"
);
fflush
(
stdout
);
/* Main loop. */
while
(
1
)
{
...
...
@@ -1090,8 +1087,8 @@ void *runner_main(void *data) {
t
=
scheduler_gettask
(
sched
,
r
->
qid
,
super
);
TIMER_TOC
(
timer_gettask
);
//message("Got task %p", t->type); fflush(stdout);
//
message("Got task %p", t->type); fflush(stdout);
/* Did I get anything? */
if
(
t
==
NULL
)
break
;
}
...
...
@@ -1112,7 +1109,7 @@ void *runner_main(void *data) {
/* Different types of tasks... */
switch
(
t
->
type
)
{
case
task_type_self
:
//message("self");
//
message("self");
if
(
t
->
subtype
==
task_subtype_density
)
runner_doself1_density
(
r
,
ci
);
else
if
(
t
->
subtype
==
task_subtype_force
)
...
...
src/scheduler.c
View file @
4338bd27
...
...
@@ -496,8 +496,8 @@ void scheduler_splittasks(struct scheduler *s) {
/* Otherwise, if not spilt, stitch-up the sorting. */
else
{
//message("called");
//
message("called");
/* Create the sort for ci. */
// lock_lock( &ci->lock );
if
(
ci
->
sorts
==
NULL
)
...
...
@@ -672,7 +672,7 @@ struct task *scheduler_addtask(struct scheduler *s, int type, int subtype,
/* Get the next free task. */
ind
=
atomic_inc
(
&
s
->
tasks_next
);
/* Overflow? */
if
(
ind
>=
s
->
size
)
error
(
"Task list overflow."
);
...
...
@@ -680,7 +680,7 @@ struct task *scheduler_addtask(struct scheduler *s, int type, int subtype,
t
=
&
s
->
tasks
[
ind
];
if
(
t
->
type
==
task_type_sort
)
message
(
"sort!"
);
/* Copy the data. */
t
->
type
=
type
;
t
->
subtype
=
subtype
;
...
...
@@ -908,14 +908,14 @@ void scheduler_start(struct scheduler *s, unsigned int mask) {
struct
task
*
t
,
*
tasks
=
s
->
tasks
;
// ticks tic;
//message("begin");
//fflush(stdout);
//
message("begin");
//
fflush(stdout);
/* Store the mask */
s
->
mask
=
mask
;
FILE
*
file
=
fopen
(
"tasks.dat"
,
"w"
);
FILE
*
file
=
fopen
(
"tasks.dat"
,
"w"
);
/* Run through the tasks and set their waits. */
// tic = getticks();
for
(
k
=
nr_tasks
-
1
;
k
>=
0
;
k
--
)
{
...
...
@@ -927,29 +927,32 @@ void scheduler_start(struct scheduler *s, unsigned int mask) {
atomic_inc
(
&
t
->
unlock_tasks
[
j
]
->
wait
);
/* if(t->unlock_tasks[j] == &tasks[9563] ) { */
/* message("task %d %s %s unlocking task %d %s %s\n", */
/* k, taskID_names[t->type], subtaskID_names[t->subtype], */
/* 9563, taskID_names[t->unlock_tasks[j]->type], subtaskID_names[t->unlock_tasks[j]->type]); */
/* k, taskID_names[t->type], subtaskID_names[t->subtype],
*/
/* 9563, taskID_names[t->unlock_tasks[j]->type],
* subtaskID_names[t->unlock_tasks[j]->type]); */
/* } */
}
}
for
(
k
=
nr_tasks
-
1
;
k
>=
0
;
k
--
)
{
t
=
&
tasks
[
tid
[
k
]];
//if (t->type == task_type_sort)
// message("%d %s %s %d %d %d\n", k, taskID_names[t->type], subtaskID_names[t->subtype], t->nr_unlock_tasks, t->wait, t->skip);
if
(
!
((
1
<<
t
->
type
)
&
s
->
mask
)
||
t
->
skip
)
continue
;
fprintf
(
file
,
"%d %s %s %d %d
\n
"
,
k
,
taskID_names
[
t
->
type
],
subtaskID_names
[
t
->
subtype
],
t
->
nr_unlock_tasks
,
t
->
wait
);
}
for
(
k
=
nr_tasks
-
1
;
k
>=
0
;
k
--
)
{
t
=
&
tasks
[
tid
[
k
]];
// if (t->type == task_type_sort)
// message("%d %s %s %d %d %d\n", k, taskID_names[t->type],
// subtaskID_names[t->subtype], t->nr_unlock_tasks, t->wait, t->skip);
if
(
!
((
1
<<
t
->
type
)
&
s
->
mask
)
||
t
->
skip
)
continue
;
fprintf
(
file
,
"%d %s %s %d %d
\n
"
,
k
,
taskID_names
[
t
->
type
],
subtaskID_names
[
t
->
subtype
],
t
->
nr_unlock_tasks
,
t
->
wait
);
}
// message( "waiting tasks took %.3f ms." , (double)( getticks() - tic ) /
// CPU_TPS * 1000 );
fclose
(
file
);
//message("All waits set");
//
message("All waits set");
fflush
(
stdout
);
/* Don't enqueue link tasks directly. */
s
->
mask
&=
~
(
1
<<
task_type_link
);
...
...
@@ -967,11 +970,9 @@ void scheduler_start(struct scheduler *s, unsigned int mask) {
}
scheduler_dump_queue
(
s
);
//message("Done enqueieing");fflush(stdout);
// message("Done enqueieing");fflush(stdout);
// message( "enqueueing tasks took %.3f ms." , (double)( getticks() - tic ) /
// CPU_TPS * 1000 );
}
...
...
@@ -990,11 +991,11 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) {
int
err
;
#endif
//if(t->type == task_type_pair) {
//
if(t->type == task_type_pair) {
// message("Enqueuing a %s", taskID_names[t->type]);
// fflush(stdout);
// }
/* Ignore skipped tasks and tasks not in the mask. */
if
(
t
->
skip
||
((
1
<<
t
->
type
)
&
~
(
s
->
mask
)
&&
t
->
type
!=
task_type_link
)
||
atomic_cas
(
&
t
->
rid
,
-
1
,
0
)
!=
-
1
)
...
...
@@ -1095,7 +1096,6 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) {
struct
task
*
scheduler_done
(
struct
scheduler
*
s
,
struct
task
*
t
)
{
/* Release whatever locks this task held. */
if
(
!
t
->
implicit
)
task_unlock
(
t
);
...
...
@@ -1287,48 +1287,43 @@ void scheduler_init(struct scheduler *s, struct space *space, int nr_queues,
s
->
tasks_next
=
0
;
}
/**
* @brief Print all the tasks in the queue of the scheduler
*
* @param s The #scheduler.
*/
void
scheduler_dump_queue
(
struct
scheduler
*
s
)
{
int
i
,
j
;
FILE
*
file
;
char
buffer
[
256
];
struct
queue
*
q
;
struct
task
*
t
;
for
(
i
=
0
;
i
<
s
->
nr_queues
;
++
i
)
{
/* Open file */
sprintf
(
buffer
,
"queue_%d.dat"
,
i
);
file
=
fopen
(
buffer
,
"w"
);
/* Get the queue */
q
=
&
s
->
queues
[
i
];
/* Some general info */
fprintf
(
file
,
"# Queue %d, size=%d, count=%d
\n
"
,
i
,
q
->
size
,
q
->
count
);
fprintf
(
file
,
"# Index type subtype
\n
"
);
for
(
j
=
0
;
j
<
q
->
count
;
++
j
)
{
/* Get the task */
t
=
&
q
->
tasks
[
j
];
/* And print... */
fprintf
(
file
,
"%d %s %s
\n
"
,
j
,
taskID_names
[
t
->
type
],
subtaskID_names
[
t
->
subtype
]);
}
/* Be nice and clean */
fclose
(
file
);
}
}
*/
void
scheduler_dump_queue
(
struct
scheduler
*
s
)
{
int
i
,
j
;
FILE
*
file
;
char
buffer
[
256
];
struct
queue
*
q
;
struct
task
*
t
;
for
(
i
=
0
;
i
<
s
->
nr_queues
;
++
i
)
{
/* Open file */
sprintf
(
buffer
,
"queue_%d.dat"
,
i
);
file
=
fopen
(
buffer
,
"w"
);
/* Get the queue */
q
=
&
s
->
queues
[
i
];
/* Some general info */
fprintf
(
file
,
"# Queue %d, size=%d, count=%d
\n
"
,
i
,
q
->
size
,
q
->
count
);
fprintf
(
file
,
"# Index type subtype
\n
"
);
for
(
j
=
0
;
j
<
q
->
count
;
++
j
)
{
/* Get the task */
t
=
&
q
->
tasks
[
j
];
/* And print... */
fprintf
(
file
,
"%d %s %s
\n
"
,
j
,
taskID_names
[
t
->
type
],
subtaskID_names
[
t
->
subtype
]);
}
/* Be nice and clean */
fclose
(
file
);
}
}
src/task.c
View file @
4338bd27
...
...
@@ -48,9 +48,8 @@ const char *taskID_names[task_type_count] = {
"ghost"
,
"drift"
,
"kick"
,
"send"
,
"recv"
,
"link"
,
"grav_pp"
,
"grav_mm"
,
"grav_up"
,
"grav_down"
};
const
char
*
subtaskID_names
[
task_type_count
]
=
{
"none"
,
"density"
,
"force"
,
"grav"
};
const
char
*
subtaskID_names
[
task_type_count
]
=
{
"none"
,
"density"
,
"force"
,
"grav"
};
/**
* @brief Unlock the cell held by this task.
...
...
src/tools.c
View file @
4338bd27
...
...
@@ -37,7 +37,7 @@ void factor(int value, int *f1, int *f2) {
int
j
;
int
i
;
j
=
(
int
)
sqrt
(
value
);
j
=
(
int
)
sqrt
(
value
);
for
(
i
=
j
;
i
>
0
;
i
--
)
{
if
((
value
%
i
)
==
0
)
{
*
f1
=
i
;
...
...
@@ -110,7 +110,7 @@ void pairs_n2(double *dim, struct part *__restrict__ parts, int N,
/* Dump the result. */
printf
(
"pairs_n2: avg. density per part is %.3f (nr. pairs %.3f).
\n
"
,
rho
/
N
+
32
.
0
/
3
,
((
double
)
count
)
/
N
);
rho
/
N
+
32
.
0
/
3
,
((
double
)
count
)
/
N
);
printf
(
"pairs_n2: densities are in [ %e , %e ].
\n
"
,
rho_min
/
N
+
32
.
0
/
3
,
rho_max
/
N
+
32
.
0
/
3
);
/* printf( "pairs_n2: maximum ratio between parts %i [%e,%e,%e] and %i
...
...
@@ -183,7 +183,7 @@ void pairs_single_grav(double *dim, long long int pid,
// int mj, mk;
// double maxratio = 1.0;
double
r2
,
dx
[
3
];
float
fdx
[
3
],
a
[
3
]
=
{
0
.
0
,
0
.
0
,
0
.
0
},
aabs
[
3
]
=
{
0
.
0
,
0
.
0
,
0
.
0
};
float
fdx
[
3
],
a
[
3
]
=
{
0
.
0
,
0
.
0
,
0
.
0
},
aabs
[
3
]
=
{
0
.
0
,
0
.
0
,
0
.
0
};
struct
gpart
pi
,
pj
;
// double ih = 12.0/6.25;
...
...
@@ -239,7 +239,7 @@ void pairs_single_grav(double *dim, long long int pid,
void
density_dump
(
int
N
)
{
int
k
;
float
r2
[
4
]
=
{
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
},
hi
[
4
],
hj
[
4
];
float
r2
[
4
]
=
{
0
.
0
f
,
0
.
0
f
,
0
.
0
f
,
0
.
0
f
},
hi
[
4
],
hj
[
4
];
struct
part
*
pi
[
4
],
*
pj
[
4
],
Pi
[
4
],
Pj
[
4
];
/* Init the interaction parameters. */
...
...
@@ -260,7 +260,7 @@ void density_dump(int N) {
r2
[
3
]
=
r2
[
2
];
r2
[
2
]
=
r2
[
1
];
r2
[
1
]
=
r2
[
0
];
r2
[
0
]
=
((
float
)
k
)
/
N
;
r2
[
0
]
=
((
float
)
k
)
/
N
;
Pi
[
0
].
density
.
wcount
=
0
;
Pj
[
0
].
density
.
wcount
=
0
;
runner_iact_density
(
r2
[
0
],
NULL
,
hi
[
0
],
hj
[
0
],
&
Pi
[
0
],
&
Pj
[
0
]);
...
...
@@ -305,8 +305,7 @@ void engine_single_density(double *dim, long long int pid,
p
.
density
.
wcount
=
0
.
0
f
;
p
.
density
.
wcount_dh
=
0
.
0
f
;
p
.
density
.
div_v
=
0
.
0
;
for
(
k
=
0
;
k
<
3
;
k
++
)
p
.
density
.
curl_v
[
k
]
=
0
.
0
;
for
(
k
=
0
;
k
<
3
;
k
++
)
p
.
density
.
curl_v
[
k
]
=
0
.
0
;
/* Loop over all particle pairs (force). */
for
(
k
=
0
;
k
<
N
;
k
++
)
{
...
...
@@ -335,7 +334,6 @@ void engine_single_density(double *dim, long long int pid,
message
(
"part %lli (h=%e) has wcount=%e, rho=%e, rho_dh=%e."
,
p
.
id
,
p
.
h
,
p
.
density
.
wcount
,
p
.
rho
,
p
.
rho_dh
);
fflush
(
stdout
);
}
void
engine_single_force
(
double
*
dim
,
long
long
int
pid
,
...
...
@@ -388,8 +386,7 @@ void engine_single_force(double *dim, long long int pid,
}
/* Dump the result. */
message
(
"part %lli (h=%e) has a=[%.3e,%.3e,%.3e], udt=%e."
,
p
.
id
,
p
.
h
,
p
.
a
[
0
]
,
p
.
a
[
1
]
,
p
.
a
[
2
]
,
p
.
force
.
u_dt
);
message
(
"part %lli (h=%e) has a=[%.3e,%.3e,%.3e], udt=%e."
,
p
.
id
,
p
.
h
,
p
.
a
[
0
]
,
p
.
a
[
1
],
p
.
a
[
2
],
p
.
force
.
u_dt
);
fflush
(
stdout
);
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment