Go to the documentation of this file.
48GJacobi :: ~GJacobi() { }
51#define GJacobi_ZERO_CHECK_TOL 1.e-40
62 double eps, eptola, eptolb, akk, ajj, ab, check, sqch, d1, d2, den, ca, cg, ak, bk, xj, xk;
64 int jm1, kp1, km1, jp1;
82 for (
int i = 1; i <= n; i++ ) {
85 d.
at(i) = a.
at(i, i) / b.
at(i, i);
103# ifdef DETAILED_REPORT
109 eps = pow(0.01, (
double ) nsweep);
111 for (
int j = 1; j <= nr; j++ ) {
113 for (
int k = jj; k <= n; k++ ) {
114 eptola = ( a.
at(j, k) * a.
at(j, k) ) / ( a.
at(j, j) * a.
at(k, k) );
115 eptolb = ( b.
at(j, k) * b.
at(j, k) ) / ( b.
at(j, j) * b.
at(k, k) );
116 if ( ( eptola < eps ) && ( eptolb < eps ) ) {
123 akk = a.
at(k, k) * b.
at(j, k) - b.
at(k, k) * a.
at(j, k);
124 ajj = a.
at(j, j) * b.
at(j, k) - b.
at(j, j) * a.
at(j, k);
125 ab = a.
at(j, j) * b.
at(k, k) - a.
at(k, k) * b.
at(j, j);
126 check = ( ab * ab + 4.0 * akk * ajj ) / 4.0;
129 }
else if ( check < 0.0 ) {
137 if ( fabs(d2) > fabs(d1) ) {
146 cg = -a.
at(j, k) / a.
at(k, k);
152 if ( ( n - 2 ) != 0 ) {
157 if ( ( jm1 - 1 ) >= 0 ) {
158 for (
int i = 1; i <= jm1; i++ ) {
163 a.
at(i, j) = aj + cg * ak;
164 b.
at(i, j) = bj + cg * bk;
165 a.
at(i, k) = ak + ca * aj;
166 b.
at(i, k) = bk + ca * bj;
170 if ( ( kp1 - n ) <= 0 ) {
171 for (
int i = kp1; i <= n; i++ ) {
176 a.
at(j, i) = aj + cg * ak;
177 b.
at(j, i) = bj + cg * bk;
178 a.
at(k, i) = ak + ca * aj;
179 b.
at(k, i) = bk + ca * bj;
183 if ( ( jp1 - km1 ) <= 0 ) {
184 for (
int i = jp1; i <= km1; i++ ) {
189 a.
at(j, i) = aj + cg * ak;
190 b.
at(j, i) = bj + cg * bk;
191 a.
at(i, k) = ak + ca * aj;
192 b.
at(i, k) = bk + ca * bj;
199 a.
at(k, k) = ak + 2.0 *ca *a.
at(j, k) + ca *ca *a.
at(j, j);
200 b.
at(k, k) = bk + 2.0 *ca *b.
at(j, k) + ca *ca *b.
at(j, j);
201 a.
at(j, j) = a.
at(j, j) + 2.0 *cg *a.
at(j, k) + cg * cg * ak;
202 b.
at(j, j) = b.
at(j, j) + 2.0 *cg *b.
at(j, k) + cg * cg * bk;
208 for (
int i = 1; i <= n; i++ ) {
211 x.
at(i, j) = xj + cg * xk;
212 x.
at(i, k) = xk + ca * xj;
220#ifdef DETAILED_REPORT
225 for (
int i = 1; i <= n; i++ ) {
229 eigv.
at(i) = a.
at(i, i) / b.
at(i, i);
232# ifdef DETAILED_REPORT
241 for (
int i = 1; i <= n; i++ ) {
242 double tol =
rtol * d.
at(i);
243 double dif = ( eigv.
at(i) - d.
at(i) );
244 if ( fabs(dif) > tol ) {
253 for (
int j = 1; j <= nr; j++ ) {
255 for (
int k = jj; k <= n; k++ ) {
256 double epsa = ( a.
at(j, k) * a.
at(j, k) ) / ( a.
at(j, j) * a.
at(k, k) );
257 double epsb = ( b.
at(j, k) * b.
at(j, k) ) / ( b.
at(j, j) * b.
at(k, k) );
258 if ( ( epsa < eps ) && ( epsb < eps ) ) {
276 }
while ( nsweep <
nsmax );
279 for (
int i = 1; i <= n; i++ ) {
280 for (
int j = 1; j <= n; j++ ) {
281 a.
at(j, i) = a.
at(i, j);
282 b.
at(j, i) = b.
at(i, j);
286 for (
int j = 1; j <= n; j++ ) {
287 double bb = sqrt( fabs( b.
at(j, j) ) );
288 for (
int k = 1; k <= n; k++ ) {
virtual void printYourself() const
void resize(Index rows, Index cols)
*Prints matrix to stdout Useful for debugging void printYourself() const
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
void beUnitMatrix()
Sets receiver to unity matrix.
bool isSquare() const
Returns nonzero if receiver is square matrix.
NumericalMethod(Domain *d, EngngModel *m)
#define GJacobi_ZERO_CHECK_TOL
#define OOFEM_LOG_DEBUG(...)
This page is part of the
OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak
Bořek Patzák
Project e-mail:
oofem@fsv.cvut.cz
Generated at for OOFEM by
doxygen
1.15.0 written by Dimitri van Heesch,
© 1997-2011