aboutsummaryrefslogtreecommitdiff
path: root/src/WaveToy.cc
blob: efa1982fa65c7a31af3a8739148299db5266f724 (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 /*@@
   @file    WaveToy.cc
   @date
   @author  Tom Goodale
   @desc
            Evolution routines for the wave equation solver
   @enddesc
   @version $Id$
 @@*/

#include <stddef.h>

#include "cctk.h"
#include "cctk_Parameters.h"
#include "cctk_Arguments.h"

#define val(gridfunc,i,j,k)  gridfunc[CCTK_GFINDEX3D(cctkGH,i,j,k)]

 /*@@
   @routine    WaveToyC_Evolution
   @date
   @author     Tom Goodale
   @desc
               Evolution for the wave equation
   @enddesc
@@*/

extern "C" void  WaveToyCXX_Evolution(CCTK_ARGUMENTS)
{
  DECLARE_CCTK_ARGUMENTS;

  // Set up shorthands

  CCTK_REAL dx = CCTK_DELTA_SPACE(0);
  CCTK_REAL dy = CCTK_DELTA_SPACE(1);
  CCTK_REAL dz = CCTK_DELTA_SPACE(2);
  CCTK_REAL dt = CCTK_DELTA_TIME;

  CCTK_REAL dx2 = dx*dx;
  CCTK_REAL dy2 = dy*dy;
  CCTK_REAL dz2 = dz*dz;
  CCTK_REAL dt2 = dt*dt;

  CCTK_REAL dx2i = 1.0/dx2;
  CCTK_REAL dy2i = 1.0/dy2;
  CCTK_REAL dz2i = 1.0/dz2;

  CCTK_REAL factor = 2*(1 - (dt2)*(dx2i + dy2i + dz2i));

  int istart = 1;
  int jstart = 1;
  int kstart = 1;

  int iend = cctk_lsh[0]-1;
  int jend = cctk_lsh[1]-1;
  int kend = cctk_lsh[2]-1;

  //
  // Do the evolution
  //

  for (int k=kstart; k<kend; k++)
  {
    for (int j=jstart; j<jend; j++)
    {
      for (int i=istart; i<iend; i++)
      {
        int vindex = CCTK_GFINDEX3D(cctkGH,i,j,k);

        phi[vindex] =
	  factor*phi_p[vindex] - phi_p_p[vindex]
	  + dt2 *
	  ( (  val( phi_p, i+1,j  ,k  ) + val( phi_p, i-1,j  ,k)   )*dx2i
	    +( val( phi_p, i  ,j+1,k  ) + val( phi_p, i  ,j-1,k)   )*dy2i
	    +( val( phi_p, i  ,j  ,k+1) + val( phi_p, i  ,j,  k-1) )*dz2i
	    );
      }
    }
  }
}

 /*@@
   @routine    WaveToyC_Boundaries
   @date
   @author     Tom Goodale
   @desc
               Boundary conditions for the wave equation
   @enddesc
@@*/

extern "C" void WaveToyCXX_Boundaries(CCTK_ARGUMENTS)
{
  DECLARE_CCTK_ARGUMENTS;
  DECLARE_CCTK_PARAMETERS;

  const char *bctype;


  bctype = NULL;
  if (CCTK_EQUALS(bound,"flat") || CCTK_EQUALS(bound,"static") ||
      CCTK_EQUALS(bound,"radiation") || CCTK_EQUALS(bound,"robin") ||
      CCTK_EQUALS(bound,"none"))
  {
    bctype = bound;
  }
  else if (CCTK_EQUALS(bound,"zero"))
  {
    bctype = "scalar";
  }

  // Uses all default arguments, so invalid table handle -1 can be passed
  if (bctype && Boundary_SelectVarForBC (cctkGH, CCTK_ALL_FACES, 1, -1,
                                         "wavetoy::phi", bctype) < 0)
  {
    CCTK_WARN (0,"WaveToyCXX_Boundaries: Error selecting boundary condition");
  }
}