diff options
author | rhaas <rhaas@c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5> | 2013-06-17 16:34:47 +0000 |
---|---|---|
committer | rhaas <rhaas@c3c03602-0f4f-0410-b3fa-d2c81c8a7dc5> | 2013-06-17 16:34:47 +0000 |
commit | 9b8fb63abc14ea5260b8fe2ce73a32c16a60e3ca (patch) | |
tree | 717c040c7e551fc9b2402c1704ff887dabdb480c /src/interpolate.c | |
parent | 655ee156051e38101cca0436c401fbace3c1425c (diff) |
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
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); |