diff options
Diffstat (limited to 'src/interpolate.c')
-rw-r--r-- | src/interpolate.c | 74 |
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); |