2
$Id: dsl.pas,v 1.2 2002/09/07 15:43:01 peter Exp $
3
This file is part of the Numlib package.
4
Copyright (c) 1986-2000 by
5
Kees van Ginneken, Wil Kortsmit and Loek van Reij of the
6
Computational centre of the Eindhoven University of Technology
8
FPC port Code by Marco van de Voort (marco@freepascal.org)
9
documentation by Michael van Canneyt (Michael@freepascal.org)
11
Unknown unit. There doesn't exist any documentation for it, it isn't
12
commented, and I don't recognize the algortism directly.
13
I added some comments, since suffixes of the procedures seem to indicate
14
some features of the matrixtype (from unit SLE)
15
So probably Some pivot matrix?
17
This code was probably internal in older libs, and only exported
20
See the file COPYING.FPC, included in this distribution,
21
for details about the copyright.
23
This program is distributed in the hope that it will be useful,
24
but WITHOUT ANY WARRANTY; without even the implied warranty of
25
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
27
**********************************************************************}
36
{Gen=generic, matrix without special or unknown ordering}
37
Procedure dslgen(n, rwidth: ArbInt; Var alu: ArbFloat; Var p: ArbInt;
38
Var b, x: ArbFloat; Var term: ArbInt);
40
{"tridiagonal matrix"}
41
Procedure dslgtr(n: ArbInt; Var l1, d1, u1, u2: ArbFloat;
42
Var p: boolean; Var b, x: ArbFloat; Var term: ArbInt);
45
Procedure dslgsy(n, rwidth: ArbInt; Var alt: ArbFloat; Var p: ArbInt;
46
Var q: boolean; Var b, x: ArbFloat; Var term: ArbInt);
48
{Symmetrical positive definitive matrix}
49
Procedure dslgpd(n, rwidth: ArbInt; Var al, b, x: ArbFloat;
52
{Generic "band" matrix}
53
Procedure dslgba(n, lb, rb, rwa: ArbInt; Var au: ArbFloat; rwl: ArbInt;
54
Var l: ArbFloat; Var p: ArbInt; Var b, x: ArbFloat;
57
{Positive definite bandmatrix}
58
Procedure dslgpb(n, lb, rwidth: ArbInt; Var al, b, x: ArbFloat;
61
{Special tridiagonal matrix}
62
Procedure dsldtr(n:ArbInt; Var l, d, u, b, x: ArbFloat; Var term: ArbInt);
66
Procedure dslgen(n, rwidth: ArbInt; Var alu: ArbFloat; Var p: ArbInt;
67
Var b, x: ArbFloat; Var term: ArbInt);
71
indk, j, k, indexpivot, kmin1 : ArbInt;
72
h, pivot, s : ArbFloat;
74
palu, pb, px : ^arfloat1;
77
If (n<1) Or (rwidth<1) Then
86
move(pb^, px^, n*sizeof(ArbFloat));
90
If indexpivot <> k Then
93
px^[k] := px^[indexpivot];
102
s := s-palu^[(k-1)*rwidth+j]*px^[j];
107
while (k>1) and success Do
110
indk := (k-1)*rwidth;
111
pivot := palu^[indk+k];
118
s := s-palu^[indk+j]*px^[j];
128
Procedure dslgtr(n: ArbInt; Var l1, d1, u1, u2: ArbFloat;
129
Var p: boolean; Var b, x: ArbFloat; Var term: ArbInt);
132
i, j, nmin1 : ArbInt;
135
pd1, pu1, pu2, pb, px : ^arfloat1;
144
pl1 := @l1; pd1 := @d1; pu1 := @u1; pu2 := @u2; pb := @b; px := @x;
146
move(pb^, px^, n*sizeof(ArbFloat));
149
while (i<>n) and success Do
152
success := pd1^[i]<>0
166
px^[j] := h-pl1^[j]*px^[i]
169
px^[j] := px^[j]-pl1^[j]*px^[i]
176
px^[nmin1] := (px^[nmin1]-pu1^[nmin1]*px^[n])/di
178
For i:=n-2 Downto 1 Do
181
px^[i] := (px^[i]-pu1^[i]*px^[i+1]-pu2^[i]*px^[i+2])/di
190
Procedure dslgsy(n, rwidth: ArbInt; Var alt: ArbFloat; Var p: ArbInt;
191
Var q: boolean; Var b, x: ArbFloat; Var term: ArbInt);
194
i, indexpivot, imin1, j, jmin1, iplus1, imin2, ns, ii : ArbInt;
195
success, regular : boolean;
196
h, ct, di : ArbFloat;
197
palt, pb, px, y, l, d, u, v : ^arfloat1;
202
If (n<1) Or (rwidth<1) Then
212
ns := n*sizeof(ArbFloat);
222
while (i<>n) and success Do
225
success := palt^[ii]<>0;
232
indexpivot := pp^[i];
233
If indexpivot <> i Then
236
y^[i] := y^[indexpivot];
238
End {indexpivot <> i}
251
h := h-palt^[(i-1)*rwidth+jmin1]*y^[j]
259
l^[1] := palt^[rwidth+1];
260
d^[2] := palt^[rwidth+2];
272
l^[imin1] := palt^[ii+imin1];
273
d^[i] := palt^[ii+i];
275
u^[imin1] := palt^[ii-rwidth+i];
276
v^[imin2] := palt^[ii-2*rwidth+i]
278
dslgtr(n, l^[1], d^[1], u^[1], v^[1], pq^[1], y^[1], px^[1], term);
287
For j:=iplus1 To n Do
288
h := h-palt^[(j-1)*rwidth+imin1]*px^[j];
293
indexpivot := pp^[i];
294
If indexpivot <> i Then
297
px^[i] := px^[indexpivot];
299
End {indexpivot <> i}
313
Procedure dslgpd(n, rwidth: ArbInt; Var al, b, x: ArbFloat;
317
ii, imin1, i, j : ArbInt;
320
pal, pb, px : ^arfloat1;
322
If (n<1) Or (rwidth<1) Then
330
move(pb^, px^, n*sizeof(ArbFloat));
334
while (i<>n) and success Do
337
success := pal^[ii]<>0;
348
h := h-pal^[ii+j]*px^[j];
356
h := h-pal^[(j-1)*rwidth+i]*px^[j];
357
px^[i] := h/pal^[(i-1)*rwidth+i]
366
Procedure dslgba(n, lb, rb, rwa: ArbInt; Var au: ArbFloat; rwl: ArbInt;
367
Var l: ArbFloat; Var p: ArbInt; Var b, x: ArbFloat;
371
i, j, k, ipivot, ubi, ubj : ArbInt;
373
pau, pl, px, pb : ^arfloat1;
377
If (n<1) Or (lb<0) Or (rb<0) Or (lb>n-1)
378
Or (rb>n-1) Or (rwa<1) Or (rwl<0) Then
388
move(pb^, px^, n*sizeof(ArbFloat));
396
px^[k] := px^[ipivot];
402
px^[i] := px^[i]-px^[k]*pl^[(k-1)*rwl+i-k]
407
while (i >= 1) and (term=1) Do
413
h := h-pau^[(i-1)*rwa+j]*px^[i+j-1];
414
pivot := pau^[(i-1)*rwa+1];
423
Procedure dslgpb(n, lb, rwidth: ArbInt; Var al, b, x: ArbFloat;
427
ll, ii, llmin1, p, i, q, k : ArbInt;
428
h, hh, alim : ArbFloat;
429
pal, pb, px : ^arfloat1;
431
If (lb<0) Or (lb>n-1) Or (n<1) Or (rwidth<1) Then
439
move(pb^, px^, n*sizeof(ArbFloat));
445
while (i <= n) and (term=1) Do
452
For k:=llmin1 Downto p Do
455
h := h-pal^[ii+k]*px^[q]
473
For k:=llmin1 Downto p Do
476
h := h-pal^[(q-1)*rwidth+k]*px^[q]
478
px^[i] := h/pal^[(i-1)*rwidth+ll]
483
Procedure dsldtr(n:ArbInt; Var l, d, u, b, x: ArbFloat; Var term: ArbInt);
488
pd, pu, pb, px : ^arfloat1;
501
move(pb^, px^, n*sizeof(ArbFloat));
507
px^[j] := px^[j]-pl^[j]*px^[i]
517
while (i >= 1) and (term=1) Do
523
px^[i] := (px^[i]-pu^[i]*px^[i+1])/di;
531
Revision 1.2 2002/09/07 15:43:01 peter
532
* old logs removed and tabs fixed
534
Revision 1.1 2002/01/29 17:55:18 peter
535
* splitted to base and extra