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 +++++++++++++++++++--------------- src/rotatingsymmetry90.c | 102 ++++++++++++++++++++++++++++++----------------- 2 files changed, 107 insertions(+), 69 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; 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); diff --git a/src/rotatingsymmetry90.c b/src/rotatingsymmetry90.c index 038de32..f1e784f 100644 --- a/src/rotatingsymmetry90.c +++ b/src/rotatingsymmetry90.c @@ -78,6 +78,7 @@ int BndRot90VI (cGH const * restrict const cctkGH, char * restrict fullname; void * restrict * restrict varptrs; int * restrict vartypes; + int * restrict vectorlengths; int firstvar; char tensortypealias[100]; @@ -139,6 +140,8 @@ int BndRot90VI (cGH const * restrict const cctkGH, assert (nvars==0 || varptrs); vartypes = malloc (nvars * sizeof *vartypes); assert (nvars==0 || vartypes); + vectorlengths = malloc (nvars * sizeof *vectorlengths); + assert (nvars==0 || vectorlengths); for (var=0; var=0 && gis[var]= 0); + + vectorlengths[var] = group.vectorlength; + assert (vectorlengths[var]>=0); + assert (vectorlengths[var]==1 || group.vectorgroup); } for (d=0; d0); firstvar = CCTK_FirstVarIndexI(gis[var]); @@ -239,7 +255,7 @@ int BndRot90VI (cGH const * restrict const cctkGH, assert (index>=0 && index=0); - + ierr = Util_TableGetString (table, sizeof tensortypealias, tensortypealias, "tensortypealias"); if (ierr == UTIL_ERROR_TABLE_NO_SUCH_KEY) { @@ -276,31 +292,32 @@ int BndRot90VI (cGH const * restrict const cctkGH, } else if (CCTK_EQUALS (tensortypealias, "u") || CCTK_EQUALS (tensortypealias, "d")) { /* vector */ - assert (numvars == DIM); + 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 if (CCTK_EQUALS (tensortypealias, "weylscalars_real")) { /* Weyl scalars, stored as 10 real numbers */ - assert (numvars == 10); + assert (numvars == 10*vectorlength); } else { char * groupname = CCTK_GroupName(gis[var]); assert (groupname); @@ -324,22 +341,28 @@ int BndRot90VI (cGH const * restrict const cctkGH, || CCTK_EQUALS (tensortypealias, "d")) { /* vector */ int srcindex; - assert (index>=0 && index=0 && index=0 && index=0 && index<(DIM+1)*vectorlength); + if (index/vectorlength==0) { /* temporal component */ srcvi = firstvar; } else { /* spatial components */ int srcindex; int const off = 1; - srcindex - = off + convert_index (step, index-off, alldirs, &parities[var]); + srcindex = index % vectorlength + vectorlength * (off + + convert_index (step, index/vectorlength-off, alldirs, &parities[var])); srcvi = firstvar + srcindex; } } else if (CCTK_EQUALS (tensortypealias, "uu") @@ -351,12 +374,13 @@ int BndRot90VI (cGH const * restrict const cctkGH, int index1, index2; int srcindex1, srcindex2; int srcindex; - assert (index>=0 && index=0 && index=0 && index=0 && index=0 && index=0 && index=0 && index<(DIM+1)*(DIM+2)/2); - if (index==0) { + assert (index>=0 && index<(DIM+1)*(DIM+2)/2*vectorlength); + if (index/vectorlength==0) { /* temporal-temporal component */ srcvi = firstvar; - } else if (index=0 && index<10); + assert (index>=0 && index<10*vectorlength); srcvi = vis[var]; } else { assert (0); @@ -803,6 +830,7 @@ int BndRot90VI (cGH const * restrict const cctkGH, free (gis); free (varptrs); + free (vectorlengths); free (vartypes); free (parities); free (srcptrs); -- cgit v1.2.3