4444#ifdef HAVE_CONFIG_H
4545#include <tmlqcd_config.h>
4646#endif
47- #include <complex.h>
4847#include <math.h>
4948#include <stdio.h>
5049#include <stdlib.h>
@@ -76,6 +75,7 @@ static double *s;
7675
7776int gmres_precon (spinor * const P , spinor * const Q , const int m , const int max_restarts ,
7877 const double eps_sq , const int rel_prec , const int N , matrix_mult f ) {
78+ int restart , i , j , k ;
7979 double beta , eps , norm ;
8080 complex tmp1 , tmp2 ;
8181 spinor * * solver_field = NULL ;
@@ -93,36 +93,36 @@ int gmres_precon(spinor *const P, spinor *const Q, const int m, const int max_re
9393
9494 /* assign(solver_field[1], P, N); */
9595 zero_spinor_field (solver_field [1 ], N );
96- for (int restart = 0 ; restart < max_restarts ; restart ++ ) {
96+ for (restart = 0 ; restart < max_restarts ; restart ++ ) {
9797 /* r_0=Q-AP (b=Q, x+0=P) */
9898 f (solver_field [1 ], solver_field [1 ]);
9999 diff (solver_field [1 ], Q , solver_field [1 ], N );
100100 /* v_0=r_0/||r_0|| */
101- alpha [0 ] = sqrt (square_norm (solver_field [1 ], N , 1 )) + 0.0 I ;
101+ alpha [0 ]. re = sqrt (square_norm (solver_field [1 ], N , 1 ));
102102
103103 /* if(alpha[0].re == 0.){ */
104104 /* assign(P, solver_field[1], N); */
105105 /* return(restart*m); */
106106 /* } */
107107
108- if (creal ( alpha [0 ]) != 0. ) {
109- mul_r (V [0 ], 1. / creal ( alpha [0 ]) , solver_field [1 ], N );
108+ if (alpha [0 ]. re != 0. ) {
109+ mul_r (V [0 ], 1. / alpha [0 ]. re , solver_field [1 ], N );
110110
111- for (int j = 0 ; j < m ; j ++ ) {
111+ for (j = 0 ; j < m ; j ++ ) {
112112 /* solver_field[1]=A*v_j */
113113
114114 f (solver_field [1 ], V [j ]);
115115
116116 /* Set h_ij and omega_j */
117117 /* solver_field[0] <- omega_j */
118118 assign (solver_field [0 ], solver_field [1 ], N );
119- for (int i = 0 ; i <= j ; i ++ ) {
119+ for (i = 0 ; i <= j ; i ++ ) {
120120 H [i ][j ] = scalar_prod (V [i ], solver_field [0 ], N , 1 );
121121 assign_diff_mul (solver_field [0 ], V [i ], H [i ][j ], N );
122122 }
123123
124124 _complex_set (H [j + 1 ][j ], sqrt (square_norm (solver_field [0 ], N , 1 )), 0. );
125- for (int i = 0 ; i < j ; i ++ ) {
125+ for (i = 0 ; i < j ; i ++ ) {
126126 tmp1 = H [i ][j ];
127127 tmp2 = H [i + 1 ][j ];
128128 _mult_real (H [i ][j ], tmp2 , s [i ]);
@@ -133,7 +133,7 @@ int gmres_precon(spinor *const P, spinor *const Q, const int m, const int max_re
133133
134134 /* Set beta, s, c, alpha[j],[j+1] */
135135 beta = sqrt (_complex_square_norm (H [j ][j ]) + _complex_square_norm (H [j + 1 ][j ]));
136- s [j ] = creal ( H [j + 1 ][j ]) / beta ;
136+ s [j ] = H [j + 1 ][j ]. re / beta ;
137137 _mult_real (c [j ], H [j ][j ], 1. / beta );
138138 _complex_set (H [j ][j ], beta , 0. );
139139 _mult_real (alpha [j + 1 ], alpha [j ], s [j ]);
@@ -146,19 +146,19 @@ int gmres_precon(spinor *const P, spinor *const Q, const int m, const int max_re
146146 alpha [j + 1 ].re * alpha [j + 1 ].re );
147147 fflush (stdout );
148148 }
149- if (((creal ( alpha [j + 1 ]) <= eps ) && (rel_prec == 0 )) ||
150- (creal (( alpha [j + 1 ]) <= eps * norm ) && (rel_prec == 1 ))) {
151- _mult_real (alpha [j ], alpha [j ], 1. / creal ( H [j ][j ]) );
149+ if (((alpha [j + 1 ]. re <= eps ) && (rel_prec == 0 )) ||
150+ (( alpha [j + 1 ]. re <= eps * norm ) && (rel_prec == 1 ))) {
151+ _mult_real (alpha [j ], alpha [j ], 1. / H [j ][j ]. re );
152152 assign_add_mul (solver_field [1 ], V [j ], alpha [j ], N );
153- for (int i = j - 1 ; i >= 0 ; i -- ) {
154- for (int k = i + 1 ; k <= j ; k ++ ) {
153+ for (i = j - 1 ; i >= 0 ; i -- ) {
154+ for (k = i + 1 ; k <= j ; k ++ ) {
155155 _mult_assign_complex (tmp1 , H [i ][k ], alpha [k ]);
156156 _diff_complex (alpha [i ], tmp1 );
157157 }
158- _mult_real (alpha [i ], alpha [i ], 1. / creal ( H [i ][i ]) );
158+ _mult_real (alpha [i ], alpha [i ], 1. / H [i ][i ]. re );
159159 assign_add_mul (solver_field [1 ], V [i ], alpha [i ], N );
160160 }
161- for (int i = 0 ; i < m ; i ++ ) {
161+ for (i = 0 ; i < m ; i ++ ) {
162162 alpha [i ].im = 0. ;
163163 }
164164 assign (P , solver_field [1 ], N );
@@ -168,24 +168,24 @@ int gmres_precon(spinor *const P, spinor *const Q, const int m, const int max_re
168168 /* if not */
169169 else {
170170 if (j != m - 1 ) {
171- mul_r (V [(j + 1 )], 1. / creal ( H [j + 1 ][j ]) , solver_field [0 ], N );
171+ mul_r (V [(j + 1 )], 1. / H [j + 1 ][j ]. re , solver_field [0 ], N );
172172 }
173173 }
174174 }
175175
176176 j = m - 1 ;
177177 /* prepare for restart */
178- _mult_real (alpha [j ], alpha [j ], 1. / creal ( H [j ][j ]) );
178+ _mult_real (alpha [j ], alpha [j ], 1. / H [j ][j ]. re );
179179 assign_add_mul (solver_field [1 ], V [j ], alpha [j ], N );
180- for (int i = j - 1 ; i >= 0 ; i -- ) {
181- for (int k = i + 1 ; k <= j ; k ++ ) {
180+ for (i = j - 1 ; i >= 0 ; i -- ) {
181+ for (k = i + 1 ; k <= j ; k ++ ) {
182182 _mult_assign_complex (tmp1 , H [i ][k ], alpha [k ]);
183183 _diff_complex (alpha [i ], tmp1 );
184184 }
185- _mult_real (alpha [i ], alpha [i ], 1. / creal ( H [i ][i ]) );
185+ _mult_real (alpha [i ], alpha [i ], 1. / H [i ][i ]. re );
186186 assign_add_mul (solver_field [1 ], V [i ], alpha [i ], N );
187187 }
188- for (int i = 0 ; i < m ; i ++ ) {
188+ for (i = 0 ; i < m ; i ++ ) {
189189 alpha [i ].im = 0. ;
190190 }
191191 }
@@ -234,7 +234,6 @@ static void init_pgmres(const int _M, const int _V) {
234234}
235235
236236complex scalar_prod_nocom (spinor * const S , spinor * const R , const int N ) {
237- #ifdef __STDC_NO_COMPLEX__
238237 int ix ;
239238 static double ks , kc , ds , tr , ts , tt ;
240239 spinor * s , * r ;
@@ -305,91 +304,39 @@ complex scalar_prod_nocom(spinor *const S, spinor *const R, const int N) {
305304
306305 c .im = kc ;
307306 return (c );
308- #else
309- double complex ks , kc ;
310-
311- ks = 0.0 + 0.0 I ;
312- kc = 0.0 + 0.0 I ;
313- for (int ix = 0 ; ix < N ; ix ++ ) {
314- spinor * s = (spinor * )S + ix ;
315- spinor * r = (spinor * )R + ix ;
316- double complex ds = (* r ).s0 .c0 * (* r ).s0 .c0 +
317- (* r ).s0 .c1 * (* r ).s0 .c1 +
318- (* r ).s0 .c2 * (* r ).s0 .c2 +
319- (* r ).s1 .c0 * (* r ).s1 .c0 +
320- (* r ).s1 .c1 * (* r ).s1 .c1 +
321- (* r ).s1 .c2 * (* r ).s1 .c2 +
322- (* r ).s2 .c0 * (* r ).s2 .c0 +
323- (* r ).s2 .c1 * (* r ).s2 .c1 +
324- (* r ).s2 .c2 * (* r ).s2 .c2 +
325- (* r ).s3 .c0 * (* r ).s3 .c0 +
326- (* r ).s3 .c1 * (* r ).s3 .c1 +
327- (* r ).s3 .c2 * (* r ).s3 .c2 ;
328-
329- double complex tr = ds + kc ;
330- double complex ts = tr + ks ;
331- double complex tt = ts - ks ;
332- ks = ts ;
333- kc = tr - tt ;
334- }
335- return ks + kc ;
336- #endif
337307}
338308
339-
340309double square_norm_nocom (spinor * const P , const int N ) {
341- double ks = 0.0 ;
342- double kc = 0.0 ;
310+ int ix ;
311+ static double ks , kc , ds , tr , ts , tt ;
312+ spinor * s ;
313+
314+ ks = 0.0 ;
315+ kc = 0.0 ;
343316
344- #ifdef __STDC_NO_COMPLEX__
345317 /* Change due to even-odd preconditioning : VOLUME to VOLUME/2 */
346- for (int ix = 0 ; ix < N ; ix ++ ) {
347- spinor * s = P + ix ;
348-
349- double ds = (* s ).s0 .c0 .re * (* s ).s0 .c0 .re + (* s ).s0 .c0 .im * (* s ).s0 .c0 .im +
350- (* s ).s0 .c1 .re * (* s ).s0 .c1 .re + (* s ).s0 .c1 .im * (* s ).s0 .c1 .im +
351- (* s ).s0 .c2 .re * (* s ).s0 .c2 .re + (* s ).s0 .c2 .im * (* s ).s0 .c2 .im +
352- (* s ).s1 .c0 .re * (* s ).s1 .c0 .re + (* s ).s1 .c0 .im * (* s ).s1 .c0 .im +
353- (* s ).s1 .c1 .re * (* s ).s1 .c1 .re + (* s ).s1 .c1 .im * (* s ).s1 .c1 .im +
354- (* s ).s1 .c2 .re * (* s ).s1 .c2 .re + (* s ).s1 .c2 .im * (* s ).s1 .c2 .im +
355- (* s ).s2 .c0 .re * (* s ).s2 .c0 .re + (* s ).s2 .c0 .im * (* s ).s2 .c0 .im +
356- (* s ).s2 .c1 .re * (* s ).s2 .c1 .re + (* s ).s2 .c1 .im * (* s ).s2 .c1 .im +
357- (* s ).s2 .c2 .re * (* s ).s2 .c2 .re + (* s ).s2 .c2 .im * (* s ).s2 .c2 .im +
358- (* s ).s3 .c0 .re * (* s ).s3 .c0 .re + (* s ).s3 .c0 .im * (* s ).s3 .c0 .im +
359- (* s ).s3 .c1 .re * (* s ).s3 .c1 .re + (* s ).s3 .c1 .im * (* s ).s3 .c1 .im +
360- (* s ).s3 .c2 .re * (* s ).s3 .c2 .re + (* s ).s3 .c2 .im * (* s ).s3 .c2 .im ;
361-
362- double tr = ds + kc ;
363- double ts = tr + ks ;
364- double tt = ts - ks ;
318+ for (ix = 0 ; ix < N ; ix ++ ) {
319+ s = P + ix ;
320+
321+ ds = (* s ).s0 .c0 .re * (* s ).s0 .c0 .re + (* s ).s0 .c0 .im * (* s ).s0 .c0 .im +
322+ (* s ).s0 .c1 .re * (* s ).s0 .c1 .re + (* s ).s0 .c1 .im * (* s ).s0 .c1 .im +
323+ (* s ).s0 .c2 .re * (* s ).s0 .c2 .re + (* s ).s0 .c2 .im * (* s ).s0 .c2 .im +
324+ (* s ).s1 .c0 .re * (* s ).s1 .c0 .re + (* s ).s1 .c0 .im * (* s ).s1 .c0 .im +
325+ (* s ).s1 .c1 .re * (* s ).s1 .c1 .re + (* s ).s1 .c1 .im * (* s ).s1 .c1 .im +
326+ (* s ).s1 .c2 .re * (* s ).s1 .c2 .re + (* s ).s1 .c2 .im * (* s ).s1 .c2 .im +
327+ (* s ).s2 .c0 .re * (* s ).s2 .c0 .re + (* s ).s2 .c0 .im * (* s ).s2 .c0 .im +
328+ (* s ).s2 .c1 .re * (* s ).s2 .c1 .re + (* s ).s2 .c1 .im * (* s ).s2 .c1 .im +
329+ (* s ).s2 .c2 .re * (* s ).s2 .c2 .re + (* s ).s2 .c2 .im * (* s ).s2 .c2 .im +
330+ (* s ).s3 .c0 .re * (* s ).s3 .c0 .re + (* s ).s3 .c0 .im * (* s ).s3 .c0 .im +
331+ (* s ).s3 .c1 .re * (* s ).s3 .c1 .re + (* s ).s3 .c1 .im * (* s ).s3 .c1 .im +
332+ (* s ).s3 .c2 .re * (* s ).s3 .c2 .re + (* s ).s3 .c2 .im * (* s ).s3 .c2 .im ;
333+
334+ tr = ds + kc ;
335+ ts = tr + ks ;
336+ tt = ts - ks ;
365337 ks = ts ;
366338 kc = tr - tt ;
367339 }
368340 kc = ks + kc ;
369- #else
370- /* Change due to even-odd preconditioning : VOLUME to VOLUME/2 */
371- for (int ix = 0 ; ix < N ; ix ++ ) {
372- spinor * s = P + ix ;
373- double complex ds = (* s ).s0 .c0 * conj ((* s ).s0 .c0 ) +
374- (* s ).s0 .c1 * conj ((* s ).s0 .c1 ) +
375- (* s ).s0 .c2 * conj ((* s ).s0 .c2 ) +
376- (* s ).s1 .c0 * conj ((* s ).s1 .c0 ) +
377- (* s ).s1 .c1 * conj ((* s ).s1 .c1 ) +
378- (* s ).s1 .c2 * conj ((* s ).s1 .c2 ) +
379- (* s ).s2 .c0 * conj ((* s ).s2 .c0 ) +
380- (* s ).s2 .c1 * conj ((* s ).s2 .c1 ) +
381- (* s ).s2 .c2 * conj ((* s ).s2 .c2 ) +
382- (* s ).s3 .c0 * conj ((* s ).s3 .c0 ) +
383- (* s ).s3 .c1 * conj ((* s ).s3 .c1 ) +
384- (* s ).s3 .c2 * conj ((* s ).s3 .c2 );
385-
386- double tr = creal (ds ) + kc ;
387- double ts = tr + ks ;
388- double tt = ts - ks ;
389- ks = ts ;
390- kc = tr - tt ;
391- }
392- #endif
393-
394341 return kc ;
395342}
0 commit comments