4 #define NO_INCLUDE_ROSENBROCK_CU
14 #if defined HAS_ROCM_MODEL
15 #include <hip/hip_runtime.h>
25 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
28 void rbCalcKi (
float **K,
float **,
float *
X,
int* ludI,
29 void (*calcDX)(
float*,
float*,
void*),
30 void *params,
float h,
int N,
int i );
32 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
35 void rbSolver (
float **,
float *,
float *,
int N );
37 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
40 void fludcmp0 (
float **,
int n,
int *indx,
float *);
42 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
46 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
49 void flubksb0 (
float **,
int n,
int *indx,
float *);
51 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
54 void fludcmp (
float **,
int,
int *,
float *);
56 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
59 void flubksb (
float **,
int,
int *,
float * );
83 #if defined __CUDA__ || defined __HIP__
86 void rbStepX (
float *
X,
void (*calcDX)(
float*,
float*,
void*),
87 void (*calcJ)(
float**,
float*,
void*,
int ),
88 void *params,
float h,
int N )
97 const float Chi[
RS_ORDER] = { 14/3., 20/3., 4/3., 2/3. };
100 #if !defined __CUDA__ && !defined __HIP__
101 printf(
"Increase limit for number of equations: currently %d\n",
RS_MAX_N);
102 #elif defined __CUDA__
103 printf(
"Error: Increase limit for number of equations (RS_MAX_N macro)\n");
108 memset(kbuf, 0,
sizeof(kbuf));
109 memset(abuf, 0,
sizeof(abuf));
111 for(
int i = 0; i <
RS_ORDER || i < N; i++ ) {
112 if( i <
RS_ORDER ) k[i] = &(kbuf[i*N]);
113 if( i < N ) a[i] = &(abuf[i*N]);
115 calcJ(a,
X, params, N);
118 for(
int i = 0; i < N; i++ )
119 for(
int j = 0; j < N; j++ )
120 a[i][j] = ((i == j) ? 4 : 0) - h * a[i][j];
126 for(
int ki = 0; ki <
RS_ORDER; ki++)
127 rbCalcKi ( k, a,
X, ludI, calcDX, params, h, N, ki );
129 for(
int Ki = 0; Ki <
RS_ORDER; Ki++)
130 for(
int row = 0; row < N; row++ )
131 X[row] += h * Chi[Ki] * k[Ki][row];
152 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
155 void rbCalcKi (
float **K,
float **A,
float *
X,
int* ludI,
156 void (*calcDX)(
float*,
float*,
void*),
157 void *params,
float h,
int N,
int i )
172 memcpy( xx,
X, N *
sizeof(
float));
174 for(
int j = 0; j < i; j++ ) {
175 for(
int row = 0; row < N; row++ ) {
176 xx[row] += h * Alpha[i][j] * K[j][row];
177 K[i][row] += Beta[i][j] * K[j][row];
182 calcDX( DXi, xx, params );
184 for(
int row = 0; row < N; row++ ) K[i][row] += DXi[row];
204 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
207 void rbSolver(
float **A,
float *x,
float *b,
int N ) {
211 for(
int i = 1; i < N; i++ ) {
212 for(
int j = 0; j < i; j++ ) {
214 float K = -A[i][j] / A[j][j];
215 for(
int k = j; k < N; k++ ) A[i][k] += K * A[j][k];
221 for(
int i = N - 1; i >= 0; i--) {
223 for(
int j = i + 1; j < N; j++) x[i] -= A[i][j] * x[j];
240 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
243 void fludcmp0(
float **a,
int n,
int *indx,
float *d)
267 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
270 void flubksb0(
float **a,
int n,
int *indx,
float *b)
278 flubksb( ptr, n, indx-1, b-1 );
281 #define TINY 1.0e-20;
283 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
286 void fludcmp(
float **a,
int n,
int *indx,
float *d)
300 if ((temp=fabs(a[i][j])) > big) big=temp;
303 printf(
"Singular matrix in routine LUDCMP");
309 }
while ( ++i <= n );
320 sum -= a[i][k]*a[k][j];
333 sum -= a[i][k]*a[k][j];
337 if ( (dum=vv[i]*fabs(
sum)) >= big) {
350 if (a[j][j] == 0.0) a[j][j]=
TINY;
353 for (i=j+1;i<=n;i++) a[i][j] *= dum;
360 #if defined MLIR_CODEGEN && (defined __CUDA__ || defined __HIP__)
363 void flubksb(
float **a,
int n,
int *indx,
float *b )
374 for (j=ii;j<=i-1;j++)
392 #if defined MLIR_CODEGEN && !defined __CUDA__ && !defined __HIP__
410 template<
size_t vector_size>
411 void rbCalcKi(
float **K,
float **A,
float *
X,
int* ludI,
412 void (*calcDX)(
float*,
float*,
void*),
413 void *params,
float h,
int N,
int i)
428 memcpy(xx,
X, N*vector_size*
sizeof(
float));
430 for (
int v = 0; v < vector_size; ++v) {
431 for(
int j = 0; j < i; j++ ) {
432 for(
int row = 0; row < N; row++ ) {
433 xx[v*N + row] += h * Alpha[i][j] * K[v*
RS_ORDER + j][row];
440 calcDX( DXi, xx, params );
441 for (
int v = 0; v < vector_size; ++v)
442 for(
int row = 0; row < N; row++ )
443 K[v*
RS_ORDER + i][row] += DXi[v*N + row];
445 for (
int v = 0; v < vector_size; ++v)
470 template<
size_t vector_size>
471 void rbStepX (
float *
X,
void (*calcDX)(
float*,
float*,
void*),
472 void (*calcJ)(
float*,
float*,
void*,
int ),
473 void *params,
float h,
int N )
480 const float Chi[
RS_ORDER] = { 14/3., 20/3., 4/3., 2/3. };
483 printf(
"Increase limit for number of equations: currently %d\n",
RS_MAX_N );
487 memset(kbuf, 0,
sizeof(kbuf));
488 memset(abuf, 0,
sizeof(abuf));
491 for (
int i = 0; i < vector_size; ++i) {
492 for(
int j = 0; j <
RS_ORDER || j < N; j++ ) {
493 if( j <
RS_ORDER ) k[i*
RS_ORDER + j] = &(kbuf[i*K_ORDER*K_ORDER + j*K_ORDER]);
494 if( j < N ) a[i*N + j] = &(abuf[i*N*N + j*N]);
497 calcJ(abuf,
X, params, N);
499 for (
int i = 0; i < vector_size; ++i)
500 for(
int j = 0; j < N; j++ )
501 for(
int k = 0; k < N; k++ )
502 a[i*N + j][k] = ((j == k) ? 4 : 0) - h * a[i*N + j][k];
505 for (
int i = 0; i < vector_size; ++i) {
507 fludcmp0( &a[i*N], N, ludI + i * N, &ludD );
510 for(
int ki = 0; ki <
RS_ORDER; ki++)
511 rbCalcKi<vector_size>( k, a,
X, ludI, calcDX, params, h, N, ki);
513 for (
int i = 0; i < vector_size; ++i)
514 for(
int Ki = 0; Ki <
RS_ORDER; Ki++)
515 for(
int row = 0; row < N; row++ )
516 X[i*N + row] += h * Chi[Ki] * k[i *
RS_ORDER + Ki][row];
524 void rbStepX_2 (
float *
X,
void (*calcDX)(
float*,
float*,
void*),
525 void (*calcJ)(
float*,
float*,
void*,
int ),
526 void *params,
float h,
int N )
528 rbStepX<2>(
X, calcDX, calcJ, params, h, N);
531 void rbStepX_4 (
float *
X,
void (*calcDX)(
float*,
float*,
void*),
532 void (*calcJ)(
float*,
float*,
void*,
int ),
533 void *params,
float h,
int N )
535 rbStepX<4>(
X, calcDX, calcJ, params, h, N);
538 void rbStepX_8 (
float *
X,
void (*calcDX)(
float*,
float*,
void*),
539 void (*calcJ)(
float*,
float*,
void*,
int ),
540 void *params,
float h,
int N )
542 rbStepX<8>(
X, calcDX, calcJ, params, h, N);
545 void rbStepX_16 (
float *
X,
void (*calcDX)(
float*,
float*,
void*),
546 void (*calcJ)(
float*,
float*,
void*,
int ),
547 void *params,
float h,
int N )
549 rbStepX<16>(
X, calcDX, calcJ, params, h, N);
552 void rbStepX_32 (
float *
X,
void (*calcDX)(
float*,
float*,
void*),
553 void (*calcJ)(
float*,
float*,
void*,
int ),
554 void *params,
float h,
int N )
556 rbStepX<32>(
X, calcDX, calcJ, params, h, N);
T sum(const vector< T > &vec)
Compute sum of a vector's entries.
void rbSolver(float **, float *, float *, int N)
void fludcmp(float **, int, int *, float *)
void flubksb(float **, int, int *, float *)
void rbStepX(float *X, void(*calcDX)(float *, float *, void *), void(*calcJ)(float **, float *, void *, int), void *params, float h, int N)
void flubksb0(float **, int n, int *indx, float *)
void rbCalcKi(float **K, float **, float *X, int *ludI, void(*calcDX)(float *, float *, void *), void *params, float h, int N, int i)
void fludcmp0(float **, int n, int *indx, float *)