00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef TEMPLATE_LAPACK_LASRT_HEADER
00038 #define TEMPLATE_LAPACK_LASRT_HEADER
00039
00040
00041 template<class Treal>
00042 int template_lapack_lasrt(const char *id, const integer *n, Treal *d__, integer *
00043 info)
00044 {
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 integer i__1, i__2;
00088
00089 integer endd, i__, j;
00090 integer stack[64] ;
00091 Treal dmnmx, d1, d2, d3;
00092 integer start;
00093 integer stkpnt, dir;
00094 Treal tmp;
00095 #define stack_ref(a_1,a_2) stack[(a_2)*2 + a_1 - 3]
00096
00097 --d__;
00098
00099
00100 *info = 0;
00101 dir = -1;
00102 if (template_blas_lsame(id, "D")) {
00103 dir = 0;
00104 } else if (template_blas_lsame(id, "I")) {
00105 dir = 1;
00106 }
00107 if (dir == -1) {
00108 *info = -1;
00109 } else if (*n < 0) {
00110 *info = -2;
00111 }
00112 if (*info != 0) {
00113 i__1 = -(*info);
00114 template_blas_erbla("LASRT ", &i__1);
00115 return 0;
00116 }
00117
00118
00119
00120 if (*n <= 1) {
00121 return 0;
00122 }
00123
00124 stkpnt = 1;
00125 stack_ref(1, 1) = 1;
00126 stack_ref(2, 1) = *n;
00127 L10:
00128 start = stack_ref(1, stkpnt);
00129 endd = stack_ref(2, stkpnt);
00130 --stkpnt;
00131 if (endd - start <= 20 && endd - start > 0) {
00132
00133
00134
00135 if (dir == 0) {
00136
00137
00138
00139 i__1 = endd;
00140 for (i__ = start + 1; i__ <= i__1; ++i__) {
00141 i__2 = start + 1;
00142 for (j = i__; j >= i__2; --j) {
00143 if (d__[j] > d__[j - 1]) {
00144 dmnmx = d__[j];
00145 d__[j] = d__[j - 1];
00146 d__[j - 1] = dmnmx;
00147 } else {
00148 goto L30;
00149 }
00150
00151 }
00152 L30:
00153 ;
00154 }
00155
00156 } else {
00157
00158
00159
00160 i__1 = endd;
00161 for (i__ = start + 1; i__ <= i__1; ++i__) {
00162 i__2 = start + 1;
00163 for (j = i__; j >= i__2; --j) {
00164 if (d__[j] < d__[j - 1]) {
00165 dmnmx = d__[j];
00166 d__[j] = d__[j - 1];
00167 d__[j - 1] = dmnmx;
00168 } else {
00169 goto L50;
00170 }
00171
00172 }
00173 L50:
00174 ;
00175 }
00176
00177 }
00178
00179 } else if (endd - start > 20) {
00180
00181
00182
00183
00184
00185 d1 = d__[start];
00186 d2 = d__[endd];
00187 i__ = (start + endd) / 2;
00188 d3 = d__[i__];
00189 if (d1 < d2) {
00190 if (d3 < d1) {
00191 dmnmx = d1;
00192 } else if (d3 < d2) {
00193 dmnmx = d3;
00194 } else {
00195 dmnmx = d2;
00196 }
00197 } else {
00198 if (d3 < d2) {
00199 dmnmx = d2;
00200 } else if (d3 < d1) {
00201 dmnmx = d3;
00202 } else {
00203 dmnmx = d1;
00204 }
00205 }
00206
00207 if (dir == 0) {
00208
00209
00210
00211 i__ = start - 1;
00212 j = endd + 1;
00213 L60:
00214 L70:
00215 --j;
00216 if (d__[j] < dmnmx) {
00217 goto L70;
00218 }
00219 L80:
00220 ++i__;
00221 if (d__[i__] > dmnmx) {
00222 goto L80;
00223 }
00224 if (i__ < j) {
00225 tmp = d__[i__];
00226 d__[i__] = d__[j];
00227 d__[j] = tmp;
00228 goto L60;
00229 }
00230 if (j - start > endd - j - 1) {
00231 ++stkpnt;
00232 stack_ref(1, stkpnt) = start;
00233 stack_ref(2, stkpnt) = j;
00234 ++stkpnt;
00235 stack_ref(1, stkpnt) = j + 1;
00236 stack_ref(2, stkpnt) = endd;
00237 } else {
00238 ++stkpnt;
00239 stack_ref(1, stkpnt) = j + 1;
00240 stack_ref(2, stkpnt) = endd;
00241 ++stkpnt;
00242 stack_ref(1, stkpnt) = start;
00243 stack_ref(2, stkpnt) = j;
00244 }
00245 } else {
00246
00247
00248
00249 i__ = start - 1;
00250 j = endd + 1;
00251 L90:
00252 L100:
00253 --j;
00254 if (d__[j] > dmnmx) {
00255 goto L100;
00256 }
00257 L110:
00258 ++i__;
00259 if (d__[i__] < dmnmx) {
00260 goto L110;
00261 }
00262 if (i__ < j) {
00263 tmp = d__[i__];
00264 d__[i__] = d__[j];
00265 d__[j] = tmp;
00266 goto L90;
00267 }
00268 if (j - start > endd - j - 1) {
00269 ++stkpnt;
00270 stack_ref(1, stkpnt) = start;
00271 stack_ref(2, stkpnt) = j;
00272 ++stkpnt;
00273 stack_ref(1, stkpnt) = j + 1;
00274 stack_ref(2, stkpnt) = endd;
00275 } else {
00276 ++stkpnt;
00277 stack_ref(1, stkpnt) = j + 1;
00278 stack_ref(2, stkpnt) = endd;
00279 ++stkpnt;
00280 stack_ref(1, stkpnt) = start;
00281 stack_ref(2, stkpnt) = j;
00282 }
00283 }
00284 }
00285 if (stkpnt > 0) {
00286 goto L10;
00287 }
00288 return 0;
00289
00290
00291
00292 }
00293
00294 #undef stack_ref
00295
00296
00297 #endif