aboutsummaryrefslogtreecommitdiff
path: root/src/Write.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/Write.c')
-rw-r--r--src/Write.c341
1 files changed, 264 insertions, 77 deletions
diff --git a/src/Write.c b/src/Write.c
index 3fa5c7d..4ada69b 100644
--- a/src/Write.c
+++ b/src/Write.c
@@ -9,6 +9,9 @@
@@*/
+#include <assert.h>
+#include <limits.h>
+#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -118,103 +121,287 @@ int IOJpeg_Write (const cGH *GH, CCTK_INT vindex, const char *alias)
min = colormap_min;
max = colormap_max;
}
- else
+ else if (CCTK_Equals (colormap, "auto"))
{
i = CCTK_LocalArrayReductionHandle ("minimum");
- i = CCTK_ReduceGridArrays (GH, 0, i, -1, 1, input_array , 1, input_array_type_codes, value_min);
+ CCTK_ReduceGridArrays (GH, 0, i, -1, 1, input_array , 1, input_array_type_codes, value_min);
i = CCTK_LocalArrayReductionHandle ("maximum");
- i = CCTK_ReduceGridArrays (GH, 0, i, -1, 1, input_array , 1, input_array_type_codes, value_max);
+ CCTK_ReduceGridArrays (GH, 0, i, -1, 1, input_array , 1, input_array_type_codes, value_max);
+ }
+ else if (CCTK_Equals (colormap, "auto-old"))
+ {
+ i = CCTK_ReductionHandle ("minimum");
+ CCTK_Reduce (GH, 0, i, 1, CCTK_VARIABLE_REAL, &min, 1, vindex);
+ i = CCTK_ReductionHandle ("maximum");
+ CCTK_Reduce (GH, 0, i, 1, CCTK_VARIABLE_REAL, &max, 1, vindex);
+ }
+ else
+ {
+ CCTK_WARN (CCTK_WARN_ABORT, "Setting for parameter IOpjeg::colormap not recognised");
}
/* get the number of slices to output */
/* in general: maxdir = gdata.dim * (gdata.dim - 1) / 2; */
maxdir = gdata.dim == 2 ? 1 : 3;
- /* now do the actual I/O looping over all directions */
- for (dir = 0; dir < maxdir; dir++)
+ if (CCTK_EQUALS(gridpoints, "hyperslab"))
{
- /* get the directions to span the hyperslab */
- if (dir == 0)
+
+ /* now do the actual I/O looping over all directions */
+ for (dir = 0; dir < maxdir; dir++)
{
- dir_i = 0; dir_j = 1; /* xy */
- }
- else if (dir == 1)
- {
- dir_i = 0; dir_j = 2; /* xz */
- }
- else
- {
- dir_i = 1; dir_j = 2; /* yz */
- }
+ /* get the directions to span the hyperslab */
+ if (dir == 0)
+ {
+ dir_i = 0; dir_j = 1; /* xy */
+ }
+ else if (dir == 1)
+ {
+ dir_i = 0; dir_j = 2; /* xz */
+ }
+ else
+ {
+ dir_i = 1; dir_j = 2; /* yz */
+ }
+
+ /* set the origin using the slice center from IOUtil */
+ memset (origin, 0, sizeof (origin));
+ if (gdata.grouptype == CCTK_GF)
+ {
+ origin[maxdir-dir-1] = myGH->sp2xyz[gdata.dim - 1][dir];
+ }
+
+ /* set the direction vector */
+ memset (direction, 0, sizeof (direction));
+ direction[dir_i] = direction[gdata.dim + dir_j] = 1;
+
+ mapping = Hyperslab_GlobalMappingByIndex (GH, vindex, 2,
+ direction, origin, extent,
+ NULL, -1, NULL, hsize);
+ if (mapping < 0)
+ {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Failed to define hyperslab mapping for variable '%s'",
+ fullname);
+ continue;
+ }
+ {
+ // Sanity check
+ // (if this fails, we requested an insane number of grid points)
+ int max = INT_MAX;
+ int d;
+ for (d=0; d<2; ++d) {
+ assert (hsize[d] >= 0 && hsize[d] <= max);
+ if (hsize[d] > 0) max /= hsize[d];
+ }
+ assert (CCTK_VarTypeSize (gdata.vartype) <= max);
+ }
+ total_hsize = hsize[0] * hsize[1] * CCTK_VarTypeSize (gdata.vartype);
+ assert (total_hsize >= 0);
+ if (total_hsize <= 0)
+ {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Selected hyperslab has zero size for variable '%s' "
+ "direction %d", fullname, dir);
+ Hyperslab_FreeMapping (mapping);
+ continue;
+ }
+
+ /* allocate hyperslab buffer */
+ hdata = myproc == 0 ? malloc (total_hsize) : NULL;
+
+ /* get the hyperslab */
+ i = Hyperslab_Get (GH, mapping, 0, vindex, 0, htype, hdata);
+ if (i)
+ {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Failed to extract hyperslab for variable '%s'", fullname);
+ }
+
+ /* release the mapping structure */
+ Hyperslab_FreeMapping (mapping);
+
+ /* and dump the data to file */
+ if (myproc == 0)
+ {
+ if (i == 0)
+ {
+ /* refine the 2D slice if requested */
+ outdata = refinement_factor > 1 ? RefineData (hsize, hdata) : hdata;
+ if (! outdata)
+ {
+ CCTK_WARN (1, "Failed to refine 2D array");
+ outdata = hdata;
+ }
+ WriteData (GH, vindex, alias, gdata.dim, dir, min, max, hsize, outdata);
+ if (outdata != hdata)
+ {
+ free (outdata);
+ }
+ }
+
+ /* clean up */
+ free (hdata);
+ }
+ } /* end of looping through xyz directions */
- /* set the origin using the slice center from IOUtil */
- memset (origin, 0, sizeof (origin));
- if (gdata.grouptype == CCTK_GF)
+ }
+ else if (CCTK_EQUALS(gridpoints, "interpolate"))
+ {
+
+ int interpolator;
+ int options_table;
+ int coord_handle;
+
+ CCTK_REAL * restrict coordsx;
+ CCTK_REAL * restrict coordsy;
+ CCTK_REAL * restrict coordsz;
+ CCTK_POINTER_TO_CONST coords[3];
+ CCTK_INT * restrict inputs;
+ CCTK_INT * restrict output_types;
+ CCTK_POINTER * restrict outputs;
+ CCTK_INT * restrict operation_codes;
+ CCTK_INT * restrict time_deriv_order;
+
+ const int nvars = 1;
+ int npoints;
+
+ int n;
+ int i, j, k;
+ int d;
+ int ierr;
+
+ CCTK_REAL *outdata;
+
+
+
+ interpolator = CCTK_InterpHandle (interpolator_name);
+ assert (interpolator >= 0);
+
+ options_table = Util_TableCreateFromString (interpolator_options);
+ assert (options_table >= 0);
+
+ coord_handle = CCTK_CoordSystemHandle (interpolator_coordinates);
+ assert (coord_handle >= 0);
+
+
+
{
- origin[maxdir-dir-1] = myGH->sp2xyz[gdata.dim - 1][dir];
+ ierr = Util_TableSetInt (options_table, 1, "want_global_mode");
+ assert (! ierr);
}
-
- /* set the direction vector */
- memset (direction, 0, sizeof (direction));
- direction[dir_i] = direction[gdata.dim + dir_j] = 1;
-
- mapping = Hyperslab_GlobalMappingByIndex (GH, vindex, 2,
- direction, origin, extent,
- NULL, -1, NULL, hsize);
- if (mapping < 0)
- {
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Failed to define hyperslab mapping for variable '%s'",
- fullname);
- continue;
+
+
+
+ /* 2D Arrays */
+ npoints = myproc==0 ? array2d_npoints_i * array2d_npoints_j : 0;
+
+ coordsx = malloc (npoints * sizeof * coordsx);
+ assert (npoints==0 || coordsx);
+ coordsy = malloc (npoints * sizeof * coordsy);
+ assert (npoints==0 || coordsy);
+ coordsz = malloc (npoints * sizeof * coordsz);
+ assert (npoints==0 || coordsz);
+ coords[0] = coordsx;
+ coords[1] = coordsy;
+ coords[2] = coordsz;
+
+ if (myproc==0) {
+ n = 0;
+ for (j=0; j<array2d_npoints_j; ++j) {
+ for (i=0; i<array2d_npoints_i; ++i) {
+ assert (n <= npoints);
+ coordsx[n] = array2d_x0 + i * array2d_dx_i + j * array2d_dx_j;
+ coordsy[n] = array2d_y0 + i * array2d_dy_i + j * array2d_dy_j;
+ coordsz[n] = array2d_z0 + i * array2d_dz_i + j * array2d_dz_j;
+ ++n;
+ }
+ }
+ assert (n == npoints);
}
- total_hsize = hsize[0] * hsize[1] * CCTK_VarTypeSize (gdata.vartype);
- if (total_hsize <= 0)
- {
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Selected hyperslab has zero size for variable '%s' "
- "direction %d", fullname, dir);
- Hyperslab_FreeMapping (mapping);
- continue;
+
+ inputs = malloc (nvars * sizeof * inputs);
+ assert (inputs);
+
+ for (n=0; n<nvars; ++n) {
+ inputs[n] = vindex;
+ if (inputs[n] < 0) {
+ inputs[n] = -1;
+ }
}
-
- /* allocate hyperslab buffer */
- hdata = myproc == 0 ? malloc (total_hsize) : NULL;
-
- /* get the hyperslab */
- i = Hyperslab_Get (GH, mapping, 0, vindex, 0, htype, hdata);
- if (i)
- {
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Failed to extract hyperslab for variable '%s'", fullname);
+
+ output_types = malloc (nvars * sizeof * output_types);
+ assert (output_types);
+
+ for (n=0; n<nvars; ++n) {
+ output_types[n] = CCTK_VARIABLE_REAL;
}
-
- /* release the mapping structure */
- Hyperslab_FreeMapping (mapping);
-
- /* and dump the data to file */
- if (myproc == 0)
- {
- if (i == 0)
- {
- /* refine the 2D slice if requested */
- outdata = refinement_factor > 1 ? RefineData (hsize, hdata) : hdata;
- if (! outdata)
- {
- CCTK_WARN (1, "Failed to refine 2D array");
- outdata = hdata;
- }
- WriteData (GH, vindex, alias, gdata.dim, dir, min, max, hsize, outdata);
- if (outdata != hdata)
- {
- free (outdata);
- }
+
+ outputs = malloc (nvars * sizeof * outputs);
+ assert (outputs);
+
+ outdata = malloc (npoints * sizeof * outdata);
+ assert (npoints==0 || outdata);
+
+ for (n=0; n<nvars; ++n) {
+ outputs[n] = outdata;
+ }
+
+ ierr = CCTK_InterpGridArrays
+ (GH, 3, interpolator, options_table, coord_handle,
+ npoints, CCTK_VARIABLE_REAL, coords,
+ nvars, inputs,
+ nvars, output_types, outputs);
+ assert (! ierr);
+
+
+
+ /* Multiply values by r */
+ if (myproc==0) {
+ for (n=0; n<npoints; ++n) {
+ const CCTK_REAL x = coordsx[n];
+ const CCTK_REAL y = coordsy[n];
+ const CCTK_REAL z = coordsz[n];
+ const CCTK_REAL r = sqrt (pow (x, 2) + pow (y, 2) + pow (z, 2));
+ outdata[n] *= r;
}
+ }
+
+
- /* clean up */
- free (hdata);
+ free (coordsx);
+ free (coordsy);
+ free (coordsz);
+ free (inputs);
+ free (output_types);
+ free (outputs);
+
+
+
+ ierr = Util_TableDestroy (options_table);
+ assert (! ierr);
+
+
+
+ if (myproc==0) {
+ const int dir = 0;
+ CCTK_INT hsize[2];
+ hsize[0] = array2d_npoints_i;
+ hsize[1] = array2d_npoints_j;
+
+ assert (CCTK_VarTypeI(vindex) == CCTK_VARIABLE_REAL);
+
+ WriteData (GH, vindex, alias, gdata.dim, dir,
+ min, max, hsize, outdata);
}
- } /* end of looping through xyz directions */
+
+ free (outdata);
+
+ }
+ else
+ {
+ CCTK_WARN (CCTK_WARN_ABORT, "unknown setting for parameter IOJpeg::gridpoints");
+ }
free (fullname);