1
function spcho=chfact(A)
2
//cholesky factors, returned in a tlist
3
//spcho = {xlnz, nnzl, xsuper, xlindx, lindx, snode,
4
// split, tmpsiz, perm, invp, lnz}.
6
// invp=spcho('invp');xlnz=spcho('xlnz');
7
// xlindx=spcho('xlindx');lindx=spcho('lindx');lnz=spcho('lnz');
8
// P=sparse([(1:m)',invp],ones(invp),[m,m]);
9
// adjncy = spcompack(xlnz,xlindx,lindx);
10
// R=adj2sp(xlnz,adjncy,lnz);
13
if size(A,2) ~= m | type(A)~=5 | A == [] then,
14
error('Matrix must be square, sparse and nonempty.');
17
[xadj,adjncy,v]=sp2adj(A-diag(diag(A)));
18
[perm,invp,nofsub]=ordmmd(xadj,adjncy,neqns);
20
spcho=symfct(xadj,adjncy,perm,invp,cachsz,neqns);
21
[xadjf,adjncyf,v]=sp2adj(A);
22
spcho=inpnv(xadjf,adjncyf,v,spcho);
24
spcho=blkfc1(spcho,level);
26
function [spcho]= blkfc1(spcho,level)
27
//retrieves Fortran variables (see sfinit.f,bfinit.f,symfct.f )
28
//[xlnz,nnzl,xsuper,xlindx,lindx,snode,split,tmpsiz,perm,invp,lnz]=spcho(2:12);
29
xsuper=spcho('xsuper');
30
nsuper=size(xsuper,1)-1;
35
iwsiz = 2*neqns+2*nsuper;
36
iwork = zeros(iwsiz,1);
37
tmpsiz = spcho('tmpsiz');
38
tmpvec= zeros(tmpsiz,1);
40
// calling blkfc1i primitive
41
[lnz,iflag]=blkfc1i(neqns,nsuper,xsuper,snode,spcho('split'),spcho('xlindx'),spcho('lindx'),spcho('xlnz'),lnz,iwsiz,iwork,tmpsiz,tmpvec,iflag,level);
43
if max(abs(lnz)) > 5d63 then
44
warning(' Possible matrix is not positive definite');
49
error('nonpositive diag. encountered, matrix is not positive def'),
51
error('Insufficient working storage in blkfct, temp(*)'),
53
error('Insufficient working storage in blkfct, iwork(*)'),
58
function rhs=blkslv(spcho,rhs)
60
//[xlnz,nnzl,xsuper,xlindx,lindx,snode,split,tmpsiz,perm,invp,lnz]=spcho(2:12);
61
xsuper=spcho('xsuper');
62
nsuper=size(xsuper,1)-1;
64
rhs=blkslvi(nsuper,xsuper,spcho('xlindx'),spcho('lindx'),spcho('xlnz'),...
68
function [spcho]=inpnv(xadjf,adjf,anzf,spcho)
70
//[xlnz,nnzl,xsuper,xlindx,lindx,snode,split,tmpsiz,perm,invp,lnz]=spcho(2:12);
72
xsuper=spcho('xsuper');
73
neqns=size(xadjf,1)-1,
74
nsuper=size(xsuper,1)-1,
76
offset=zeros(neqns,1);
77
lnz=zeros(spcho('nnzl'),1);
79
lnz = inpnvi(neqns,xadjf,adjf,anzf,spcho('perm'),spcho('invp'),nsuper,...
80
xsuper,spcho('xlindx'),spcho('lindx'),spcho('xlnz'),lnz,offset);
84
function [spcho] = symfct(xadj,adjncy,perm,invp,cachsz,neqns)
92
if size(perm)~= [neqns,1] then, error(' SYMFCT requires PERM to be neqns x 1'),
94
if size(invp)~= [neqns,1] then, error(' SYMFCT requires INVN to be neqns x 1'),
96
if size(cachsz)~= [1,1] then, error(' SYMFCT requires CACHSZ to be 1 x 1'),
99
[perm,invp,colcnt,nnzl,nsub,nsuper,snode,xsuper,iflag]=...
100
sfinit(neqns,nnza,xadj,adjncy,perm,invp,iwsiz,iwork);
102
if iflag == -1 then error(' Insufficient working storage in sfinit'),end;
104
bb=xsuper(1:nsuper+1,1);
106
iwsiz = 2*nsuper+2*neqns+1;
107
iwork=zeros(iwsiz,1);
110
[xlindx,lindx,xlnz,iflag]=symfcti(neqns,nnza,xadj,adjncy,perm,...
111
invp,colcnt,nsuper,xsuper,snode,nsub,iwsiz,iwork)
112
if iflag == -1 then error(' Insufficient working storage in symfct'),end;
113
if iflag == -2 then error(' Inconsistancy in the input in symfct'),end;
115
[tmpsiz,split]=bfinit(neqns,nsuper,xsuper,snode,xlindx,lindx,cachsz)
117
spcho = tlist(['chol','xlnz','nnzl','xsuper','xlindx','lindx','snode','split',...
118
'tmpsiz','perm','invp','lnz'],...
119
xlnz,nnzl,xsuper,xlindx,lindx,snode,split,tmpsiz,perm,invp,[])