Doxygen Source Code Documentation
eis_corth.c File Reference
#include "f2c.h"
Go to the source code of this file.
Functions | |
int | corth_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *ar, doublereal *ai, doublereal *ortr, doublereal *orti) |
Function Documentation
|
Definition at line 8 of file eis_corth.c. References abs, mp, pythag_(), and scale. Referenced by cg_().
00011 { 00012 /* System generated locals */ 00013 integer ar_dim1, ar_offset, ai_dim1, ai_offset, i__1, i__2, i__3; 00014 doublereal d__1, d__2; 00015 00016 /* Builtin functions */ 00017 double sqrt(doublereal); 00018 00019 /* Local variables */ 00020 static doublereal f, g, h__; 00021 static integer i__, j, m; 00022 static doublereal scale; 00023 static integer la; 00024 static doublereal fi; 00025 static integer ii, jj; 00026 static doublereal fr; 00027 static integer mp; 00028 extern doublereal pythag_(doublereal *, doublereal *); 00029 static integer kp1; 00030 00031 00032 00033 /* THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF */ 00034 /* THE ALGOL PROCEDURE ORTHES, NUM. MATH. 12, 349-368(1968) */ 00035 /* BY MARTIN AND WILKINSON. */ 00036 /* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */ 00037 00038 /* GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINE */ 00039 /* REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS */ 00040 /* LOW THROUGH IGH TO UPPER HESSENBERG FORM BY */ 00041 /* UNITARY SIMILARITY TRANSFORMATIONS. */ 00042 00043 /* ON INPUT */ 00044 00045 /* NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */ 00046 /* ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */ 00047 /* DIMENSION STATEMENT. */ 00048 00049 /* N IS THE ORDER OF THE MATRIX. */ 00050 00051 /* LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */ 00052 /* SUBROUTINE CBAL. IF CBAL HAS NOT BEEN USED, */ 00053 /* SET LOW=1, IGH=N. */ 00054 00055 /* AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */ 00056 /* RESPECTIVELY, OF THE COMPLEX INPUT MATRIX. */ 00057 00058 /* ON OUTPUT */ 00059 00060 /* AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */ 00061 /* RESPECTIVELY, OF THE HESSENBERG MATRIX. INFORMATION */ 00062 /* ABOUT THE UNITARY TRANSFORMATIONS USED IN THE REDUCTION */ 00063 /* IS STORED IN THE REMAINING TRIANGLES UNDER THE */ 00064 /* HESSENBERG MATRIX. */ 00065 00066 /* ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THE */ 00067 /* TRANSFORMATIONS. ONLY ELEMENTS LOW THROUGH IGH ARE USED. */ 00068 00069 /* CALLS PYTHAG FOR DSQRT(A*A + B*B) . */ 00070 00071 /* QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */ 00072 /* MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 00073 */ 00074 00075 /* THIS VERSION DATED AUGUST 1983. */ 00076 00077 /* ------------------------------------------------------------------ 00078 */ 00079 00080 /* Parameter adjustments */ 00081 ai_dim1 = *nm; 00082 ai_offset = ai_dim1 + 1; 00083 ai -= ai_offset; 00084 ar_dim1 = *nm; 00085 ar_offset = ar_dim1 + 1; 00086 ar -= ar_offset; 00087 --orti; 00088 --ortr; 00089 00090 /* Function Body */ 00091 la = *igh - 1; 00092 kp1 = *low + 1; 00093 if (la < kp1) { 00094 goto L200; 00095 } 00096 00097 i__1 = la; 00098 for (m = kp1; m <= i__1; ++m) { 00099 h__ = 0.; 00100 ortr[m] = 0.; 00101 orti[m] = 0.; 00102 scale = 0.; 00103 /* .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) .......... 00104 */ 00105 i__2 = *igh; 00106 for (i__ = m; i__ <= i__2; ++i__) { 00107 /* L90: */ 00108 scale = scale + (d__1 = ar[i__ + (m - 1) * ar_dim1], abs(d__1)) + 00109 (d__2 = ai[i__ + (m - 1) * ai_dim1], abs(d__2)); 00110 } 00111 00112 if (scale == 0.) { 00113 goto L180; 00114 } 00115 mp = m + *igh; 00116 /* .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... */ 00117 i__2 = *igh; 00118 for (ii = m; ii <= i__2; ++ii) { 00119 i__ = mp - ii; 00120 ortr[i__] = ar[i__ + (m - 1) * ar_dim1] / scale; 00121 orti[i__] = ai[i__ + (m - 1) * ai_dim1] / scale; 00122 h__ = h__ + ortr[i__] * ortr[i__] + orti[i__] * orti[i__]; 00123 /* L100: */ 00124 } 00125 00126 g = sqrt(h__); 00127 f = pythag_(&ortr[m], &orti[m]); 00128 if (f == 0.) { 00129 goto L103; 00130 } 00131 h__ += f * g; 00132 g /= f; 00133 ortr[m] = (g + 1.) * ortr[m]; 00134 orti[m] = (g + 1.) * orti[m]; 00135 goto L105; 00136 00137 L103: 00138 ortr[m] = g; 00139 ar[m + (m - 1) * ar_dim1] = scale; 00140 /* .......... FORM (I-(U*UT)/H) * A .......... */ 00141 L105: 00142 i__2 = *n; 00143 for (j = m; j <= i__2; ++j) { 00144 fr = 0.; 00145 fi = 0.; 00146 /* .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... */ 00147 i__3 = *igh; 00148 for (ii = m; ii <= i__3; ++ii) { 00149 i__ = mp - ii; 00150 fr = fr + ortr[i__] * ar[i__ + j * ar_dim1] + orti[i__] * ai[ 00151 i__ + j * ai_dim1]; 00152 fi = fi + ortr[i__] * ai[i__ + j * ai_dim1] - orti[i__] * ar[ 00153 i__ + j * ar_dim1]; 00154 /* L110: */ 00155 } 00156 00157 fr /= h__; 00158 fi /= h__; 00159 00160 i__3 = *igh; 00161 for (i__ = m; i__ <= i__3; ++i__) { 00162 ar[i__ + j * ar_dim1] = ar[i__ + j * ar_dim1] - fr * ortr[i__] 00163 + fi * orti[i__]; 00164 ai[i__ + j * ai_dim1] = ai[i__ + j * ai_dim1] - fr * orti[i__] 00165 - fi * ortr[i__]; 00166 /* L120: */ 00167 } 00168 00169 /* L130: */ 00170 } 00171 /* .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) .......... */ 00172 i__2 = *igh; 00173 for (i__ = 1; i__ <= i__2; ++i__) { 00174 fr = 0.; 00175 fi = 0.; 00176 /* .......... FOR J=IGH STEP -1 UNTIL M DO -- .......... */ 00177 i__3 = *igh; 00178 for (jj = m; jj <= i__3; ++jj) { 00179 j = mp - jj; 00180 fr = fr + ortr[j] * ar[i__ + j * ar_dim1] - orti[j] * ai[i__ 00181 + j * ai_dim1]; 00182 fi = fi + ortr[j] * ai[i__ + j * ai_dim1] + orti[j] * ar[i__ 00183 + j * ar_dim1]; 00184 /* L140: */ 00185 } 00186 00187 fr /= h__; 00188 fi /= h__; 00189 00190 i__3 = *igh; 00191 for (j = m; j <= i__3; ++j) { 00192 ar[i__ + j * ar_dim1] = ar[i__ + j * ar_dim1] - fr * ortr[j] 00193 - fi * orti[j]; 00194 ai[i__ + j * ai_dim1] = ai[i__ + j * ai_dim1] + fr * orti[j] 00195 - fi * ortr[j]; 00196 /* L150: */ 00197 } 00198 00199 /* L160: */ 00200 } 00201 00202 ortr[m] = scale * ortr[m]; 00203 orti[m] = scale * orti[m]; 00204 ar[m + (m - 1) * ar_dim1] = -g * ar[m + (m - 1) * ar_dim1]; 00205 ai[m + (m - 1) * ai_dim1] = -g * ai[m + (m - 1) * ai_dim1]; 00206 L180: 00207 ; 00208 } 00209 00210 L200: 00211 return 0; 00212 } /* corth_ */ |