void matrix_setup(complex_array& A) { int n = 4; A.get(0,0) = 3.0; A.get(0,1) =1.0; A.get(0,2) =-4.0; A.get(0,3) =2.0; A.get(1,0) =3.0; A.get(1,1) =1.0; A.get(1,2) =0.0; A.get(1,3) =2.0; A.get(2,0) =2.0; A.get(2,1) =13.0; A.get(2,2) =-1.0; A.get(2,3) =0.0; A.get(3,0) =-2.0; A.get(3,1) =3.0; A.get(3,2) =-1.0; A.get(3,3) =4.0; for (int i = 1; i < n; i++ ) { for (int j = 0; j < i; j++ ) std::swap(A.get(i,j),A.get(j,i)); } }
void lu_decompose_burke(int n, complex_array& a, int_array& ip, int ndim) { /*C C Un-transpose the matrix for Gauss elimination C DO 12 I=2,N DO 11 J=1,I-1 ARJ=A(I,J) A(I,J)=A(J,I) A(J,I)=ARJ 11 CONTINUE 12 CONTINUE */ // for (int i = 1; i < n; i++ ) // { // for (int j = 0; j < i; j++ ) // std::swap(a.get(i,j),a.get(j,i)); // } /* IFLG=0 DO 9 R=1,N */ complex_array d(n); for (int r = 0; r < n; r++ ) { bool iflg=false; /*C C STEP 1 C DO 1 K=1,N D(K)=A(K,R) 1 CONTINUE*/ for (int k = 0; k < n; k++ ) d[k]= a.get(k,r); /* C C STEPS 2 AND 3 C RM1=R-1 IF (RM1.LT.1) GO TO 4 DO 3 J=1,RM1 PJ=IP(J) ARJ=D(PJ) A(J,R)=ARJ D(PJ)=D(J) JP1=J+1 DO 2 I=JP1,N D(I)=D(I)-A(I,J)*ARJ 2 CONTINUE 3 CONTINUE 4 CONTINUE */ int rm1 = r - 1; if (rm1 >= 0) { for (int j=0; j < r; j++) { int pj = ip[j]; nec_complex arj = d[pj]; a.set(j,r,arj); d[pj] = d[j]; int jp1 = j + 1; for (int i=jp1;i<n;i++) d[i] -= a.get(i,j)*arj; } } /* C C STEP 4 C DMAX=REAL(D(R)*CONJG(D(R))) IP(R)=R RP1=R+1 IF (RP1.GT.N) GO TO 6 DO 5 I=RP1,N ELMAG=REAL(D(I)*CONJG(D(I))) IF (ELMAG.LT.DMAX) GO TO 5 DMAX=ELMAG IP(R)=I 5 CONTINUE 6 CONTINUE IF (DMAX.LT.1.E-10) IFLG=1 PR=IP(R) A(R,R)=D(PR) D(PR)=D(R) */ nec_float dmax = norm(d[r]);; ip[r] = r; int rp1 = r + 1; if (rp1 < n) { for (int i=rp1; i<n; i++) { nec_float elmag = norm(d[i]); if (elmag >= dmax) { dmax = elmag; ip[r] = i; } } } if (dmax < 1e-10) iflg = true; int pr = ip[r]; a.set(r,r,d[pr]); d[pr] = d[r]; /* C C STEP 5 C IF (RP1.GT.N) GO TO 8 ARJ=1./A(R,R) DO 7 I=RP1,N A(I,R)=D(I)*ARJ 7 CONTINUE 8 CONTINUE */ if (rp1 < n) { nec_complex arj = cplx_10() / a.get(r,r); for (int i=rp1; i<n; i++) { a.set(i,r,d[i] * arj); } } /* IF (IFLG.EQ.0) GO TO 9 WRITE(3,10) R,DMAX IFLG=0 */ if (iflg == true) { cout << "FACTR: PIVOT(" << r << ")=" << dmax; iflg = false; } } // increment ip array for (int i=0;i<n;i++) ip[i] += 1; /* cout << "solved = "; to_octave(a,n,ndim); cout << "ip = "; to_octave(ip,n); */ }