From 433217f811bce10d1c1b2278c6d90a2b7abb55d4 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauldmccarthy@gmail.com>
Date: Fri, 6 Sep 2024 16:38:18 +0100
Subject: [PATCH] ENH,RF: Implement clamped extrapolation boundary condition
 for coefficient initialisation

---
 splinterpolator.h | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/splinterpolator.h b/splinterpolator.h
index a9b1426..2fab71c 100644
--- a/splinterpolator.h
+++ b/splinterpolator.h
@@ -1643,11 +1643,17 @@ double Splinterpolator<T>::SplineColumn::init_fwd_sweep(double z, ExtrapolationT
     double z2i=z;
     for (unsigned int i=1; i<n; i++, ptr--, z2i*=z) iv += z2i * *ptr;
   }
-  else {
+  else if (et == Mirror) {
     double *ptr=&_col[1];
     double z2i=z;
     for (unsigned int i=1; i<n; i++, ptr++, z2i*=z) iv += z2i * *ptr;
   }
+  // et == Constant || et == Zeros
+  else {
+    double *ptr=&_col[0];
+    double z2i=z;
+    for (unsigned int i=0; i<n; i++, ptr++, z2i*=z) iv += z2i * *ptr;
+  }
   return(iv);
 }
 
@@ -1674,9 +1680,14 @@ double Splinterpolator<T>::SplineColumn::init_bwd_sweep(double z, double lv, Ext
     }
     iv /= (z2i-1.0);
   }
-  else {
+  else if (et == Mirror) {
     iv = -z/(1.0-z*z) * (2.0*_col[_sz-1] - lv);
   }
+  // et == Constant || et == Zeros
+  else  {
+    iv = z / (z - 1) * _col[_sz-1];
+  }
+
   return(iv);
 }
 
-- 
GitLab