subroutine eqblok ( t, n, kpm, work1, work2, * bloks, lenblk, integs, nbloks, b ) c from * a practical guide to splines * by c. de boor calls putit(difequ,bsplvd(bsplvb)) c to be called in c o l l o c c c****** i n p u t ****** c t the knot sequence, of length n+kpm c n the dimension of the approximating spline space, i.e., the order c of the linear system to be constructed. c kpm = k+m, the order of the approximating spline c lenblk the maximum length of the array bloks as allowed by the c dimension statement in colloc . c c****** w o r k a r e a s ****** c work1 used in putit, of size (kpm,kpm) c work2 used in putit, of size (kpm,m+1) c c****** o u t p u t ****** c bloks the coefficient matrix of the linear system, stored in al- c most block diagonal form, of size c kpm*sum(integs(1,i) , i=1,...,nbloks) c integs an integer array, of size (3,nbloks), describing the block c structure. c integs(1,i) = number of rows in block i c integs(2,i) = number of columns in block i c integs(3,i) = number of elimination steps which can be c carried out in block i before pivoting might c bring in an equation from the next block. c nbloks number of blocks, equals number of polynomial pieces c b the right side of the linear system, stored corresponding to the c almost block diagonal form, of size sum(integs(1,i) , i=1,..., c nbloks). c c****** m e t h o d ****** c each breakpoint interval gives rise to a block in the linear system. c this block is determined by the k colloc.equations in the interval c with the side conditions (if any) in the interval interspersed ap- c propriately, and involves the kpm b-splines having the interval in c their support. correspondingly, such a block has nrow = k + isidel c rows, with isidel = number of side conditions in this and the prev- c ious intervals, and ncol = kpm columns. c further, because the interior knots have multiplicity k, we can c carry out (in slvblk) k elimination steps in a block before pivot- c ing might involve an equation from the next block. in the last block, c of course, all kpm elimination steps will be carried out (in slvblk). c c see the detailed comments in the solveblok package for further in- c formation about the almost block diagonal form used here. integer integs(3,1),kpm,lenblk,n,nbloks, i,index,indexb,iside * ,isidel,itermx,k,left,m,nrow real b(1),bloks(1),t(1),work1(1),work2(1), rho,xside common /side/ m, iside, xside(10) common /other/ itermx,k,rho(19) index = 1 indexb = 1 i = 0 iside = 1 do 20 left=kpm,n,k i = i+1 c determine integs(.,i) integs(2,i) = kpm if (left .lt. n) go to 14 integs(3,i) = kpm isidel = m go to 16 14 integs(3,i) = k c at this point, iside-1 gives the number of side conditions c incorporated so far. adding to this the side conditions in the c current interval gives the number isidel . isidel = iside-1 15 if (isidel .eq. m) go to 16 if (xside(isidel+1) .ge. t(left+1)) * go to 16 isidel = isidel+1 go to 15 16 nrow = k + isidel integs(1,i) = nrow c the detailed equations for this block are generated and put c together in p u t i t . if (lenblk .lt. index+nrow*kpm-1)go to 999 call putit(t,kpm,left,work1,work2,bloks(index),nrow,b(indexb)) index = index + nrow*kpm 20 indexb = indexb + nrow nbloks = i return 999 print 699,lenblk 699 format(11h **********/23h the assigned dimension,i5 * ,38h for bloks in colloc is too small.) stop end