aboutsummaryrefslogtreecommitdiff
path: root/math/deboor/putit_io.f
blob: c3e97c5a9e83847dbbed57eece9a3bd69175cf72 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
subroutine putit ( t, kpm, left, scrtch, dbiatx, q, nrow, b )
c  from  * a practical guide to splines *  by c. de boor
calls  bsplvd(bsplvb),difequ(*)
c  to be called by  e q b l o k .
c
c  puts together one block of the collocation equation system
c
c******  i n p u t  ******
c  t	 knot sequence, of size  left+kpm (at least)
c  kpm	 order of spline
c  left  integer indicating interval of interest, viz the interval
c	    (t(left), t(left+1))
c  nrow  number of rows in block to be put together
c
c******  w o r k  a r e a  ******
c  scrtch   used in bsplvd, of size (kpm,kpm)
c  dbiatx   used to contain derivatives of b-splines, of size (kpm,m+1)
c	    with dbiatx(j,i+1) containing the i-th derivative of the
c	    j-th b-spline of interest
c
c******  o u t p u t  ******
c  q  the block, of size (nrow,kpm)
c  b  the corresponding piece of the right side, of size (nrow)
c
c******  m e t h o d  ******
c  the	k  collocation equations for the interval  (t(left),t(left+1))
c  are constructed with the aid of the subroutine  d i f e q u ( 2, .,
c  . ) and interspersed (in order) with the side conditions (if any) in
c  this interval, using  d i f e q u ( 3, ., . )  for the information.
c     the block  q  has  kpm  columns, corresponding to the  kpm  b-
c  splines of order  kpm  which have the interval (t(left),t(left+1))
c  in their support. the block's diagonal is part of the diagonal of the
c  total system. the first equation in this block not overlapped by the
c  preceding block is therefore equation  l o w r o w , with lowrow =
c  number of side conditions in preceding intervals (or blocks).
c
      integer kpm,left,nrow,   i,irow,iside,itermx,j,k,ll,lowrow,m,mode
     *			      ,mp1
      real b(1),dbiatx(kpm,1),q(nrow,kpm),scrtch(1),t(1),   dx,rho,sum
     *						      ,v(20),xm,xside,xx
      common /side/ m, iside, xside(10)
      common /other/ itermx,k,rho(19)
      mp1 = m+1
      do 10 j=1,kpm
	 do 10 i=1,nrow
   10	    q(i,j) = 0.
      xm = (t(left+1)+t(left))/2.
      dx = (t(left+1)-t(left))/2.
c
      ll = 1
      lowrow = iside
      do 30 irow=lowrow,nrow
	 if (ll .gt. k) 		go to 22
	 mode = 2
c	 next collocation point is ...
	 xx = xm + dx*rho(ll)
	 ll = ll + 1
c	 the corresp.collocation equation is next unless the next side
c	 condition occurs at a point at, or to the left of, the next
c	 collocation point.
	 if (iside .gt. m)		go to 24
	 if (xside(iside) .gt. xx)	go to 24
	 ll = ll - 1
   22	 mode = 3
	 xx = xside(iside)
   24	 call difequ ( mode, xx, v )
c	 the next equation, a collocation equation (mode = 2) or a side
c	 condition (mode = 3), reads
c   (*)   (v(m+1)*d**m + v(m)*d**(m-1) +...+ v(1)*d**0)f(xx) = v(m+2)
c	 in terms of the info supplied by  difequ . the corresponding
c	 equation for the b-coeffs of  f  therefore has the left side of
c	 (*), evaluated at each of the	kpm  b-splines having  xx  in
c	 their support, as its	kpm  possibly nonzero coefficients.
	 call bsplvd ( t, kpm, xx, left, scrtch, dbiatx, mp1 )
	 do 26 j=1,kpm
	    sum = 0.
	    do 25 i=1,mp1
   25	       sum = v(i)*dbiatx(j,i) + sum
   26	    q(irow,j) = sum
   30	 b(irow) = v(m+2)
					return
      end