From 9b8fb63abc14ea5260b8fe2ce73a32c16a60e3ca Mon Sep 17 00:00:00 2001 From: rhaas Date: Mon, 17 Jun 2013 16:34:47 +0000 Subject: handle vector groups of vectors and higher order tensors this patch adds support for groups of the form CCTK_REAL vvel[3] "group of vectors" { vvelx, vvely, vvelz } it changes how the vector/tensor component is constructed from the variable index. It assumes that Cactus order variables as vvelx[0], vvelx[1], vvelx[2], vvely[0], ... git-svn-id: http://svn.cactuscode.org/arrangements/CactusNumerical/RotatingSymmetry90/trunk@89 c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5 --- src/interpolate.c | 74 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 32 deletions(-) (limited to 'src/interpolate.c') 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; gi0); 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=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); -- cgit v1.2.3