From 23074b9a6ad87274d713367308cfe304ea74d791 Mon Sep 17 00:00:00 2001 From: schnetter Date: Sat, 19 Jun 2004 19:58:15 +0000 Subject: Take time levels into account. git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/RotatingSymmetry90/trunk@13 c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5 --- src/interpolate.c | 80 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 24 deletions(-) diff --git a/src/interpolate.c b/src/interpolate.c index 2d6c369..f0e032b 100644 --- a/src/interpolate.c +++ b/src/interpolate.c @@ -268,12 +268,13 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, CCTK_POINTER new_interp_coords[3]; CCTK_POINTER * restrict new_output_arrays; CCTK_INT new_faces; + CCTK_INT * restrict input_array_time_levels; CCTK_INT * restrict operand_indices; CCTK_INT * restrict operation_codes; CCTK_INT * restrict output_array_indices; - struct tensor const * restrict * restrict thetensor[3]; - int * restrict * restrict thevars[3]; + struct tensor const * restrict * restrict thetensor[3][4]; + int * restrict * restrict thevars[3][4]; int * restrict thebase; int * restrict thevar; @@ -283,6 +284,7 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, int f; /* face */ int d; /* dimension */ int q; /* number of derivatives */ + int tl; /* time level */ int r; /* rank */ int iret; /* interpolator return value */ @@ -373,6 +375,20 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, /* Find output variable indices */ + input_array_time_levels + = malloc (N_input_arrays * sizeof *input_array_time_levels); + assert (input_array_time_levels); + ierr = Util_TableGetIntArray + (param_table_handle, N_input_arrays, + input_array_time_levels, "input_array_time_levels"); + if (ierr == UTIL_ERROR_TABLE_NO_SUCH_KEY) { + for (m=0; m=0); } + /* Get the time level */ + time_level = input_array_time_levels[operand_indices[m]]; + assert (time_level>=0 && time_level<4); + if (tensortype == &scalar) { switch (num_derivs) { case 0: break; @@ -594,20 +617,21 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, } /* Create or cross-check the tensor object */ - if (! thetensor[num_derivs][basevar]) { - thetensor[num_derivs][basevar] = tensortype; - assert (! thevars[num_derivs][basevar]); - thevars[num_derivs][basevar] - = malloc (tensortype->nvars * sizeof *thevars[num_derivs][basevar]); - assert (thevars[num_derivs][basevar]); + if (! thetensor[num_derivs][time_level][basevar]) { + thetensor[num_derivs][time_level][basevar] = tensortype; + assert (! thevars[num_derivs][time_level][basevar]); + thevars[num_derivs][time_level][basevar] + = malloc (tensortype->nvars + * sizeof *thevars[num_derivs][time_level][basevar]); + assert (thevars[num_derivs][time_level][basevar]); for (i=0; invars; ++i) { - thevars[num_derivs][basevar][i] = -1; + thevars[num_derivs][time_level][basevar][i] = -1; } } - assert (thetensor[num_derivs][basevar] == tensortype); - assert (thevars[num_derivs][basevar]); - assert (thevars[num_derivs][basevar][var] == -1); - thevars[num_derivs][basevar][var] = m; + assert (thetensor[num_derivs][time_level][basevar] == tensortype); + assert (thevars[num_derivs][time_level][basevar]); + assert (thevars[num_derivs][time_level][basevar][var] == -1); + thevars[num_derivs][time_level][basevar][var] = m; } /* for m */ @@ -617,6 +641,7 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, for (m=0; m=0); } + /* Get the time level */ + time_level = input_array_time_levels[operand_indices[m]]; + assert (time_level>=0 && time_level<4); + /* Get the tensor type */ basevar = thebase[m]; assert (basevar>=0 && basevar<=CCTK_NumVars()); - tensortype = thetensor[num_derivs][basevar]; + tensortype = thetensor[num_derivs][time_level][basevar]; assert (tensortype); - vars = thevars[num_derivs][basevar]; + vars = thevars[num_derivs][time_level][basevar]; assert (vars); var = thevar[m]; assert (var>=0 && varnvars); @@ -732,13 +761,16 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, } free (new_output_arrays); + free (input_array_time_levels); free (operand_indices); free (operation_codes); free (output_array_indices); for (q=0; q<3; ++q) { - free ((void *) (thetensor[q])); - free ((void *) (thevars[q])); + for (tl=0; tl<4; ++tl) { + free ((void *) (thetensor[q][tl])); + free ((void *) (thevars[q][tl])); + } } free (thebase); free (thevar); -- cgit v1.2.3