aboutsummaryrefslogtreecommitdiff
path: root/src/ChooseOutput.c
blob: 00ae90240681d9f7f57667c76e232c978d841f2f (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*@@
  @file      ChooseOutput.c
  @author    Thomas Radke
  @date      12 June 2004
  @desc
             Choose what 1D slices and 2D planes to output by IOSDF.
  @enddesc

  @version   $Id$
 @@*/

#include <stdlib.h>
#include <string.h>

#include "cctk.h"
#include "cctk_Parameters.h"
#include "CactusBase/IOUtil/src/ioutil_Utils.h"
#include "ioSDFGH.h"

/* the rcs ID and its dummy function to use it */
static const char *rcsid = "$Header$";
CCTK_FILEVERSION(CactusIO_IOSDF_ChooseOutput_c)


/********************************************************************
 ********************    Macro Definitions   ************************
 ********************************************************************/
/* macro to choose origin according actual parameter settings:
     1. Indices from IOSDF
     2. Indices from IOUtil
     3. Coords from IOSDF
     4. Coords from IOUtil
 */
#define GET_SLICE(IOSDF_param, IOUtil_param, index, coord)                    \
        {                                                                     \
          index = IOSDF_param##i >= 0 ? IOSDF_param##i : IOUtil_param##i;     \
          coord = IOSDF_param != -424242 ? IOSDF_param : IOUtil_param;        \
        }


/*@@
   @routine   IOSDF_Choose1D
   @author    Thomas Radke
   @date      12 June 2004
   @desc
              Use parameters to choose the 1D slices through the output data.
   @enddesc

   @calls     IOUtil_1DLines

   @var       GH
   @vdesc     pointer to CCTK grid hierarchy
   @vtype     const cGH *
   @vio       in
   @endvar
@@*/
void IOSDF_Choose1D (const cGH *GH)
{
  int i, j, maxdim;
  ioSDFGH *myGH;
  int *origin_index[3];
  CCTK_REAL *origin_phys[3];
  DECLARE_CCTK_PARAMETERS


  /* allocate arrays for origins */
  origin_phys[0] = malloc (3 * 3 * sizeof (CCTK_REAL));
  origin_phys[1] = origin_phys[0] + 3;
  origin_phys[2] = origin_phys[1] + 3;
  origin_index[0] = malloc (3 * 3 * sizeof (int));
  origin_index[1] = origin_index[0] + 3;
  origin_index[2] = origin_index[1] + 3;

  /* get slice points */
  GET_SLICE (out1D_xline_y, out_xline_y, origin_index[0][1], origin_phys[0][1]);
  GET_SLICE (out1D_xline_z, out_xline_z, origin_index[0][2], origin_phys[0][2]);
  GET_SLICE (out1D_yline_x, out_yline_x, origin_index[1][0], origin_phys[1][0]);
  GET_SLICE (out1D_yline_z, out_yline_z, origin_index[1][2], origin_phys[1][2]);
  GET_SLICE (out1D_zline_x, out_zline_x, origin_index[2][0], origin_phys[2][0]);
  GET_SLICE (out1D_zline_y, out_zline_y, origin_index[2][1], origin_phys[2][1]);

  maxdim = CCTK_MaxDim ();
  myGH = CCTK_GHExtension (GH, "IOSDF");
  myGH->spxyz = malloc (maxdim * sizeof (int **));

  for (i = 0; i < maxdim; i++)
  {
    myGH->spxyz[i] = malloc ((i + 1) * sizeof (int *));

    for (j = 0; j <= i; j++)
    {
      myGH->spxyz[i][j] = calloc (i + 1, sizeof (int));
    }

    if (i < 3)
    {
      IOUtil_1DLines (GH, i + 1, origin_index, origin_phys, myGH->spxyz[i]);
    }
  }

  /* free allocated resources */
  free (origin_phys[0]);
  free (origin_index[0]);
}


/*@@
   @routine   IOSDF_Choose2D
   @author    Thomas Radke
   @date      12 June 2004
   @desc
              Use parameters to choose the 2D slices through the output data.
   @enddesc

   @calls     IOUtil_2DPlanes

   @var       GH
   @vdesc     Pointer to CCTK grid hierarchy
   @vtype     const cGH *
   @vio       in
   @endvar
 @@*/
void IOSDF_Choose2D (const cGH *GH)
{
  int i, maxdim;
  ioSDFGH *myGH;
  int origin_index[3];
  CCTK_REAL origin_phys[3];
  DECLARE_CCTK_PARAMETERS


  GET_SLICE (out2D_xyplane_z, out_xyplane_z, origin_index[0], origin_phys[0]);
  GET_SLICE (out2D_xzplane_y, out_xzplane_y, origin_index[1], origin_phys[1]);
  GET_SLICE (out2D_yzplane_x, out_yzplane_x, origin_index[2], origin_phys[2]);

  maxdim = CCTK_MaxDim ();
  myGH = CCTK_GHExtension (GH, "IOSDF");
  myGH->sp2xyz = malloc (3 * sizeof (int *));

  for (i = 0; i < maxdim; i++)
  {
    myGH->sp2xyz[i] = calloc (i + 1, sizeof (int));

    if (i == 2)
    {
      IOUtil_2DPlanes (GH, i + 1, origin_index, origin_phys, myGH->sp2xyz[i]);
    }
  }
}