1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/* $Header$ */
#include <assert.h>
#include <stdio.h>
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
void
BHTracker_Adjust (CCTK_ARGUMENTS);
static void
setpar (char const * name, int index, char const * thorn, CCTK_REAL value);
void
BHTracker_Adjust (CCTK_ARGUMENTS)
{
DECLARE_CCTK_PARAMETERS;
DECLARE_CCTK_ARGUMENTS;
int n;
int si, ri;
char name[100], val[100];
int icnt, ierr;
CCTK_REAL xpos,ypos,zpos;
if ((cctk_iteration-1) < track_first) return;
if ((cctk_iteration-1) % track_every != 0) return;
CCTK_INFO ("Tracking...");
for (n=0; n<num_tracked; ++n) {
si = surface_index[n];
assert (si>=0 && si<nsurfaces);
ri = region_index[n];
assert (ri>=0 && ri<num_offsets);
if (sf_valid[si] > 0) {
CCTK_VInfo (CCTK_THORNSTRING,
" Object #%d has moved to [%g,%g,%g]", n,
(double)sf_centroid_x[si], (double)sf_centroid_y[si],
(double)sf_centroid_z[si]);
/* calculate new positions */
xpos = (sf_centroid_x[si] - initial_x[si]);
ypos = (sf_centroid_y[si] - initial_y[si]);
zpos = (sf_centroid_z[si] - initial_z[si]);
setpar ("offsetx", ri, "CarpetRegrid", xpos);
setpar ("offsety", ri, "CarpetRegrid", ypos);
setpar ("offsetz", ri, "CarpetRegrid", zpos);
} else {
CCTK_VInfo (CCTK_THORNSTRING,
" Object #%d cannot be detected at this time", n);
}
}
}
static void
setpar (char const * const name, int const index, char const * const thorn,
CCTK_REAL const value)
{
char nambuf[100], valbuf[100];
int icnt, ierr;
icnt = snprintf (nambuf, sizeof nambuf, "%s[%d]", name, index);
assert (icnt>=0 && icnt<sizeof nambuf);
icnt = snprintf (valbuf, sizeof valbuf, "%g", value);
assert (icnt>=0 && icnt<sizeof valbuf);
ierr = CCTK_ParameterSet (nambuf, thorn, valbuf);
assert (! ierr);
}
|