aboutsummaryrefslogtreecommitdiff
path: root/src/interpolate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interpolate.c')
-rw-r--r--src/interpolate.c74
1 files changed, 42 insertions, 32 deletions
diff --git a/src/interpolate.c b/src/interpolate.c
index 4594844..4087119 100644
--- a/src/interpolate.c
+++ b/src/interpolate.c
@@ -292,15 +292,19 @@ Rot90_CheckTensorTypes (CCTK_ARGUMENTS)
for (gi=0; gi<CCTK_NumGroups(); ++gi) {
char tensortypealias[100];
- int numvars, firstvar;
+ int numvars, firstvar, vectorlength;
int table;
int ierr;
+ cGroup group;
numvars = CCTK_NumVarsInGroupI(gi);
if (numvars == 0) continue;
assert (numvars>0);
firstvar = CCTK_FirstVarIndexI(gi);
assert (firstvar>=0);
+ ierr = CCTK_GroupData (gi, &group);
+ assert (!ierr);
+ vectorlength = group.vectorlength;
table = CCTK_GroupTagsTableI(gi);
assert (table>=0);
@@ -348,30 +352,31 @@ Rot90_CheckTensorTypes (CCTK_ARGUMENTS)
} else if (CCTK_EQUALS (tensortypealias, "u")
|| CCTK_EQUALS (tensortypealias, "d"))
{
- /* vector */
- assert (numvars == DIM);
+ /* vector, special case */
+ assert ((numvars == DIM*vectorlength) ||
+ (numvars == DIM && vectorlength == DIM));
} else if (CCTK_EQUALS (tensortypealias, "4u")
|| CCTK_EQUALS (tensortypealias, "4d"))
{
/* 4-vector */
- assert (numvars == DIM+1);
+ assert (numvars == (DIM+1)*vectorlength);
} else if (CCTK_EQUALS (tensortypealias, "uu")
|| CCTK_EQUALS (tensortypealias, "ud")
|| CCTK_EQUALS (tensortypealias, "du")
|| CCTK_EQUALS (tensortypealias, "dd")) {
/* tensor */
- assert (numvars == DIM*DIM);
+ assert (numvars == DIM*DIM*vectorlength);
} else if (CCTK_EQUALS (tensortypealias, "uu_sym")
|| CCTK_EQUALS (tensortypealias, "dd_sym")) {
/* symmetric tensor */
- assert (numvars == DIM*(DIM+1)/2);
+ assert (numvars == DIM*(DIM+1)/2*vectorlength);
} else if (CCTK_EQUALS (tensortypealias, "ddd_sym")) {
/* 3rd rank tensor, symmetric in last 2 indices */
- assert (numvars == DIM*DIM*(DIM+1)/2);
+ assert (numvars == DIM*DIM*(DIM+1)/2*vectorlength);
} else if (CCTK_EQUALS (tensortypealias, "4uu_sym")
|| CCTK_EQUALS (tensortypealias, "4dd_sym")) {
/* symmetric 4-tensor */
- assert (numvars == (DIM+1)*(DIM+2)/2);
+ assert (numvars == (DIM+1)*(DIM+2)/2*vectorlength);
} else {
char * groupname = CCTK_GroupName(gi);
assert (groupname);
@@ -617,7 +622,8 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH,
if (output_array_indices[m]!=-1) {
int vi, gi;
- int numvars, firstvar;
+ int numvars, firstvar, vectorlength;
+ cGroup group;
int table;
char tensortypealias[100];
@@ -630,7 +636,7 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH,
int num_time_derivs;
int num_derivs;
int time_level;
-
+
/* Get some variable information */
vi = output_array_indices[m];
assert (vi>=0 && vi<CCTK_NumVars());
@@ -642,6 +648,9 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH,
assert (firstvar>=0);
table = CCTK_GroupTagsTableI(gi);
assert (table>=0);
+ ierr = CCTK_GroupData (gi, &group);
+ assert (!ierr);
+ vectorlength = group.vectorlength;
/* Get the tensor type alias */
ierr = Util_TableGetString
@@ -697,72 +706,73 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH,
|| CCTK_EQUALS (tensortypealias, "d"))
{
/* vector */
- assert (numvars == DIM);
+ assert ((numvars == DIM*vectorlength) ||
+ (numvars == DIM && vectorlength == DIM));
tensortype = &vector;
basevar = firstvar;
- var = vi - basevar;
+ var = (vi - basevar) / vectorlength;
} else if (CCTK_EQUALS (tensortypealias, "4u")
|| CCTK_EQUALS (tensortypealias, "4d"))
{
/* 4-vector */
- assert (numvars == DIM+1);
- if (vi == firstvar) {
+ assert (numvars == (DIM+1)*vectorlength);
+ if ((vi - firstvar) / vectorlength == 0) {
/* temporal component */
int const off = 0;
tensortype = &scalar;
- basevar = firstvar + off;
- var = vi - basevar;
+ basevar = firstvar + off * vectorlength;
+ var = (vi - basevar) / vectorlength;
} else {
/* spatial components */
int const off = 1;
tensortype = &vector;
- basevar = firstvar + off;
- var = vi - basevar;
+ basevar = firstvar + off * vectorlength;
+ var = (vi - basevar) / vectorlength;
}
} else if (CCTK_EQUALS (tensortypealias, "uu")
|| CCTK_EQUALS (tensortypealias, "ud")
|| CCTK_EQUALS (tensortypealias, "du")
|| CCTK_EQUALS (tensortypealias, "dd")) {
/* tensor */
- assert (numvars == DIM*DIM);
+ assert (numvars == DIM*DIM*vectorlength);
tensortype = &tensor;
basevar = firstvar;
- var = vi - basevar;
+ var = (vi - basevar) / vectorlength;
} else if (CCTK_EQUALS (tensortypealias, "uu_sym")
|| CCTK_EQUALS (tensortypealias, "dd_sym")) {
/* symmetric tensor */
- assert (numvars == DIM*(DIM+1)/2);
+ assert (numvars == DIM*(DIM+1)/2*vectorlength);
tensortype = &symmtensor;
basevar = firstvar;
- var = vi - basevar;
+ var = (vi - basevar) / vectorlength;
} else if (CCTK_EQUALS (tensortypealias, "ddd_sym")) {
/* 3rd rank tensor, symmetric in last 2 indices */
- assert (numvars == DIM*DIM*(DIM+1)/2);
+ assert (numvars == DIM*DIM*(DIM+1)/2*vectorlength);
tensortype = &symmtensor3b;
basevar = firstvar;
- var = vi - basevar;
+ var = (vi - basevar) / vectorlength;
} else if (CCTK_EQUALS (tensortypealias, "4uu_sym")
|| CCTK_EQUALS (tensortypealias, "4dd_sym")) {
/* symmetric 4-tensor */
- assert (numvars == (DIM+1)*(DIM+2)/2);
- if (vi == firstvar) {
+ assert (numvars == (DIM+1)*(DIM+2)/2*vectorlength);
+ if ((vi - firstvar) / vectorlength == 0) {
/* temporal-temporal component */
int const off = 0;
tensortype = &scalar;
- basevar = firstvar + off;
- var = vi - basevar;
+ basevar = firstvar + off * vectorlength;
+ var = (vi - basevar) / vectorlength;
} else if (vi < firstvar+DIM+1) {
/* temporal-spatial components */
int const off = 1;
tensortype = &vector;
- basevar = firstvar + off;
- var = vi - basevar;
+ basevar = firstvar + off * vectorlength;
+ var = (vi - basevar) / vectorlength;
} else {
/* spatial-spatial components */
int const off = DIM+1;
tensortype = &symmtensor;
- basevar = firstvar + off;
- var = vi - basevar;
+ basevar = firstvar + off * vectorlength;
+ var = (vi - basevar) / vectorlength;
}
} else {
char * groupname = CCTK_GroupName(gi);