aboutsummaryrefslogtreecommitdiff
path: root/math/deboor/chol1d.f
diff options
context:
space:
mode:
Diffstat (limited to 'math/deboor/chol1d.f')
-rw-r--r--math/deboor/chol1d.f58
1 files changed, 58 insertions, 0 deletions
diff --git a/math/deboor/chol1d.f b/math/deboor/chol1d.f
new file mode 100644
index 00000000..fa0434ab
--- /dev/null
+++ b/math/deboor/chol1d.f
@@ -0,0 +1,58 @@
+ subroutine chol1d ( p, v, qty, npoint, ncol, u, qu )
+c from * a practical guide to splines * by c. de boor
+c from * a practical guide to splines * by c. de boor
+c to be called in s m o o t h
+constructs the upper three diags. in v(i,j), i=2,,npoint-1, j=1,3, of
+c the matrix 6*(1-p)*q-transp.*(d**2)*q + p*r, then computes its
+c l*l-transp. decomposition and stores it also in v, then applies
+c forward and backsubstitution to the right side q-transp.*y in qty
+c to obtain the solution in u .
+ integer ncol,npoint, i,npm1,npm2
+ real p,qty(npoint),qu(npoint),u(npoint),v(npoint,7), prev,ratio
+ * ,six1mp,twop
+ npm1 = npoint - 1
+c construct 6*(1-p)*q-transp.*(d**2)*q + p*r
+ six1mp = 6.*(1.-p)
+ twop = 2.*p
+ do 2 i=2,npm1
+ v(i,1) = six1mp*v(i,5) + twop*(v(i-1,4)+v(i,4))
+ v(i,2) = six1mp*v(i,6) + p*v(i,4)
+ 2 v(i,3) = six1mp*v(i,7)
+ npm2 = npoint - 2
+ if (npm2 .ge. 2) go to 10
+ u(1) = 0.
+ u(2) = qty(2)/v(2,1)
+ u(3) = 0.
+ go to 41
+c factorization
+ 10 do 20 i=2,npm2
+ ratio = v(i,2)/v(i,1)
+ v(i+1,1) = v(i+1,1) - ratio*v(i,2)
+ v(i+1,2) = v(i+1,2) - ratio*v(i,3)
+ v(i,2) = ratio
+ ratio = v(i,3)/v(i,1)
+ v(i+2,1) = v(i+2,1) - ratio*v(i,3)
+ 20 v(i,3) = ratio
+c
+c forward substitution
+ u(1) = 0.
+ v(1,3) = 0.
+ u(2) = qty(2)
+ do 30 i=2,npm2
+ 30 u(i+1) = qty(i+1) - v(i,2)*u(i) - v(i-1,3)*u(i-1)
+c back substitution
+ u(npoint) = 0.
+ u(npm1) = u(npm1)/v(npm1,1)
+ i = npm2
+ 40 u(i) = u(i)/v(i,1)-u(i+1)*v(i,2)-u(i+2)*v(i,3)
+ i = i - 1
+ if (i .gt. 1) go to 40
+c construct q*u
+ 41 prev = 0.
+ do 50 i=2,npoint
+ qu(i) = (u(i) - u(i-1))/v(i-1,4)
+ qu(i-1) = qu(i) - prev
+ 50 prev = qu(i)
+ qu(npoint) = -qu(npoint)
+ return
+ end