Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@4:557ad9613c6e, 2017-01-03 (annotated)
- Committer:
- JovanEps
- Date:
- Tue Jan 03 14:24:52 2017 +0000
- Revision:
- 4:557ad9613c6e
- Parent:
- 3:da1132c65314
- Child:
- 5:2b929fbd5c69
Must be lower to N2 -3
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| JovanEps | 0:43b96e9650ef | 1 | //******************************************************** |
| JovanEps | 3:da1132c65314 | 2 | //** BETA--------------- |
| JovanEps | 2:273153e44338 | 3 | //** Nucleo-144 Stm32F746 and Stm32F767 benchmark ****** |
| JovanEps | 2:273153e44338 | 4 | //** Limpack -port form Arduino IDE ***** |
| JovanEps | 0:43b96e9650ef | 5 | //** Jovan Ivkovic - 2016 ****** |
| JovanEps | 0:43b96e9650ef | 6 | //******************************************************** |
| JovanEps | 0:43b96e9650ef | 7 | #include "mbed.h" |
| JovanEps | 2:273153e44338 | 8 | |
| JovanEps | 2:273153e44338 | 9 | /* the following is optional depending on the timing function used */ |
| JovanEps | 2:273153e44338 | 10 | # include <stdlib.h> |
| JovanEps | 2:273153e44338 | 11 | # include <stdio.h> |
| JovanEps | 2:273153e44338 | 12 | # include <math.h> |
| JovanEps | 2:273153e44338 | 13 | |
| JovanEps | 0:43b96e9650ef | 14 | DigitalOut myled(LED1); |
| JovanEps | 0:43b96e9650ef | 15 | Serial pc(USBTX, USBRX); |
| JovanEps | 0:43b96e9650ef | 16 | Timer timer; |
| JovanEps | 0:43b96e9650ef | 17 | |
| JovanEps | 2:273153e44338 | 18 | int do_benchmark( void ); |
| JovanEps | 4:557ad9613c6e | 19 | //double cpu_time( void ); |
| JovanEps | 2:273153e44338 | 20 | void daxpy( int n, double da, double dx[], int incx, double dy[], int incy ); |
| JovanEps | 2:273153e44338 | 21 | double ddot( int n, double dx[], int incx, double dy[], int incy ); |
| JovanEps | 2:273153e44338 | 22 | int dgefa( double a[], int lda, int n, int ipvt[] ); |
| JovanEps | 2:273153e44338 | 23 | void dgesl( double a[], int lda, int n, int ipvt[], double b[], int job ); |
| JovanEps | 2:273153e44338 | 24 | void dscal( int n, double sa, double x[], int incx ); |
| JovanEps | 2:273153e44338 | 25 | int idamax( int n, double dx[], int incx ); |
| JovanEps | 2:273153e44338 | 26 | double r8_abs( double x ); |
| JovanEps | 2:273153e44338 | 27 | double r8_epsilon( void ); |
| JovanEps | 2:273153e44338 | 28 | double r8_max( double x, double y ); |
| JovanEps | 2:273153e44338 | 29 | double r8_random(int iseed[4] ); |
| JovanEps | 2:273153e44338 | 30 | double *r8mat_gen ( int lda, int n ); |
| JovanEps | 0:43b96e9650ef | 31 | |
| JovanEps | 2:273153e44338 | 32 | //static FILE uartout = {0} ; |
| JovanEps | 0:43b96e9650ef | 33 | |
| JovanEps | 2:273153e44338 | 34 | //static int uart_putchar (char c, FILE *stream) |
| JovanEps | 2:273153e44338 | 35 | //{ |
| JovanEps | 2:273153e44338 | 36 | // Serial.write(c) ; |
| JovanEps | 2:273153e44338 | 37 | // return 0 ; |
| JovanEps | 2:273153e44338 | 38 | //} |
| JovanEps | 0:43b96e9650ef | 39 | |
| JovanEps | 2:273153e44338 | 40 | //void setup() { |
| JovanEps | 2:273153e44338 | 41 | // Serial.begin(9600); |
| JovanEps | 2:273153e44338 | 42 | // fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); |
| JovanEps | 2:273153e44338 | 43 | // stdout = &uartout ; |
| JovanEps | 2:273153e44338 | 44 | //} |
| JovanEps | 0:43b96e9650ef | 45 | |
| JovanEps | 2:273153e44338 | 46 | int main() |
| JovanEps | 0:43b96e9650ef | 47 | { |
| JovanEps | 4:557ad9613c6e | 48 | pc.baud(115200); |
| JovanEps | 4:557ad9613c6e | 49 | //pc.baud(9600); |
| JovanEps | 2:273153e44338 | 50 | |
| JovanEps | 2:273153e44338 | 51 | while(1) { |
| JovanEps | 2:273153e44338 | 52 | |
| JovanEps | 2:273153e44338 | 53 | pc.printf("Starting benchmark...\n"); |
| JovanEps | 2:273153e44338 | 54 | |
| JovanEps | 2:273153e44338 | 55 | do_benchmark(); |
| JovanEps | 4:557ad9613c6e | 56 | |
| JovanEps | 2:273153e44338 | 57 | pc.printf(" kraj \n\n"); |
| JovanEps | 2:273153e44338 | 58 | } |
| JovanEps | 2:273153e44338 | 59 | } |
| JovanEps | 2:273153e44338 | 60 | |
| JovanEps | 2:273153e44338 | 61 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 62 | |
| JovanEps | 2:273153e44338 | 63 | int do_benchmark ( void ) |
| JovanEps | 0:43b96e9650ef | 64 | |
| JovanEps | 2:273153e44338 | 65 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 66 | /* |
| JovanEps | 2:273153e44338 | 67 | Purpose: |
| JovanEps | 2:273153e44338 | 68 | |
| JovanEps | 2:273153e44338 | 69 | MAIN is the main program for LINPACK_BENCH. |
| JovanEps | 0:43b96e9650ef | 70 | |
| JovanEps | 2:273153e44338 | 71 | Discussion: |
| JovanEps | 2:273153e44338 | 72 | |
| JovanEps | 2:273153e44338 | 73 | LINPACK_BENCH drives the double precision LINPACK benchmark program. |
| JovanEps | 2:273153e44338 | 74 | |
| JovanEps | 2:273153e44338 | 75 | Modified: |
| JovanEps | 2:273153e44338 | 76 | |
| JovanEps | 2:273153e44338 | 77 | 25 July 2008 |
| JovanEps | 2:273153e44338 | 78 | |
| JovanEps | 2:273153e44338 | 79 | Parameters: |
| JovanEps | 0:43b96e9650ef | 80 | |
| JovanEps | 2:273153e44338 | 81 | N is the problem size. |
| JovanEps | 0:43b96e9650ef | 82 | */ |
| JovanEps | 2:273153e44338 | 83 | { |
| JovanEps | 4:557ad9613c6e | 84 | # define N 2 |
| JovanEps | 2:273153e44338 | 85 | # define LDA ( N + 1 ) |
| JovanEps | 2:273153e44338 | 86 | |
| JovanEps | 3:da1132c65314 | 87 | //static double a[90]; |
| JovanEps | 2:273153e44338 | 88 | static double *a; |
| JovanEps | 2:273153e44338 | 89 | static double a_max; |
| JovanEps | 3:da1132c65314 | 90 | //static double b[9]; |
| JovanEps | 2:273153e44338 | 91 | static double *b; |
| JovanEps | 2:273153e44338 | 92 | static double b_max; |
| JovanEps | 2:273153e44338 | 93 | const double cray = 0.056; |
| JovanEps | 2:273153e44338 | 94 | static double eps; |
| JovanEps | 2:273153e44338 | 95 | int i; |
| JovanEps | 2:273153e44338 | 96 | int info; |
| JovanEps | 3:da1132c65314 | 97 | static int *ipvt; |
| JovanEps | 2:273153e44338 | 98 | int j; |
| JovanEps | 2:273153e44338 | 99 | int job; |
| JovanEps | 2:273153e44338 | 100 | double ops; |
| JovanEps | 3:da1132c65314 | 101 | static double *resid; |
| JovanEps | 2:273153e44338 | 102 | double resid_max; |
| JovanEps | 2:273153e44338 | 103 | double residn; |
| JovanEps | 3:da1132c65314 | 104 | static double *rhs; |
| JovanEps | 3:da1132c65314 | 105 | double t1 = 0.0; |
| JovanEps | 3:da1132c65314 | 106 | double t2 = 0.0; |
| JovanEps | 2:273153e44338 | 107 | static double time[6]; |
| JovanEps | 2:273153e44338 | 108 | double total; |
| JovanEps | 3:da1132c65314 | 109 | double *x; |
| JovanEps | 2:273153e44338 | 110 | |
| JovanEps | 0:43b96e9650ef | 111 | |
| JovanEps | 2:273153e44338 | 112 | pc.printf ( "\n" ); |
| JovanEps | 2:273153e44338 | 113 | pc.printf ( "LINPACK_BENCH\n" ); |
| JovanEps | 2:273153e44338 | 114 | pc.printf ( " C version\n" ); |
| JovanEps | 2:273153e44338 | 115 | pc.printf ( "\n" ); |
| JovanEps | 2:273153e44338 | 116 | pc.printf ( " The LINPACK benchmark.\n" ); |
| JovanEps | 2:273153e44338 | 117 | pc.printf ( " Language: C\n" ); |
| JovanEps | 2:273153e44338 | 118 | pc.printf ( " Datatype: Double precision real\n" ); |
| JovanEps | 2:273153e44338 | 119 | pc.printf ( " Matrix order N = %d\n", N ); |
| JovanEps | 2:273153e44338 | 120 | pc.printf ( " Leading matrix dimension LDA = %d\n", LDA ); |
| JovanEps | 2:273153e44338 | 121 | |
| JovanEps | 4:557ad9613c6e | 122 | ops = ( double ) ( 2L * N * N * N ) / 3 + 2 * ( N * N ); |
| JovanEps | 2:273153e44338 | 123 | |
| JovanEps | 2:273153e44338 | 124 | /* |
| JovanEps | 2:273153e44338 | 125 | Allocate space for arrays. |
| JovanEps | 2:273153e44338 | 126 | */ |
| JovanEps | 2:273153e44338 | 127 | a = r8mat_gen ( LDA, N ); |
| JovanEps | 3:da1132c65314 | 128 | //r8mat_gen ( LDA, N, a); |
| JovanEps | 0:43b96e9650ef | 129 | |
| JovanEps | 2:273153e44338 | 130 | a_max = 0.0; |
| JovanEps | 2:273153e44338 | 131 | for ( j = 0; j < N; j++ ) { |
| JovanEps | 2:273153e44338 | 132 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 133 | a_max = r8_max ( a_max, a[i+j*LDA] ); |
| JovanEps | 2:273153e44338 | 134 | } |
| JovanEps | 0:43b96e9650ef | 135 | } |
| JovanEps | 0:43b96e9650ef | 136 | |
| JovanEps | 2:273153e44338 | 137 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 138 | x[i] = 1.0; |
| JovanEps | 2:273153e44338 | 139 | } |
| JovanEps | 0:43b96e9650ef | 140 | |
| JovanEps | 2:273153e44338 | 141 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 142 | b[i] = 0.0; |
| JovanEps | 2:273153e44338 | 143 | for ( j = 0; j < N; j++ ) { |
| JovanEps | 2:273153e44338 | 144 | b[i] = b[i] + a[i+j*LDA] * x[j]; |
| JovanEps | 2:273153e44338 | 145 | } |
| JovanEps | 0:43b96e9650ef | 146 | } |
| JovanEps | 0:43b96e9650ef | 147 | |
| JovanEps | 2:273153e44338 | 148 | timer.start(); |
| JovanEps | 4:557ad9613c6e | 149 | |
| JovanEps | 2:273153e44338 | 150 | //***************** |
| JovanEps | 3:da1132c65314 | 151 | t1 = ( double ) timer.read_us() / 1000000.0; |
| JovanEps | 4:557ad9613c6e | 152 | |
| JovanEps | 2:273153e44338 | 153 | info = dgefa ( a, LDA, N, ipvt ); |
| JovanEps | 0:43b96e9650ef | 154 | |
| JovanEps | 3:da1132c65314 | 155 | t2 = ( double ) timer.read_us() / 1000000.0; |
| JovanEps | 4:557ad9613c6e | 156 | |
| JovanEps | 2:273153e44338 | 157 | if ( info != 0 ) { |
| JovanEps | 2:273153e44338 | 158 | pc.printf ( "\n" ); |
| JovanEps | 2:273153e44338 | 159 | pc.printf ( "LINPACK_BENCH - Fatal error!\n" ); |
| JovanEps | 2:273153e44338 | 160 | pc.printf ( " The matrix A is apparently singular.\n" ); |
| JovanEps | 2:273153e44338 | 161 | pc.printf ( " Abnormal end of execution.\n" ); |
| JovanEps | 2:273153e44338 | 162 | return 1; |
| JovanEps | 1:be78b18b8347 | 163 | } |
| JovanEps | 3:da1132c65314 | 164 | time[0] = ( double ) t2 - t1; |
| JovanEps | 4:557ad9613c6e | 165 | |
| JovanEps | 4:557ad9613c6e | 166 | |
| JovanEps | 3:da1132c65314 | 167 | timer.reset(); |
| JovanEps | 2:273153e44338 | 168 | |
| JovanEps | 2:273153e44338 | 169 | //********* |
| JovanEps | 4:557ad9613c6e | 170 | |
| JovanEps | 3:da1132c65314 | 171 | t1 = ( double ) timer.read_us() / 1000000.0; |
| JovanEps | 2:273153e44338 | 172 | |
| JovanEps | 2:273153e44338 | 173 | job = 0; |
| JovanEps | 2:273153e44338 | 174 | dgesl ( a, LDA, N, ipvt, b, job ); |
| JovanEps | 2:273153e44338 | 175 | |
| JovanEps | 3:da1132c65314 | 176 | t2 = ( double ) timer.read_us() / 1000000.0; |
| JovanEps | 3:da1132c65314 | 177 | time[1] = ( double ) t2 - t1; |
| JovanEps | 2:273153e44338 | 178 | |
| JovanEps | 2:273153e44338 | 179 | total = time[0] + time[1]; |
| JovanEps | 0:43b96e9650ef | 180 | |
| JovanEps | 4:557ad9613c6e | 181 | timer.stop(); |
| JovanEps | 4:557ad9613c6e | 182 | |
| JovanEps | 2:273153e44338 | 183 | //********* |
| JovanEps | 2:273153e44338 | 184 | |
| JovanEps | 2:273153e44338 | 185 | /* |
| JovanEps | 2:273153e44338 | 186 | Compute a residual to verify results. |
| JovanEps | 2:273153e44338 | 187 | */ |
| JovanEps | 2:273153e44338 | 188 | a = r8mat_gen ( LDA, N ); |
| JovanEps | 3:da1132c65314 | 189 | //r8mat_gen ( LDA, N, a); |
| JovanEps | 2:273153e44338 | 190 | |
| JovanEps | 2:273153e44338 | 191 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 192 | x[i] = 1.0; |
| JovanEps | 2:273153e44338 | 193 | } |
| JovanEps | 0:43b96e9650ef | 194 | |
| JovanEps | 2:273153e44338 | 195 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 196 | rhs[i] = 0.0; |
| JovanEps | 2:273153e44338 | 197 | for ( j = 0; j < N; j++ ) { |
| JovanEps | 2:273153e44338 | 198 | rhs[i] = rhs[i] + a[i+j*LDA] * x[j]; |
| JovanEps | 2:273153e44338 | 199 | } |
| JovanEps | 2:273153e44338 | 200 | } |
| JovanEps | 0:43b96e9650ef | 201 | |
| JovanEps | 2:273153e44338 | 202 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 203 | resid[i] = -rhs[i]; |
| JovanEps | 2:273153e44338 | 204 | for ( j = 0; j < N; j++ ) { |
| JovanEps | 2:273153e44338 | 205 | resid[i] = resid[i] + a[i+j*LDA] * b[j]; |
| JovanEps | 2:273153e44338 | 206 | } |
| JovanEps | 2:273153e44338 | 207 | } |
| JovanEps | 2:273153e44338 | 208 | |
| JovanEps | 2:273153e44338 | 209 | resid_max = 0.0; |
| JovanEps | 2:273153e44338 | 210 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 211 | resid_max = r8_max ( resid_max, r8_abs ( resid[i] ) ); |
| JovanEps | 2:273153e44338 | 212 | } |
| JovanEps | 2:273153e44338 | 213 | |
| JovanEps | 2:273153e44338 | 214 | b_max = 0.0; |
| JovanEps | 2:273153e44338 | 215 | for ( i = 0; i < N; i++ ) { |
| JovanEps | 2:273153e44338 | 216 | b_max = r8_max ( b_max, r8_abs ( b[i] ) ); |
| JovanEps | 0:43b96e9650ef | 217 | } |
| JovanEps | 0:43b96e9650ef | 218 | |
| JovanEps | 2:273153e44338 | 219 | eps = r8_epsilon ( ); |
| JovanEps | 2:273153e44338 | 220 | |
| JovanEps | 2:273153e44338 | 221 | residn = resid_max / ( double ) N / a_max / b_max / eps; |
| JovanEps | 2:273153e44338 | 222 | |
| JovanEps | 2:273153e44338 | 223 | time[2] = total; |
| JovanEps | 2:273153e44338 | 224 | |
| JovanEps | 4:557ad9613c6e | 225 | time[3] = ( double ) ops / ( 1000000.0 * total ); |
| JovanEps | 4:557ad9613c6e | 226 | /* |
| JovanEps | 3:da1132c65314 | 227 | if ( 0.0 < total) |
| JovanEps | 2:273153e44338 | 228 | { |
| JovanEps | 3:da1132c65314 | 229 | time[3] = ( double ) ops / ( 1000000.0 * total ); |
| JovanEps | 4:557ad9613c6e | 230 | } |
| JovanEps | 4:557ad9613c6e | 231 | else |
| JovanEps | 2:273153e44338 | 232 | { |
| JovanEps | 2:273153e44338 | 233 | time[3] = -1.0; |
| JovanEps | 2:273153e44338 | 234 | } |
| JovanEps | 4:557ad9613c6e | 235 | */ |
| JovanEps | 4:557ad9613c6e | 236 | |
| JovanEps | 2:273153e44338 | 237 | time[4] = 2.0 / time[3]; |
| JovanEps | 2:273153e44338 | 238 | time[5] = total / cray; |
| JovanEps | 2:273153e44338 | 239 | |
| JovanEps | 4:557ad9613c6e | 240 | //pc.printf( " \n\n "); |
| JovanEps | 4:557ad9613c6e | 241 | //pc.printf( "\n Norm. Resid Resid MACHEP X[1] X[N]\n" ); |
| JovanEps | 4:557ad9613c6e | 242 | pc.printf( "\n MACHEP X[1] X[N]\n" ); |
| JovanEps | 3:da1132c65314 | 243 | //pc.printf(" %14f", residn); |
| JovanEps | 3:da1132c65314 | 244 | //pc.printf(" %14f", resid_max); |
| JovanEps | 4:557ad9613c6e | 245 | pc.printf(" %14e", eps); |
| JovanEps | 4:557ad9613c6e | 246 | pc.printf(" %14f", b[0]); |
| JovanEps | 4:557ad9613c6e | 247 | pc.printf(" %14f ",b[N-1]); |
| JovanEps | 4:557ad9613c6e | 248 | pc.printf("\n\n"); |
| JovanEps | 4:557ad9613c6e | 249 | //pc.printf( " %14f %14f %14e %14f %14f \n", residn, resid_max, eps, b[0], b[N-1] ); |
| JovanEps | 0:43b96e9650ef | 250 | |
| JovanEps | 2:273153e44338 | 251 | pc.printf( " \n\n "); |
| JovanEps | 4:557ad9613c6e | 252 | pc.printf( " Factor Solve Total MFLOPS Unit Cray-Ratio \n\n" ); |
| JovanEps | 4:557ad9613c6e | 253 | |
| JovanEps | 2:273153e44338 | 254 | for(int ii=0; ii<6; ii++) { |
| JovanEps | 4:557ad9613c6e | 255 | pc.printf(" %9f", time[ii]); |
| JovanEps | 2:273153e44338 | 256 | } |
| JovanEps | 4:557ad9613c6e | 257 | |
| JovanEps | 4:557ad9613c6e | 258 | //pc.printf( " %9f %9f %9f %9f %9f %9f\n", time[0], time[1], time[2], time[3], time[4], time[5] ); |
| JovanEps | 2:273153e44338 | 259 | |
| JovanEps | 2:273153e44338 | 260 | /* |
| JovanEps | 2:273153e44338 | 261 | Terminate. |
| JovanEps | 2:273153e44338 | 262 | */ |
| JovanEps | 2:273153e44338 | 263 | pc.printf( "\n" ); |
| JovanEps | 2:273153e44338 | 264 | pc.printf( "LINPACK_BENCH\n" ); |
| JovanEps | 2:273153e44338 | 265 | pc.printf( " Normal end of execution.\n" ); |
| JovanEps | 2:273153e44338 | 266 | |
| JovanEps | 2:273153e44338 | 267 | pc.printf( "\n" ); |
| JovanEps | 2:273153e44338 | 268 | |
| JovanEps | 2:273153e44338 | 269 | return 0; |
| JovanEps | 2:273153e44338 | 270 | # undef LDA |
| JovanEps | 2:273153e44338 | 271 | # undef N |
| JovanEps | 2:273153e44338 | 272 | } |
| JovanEps | 4:557ad9613c6e | 273 | |
| JovanEps | 2:273153e44338 | 274 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 275 | |
| JovanEps | 4:557ad9613c6e | 276 | //double cpu_time ( void ) |
| JovanEps | 2:273153e44338 | 277 | |
| JovanEps | 2:273153e44338 | 278 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 279 | /* |
| JovanEps | 2:273153e44338 | 280 | Purpose: |
| JovanEps | 2:273153e44338 | 281 | |
| JovanEps | 2:273153e44338 | 282 | CPU_TIME returns the current reading on the CPU clock. |
| JovanEps | 2:273153e44338 | 283 | |
| JovanEps | 2:273153e44338 | 284 | Discussion: |
| JovanEps | 0:43b96e9650ef | 285 | |
| JovanEps | 2:273153e44338 | 286 | The CPU time measurements available through this routine are often |
| JovanEps | 2:273153e44338 | 287 | not very accurate. In some cases, the accuracy is no better than |
| JovanEps | 2:273153e44338 | 288 | a hundredth of a second. |
| JovanEps | 2:273153e44338 | 289 | |
| JovanEps | 2:273153e44338 | 290 | koristi mbed.Timer |
| JovanEps | 2:273153e44338 | 291 | |
| JovanEps | 2:273153e44338 | 292 | */ |
| JovanEps | 4:557ad9613c6e | 293 | //{ |
| JovanEps | 4:557ad9613c6e | 294 | // double vreme; |
| JovanEps | 4:557ad9613c6e | 295 | |
| JovanEps | 4:557ad9613c6e | 296 | // vreme = timer.read_ms() / 1000; |
| JovanEps | 2:273153e44338 | 297 | |
| JovanEps | 4:557ad9613c6e | 298 | // return vreme; |
| JovanEps | 4:557ad9613c6e | 299 | //} |
| JovanEps | 4:557ad9613c6e | 300 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 301 | |
| JovanEps | 2:273153e44338 | 302 | |
| JovanEps | 2:273153e44338 | 303 | void daxpy ( int n, double da, double dx[], int incx, double dy[], int incy ) |
| JovanEps | 2:273153e44338 | 304 | |
| JovanEps | 2:273153e44338 | 305 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 306 | /* |
| JovanEps | 2:273153e44338 | 307 | Purpose: |
| JovanEps | 2:273153e44338 | 308 | |
| JovanEps | 2:273153e44338 | 309 | DAXPY computes constant times a vector plus a vector. |
| JovanEps | 2:273153e44338 | 310 | |
| JovanEps | 2:273153e44338 | 311 | Discussion: |
| JovanEps | 2:273153e44338 | 312 | |
| JovanEps | 2:273153e44338 | 313 | This routine uses unrolled loops for increments equal to one. |
| JovanEps | 2:273153e44338 | 314 | |
| JovanEps | 2:273153e44338 | 315 | Modified: |
| JovanEps | 2:273153e44338 | 316 | |
| JovanEps | 2:273153e44338 | 317 | 30 March 2007 |
| JovanEps | 2:273153e44338 | 318 | |
| JovanEps | 2:273153e44338 | 319 | Author: |
| JovanEps | 0:43b96e9650ef | 320 | |
| JovanEps | 2:273153e44338 | 321 | FORTRAN77 original by Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart. |
| JovanEps | 2:273153e44338 | 322 | C version by John Burkardt |
| JovanEps | 2:273153e44338 | 323 | |
| JovanEps | 2:273153e44338 | 324 | Reference: |
| JovanEps | 2:273153e44338 | 325 | |
| JovanEps | 2:273153e44338 | 326 | Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart, |
| JovanEps | 2:273153e44338 | 327 | LINPACK User's Guide, |
| JovanEps | 2:273153e44338 | 328 | SIAM, 1979. |
| JovanEps | 2:273153e44338 | 329 | |
| JovanEps | 2:273153e44338 | 330 | Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, |
| JovanEps | 2:273153e44338 | 331 | Basic Linear Algebra Subprograms for Fortran Usage, |
| JovanEps | 2:273153e44338 | 332 | Algorithm 539, |
| JovanEps | 2:273153e44338 | 333 | ACM Transactions on Mathematical Software, |
| JovanEps | 2:273153e44338 | 334 | Volume 5, Number 3, September 1979, pages 308-323. |
| JovanEps | 2:273153e44338 | 335 | |
| JovanEps | 2:273153e44338 | 336 | Parameters: |
| JovanEps | 2:273153e44338 | 337 | |
| JovanEps | 2:273153e44338 | 338 | Input, int N, the number of elements in DX and DY. |
| JovanEps | 2:273153e44338 | 339 | |
| JovanEps | 2:273153e44338 | 340 | Input, double DA, the multiplier of DX. |
| JovanEps | 2:273153e44338 | 341 | |
| JovanEps | 2:273153e44338 | 342 | Input, double DX[*], the first vector. |
| JovanEps | 2:273153e44338 | 343 | |
| JovanEps | 2:273153e44338 | 344 | Input, int INCX, the increment between successive entries of DX. |
| JovanEps | 2:273153e44338 | 345 | |
| JovanEps | 2:273153e44338 | 346 | Input/output, double DY[*], the second vector. |
| JovanEps | 2:273153e44338 | 347 | On output, DY[*] has been replaced by DY[*] + DA * DX[*]. |
| JovanEps | 2:273153e44338 | 348 | |
| JovanEps | 2:273153e44338 | 349 | Input, int INCY, the increment between successive entries of DY. |
| JovanEps | 2:273153e44338 | 350 | */ |
| JovanEps | 2:273153e44338 | 351 | { |
| JovanEps | 2:273153e44338 | 352 | int i; |
| JovanEps | 2:273153e44338 | 353 | int ix; |
| JovanEps | 2:273153e44338 | 354 | int iy; |
| JovanEps | 2:273153e44338 | 355 | int m; |
| JovanEps | 2:273153e44338 | 356 | |
| JovanEps | 2:273153e44338 | 357 | if ( n <= 0 ) { |
| JovanEps | 2:273153e44338 | 358 | return; |
| JovanEps | 0:43b96e9650ef | 359 | } |
| JovanEps | 0:43b96e9650ef | 360 | |
| JovanEps | 2:273153e44338 | 361 | if ( da == 0.0 ) { |
| JovanEps | 2:273153e44338 | 362 | return; |
| JovanEps | 2:273153e44338 | 363 | } |
| JovanEps | 2:273153e44338 | 364 | /* |
| JovanEps | 2:273153e44338 | 365 | Code for unequal increments or equal increments |
| JovanEps | 2:273153e44338 | 366 | not equal to 1. |
| JovanEps | 2:273153e44338 | 367 | */ |
| JovanEps | 2:273153e44338 | 368 | if ( incx != 1 || incy != 1 ) { |
| JovanEps | 2:273153e44338 | 369 | if ( 0 <= incx ) { |
| JovanEps | 2:273153e44338 | 370 | ix = 0; |
| JovanEps | 2:273153e44338 | 371 | } else { |
| JovanEps | 2:273153e44338 | 372 | ix = ( - n + 1 ) * incx; |
| JovanEps | 2:273153e44338 | 373 | } |
| JovanEps | 2:273153e44338 | 374 | |
| JovanEps | 2:273153e44338 | 375 | if ( 0 <= incy ) { |
| JovanEps | 2:273153e44338 | 376 | iy = 0; |
| JovanEps | 2:273153e44338 | 377 | } else { |
| JovanEps | 2:273153e44338 | 378 | iy = ( - n + 1 ) * incy; |
| JovanEps | 2:273153e44338 | 379 | } |
| JovanEps | 0:43b96e9650ef | 380 | |
| JovanEps | 2:273153e44338 | 381 | for ( i = 0; i < n; i++ ) { |
| JovanEps | 2:273153e44338 | 382 | dy[iy] = dy[iy] + da * dx[ix]; |
| JovanEps | 2:273153e44338 | 383 | ix = ix + incx; |
| JovanEps | 2:273153e44338 | 384 | iy = iy + incy; |
| JovanEps | 2:273153e44338 | 385 | } |
| JovanEps | 2:273153e44338 | 386 | } |
| JovanEps | 2:273153e44338 | 387 | /* |
| JovanEps | 2:273153e44338 | 388 | Code for both increments equal to 1. |
| JovanEps | 2:273153e44338 | 389 | */ |
| JovanEps | 2:273153e44338 | 390 | else { |
| JovanEps | 2:273153e44338 | 391 | m = n % 4; |
| JovanEps | 2:273153e44338 | 392 | |
| JovanEps | 2:273153e44338 | 393 | for ( i = 0; i < m; i++ ) { |
| JovanEps | 2:273153e44338 | 394 | dy[i] = dy[i] + da * dx[i]; |
| JovanEps | 2:273153e44338 | 395 | } |
| JovanEps | 2:273153e44338 | 396 | |
| JovanEps | 2:273153e44338 | 397 | for ( i = m; i < n; i = i + 4 ) { |
| JovanEps | 2:273153e44338 | 398 | dy[i ] = dy[i ] + da * dx[i ]; |
| JovanEps | 2:273153e44338 | 399 | dy[i+1] = dy[i+1] + da * dx[i+1]; |
| JovanEps | 2:273153e44338 | 400 | dy[i+2] = dy[i+2] + da * dx[i+2]; |
| JovanEps | 2:273153e44338 | 401 | dy[i+3] = dy[i+3] + da * dx[i+3]; |
| JovanEps | 2:273153e44338 | 402 | } |
| JovanEps | 2:273153e44338 | 403 | } |
| JovanEps | 2:273153e44338 | 404 | return; |
| JovanEps | 2:273153e44338 | 405 | } |
| JovanEps | 2:273153e44338 | 406 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 407 | |
| JovanEps | 2:273153e44338 | 408 | double ddot ( int n, double dx[], int incx, double dy[], int incy ) |
| JovanEps | 2:273153e44338 | 409 | |
| JovanEps | 2:273153e44338 | 410 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 411 | /* |
| JovanEps | 2:273153e44338 | 412 | Purpose: |
| JovanEps | 2:273153e44338 | 413 | |
| JovanEps | 2:273153e44338 | 414 | DDOT forms the dot product of two vectors. |
| JovanEps | 2:273153e44338 | 415 | |
| JovanEps | 2:273153e44338 | 416 | Discussion: |
| JovanEps | 2:273153e44338 | 417 | |
| JovanEps | 2:273153e44338 | 418 | This routine uses unrolled loops for increments equal to one. |
| JovanEps | 2:273153e44338 | 419 | |
| JovanEps | 2:273153e44338 | 420 | Modified: |
| JovanEps | 2:273153e44338 | 421 | |
| JovanEps | 2:273153e44338 | 422 | 30 March 2007 |
| JovanEps | 2:273153e44338 | 423 | |
| JovanEps | 2:273153e44338 | 424 | Author: |
| JovanEps | 2:273153e44338 | 425 | |
| JovanEps | 2:273153e44338 | 426 | FORTRAN77 original by Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart. |
| JovanEps | 2:273153e44338 | 427 | C version by John Burkardt |
| JovanEps | 2:273153e44338 | 428 | |
| JovanEps | 2:273153e44338 | 429 | Reference: |
| JovanEps | 2:273153e44338 | 430 | |
| JovanEps | 2:273153e44338 | 431 | Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart, |
| JovanEps | 2:273153e44338 | 432 | LINPACK User's Guide, |
| JovanEps | 2:273153e44338 | 433 | SIAM, 1979. |
| JovanEps | 2:273153e44338 | 434 | |
| JovanEps | 2:273153e44338 | 435 | Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, |
| JovanEps | 2:273153e44338 | 436 | Basic Linear Algebra Subprograms for Fortran Usage, |
| JovanEps | 2:273153e44338 | 437 | Algorithm 539, |
| JovanEps | 2:273153e44338 | 438 | ACM Transactions on Mathematical Software, |
| JovanEps | 2:273153e44338 | 439 | Volume 5, Number 3, September 1979, pages 308-323. |
| JovanEps | 2:273153e44338 | 440 | |
| JovanEps | 2:273153e44338 | 441 | Parameters: |
| JovanEps | 2:273153e44338 | 442 | |
| JovanEps | 2:273153e44338 | 443 | Input, int N, the number of entries in the vectors. |
| JovanEps | 2:273153e44338 | 444 | |
| JovanEps | 2:273153e44338 | 445 | Input, double DX[*], the first vector. |
| JovanEps | 2:273153e44338 | 446 | |
| JovanEps | 2:273153e44338 | 447 | Input, int INCX, the increment between successive entries in DX. |
| JovanEps | 2:273153e44338 | 448 | |
| JovanEps | 2:273153e44338 | 449 | Input, double DY[*], the second vector. |
| JovanEps | 2:273153e44338 | 450 | |
| JovanEps | 2:273153e44338 | 451 | Input, int INCY, the increment between successive entries in DY. |
| JovanEps | 2:273153e44338 | 452 | |
| JovanEps | 2:273153e44338 | 453 | Output, double DDOT, the sum of the product of the corresponding |
| JovanEps | 2:273153e44338 | 454 | entries of DX and DY. |
| JovanEps | 0:43b96e9650ef | 455 | */ |
| JovanEps | 2:273153e44338 | 456 | { |
| JovanEps | 2:273153e44338 | 457 | double dtemp; |
| JovanEps | 2:273153e44338 | 458 | int i; |
| JovanEps | 2:273153e44338 | 459 | int ix; |
| JovanEps | 2:273153e44338 | 460 | int iy; |
| JovanEps | 2:273153e44338 | 461 | int m; |
| JovanEps | 2:273153e44338 | 462 | |
| JovanEps | 2:273153e44338 | 463 | dtemp = 0.0; |
| JovanEps | 2:273153e44338 | 464 | |
| JovanEps | 2:273153e44338 | 465 | if ( n <= 0 ) { |
| JovanEps | 2:273153e44338 | 466 | return dtemp; |
| JovanEps | 2:273153e44338 | 467 | } |
| JovanEps | 2:273153e44338 | 468 | /* |
| JovanEps | 2:273153e44338 | 469 | Code for unequal increments or equal increments |
| JovanEps | 2:273153e44338 | 470 | not equal to 1. |
| JovanEps | 2:273153e44338 | 471 | */ |
| JovanEps | 2:273153e44338 | 472 | if ( incx != 1 || incy != 1 ) { |
| JovanEps | 2:273153e44338 | 473 | if ( 0 <= incx ) { |
| JovanEps | 2:273153e44338 | 474 | ix = 0; |
| JovanEps | 2:273153e44338 | 475 | } else { |
| JovanEps | 2:273153e44338 | 476 | ix = ( - n + 1 ) * incx; |
| JovanEps | 2:273153e44338 | 477 | } |
| JovanEps | 2:273153e44338 | 478 | |
| JovanEps | 2:273153e44338 | 479 | if ( 0 <= incy ) { |
| JovanEps | 2:273153e44338 | 480 | iy = 0; |
| JovanEps | 2:273153e44338 | 481 | } else { |
| JovanEps | 2:273153e44338 | 482 | iy = ( - n + 1 ) * incy; |
| JovanEps | 2:273153e44338 | 483 | } |
| JovanEps | 2:273153e44338 | 484 | |
| JovanEps | 2:273153e44338 | 485 | for ( i = 0; i < n; i++ ) { |
| JovanEps | 2:273153e44338 | 486 | dtemp = dtemp + dx[ix] * dy[iy]; |
| JovanEps | 2:273153e44338 | 487 | ix = ix + incx; |
| JovanEps | 2:273153e44338 | 488 | iy = iy + incy; |
| JovanEps | 2:273153e44338 | 489 | } |
| JovanEps | 2:273153e44338 | 490 | } |
| JovanEps | 2:273153e44338 | 491 | /* |
| JovanEps | 2:273153e44338 | 492 | Code for both increments equal to 1. |
| JovanEps | 2:273153e44338 | 493 | */ |
| JovanEps | 2:273153e44338 | 494 | else { |
| JovanEps | 2:273153e44338 | 495 | m = n % 5; |
| JovanEps | 2:273153e44338 | 496 | |
| JovanEps | 2:273153e44338 | 497 | for ( i = 0; i < m; i++ ) { |
| JovanEps | 2:273153e44338 | 498 | dtemp = dtemp + dx[i] * dy[i]; |
| JovanEps | 2:273153e44338 | 499 | } |
| JovanEps | 2:273153e44338 | 500 | |
| JovanEps | 2:273153e44338 | 501 | for ( i = m; i < n; i = i + 5 ) { |
| JovanEps | 2:273153e44338 | 502 | dtemp = dtemp + dx[i ] * dy[i ] |
| JovanEps | 2:273153e44338 | 503 | + dx[i+1] * dy[i+1] |
| JovanEps | 2:273153e44338 | 504 | + dx[i+2] * dy[i+2] |
| JovanEps | 2:273153e44338 | 505 | + dx[i+3] * dy[i+3] |
| JovanEps | 2:273153e44338 | 506 | + dx[i+4] * dy[i+4]; |
| JovanEps | 2:273153e44338 | 507 | } |
| JovanEps | 2:273153e44338 | 508 | } |
| JovanEps | 2:273153e44338 | 509 | return dtemp; |
| JovanEps | 2:273153e44338 | 510 | } |
| JovanEps | 2:273153e44338 | 511 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 512 | |
| JovanEps | 2:273153e44338 | 513 | int dgefa ( double a[], int lda, int n, int ipvt[] ) |
| JovanEps | 2:273153e44338 | 514 | |
| JovanEps | 2:273153e44338 | 515 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 516 | /* |
| JovanEps | 2:273153e44338 | 517 | Purpose: |
| JovanEps | 2:273153e44338 | 518 | |
| JovanEps | 2:273153e44338 | 519 | DGEFA factors a real general matrix. |
| JovanEps | 2:273153e44338 | 520 | |
| JovanEps | 2:273153e44338 | 521 | Modified: |
| JovanEps | 2:273153e44338 | 522 | |
| JovanEps | 2:273153e44338 | 523 | 16 May 2005 |
| JovanEps | 2:273153e44338 | 524 | |
| JovanEps | 2:273153e44338 | 525 | Author: |
| JovanEps | 2:273153e44338 | 526 | |
| JovanEps | 2:273153e44338 | 527 | C version by John Burkardt. |
| JovanEps | 2:273153e44338 | 528 | |
| JovanEps | 2:273153e44338 | 529 | Reference: |
| JovanEps | 0:43b96e9650ef | 530 | |
| JovanEps | 2:273153e44338 | 531 | Jack Dongarra, Cleve Moler, Jim Bunch and Pete Stewart, |
| JovanEps | 2:273153e44338 | 532 | LINPACK User's Guide, |
| JovanEps | 2:273153e44338 | 533 | SIAM, (Society for Industrial and Applied Mathematics), |
| JovanEps | 2:273153e44338 | 534 | 3600 University City Science Center, |
| JovanEps | 2:273153e44338 | 535 | Philadelphia, PA, 19104-2688. |
| JovanEps | 2:273153e44338 | 536 | ISBN 0-89871-172-X |
| JovanEps | 2:273153e44338 | 537 | |
| JovanEps | 2:273153e44338 | 538 | Parameters: |
| JovanEps | 2:273153e44338 | 539 | |
| JovanEps | 2:273153e44338 | 540 | Input/output, double A[LDA*N]. |
| JovanEps | 2:273153e44338 | 541 | On intput, the matrix to be factored. |
| JovanEps | 2:273153e44338 | 542 | On output, an upper triangular matrix and the multipliers used to obtain |
| JovanEps | 2:273153e44338 | 543 | it. The factorization can be written A=L*U, where L is a product of |
| JovanEps | 2:273153e44338 | 544 | permutation and unit lower triangular matrices, and U is upper triangular. |
| JovanEps | 2:273153e44338 | 545 | |
| JovanEps | 2:273153e44338 | 546 | Input, int LDA, the leading dimension of A. |
| JovanEps | 2:273153e44338 | 547 | |
| JovanEps | 2:273153e44338 | 548 | Input, int N, the order of the matrix A. |
| JovanEps | 2:273153e44338 | 549 | |
| JovanEps | 2:273153e44338 | 550 | Output, int IPVT[N], the pivot indices. |
| JovanEps | 2:273153e44338 | 551 | |
| JovanEps | 2:273153e44338 | 552 | Output, int DGEFA, singularity indicator. |
| JovanEps | 2:273153e44338 | 553 | 0, normal value. |
| JovanEps | 2:273153e44338 | 554 | K, if U(K,K) == 0. This is not an error condition for this subroutine, |
| JovanEps | 2:273153e44338 | 555 | but it does indicate that DGESL or DGEDI will divide by zero if called. |
| JovanEps | 2:273153e44338 | 556 | Use RCOND in DGECO for a reliable indication of singularity. |
| JovanEps | 2:273153e44338 | 557 | */ |
| JovanEps | 2:273153e44338 | 558 | { |
| JovanEps | 2:273153e44338 | 559 | int info; |
| JovanEps | 2:273153e44338 | 560 | int j; |
| JovanEps | 2:273153e44338 | 561 | int k; |
| JovanEps | 2:273153e44338 | 562 | int l; |
| JovanEps | 2:273153e44338 | 563 | double t; |
| JovanEps | 2:273153e44338 | 564 | /* |
| JovanEps | 2:273153e44338 | 565 | Gaussian elimination with partial pivoting. |
| JovanEps | 2:273153e44338 | 566 | */ |
| JovanEps | 2:273153e44338 | 567 | info = 0; |
| JovanEps | 2:273153e44338 | 568 | |
| JovanEps | 2:273153e44338 | 569 | for ( k = 1; k <= n-1; k++ ) { |
| JovanEps | 2:273153e44338 | 570 | /* |
| JovanEps | 2:273153e44338 | 571 | Find L = pivot index. |
| JovanEps | 2:273153e44338 | 572 | */ |
| JovanEps | 2:273153e44338 | 573 | l = idamax ( n-k+1, a+(k-1)+(k-1)*lda, 1 ) + k - 1; |
| JovanEps | 2:273153e44338 | 574 | ipvt[k-1] = l; |
| JovanEps | 2:273153e44338 | 575 | /* |
| JovanEps | 2:273153e44338 | 576 | Zero pivot implies this column already triangularized. |
| JovanEps | 2:273153e44338 | 577 | */ |
| JovanEps | 2:273153e44338 | 578 | if ( a[l-1+(k-1)*lda] == 0.0 ) { |
| JovanEps | 2:273153e44338 | 579 | info = k; |
| JovanEps | 2:273153e44338 | 580 | continue; |
| JovanEps | 2:273153e44338 | 581 | } |
| JovanEps | 2:273153e44338 | 582 | /* |
| JovanEps | 2:273153e44338 | 583 | Interchange if necessary. |
| JovanEps | 2:273153e44338 | 584 | */ |
| JovanEps | 2:273153e44338 | 585 | if ( l != k ) { |
| JovanEps | 2:273153e44338 | 586 | t = a[l-1+(k-1)*lda]; |
| JovanEps | 2:273153e44338 | 587 | a[l-1+(k-1)*lda] = a[k-1+(k-1)*lda]; |
| JovanEps | 2:273153e44338 | 588 | a[k-1+(k-1)*lda] = t; |
| JovanEps | 2:273153e44338 | 589 | } |
| JovanEps | 2:273153e44338 | 590 | /* |
| JovanEps | 2:273153e44338 | 591 | Compute multipliers. |
| JovanEps | 2:273153e44338 | 592 | */ |
| JovanEps | 2:273153e44338 | 593 | t = -1.0 / a[k-1+(k-1)*lda]; |
| JovanEps | 2:273153e44338 | 594 | |
| JovanEps | 2:273153e44338 | 595 | dscal ( n-k, t, a+k+(k-1)*lda, 1 ); |
| JovanEps | 2:273153e44338 | 596 | /* |
| JovanEps | 2:273153e44338 | 597 | Row elimination with column indexing. |
| JovanEps | 2:273153e44338 | 598 | */ |
| JovanEps | 2:273153e44338 | 599 | for ( j = k+1; j <= n; j++ ) { |
| JovanEps | 2:273153e44338 | 600 | t = a[l-1+(j-1)*lda]; |
| JovanEps | 2:273153e44338 | 601 | if ( l != k ) { |
| JovanEps | 2:273153e44338 | 602 | a[l-1+(j-1)*lda] = a[k-1+(j-1)*lda]; |
| JovanEps | 2:273153e44338 | 603 | a[k-1+(j-1)*lda] = t; |
| JovanEps | 2:273153e44338 | 604 | } |
| JovanEps | 2:273153e44338 | 605 | daxpy ( n-k, t, a+k+(k-1)*lda, 1, a+k+(j-1)*lda, 1 ); |
| JovanEps | 2:273153e44338 | 606 | } |
| JovanEps | 2:273153e44338 | 607 | |
| JovanEps | 0:43b96e9650ef | 608 | } |
| JovanEps | 0:43b96e9650ef | 609 | |
| JovanEps | 2:273153e44338 | 610 | ipvt[n-1] = n; |
| JovanEps | 0:43b96e9650ef | 611 | |
| JovanEps | 2:273153e44338 | 612 | if ( a[n-1+(n-1)*lda] == 0.0 ) { |
| JovanEps | 2:273153e44338 | 613 | info = n; |
| JovanEps | 0:43b96e9650ef | 614 | } |
| JovanEps | 0:43b96e9650ef | 615 | |
| JovanEps | 2:273153e44338 | 616 | return info; |
| JovanEps | 2:273153e44338 | 617 | } |
| JovanEps | 2:273153e44338 | 618 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 619 | |
| JovanEps | 2:273153e44338 | 620 | void dgesl ( double a[], int lda, int n, int ipvt[], double b[], int job ) |
| JovanEps | 2:273153e44338 | 621 | |
| JovanEps | 2:273153e44338 | 622 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 623 | /* |
| JovanEps | 2:273153e44338 | 624 | Purpose: |
| JovanEps | 2:273153e44338 | 625 | |
| JovanEps | 2:273153e44338 | 626 | DGESL solves a real general linear system A * X = B. |
| JovanEps | 2:273153e44338 | 627 | |
| JovanEps | 2:273153e44338 | 628 | Discussion: |
| JovanEps | 2:273153e44338 | 629 | |
| JovanEps | 2:273153e44338 | 630 | DGESL can solve either of the systems A * X = B or A' * X = B. |
| JovanEps | 2:273153e44338 | 631 | |
| JovanEps | 2:273153e44338 | 632 | The system matrix must have been factored by DGECO or DGEFA. |
| JovanEps | 2:273153e44338 | 633 | |
| JovanEps | 2:273153e44338 | 634 | A division by zero will occur if the input factor contains a |
| JovanEps | 2:273153e44338 | 635 | zero on the diagonal. Technically this indicates singularity |
| JovanEps | 2:273153e44338 | 636 | but it is often caused by improper arguments or improper |
| JovanEps | 2:273153e44338 | 637 | setting of LDA. It will not occur if the subroutines are |
| JovanEps | 2:273153e44338 | 638 | called correctly and if DGECO has set 0.0 < RCOND |
| JovanEps | 2:273153e44338 | 639 | or DGEFA has set INFO == 0. |
| JovanEps | 2:273153e44338 | 640 | |
| JovanEps | 2:273153e44338 | 641 | Modified: |
| JovanEps | 2:273153e44338 | 642 | |
| JovanEps | 2:273153e44338 | 643 | 16 May 2005 |
| JovanEps | 2:273153e44338 | 644 | |
| JovanEps | 2:273153e44338 | 645 | Author: |
| JovanEps | 2:273153e44338 | 646 | |
| JovanEps | 2:273153e44338 | 647 | C version by John Burkardt. |
| JovanEps | 2:273153e44338 | 648 | |
| JovanEps | 2:273153e44338 | 649 | Reference: |
| JovanEps | 2:273153e44338 | 650 | |
| JovanEps | 2:273153e44338 | 651 | Jack Dongarra, Cleve Moler, Jim Bunch and Pete Stewart, |
| JovanEps | 2:273153e44338 | 652 | LINPACK User's Guide, |
| JovanEps | 2:273153e44338 | 653 | SIAM, (Society for Industrial and Applied Mathematics), |
| JovanEps | 2:273153e44338 | 654 | 3600 University City Science Center, |
| JovanEps | 2:273153e44338 | 655 | Philadelphia, PA, 19104-2688. |
| JovanEps | 2:273153e44338 | 656 | ISBN 0-89871-172-X |
| JovanEps | 2:273153e44338 | 657 | |
| JovanEps | 2:273153e44338 | 658 | Parameters: |
| JovanEps | 2:273153e44338 | 659 | |
| JovanEps | 2:273153e44338 | 660 | Input, double A[LDA*N], the output from DGECO or DGEFA. |
| JovanEps | 2:273153e44338 | 661 | |
| JovanEps | 2:273153e44338 | 662 | Input, int LDA, the leading dimension of A. |
| JovanEps | 2:273153e44338 | 663 | |
| JovanEps | 2:273153e44338 | 664 | Input, int N, the order of the matrix A. |
| JovanEps | 2:273153e44338 | 665 | |
| JovanEps | 2:273153e44338 | 666 | Input, int IPVT[N], the pivot vector from DGECO or DGEFA. |
| JovanEps | 2:273153e44338 | 667 | |
| JovanEps | 2:273153e44338 | 668 | Input/output, double B[N]. |
| JovanEps | 2:273153e44338 | 669 | On input, the right hand side vector. |
| JovanEps | 2:273153e44338 | 670 | On output, the solution vector. |
| JovanEps | 0:43b96e9650ef | 671 | |
| JovanEps | 2:273153e44338 | 672 | Input, int JOB. |
| JovanEps | 2:273153e44338 | 673 | 0, solve A * X = B; |
| JovanEps | 2:273153e44338 | 674 | nonzero, solve A' * X = B. |
| JovanEps | 2:273153e44338 | 675 | */ |
| JovanEps | 2:273153e44338 | 676 | { |
| JovanEps | 2:273153e44338 | 677 | int k; |
| JovanEps | 2:273153e44338 | 678 | int l; |
| JovanEps | 2:273153e44338 | 679 | double t; |
| JovanEps | 2:273153e44338 | 680 | /* |
| JovanEps | 2:273153e44338 | 681 | Solve A * X = B. |
| JovanEps | 2:273153e44338 | 682 | */ |
| JovanEps | 2:273153e44338 | 683 | if ( job == 0 ) { |
| JovanEps | 2:273153e44338 | 684 | for ( k = 1; k <= n-1; k++ ) { |
| JovanEps | 2:273153e44338 | 685 | l = ipvt[k-1]; |
| JovanEps | 2:273153e44338 | 686 | t = b[l-1]; |
| JovanEps | 2:273153e44338 | 687 | |
| JovanEps | 2:273153e44338 | 688 | if ( l != k ) { |
| JovanEps | 2:273153e44338 | 689 | b[l-1] = b[k-1]; |
| JovanEps | 2:273153e44338 | 690 | b[k-1] = t; |
| JovanEps | 2:273153e44338 | 691 | } |
| JovanEps | 2:273153e44338 | 692 | |
| JovanEps | 2:273153e44338 | 693 | daxpy ( n-k, t, a+k+(k-1)*lda, 1, b+k, 1 ); |
| JovanEps | 2:273153e44338 | 694 | |
| JovanEps | 2:273153e44338 | 695 | } |
| JovanEps | 0:43b96e9650ef | 696 | |
| JovanEps | 2:273153e44338 | 697 | for ( k = n; 1 <= k; k-- ) { |
| JovanEps | 2:273153e44338 | 698 | b[k-1] = b[k-1] / a[k-1+(k-1)*lda]; |
| JovanEps | 2:273153e44338 | 699 | t = -b[k-1]; |
| JovanEps | 2:273153e44338 | 700 | daxpy ( k-1, t, a+0+(k-1)*lda, 1, b, 1 ); |
| JovanEps | 2:273153e44338 | 701 | } |
| JovanEps | 2:273153e44338 | 702 | } |
| JovanEps | 2:273153e44338 | 703 | /* |
| JovanEps | 2:273153e44338 | 704 | Solve A' * X = B. |
| JovanEps | 2:273153e44338 | 705 | */ |
| JovanEps | 2:273153e44338 | 706 | else { |
| JovanEps | 2:273153e44338 | 707 | for ( k = 1; k <= n; k++ ) { |
| JovanEps | 2:273153e44338 | 708 | t = ddot ( k-1, a+0+(k-1)*lda, 1, b, 1 ); |
| JovanEps | 2:273153e44338 | 709 | b[k-1] = ( b[k-1] - t ) / a[k-1+(k-1)*lda]; |
| JovanEps | 2:273153e44338 | 710 | } |
| JovanEps | 0:43b96e9650ef | 711 | |
| JovanEps | 2:273153e44338 | 712 | for ( k = n-1; 1 <= k; k-- ) { |
| JovanEps | 2:273153e44338 | 713 | b[k-1] = b[k-1] + ddot ( n-k, a+k+(k-1)*lda, 1, b+k, 1 ); |
| JovanEps | 2:273153e44338 | 714 | l = ipvt[k-1]; |
| JovanEps | 2:273153e44338 | 715 | |
| JovanEps | 2:273153e44338 | 716 | if ( l != k ) { |
| JovanEps | 2:273153e44338 | 717 | t = b[l-1]; |
| JovanEps | 2:273153e44338 | 718 | b[l-1] = b[k-1]; |
| JovanEps | 2:273153e44338 | 719 | b[k-1] = t; |
| JovanEps | 2:273153e44338 | 720 | } |
| JovanEps | 2:273153e44338 | 721 | } |
| JovanEps | 2:273153e44338 | 722 | } |
| JovanEps | 2:273153e44338 | 723 | return; |
| JovanEps | 2:273153e44338 | 724 | } |
| JovanEps | 2:273153e44338 | 725 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 726 | |
| JovanEps | 2:273153e44338 | 727 | void dscal ( int n, double sa, double x[], int incx ) |
| JovanEps | 2:273153e44338 | 728 | |
| JovanEps | 2:273153e44338 | 729 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 730 | /* |
| JovanEps | 2:273153e44338 | 731 | Purpose: |
| JovanEps | 2:273153e44338 | 732 | |
| JovanEps | 2:273153e44338 | 733 | DSCAL scales a vector by a constant. |
| JovanEps | 2:273153e44338 | 734 | |
| JovanEps | 2:273153e44338 | 735 | Modified: |
| JovanEps | 2:273153e44338 | 736 | |
| JovanEps | 2:273153e44338 | 737 | 30 March 2007 |
| JovanEps | 2:273153e44338 | 738 | |
| JovanEps | 2:273153e44338 | 739 | Author: |
| JovanEps | 2:273153e44338 | 740 | |
| JovanEps | 2:273153e44338 | 741 | FORTRAN77 original by Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart. |
| JovanEps | 2:273153e44338 | 742 | C version by John Burkardt |
| JovanEps | 2:273153e44338 | 743 | |
| JovanEps | 2:273153e44338 | 744 | Reference: |
| JovanEps | 2:273153e44338 | 745 | |
| JovanEps | 2:273153e44338 | 746 | Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart, |
| JovanEps | 2:273153e44338 | 747 | LINPACK User's Guide, |
| JovanEps | 2:273153e44338 | 748 | SIAM, 1979. |
| JovanEps | 2:273153e44338 | 749 | |
| JovanEps | 2:273153e44338 | 750 | Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, |
| JovanEps | 2:273153e44338 | 751 | Basic Linear Algebra Subprograms for Fortran Usage, |
| JovanEps | 2:273153e44338 | 752 | Algorithm 539, |
| JovanEps | 2:273153e44338 | 753 | ACM Transactions on Mathematical Software, |
| JovanEps | 2:273153e44338 | 754 | Volume 5, Number 3, September 1979, pages 308-323. |
| JovanEps | 2:273153e44338 | 755 | |
| JovanEps | 2:273153e44338 | 756 | Parameters: |
| JovanEps | 2:273153e44338 | 757 | |
| JovanEps | 2:273153e44338 | 758 | Input, int N, the number of entries in the vector. |
| JovanEps | 2:273153e44338 | 759 | |
| JovanEps | 2:273153e44338 | 760 | Input, double SA, the multiplier. |
| JovanEps | 2:273153e44338 | 761 | |
| JovanEps | 2:273153e44338 | 762 | Input/output, double X[*], the vector to be scaled. |
| JovanEps | 2:273153e44338 | 763 | |
| JovanEps | 2:273153e44338 | 764 | Input, int INCX, the increment between successive entries of X. |
| JovanEps | 0:43b96e9650ef | 765 | */ |
| JovanEps | 2:273153e44338 | 766 | { |
| JovanEps | 2:273153e44338 | 767 | int i; |
| JovanEps | 2:273153e44338 | 768 | int ix; |
| JovanEps | 2:273153e44338 | 769 | int m; |
| JovanEps | 2:273153e44338 | 770 | |
| JovanEps | 2:273153e44338 | 771 | if ( n <= 0 ) { |
| JovanEps | 2:273153e44338 | 772 | } else if ( incx == 1 ) { |
| JovanEps | 2:273153e44338 | 773 | m = n % 5; |
| JovanEps | 2:273153e44338 | 774 | |
| JovanEps | 2:273153e44338 | 775 | for ( i = 0; i < m; i++ ) { |
| JovanEps | 2:273153e44338 | 776 | x[i] = sa * x[i]; |
| JovanEps | 2:273153e44338 | 777 | } |
| JovanEps | 0:43b96e9650ef | 778 | |
| JovanEps | 2:273153e44338 | 779 | for ( i = m; i < n; i = i + 5 ) { |
| JovanEps | 2:273153e44338 | 780 | x[i] = sa * x[i]; |
| JovanEps | 2:273153e44338 | 781 | x[i+1] = sa * x[i+1]; |
| JovanEps | 2:273153e44338 | 782 | x[i+2] = sa * x[i+2]; |
| JovanEps | 2:273153e44338 | 783 | x[i+3] = sa * x[i+3]; |
| JovanEps | 2:273153e44338 | 784 | x[i+4] = sa * x[i+4]; |
| JovanEps | 2:273153e44338 | 785 | } |
| JovanEps | 2:273153e44338 | 786 | } else { |
| JovanEps | 2:273153e44338 | 787 | if ( 0 <= incx ) { |
| JovanEps | 2:273153e44338 | 788 | ix = 0; |
| JovanEps | 2:273153e44338 | 789 | } else { |
| JovanEps | 2:273153e44338 | 790 | ix = ( - n + 1 ) * incx; |
| JovanEps | 2:273153e44338 | 791 | } |
| JovanEps | 2:273153e44338 | 792 | |
| JovanEps | 2:273153e44338 | 793 | for ( i = 0; i < n; i++ ) { |
| JovanEps | 2:273153e44338 | 794 | x[ix] = sa * x[ix]; |
| JovanEps | 2:273153e44338 | 795 | ix = ix + incx; |
| JovanEps | 2:273153e44338 | 796 | } |
| JovanEps | 2:273153e44338 | 797 | } |
| JovanEps | 2:273153e44338 | 798 | return; |
| JovanEps | 2:273153e44338 | 799 | } |
| JovanEps | 2:273153e44338 | 800 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 801 | |
| JovanEps | 2:273153e44338 | 802 | int idamax ( int n, double dx[], int incx ) |
| JovanEps | 2:273153e44338 | 803 | |
| JovanEps | 2:273153e44338 | 804 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 805 | /* |
| JovanEps | 2:273153e44338 | 806 | Purpose: |
| JovanEps | 2:273153e44338 | 807 | |
| JovanEps | 2:273153e44338 | 808 | IDAMAX finds the index of the vector element of maximum absolute value. |
| JovanEps | 2:273153e44338 | 809 | |
| JovanEps | 2:273153e44338 | 810 | Discussion: |
| JovanEps | 2:273153e44338 | 811 | |
| JovanEps | 2:273153e44338 | 812 | WARNING: This index is a 1-based index, not a 0-based index! |
| JovanEps | 2:273153e44338 | 813 | |
| JovanEps | 2:273153e44338 | 814 | Modified: |
| JovanEps | 2:273153e44338 | 815 | |
| JovanEps | 2:273153e44338 | 816 | 30 March 2007 |
| JovanEps | 2:273153e44338 | 817 | |
| JovanEps | 2:273153e44338 | 818 | Author: |
| JovanEps | 2:273153e44338 | 819 | |
| JovanEps | 2:273153e44338 | 820 | FORTRAN77 original by Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart. |
| JovanEps | 2:273153e44338 | 821 | C version by John Burkardt |
| JovanEps | 2:273153e44338 | 822 | |
| JovanEps | 2:273153e44338 | 823 | Reference: |
| JovanEps | 2:273153e44338 | 824 | |
| JovanEps | 2:273153e44338 | 825 | Jack Dongarra, Cleve Moler, Jim Bunch, Pete Stewart, |
| JovanEps | 2:273153e44338 | 826 | LINPACK User's Guide, |
| JovanEps | 2:273153e44338 | 827 | SIAM, 1979. |
| JovanEps | 2:273153e44338 | 828 | |
| JovanEps | 2:273153e44338 | 829 | Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, |
| JovanEps | 2:273153e44338 | 830 | Basic Linear Algebra Subprograms for Fortran Usage, |
| JovanEps | 2:273153e44338 | 831 | Algorithm 539, |
| JovanEps | 2:273153e44338 | 832 | ACM Transactions on Mathematical Software, |
| JovanEps | 2:273153e44338 | 833 | Volume 5, Number 3, September 1979, pages 308-323. |
| JovanEps | 2:273153e44338 | 834 | |
| JovanEps | 2:273153e44338 | 835 | Parameters: |
| JovanEps | 2:273153e44338 | 836 | |
| JovanEps | 2:273153e44338 | 837 | Input, int N, the number of entries in the vector. |
| JovanEps | 2:273153e44338 | 838 | |
| JovanEps | 2:273153e44338 | 839 | Input, double X[*], the vector to be examined. |
| JovanEps | 2:273153e44338 | 840 | |
| JovanEps | 2:273153e44338 | 841 | Input, int INCX, the increment between successive entries of SX. |
| JovanEps | 2:273153e44338 | 842 | |
| JovanEps | 2:273153e44338 | 843 | Output, int IDAMAX, the index of the element of maximum |
| JovanEps | 2:273153e44338 | 844 | absolute value. |
| JovanEps | 0:43b96e9650ef | 845 | */ |
| JovanEps | 2:273153e44338 | 846 | { |
| JovanEps | 2:273153e44338 | 847 | double dmax; |
| JovanEps | 2:273153e44338 | 848 | int i; |
| JovanEps | 2:273153e44338 | 849 | int ix; |
| JovanEps | 2:273153e44338 | 850 | int value; |
| JovanEps | 2:273153e44338 | 851 | |
| JovanEps | 2:273153e44338 | 852 | value = 0; |
| JovanEps | 0:43b96e9650ef | 853 | |
| JovanEps | 2:273153e44338 | 854 | if ( n < 1 || incx <= 0 ) { |
| JovanEps | 2:273153e44338 | 855 | return value; |
| JovanEps | 2:273153e44338 | 856 | } |
| JovanEps | 2:273153e44338 | 857 | |
| JovanEps | 2:273153e44338 | 858 | value = 1; |
| JovanEps | 2:273153e44338 | 859 | |
| JovanEps | 2:273153e44338 | 860 | if ( n == 1 ) { |
| JovanEps | 2:273153e44338 | 861 | return value; |
| JovanEps | 2:273153e44338 | 862 | } |
| JovanEps | 0:43b96e9650ef | 863 | |
| JovanEps | 2:273153e44338 | 864 | if ( incx == 1 ) { |
| JovanEps | 2:273153e44338 | 865 | dmax = r8_abs ( dx[0] ); |
| JovanEps | 2:273153e44338 | 866 | |
| JovanEps | 2:273153e44338 | 867 | for ( i = 1; i < n; i++ ) { |
| JovanEps | 2:273153e44338 | 868 | if ( dmax < r8_abs ( dx[i] ) ) { |
| JovanEps | 2:273153e44338 | 869 | value = i + 1; |
| JovanEps | 2:273153e44338 | 870 | dmax = r8_abs ( dx[i] ); |
| JovanEps | 2:273153e44338 | 871 | } |
| JovanEps | 2:273153e44338 | 872 | } |
| JovanEps | 2:273153e44338 | 873 | } else { |
| JovanEps | 2:273153e44338 | 874 | ix = 0; |
| JovanEps | 2:273153e44338 | 875 | dmax = r8_abs ( dx[0] ); |
| JovanEps | 2:273153e44338 | 876 | ix = ix + incx; |
| JovanEps | 2:273153e44338 | 877 | |
| JovanEps | 2:273153e44338 | 878 | for ( i = 1; i < n; i++ ) { |
| JovanEps | 2:273153e44338 | 879 | if ( dmax < r8_abs ( dx[ix] ) ) { |
| JovanEps | 2:273153e44338 | 880 | value = i + 1; |
| JovanEps | 2:273153e44338 | 881 | dmax = r8_abs ( dx[ix] ); |
| JovanEps | 2:273153e44338 | 882 | } |
| JovanEps | 2:273153e44338 | 883 | ix = ix + incx; |
| JovanEps | 2:273153e44338 | 884 | } |
| JovanEps | 2:273153e44338 | 885 | } |
| JovanEps | 0:43b96e9650ef | 886 | |
| JovanEps | 2:273153e44338 | 887 | return value; |
| JovanEps | 2:273153e44338 | 888 | } |
| JovanEps | 2:273153e44338 | 889 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 890 | |
| JovanEps | 2:273153e44338 | 891 | double r8_abs ( double x ) |
| JovanEps | 2:273153e44338 | 892 | |
| JovanEps | 2:273153e44338 | 893 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 894 | /* |
| JovanEps | 2:273153e44338 | 895 | Purpose: |
| JovanEps | 2:273153e44338 | 896 | |
| JovanEps | 2:273153e44338 | 897 | R8_ABS returns the absolute value of a R8. |
| JovanEps | 0:43b96e9650ef | 898 | |
| JovanEps | 2:273153e44338 | 899 | Modified: |
| JovanEps | 2:273153e44338 | 900 | |
| JovanEps | 2:273153e44338 | 901 | 02 April 2005 |
| JovanEps | 2:273153e44338 | 902 | |
| JovanEps | 2:273153e44338 | 903 | Author: |
| JovanEps | 0:43b96e9650ef | 904 | |
| JovanEps | 2:273153e44338 | 905 | John Burkardt |
| JovanEps | 2:273153e44338 | 906 | |
| JovanEps | 2:273153e44338 | 907 | Parameters: |
| JovanEps | 2:273153e44338 | 908 | |
| JovanEps | 2:273153e44338 | 909 | Input, double X, the quantity whose absolute value is desired. |
| JovanEps | 2:273153e44338 | 910 | |
| JovanEps | 2:273153e44338 | 911 | Output, double R8_ABS, the absolute value of X. |
| JovanEps | 2:273153e44338 | 912 | */ |
| JovanEps | 0:43b96e9650ef | 913 | { |
| JovanEps | 2:273153e44338 | 914 | double value; |
| JovanEps | 2:273153e44338 | 915 | |
| JovanEps | 2:273153e44338 | 916 | if ( 0.0 <= x ) { |
| JovanEps | 2:273153e44338 | 917 | value = x; |
| JovanEps | 2:273153e44338 | 918 | } else { |
| JovanEps | 2:273153e44338 | 919 | value = -x; |
| JovanEps | 2:273153e44338 | 920 | } |
| JovanEps | 2:273153e44338 | 921 | return value; |
| JovanEps | 2:273153e44338 | 922 | } |
| JovanEps | 2:273153e44338 | 923 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 924 | |
| JovanEps | 2:273153e44338 | 925 | double r8_epsilon ( void ) |
| JovanEps | 0:43b96e9650ef | 926 | |
| JovanEps | 2:273153e44338 | 927 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 928 | /* |
| JovanEps | 2:273153e44338 | 929 | Purpose: |
| JovanEps | 2:273153e44338 | 930 | |
| JovanEps | 2:273153e44338 | 931 | R8_EPSILON returns the R8 round off unit. |
| JovanEps | 2:273153e44338 | 932 | |
| JovanEps | 2:273153e44338 | 933 | Discussion: |
| JovanEps | 2:273153e44338 | 934 | |
| JovanEps | 2:273153e44338 | 935 | R8_EPSILON is a number R which is a power of 2 with the property that, |
| JovanEps | 2:273153e44338 | 936 | to the precision of the computer's arithmetic, |
| JovanEps | 2:273153e44338 | 937 | 1 < 1 + R |
| JovanEps | 2:273153e44338 | 938 | but |
| JovanEps | 2:273153e44338 | 939 | 1 = ( 1 + R / 2 ) |
| JovanEps | 0:43b96e9650ef | 940 | |
| JovanEps | 2:273153e44338 | 941 | Licensing: |
| JovanEps | 2:273153e44338 | 942 | |
| JovanEps | 2:273153e44338 | 943 | This code is distributed under the GNU LGPL license. |
| JovanEps | 2:273153e44338 | 944 | |
| JovanEps | 2:273153e44338 | 945 | Modified: |
| JovanEps | 2:273153e44338 | 946 | |
| JovanEps | 2:273153e44338 | 947 | 08 May 2006 |
| JovanEps | 2:273153e44338 | 948 | |
| JovanEps | 2:273153e44338 | 949 | Author: |
| JovanEps | 2:273153e44338 | 950 | |
| JovanEps | 2:273153e44338 | 951 | John Burkardt |
| JovanEps | 2:273153e44338 | 952 | |
| JovanEps | 2:273153e44338 | 953 | Parameters: |
| JovanEps | 0:43b96e9650ef | 954 | |
| JovanEps | 2:273153e44338 | 955 | Output, double R8_EPSILON, the double precision round-off unit. |
| JovanEps | 2:273153e44338 | 956 | */ |
| JovanEps | 0:43b96e9650ef | 957 | { |
| JovanEps | 2:273153e44338 | 958 | double r; |
| JovanEps | 2:273153e44338 | 959 | |
| JovanEps | 2:273153e44338 | 960 | r = 1.0; |
| JovanEps | 2:273153e44338 | 961 | |
| JovanEps | 2:273153e44338 | 962 | while ( 1.0 < ( double ) ( 1.0 + r ) ) { |
| JovanEps | 2:273153e44338 | 963 | r = r / 2.0; |
| JovanEps | 2:273153e44338 | 964 | } |
| JovanEps | 2:273153e44338 | 965 | r = 2.0 * r; |
| JovanEps | 2:273153e44338 | 966 | |
| JovanEps | 2:273153e44338 | 967 | return r; |
| JovanEps | 0:43b96e9650ef | 968 | } |
| JovanEps | 2:273153e44338 | 969 | /******************************************************************************/ |
| JovanEps | 0:43b96e9650ef | 970 | |
| JovanEps | 2:273153e44338 | 971 | double r8_max ( double x, double y ) |
| JovanEps | 2:273153e44338 | 972 | |
| JovanEps | 2:273153e44338 | 973 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 974 | /* |
| JovanEps | 2:273153e44338 | 975 | Purpose: |
| JovanEps | 2:273153e44338 | 976 | |
| JovanEps | 2:273153e44338 | 977 | R8_MAX returns the maximum of two R8's. |
| JovanEps | 2:273153e44338 | 978 | |
| JovanEps | 2:273153e44338 | 979 | Modified: |
| JovanEps | 2:273153e44338 | 980 | |
| JovanEps | 2:273153e44338 | 981 | 18 August 2004 |
| JovanEps | 2:273153e44338 | 982 | |
| JovanEps | 2:273153e44338 | 983 | Author: |
| JovanEps | 0:43b96e9650ef | 984 | |
| JovanEps | 2:273153e44338 | 985 | John Burkardt |
| JovanEps | 2:273153e44338 | 986 | |
| JovanEps | 2:273153e44338 | 987 | Parameters: |
| JovanEps | 2:273153e44338 | 988 | |
| JovanEps | 2:273153e44338 | 989 | Input, double X, Y, the quantities to compare. |
| JovanEps | 0:43b96e9650ef | 990 | |
| JovanEps | 2:273153e44338 | 991 | Output, double R8_MAX, the maximum of X and Y. |
| JovanEps | 2:273153e44338 | 992 | */ |
| JovanEps | 0:43b96e9650ef | 993 | { |
| JovanEps | 2:273153e44338 | 994 | double value; |
| JovanEps | 2:273153e44338 | 995 | |
| JovanEps | 2:273153e44338 | 996 | if ( y < x ) { |
| JovanEps | 2:273153e44338 | 997 | value = x; |
| JovanEps | 2:273153e44338 | 998 | } else { |
| JovanEps | 2:273153e44338 | 999 | value = y; |
| JovanEps | 2:273153e44338 | 1000 | } |
| JovanEps | 2:273153e44338 | 1001 | return value; |
| JovanEps | 0:43b96e9650ef | 1002 | } |
| JovanEps | 2:273153e44338 | 1003 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 1004 | |
| JovanEps | 2:273153e44338 | 1005 | double r8_random ( int iseed[4] ) |
| JovanEps | 2:273153e44338 | 1006 | |
| JovanEps | 2:273153e44338 | 1007 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 1008 | /* |
| JovanEps | 2:273153e44338 | 1009 | Purpose: |
| JovanEps | 2:273153e44338 | 1010 | |
| JovanEps | 2:273153e44338 | 1011 | R8_RANDOM returns a uniformly distributed random number between 0 and 1. |
| JovanEps | 2:273153e44338 | 1012 | |
| JovanEps | 2:273153e44338 | 1013 | Discussion: |
| JovanEps | 0:43b96e9650ef | 1014 | |
| JovanEps | 2:273153e44338 | 1015 | This routine uses a multiplicative congruential method with modulus |
| JovanEps | 2:273153e44338 | 1016 | 2**48 and multiplier 33952834046453 (see G.S.Fishman, |
| JovanEps | 2:273153e44338 | 1017 | 'Multiplicative congruential random number generators with modulus |
| JovanEps | 2:273153e44338 | 1018 | 2**b: an exhaustive analysis for b = 32 and a partial analysis for |
| JovanEps | 2:273153e44338 | 1019 | b = 48', Math. Comp. 189, pp 331-344, 1990). |
| JovanEps | 2:273153e44338 | 1020 | |
| JovanEps | 2:273153e44338 | 1021 | 48-bit integers are stored in 4 integer array elements with 12 bits |
| JovanEps | 2:273153e44338 | 1022 | per element. Hence the routine is portable across machines with |
| JovanEps | 2:273153e44338 | 1023 | integers of 32 bits or more. |
| JovanEps | 2:273153e44338 | 1024 | |
| JovanEps | 2:273153e44338 | 1025 | Parameters: |
| JovanEps | 2:273153e44338 | 1026 | |
| JovanEps | 2:273153e44338 | 1027 | Input/output, integer ISEED(4). |
| JovanEps | 2:273153e44338 | 1028 | On entry, the seed of the random number generator; the array |
| JovanEps | 2:273153e44338 | 1029 | elements must be between 0 and 4095, and ISEED(4) must be odd. |
| JovanEps | 2:273153e44338 | 1030 | On exit, the seed is updated. |
| JovanEps | 2:273153e44338 | 1031 | |
| JovanEps | 2:273153e44338 | 1032 | Output, double R8_RANDOM, the next pseudorandom number. |
| JovanEps | 2:273153e44338 | 1033 | */ |
| JovanEps | 1:be78b18b8347 | 1034 | { |
| JovanEps | 2:273153e44338 | 1035 | int ipw2 = 4096; |
| JovanEps | 2:273153e44338 | 1036 | int it1; |
| JovanEps | 2:273153e44338 | 1037 | int it2; |
| JovanEps | 2:273153e44338 | 1038 | int it3; |
| JovanEps | 2:273153e44338 | 1039 | int it4; |
| JovanEps | 2:273153e44338 | 1040 | int m1 = 494; |
| JovanEps | 2:273153e44338 | 1041 | int m2 = 322; |
| JovanEps | 2:273153e44338 | 1042 | int m3 = 2508; |
| JovanEps | 2:273153e44338 | 1043 | int m4 = 2549; |
| JovanEps | 2:273153e44338 | 1044 | double r = 1.0 / 4096.0; |
| JovanEps | 2:273153e44338 | 1045 | double value; |
| JovanEps | 2:273153e44338 | 1046 | /* |
| JovanEps | 2:273153e44338 | 1047 | Multiply the seed by the multiplier modulo 2**48. |
| JovanEps | 2:273153e44338 | 1048 | */ |
| JovanEps | 2:273153e44338 | 1049 | it4 = iseed[3] * m4; |
| JovanEps | 2:273153e44338 | 1050 | it3 = it4 / ipw2; |
| JovanEps | 2:273153e44338 | 1051 | it4 = it4 - ipw2 * it3; |
| JovanEps | 2:273153e44338 | 1052 | it3 = it3 + iseed[2] * m4 + iseed[3] * m3; |
| JovanEps | 2:273153e44338 | 1053 | it2 = it3 / ipw2; |
| JovanEps | 2:273153e44338 | 1054 | it3 = it3 - ipw2 * it2; |
| JovanEps | 2:273153e44338 | 1055 | it2 = it2 + iseed[1] * m4 + iseed[2] * m3 + iseed[3] * m2; |
| JovanEps | 2:273153e44338 | 1056 | it1 = it2 / ipw2; |
| JovanEps | 2:273153e44338 | 1057 | it2 = it2 - ipw2 * it1; |
| JovanEps | 2:273153e44338 | 1058 | it1 = it1 + iseed[0] * m4 + iseed[1] * m3 + iseed[2] * m2 + iseed[3] * m1; |
| JovanEps | 2:273153e44338 | 1059 | it1 = ( it1 % ipw2 ); |
| JovanEps | 2:273153e44338 | 1060 | /* |
| JovanEps | 2:273153e44338 | 1061 | Return updated seed |
| JovanEps | 2:273153e44338 | 1062 | */ |
| JovanEps | 2:273153e44338 | 1063 | iseed[0] = it1; |
| JovanEps | 2:273153e44338 | 1064 | iseed[1] = it2; |
| JovanEps | 2:273153e44338 | 1065 | iseed[2] = it3; |
| JovanEps | 2:273153e44338 | 1066 | iseed[3] = it4; |
| JovanEps | 2:273153e44338 | 1067 | /* |
| JovanEps | 2:273153e44338 | 1068 | Convert 48-bit integer to a real number in the interval (0,1) |
| JovanEps | 2:273153e44338 | 1069 | */ |
| JovanEps | 2:273153e44338 | 1070 | value = |
| JovanEps | 2:273153e44338 | 1071 | r * ( ( double ) ( it1 ) |
| JovanEps | 2:273153e44338 | 1072 | + r * ( ( double ) ( it2 ) |
| JovanEps | 2:273153e44338 | 1073 | + r * ( ( double ) ( it3 ) |
| JovanEps | 2:273153e44338 | 1074 | + r * ( ( double ) ( it4 ) ) ) ) ); |
| JovanEps | 2:273153e44338 | 1075 | |
| JovanEps | 2:273153e44338 | 1076 | return value; |
| JovanEps | 2:273153e44338 | 1077 | } |
| JovanEps | 2:273153e44338 | 1078 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 1079 | |
| JovanEps | 2:273153e44338 | 1080 | double *r8mat_gen ( int lda, int n ) |
| JovanEps | 2:273153e44338 | 1081 | |
| JovanEps | 2:273153e44338 | 1082 | /******************************************************************************/ |
| JovanEps | 2:273153e44338 | 1083 | /* |
| JovanEps | 2:273153e44338 | 1084 | Purpose: |
| JovanEps | 2:273153e44338 | 1085 | |
| JovanEps | 2:273153e44338 | 1086 | R8MAT_GEN generates a random R8MAT. |
| JovanEps | 2:273153e44338 | 1087 | |
| JovanEps | 2:273153e44338 | 1088 | Modified: |
| JovanEps | 2:273153e44338 | 1089 | |
| JovanEps | 2:273153e44338 | 1090 | 06 June 2005 |
| JovanEps | 2:273153e44338 | 1091 | |
| JovanEps | 2:273153e44338 | 1092 | Parameters: |
| JovanEps | 2:273153e44338 | 1093 | |
| JovanEps | 2:273153e44338 | 1094 | Input, integer LDA, the leading dimension of the matrix. |
| JovanEps | 2:273153e44338 | 1095 | |
| JovanEps | 2:273153e44338 | 1096 | Input, integer N, the order of the matrix. |
| JovanEps | 2:273153e44338 | 1097 | |
| JovanEps | 2:273153e44338 | 1098 | Output, double R8MAT_GEN[LDA*N], the N by N matrix. |
| JovanEps | 2:273153e44338 | 1099 | */ |
| JovanEps | 2:273153e44338 | 1100 | { |
| JovanEps | 3:da1132c65314 | 1101 | double *ba; |
| JovanEps | 2:273153e44338 | 1102 | int i; |
| JovanEps | 2:273153e44338 | 1103 | int init[4] = { 1, 2, 3, 1325 }; |
| JovanEps | 2:273153e44338 | 1104 | int j; |
| JovanEps | 2:273153e44338 | 1105 | |
| JovanEps | 3:da1132c65314 | 1106 | ba = ( double * ) malloc ( lda * n * sizeof ( double ) ); |
| JovanEps | 2:273153e44338 | 1107 | |
| JovanEps | 2:273153e44338 | 1108 | for ( j = 1; j <= n; j++ ) { |
| JovanEps | 2:273153e44338 | 1109 | for ( i = 1; i <= n; i++ ) { |
| JovanEps | 3:da1132c65314 | 1110 | ba[i-1+(j-1)*lda] = r8_random ( init ) - 0.5; |
| JovanEps | 2:273153e44338 | 1111 | } |
| JovanEps | 1:be78b18b8347 | 1112 | } |
| JovanEps | 2:273153e44338 | 1113 | |
| JovanEps | 3:da1132c65314 | 1114 | return ba; |
| JovanEps | 0:43b96e9650ef | 1115 | } |