diff options
Diffstat (limited to 'src/interpolate.c')
-rw-r--r-- | src/interpolate.c | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/src/interpolate.c b/src/interpolate.c index 9c6a392..844aaf6 100644 --- a/src/interpolate.c +++ b/src/interpolate.c @@ -293,14 +293,34 @@ Rot90_CheckTensorTypes (CCTK_ARGUMENTS) groupname); free (groupname); } + } else if (CCTK_EQUALS (tensortypealias, "4scalar")) { + /* 4-scalar */ + if (numvars != 1) { + char * groupname = CCTK_GroupName(gi); + assert (groupname); + CCTK_VWarn (3, __LINE__, __FILE__, CCTK_THORNSTRING, + "Group \"%s\" has the tensor type alias \"4scalar\", but contains more than 1 element", + groupname); + free (groupname); + } } else if (CCTK_EQUALS (tensortypealias, "u") || CCTK_EQUALS (tensortypealias, "d")) { /* vector */ assert (numvars == 3); - } else if (CCTK_EQUALS (tensortypealias, "dd_sym")) { + } else if (CCTK_EQUALS (tensortypealias, "4u") + || CCTK_EQUALS (tensortypealias, "4d")) + { + /* 4-vector */ + assert (numvars == 4); + } else if (CCTK_EQUALS (tensortypealias, "uu_sym") + || CCTK_EQUALS (tensortypealias, "dd_sym")) { /* symmetric tensor */ assert (numvars == 6); + } else if (CCTK_EQUALS (tensortypealias, "4uu_sym") + || CCTK_EQUALS (tensortypealias, "4dd_sym")) { + /* symmetric 4-tensor */ + assert (numvars == 10); } else { char * groupname = CCTK_GroupName(gi); assert (groupname); @@ -582,6 +602,19 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, tensortype = &scalar; basevar = vi; var = 0; + } else if (CCTK_EQUALS (tensortypealias, "4scalar")) { + /* 4-scalar */ + if (numvars != 1) { + char * groupname = CCTK_GroupName(gi); + assert (groupname); + CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING, + "Group \"%s\" has the tensor type alias \"4-scalar\", but contains more than 1 element", + groupname); + free (groupname); + } + tensortype = &scalar; + basevar = vi; + var = 0; } else if (CCTK_EQUALS (tensortypealias, "u") || CCTK_EQUALS (tensortypealias, "d")) { @@ -589,13 +622,55 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, assert (numvars == 3); tensortype = &vector; basevar = firstvar; - var = vi - firstvar; - } else if (CCTK_EQUALS (tensortypealias, "dd_sym")) { + var = vi - basevar; + } else if (CCTK_EQUALS (tensortypealias, "4u") + || CCTK_EQUALS (tensortypealias, "4d")) + { + /* 4-vector */ + assert (numvars == 4); + if (vi == firstvar) { + /* temporal component */ + int const off = 0; + tensortype = &scalar; + basevar = firstvar + off; + var = vi - basevar; + } else { + /* spatial components */ + int const off = 1; + tensortype = &vector; + basevar = firstvar + off; + var = vi - basevar; + } + } else if (CCTK_EQUALS (tensortypealias, "uu_sym") + || CCTK_EQUALS (tensortypealias, "dd_sym")) { /* symmetric tensor */ assert (numvars == 6); tensortype = &symmtensor; basevar = firstvar; - var = vi - firstvar; + var = vi - basevar; + } else if (CCTK_EQUALS (tensortypealias, "4uu_sym") + || CCTK_EQUALS (tensortypealias, "4dd_sym")) { + /* symmetric 4-tensor */ + assert (numvars == 10); + if (vi == firstvar) { + /* temporal-temporal component */ + int const off = 0; + tensortype = &scalar; + basevar = firstvar + off; + var = vi - basevar; + } else if (vi < firstvar+4) { + /* temporal-spatial components */ + int const off = 1; + tensortype = &vector; + basevar = firstvar + off; + var = vi - basevar; + } else { + /* spatial-spatial components */ + int const off = 4; + tensortype = &symmtensor; + basevar = firstvar + off; + var = vi - basevar; + } } else { char * groupname = CCTK_GroupName(gi); assert (groupname); @@ -621,7 +696,7 @@ Rot90_SymmetryInterpolate (CCTK_POINTER_TO_CONST const cctkGH_, oldrank = tensortype->rank; } - /* Take operation code (i.e. derivatives) into account */ + /* Take operation code (i.e., derivatives) into account */ { int code = operation_codes[m]; num_derivs |