aboutsummaryrefslogtreecommitdiff
path: root/src/adjust.c
blob: 43a2df002d6048dd71e77b28b7f4a0e89df1da8c (plain)
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);
}