3 C ..................................................................
8 C TO SOLVE A SYSTEM OF SIMULTANEOUS LINEAR EQUATIONS WITH
9 C SYMMETRIC COEFFICIENT MATRIX UPPER TRIANGULAR PART OF WHICH
10 C IS ASSUMED TO BE STORED COLUMNWISE.
13 C CALL GELS(R,A,M,N,EPS,IER,AUX)
15 C DESCRIPTION OF PARAMETERS
16 C R - M BY N RIGHT HAND SIDE MATRIX. (DESTROYED)
17 C ON RETURN R CONTAINS THE SOLUTION OF THE EQUATIONS.
18 C A - UPPER TRIANGULAR PART OF THE SYMMETRIC
19 C M BY M COEFFICIENT MATRIX. (DESTROYED)
20 C M - THE NUMBER OF EQUATIONS IN THE SYSTEM.
21 C N - THE NUMBER OF RIGHT HAND SIDE VECTORS.
22 C EPS - AN INPUT CONSTANT WHICH IS USED AS RELATIVE
23 C TOLERANCE FOR TEST ON LOSS OF SIGNIFICANCE.
24 C IER - RESULTING ERROR PARAMETER CODED AS FOLLOWS
26 C IER=-1 - NO RESULT BECAUSE OF M LESS THAN 1 OR
27 C PIVOT ELEMENT AT ANY ELIMINATION STEP
29 C IER=K - WARNING DUE TO POSSIBLE LOSS OF SIGNIFI-
30 C CANCE INDICATED AT ELIMINATION STEP K+1,
31 C WHERE PIVOT ELEMENT WAS LESS THAN OR
32 C EQUAL TO THE INTERNAL TOLERANCE EPS TIMES
33 C ABSOLUTELY GREATEST MAIN DIAGONAL
34 C ELEMENT OF MATRIX A.
35 C AUX - AN AUXILIARY STORAGE ARRAY WITH DIMENSION M-1.
38 C UPPER TRIANGULAR PART OF MATRIX A IS ASSUMED TO BE STORED
39 C COLUMNWISE IN M*(M+1)/2 SUCCESSIVE STORAGE LOCATIONS, RIGHT
40 C HAND SIDE MATRIX R COLUMNWISE IN N*M SUCCESSIVE STORAGE
41 C LOCATIONS. ON RETURN SOLUTION MATRIX R IS STORED COLUMNWISE
43 C THE PROCEDURE GIVES RESULTS IF THE NUMBER OF EQUATIONS M IS
44 C GREATER THAN 0 AND PIVOT ELEMENTS AT ALL ELIMINATION STEPS
45 C ARE DIFFERENT FROM 0. HOWEVER WARNING IER=K - IF GIVEN -
46 C INDICATES POSSIBLE LOSS OF SIGNIFICANCE. IN CASE OF A WELL
47 C SCALED MATRIX A AND APPROPRIATE TOLERANCE EPS, IER=K MAY BE
48 C INTERPRETED THAT MATRIX A HAS THE RANK K. NO WARNING IS
50 C ERROR PARAMETER IER=-1 DOES NOT NECESSARILY MEAN THAT
51 C MATRIX A IS SINGULAR, AS ONLY MAIN DIAGONAL ELEMENTS
52 C ARE USED AS PIVOT ELEMENTS. POSSIBLY SUBROUTINE GELG (WHICH
53 C WORKS WITH TOTAL PIVOTING) WOULD BE ABLE TO FIND A SOLUTION.
55 C SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
59 C SOLUTION IS DONE BY MEANS OF GAUSS-ELIMINATION WITH
60 C PIVOTING IN MAIN DIAGONAL, IN ORDER TO PRESERVE
61 C SYMMETRY IN REMAINING COEFFICIENT MATRICES.
63 C ..................................................................
68 #define fabsl(x) ( (x) < 0.0L ? -(x) : (x) )
70 int gels( A, R, M, EPS, AUX )
77 int II, LL, LLD, LR, LT, LST, LLST, LEND;
78 long double tb, piv, tol, pivi;
87 /* SEARCH FOR GREATEST MAIN DIAGONAL ELEMENT */
89 /* Diagonal elements are at A(i,i) = 0, 2, 5, 9, 14, ...
90 * A(i,j) = A( i(i-1)/2 + j - 1 )
110 C MAIN DIAGONAL ELEMENT A(I)=A(J,J) IS FIRST PIVOT ELEMENT.
111 C PIV CONTAINS THE ABSOLUTE VALUE OF A(I).
114 /* START ELIMINATION LOOP */
117 for( K=1; K<=M; K++ )
119 /* TEST ON USEFULNESS OF SYMMETRIC ALGORITHM */
122 printf( "gels: piv <= 0 at K = %d\n", K );
138 /* PIVOT ROW REDUCTION AND ROW INTERCHANGE IN RIGHT HAND SIDE R */
139 pivi = 1.0L / A[I-1];
145 /* IS ELIMINATION TERMINATED */
149 C ROW AND COLUMN INTERCHANGE AND PIVOT ROW REDUCTION IN MATRIX A.
150 C ELEMENTS OF PIVOT COLUMN ARE SAVED IN AUXILIARY VECTOR AUX.
152 LR = LST + (LT*(K+J-1))/2;
155 for( II=K; II<=LEND; II++ )
174 /* SAVE COLUMN INTERCHANGE INFORMATION */
176 /* ELEMENT REDUCTION AND SEARCH FOR NEXT PIVOT */
180 for( II=K; II<=LEND; II++ )
185 for( LLD=II; LLD<=LEND; LLD++ )
189 A[L-1] += pivi * A[LL-1];
193 tb =fabsl( A[LR-1] );
202 R[LL-1] += pivi * R[LR-1];
205 /* END OF ELIMINATION LOOP */
207 /* BACK SUBSTITUTION AND BACK INTERCHANGE */
211 printf( "gels: LEND = %d\n", LEND );
217 for( I=2; I<=M; I++ )
226 for( LT=II; LT<=LEND; LT++ )
230 tb -= A[K-1] * R[LL-1];
238 printf( "gels error %d!\n", IER );