ianhinder / Kranc

A Mathematica package for generating code for solving time dependent partial differential equations
http://kranccode.org
GNU General Public License v2.0
28 stars 10 forks source link

Differencing.m: handle dirN expressions in non-vectorized code #137

Closed rhaas80 closed 8 years ago

ianhinder commented 8 years ago

Thanks! Could you explain the change and why it was needed? I assume the tests pass?

rhaas80 commented 8 years ago

The tests pass. This changes only apply to the non-vectorized code (which is not tested) which was broken when the fnrhs was introduced. Basically the _NV version would no longer compile.

What the change does is add arguments "dir1, dir2, dir3" to the fnrhs function calls.

diff --git a/ML_ADMQuantities/src/Differencing.h b/ML_ADMQuantities/src/Differencing.h
index d36a164..8d5afe0 100644
--- a/ML_ADMQuantities/src/Differencing.h
+++ b/ML_ADMQuantities/src/Differencing.h
@@ -174,7 +174,7 @@ static CCTK_REAL PDupwindNth3_impl(const CCTK_REAL* restrict const u, const CCTK
 static CCTK_REAL PDupwindNth3_impl(const CCTK_REAL* restrict const u, const CCTK_REAL p1o12dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDupwindNth2_impl(u, p1o12dz, cdk, cdj);
+  return PDupwindNth2_impl(u, p1o12dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -210,7 +210,7 @@ static CCTK_REAL PDonesided3_impl(const CCTK_REAL* restrict const u, const CCTK_
 static CCTK_REAL PDonesided3_impl(const CCTK_REAL* restrict const u, const CCTK_REAL p1odz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDonesided2_impl(u, p1odz, cdk, cdj);
+  return PDonesided2_impl(u, p1odz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

diff --git a/ML_BSSN_NV/src/Differencing.h b/ML_BSSN_NV/src/Differencing.h
index 3fe2066..c8b364b 100644
--- a/ML_BSSN_NV/src/Differencing.h
+++ b/ML_BSSN_NV/src/Differencing.h
@@ -606,7 +606,7 @@ static CCTK_REAL PDupwindNthfdOrder23_impl(const CCTK_REAL* restrict const u, co
 static CCTK_REAL PDupwindNthfdOrder23_impl(const CCTK_REAL* restrict const u, const CCTK_REAL pm1o2dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDupwindNthfdOrder22_impl(u, pm1o2dz, cdk, cdj);
+  return PDupwindNthfdOrder22_impl(u, pm1o2dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -642,7 +642,7 @@ static CCTK_REAL PDupwindNthfdOrder43_impl(const CCTK_REAL* restrict const u, co
 static CCTK_REAL PDupwindNthfdOrder43_impl(const CCTK_REAL* restrict const u, const CCTK_REAL p1o12dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDupwindNthfdOrder42_impl(u, p1o12dz, cdk, cdj);
+  return PDupwindNthfdOrder42_impl(u, p1o12dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -678,7 +678,7 @@ static CCTK_REAL PDupwindNthfdOrder63_impl(const CCTK_REAL* restrict const u, co
 static CCTK_REAL PDupwindNthfdOrder63_impl(const CCTK_REAL* restrict const u, const CCTK_REAL pm1o60dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDupwindNthfdOrder62_impl(u, pm1o60dz, cdk, cdj);
+  return PDupwindNthfdOrder62_impl(u, pm1o60dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -714,7 +714,7 @@ static CCTK_REAL PDupwindNthfdOrder83_impl(const CCTK_REAL* restrict const u, co
 static CCTK_REAL PDupwindNthfdOrder83_impl(const CCTK_REAL* restrict const u, const CCTK_REAL pm1o840dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDupwindNthfdOrder82_impl(u, pm1o840dz, cdk, cdj);
+  return PDupwindNthfdOrder82_impl(u, pm1o840dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -1038,7 +1038,7 @@ static CCTK_REAL PDonesidedfdOrder23_impl(const CCTK_REAL* restrict const u, con
 static CCTK_REAL PDonesidedfdOrder23_impl(const CCTK_REAL* restrict const u, const CCTK_REAL pm1o2dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDonesidedfdOrder22_impl(u, pm1o2dz, cdk, cdj);
+  return PDonesidedfdOrder22_impl(u, pm1o2dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -1074,7 +1074,7 @@ static CCTK_REAL PDonesidedfdOrder43_impl(const CCTK_REAL* restrict const u, con
 static CCTK_REAL PDonesidedfdOrder43_impl(const CCTK_REAL* restrict const u, const CCTK_REAL pm1o6dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDonesidedfdOrder42_impl(u, pm1o6dz, cdk, cdj);
+  return PDonesidedfdOrder42_impl(u, pm1o6dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -1110,7 +1110,7 @@ static CCTK_REAL PDonesidedfdOrder63_impl(const CCTK_REAL* restrict const u, con
 static CCTK_REAL PDonesidedfdOrder63_impl(const CCTK_REAL* restrict const u, const CCTK_REAL pm1o12dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDonesidedfdOrder62_impl(u, pm1o12dz, cdk, cdj);
+  return PDonesidedfdOrder62_impl(u, pm1o12dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

@@ -1146,7 +1146,7 @@ static CCTK_REAL PDonesidedfdOrder83_impl(const CCTK_REAL* restrict const u, con
 static CCTK_REAL PDonesidedfdOrder83_impl(const CCTK_REAL* restrict const u, const CCTK_REAL p1o60dz, const ptrdiff_t cdj, const ptrdiff_t cdk, const ptrdiff_t dir1, const ptrdiff_t dir2, const ptrdiff_t dir3)
 {
   const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL);
-  return PDonesidedfdOrder82_impl(u, p1o60dz, cdk, cdj);
+  return PDonesidedfdOrder82_impl(u, p1o60dz, cdk, cdj, dir1, dir2, dir3);
 }
 #endif

I stumbled across this when implementing the symmetric-operators version of McLachlan.

ianhinder commented 8 years ago

Thanks. I will accept the pull request. I assume McLachlan doesn't need to be regenerated, since it doesn't generate the nonvectorised version by default anyway?

rhaas80 commented 8 years ago

Hello Ian,

Thanks. I will accept the pull request. I assume McLachlan doesn't need to be regenerated, since it doesn't generate the nonvectorised version by default anyway? I think it does. The Makefile has:

all: McLachlan_ADM.out McLachlan_BSSN.out McLachlan_BSSN_bench.out McLachlan_BSSN_bench8.out McLachlan_BSSN_CL.out McLachlan_BSSN_ND.out McLachlan_BSSN_NV.out McLachlan_CCZ4.out McLachlan_ADMConstraints.out McLachlan_ADMQuantities.out WaveToy.out WaveToyFO.out hydro.out

as its first target and the _NV.out ones trigger non-vectorized code. That thorn however is not in the ET thornlist. So ML needs to regenerate, but the ET won't notice.

Yours, Roland

My email is as private as my paper mail. I therefore support encrypting and signing email messages. Get my PGP key from http://keys.gnupg.net.

ianhinder commented 8 years ago

OK. Please can you do the regeneration? It would probably be wise to first regenerate without the change, commit that, and then regenerate with the change, to make sure that the changes are what are expected from this. It's possible that the first part will be a no-op.