diff --git a/src/blas/_hypre_blas.h b/src/blas/_hypre_blas.h index cfb06ab9a..04aa431a7 100644 --- a/src/blas/_hypre_blas.h +++ b/src/blas/_hypre_blas.h @@ -17,6 +17,8 @@ #include "_hypre_utilities.h" #include "fortran.h" +#include + #ifdef __cplusplus extern "C" { #endif @@ -27,6 +29,29 @@ extern "C" { #ifndef HYPRE_USING_HYPRE_BLAS +#if defined(HYPRE_SINGLE) +#define hypre_dasum hypre_F90_NAME_BLAS(sasum ,SASUM ) +#define hypre_daxpy hypre_F90_NAME_BLAS(saxpy ,SAXPY ) +#define hypre_dcopy hypre_F90_NAME_BLAS(scopy ,SCOPY ) +#define hypre_ddot hypre_F90_NAME_BLAS(sdot ,SDOT ) +#define hypre_dgemm hypre_F90_NAME_BLAS(sgemm ,SGEMM ) +#define hypre_dgemv hypre_F90_NAME_BLAS(sgemv ,SGEMV ) +#define hypre_dger hypre_F90_NAME_BLAS(sger ,SGER ) +#define hypre_dnrm2 hypre_F90_NAME_BLAS(snrm2 ,SNRM2 ) +#define hypre_drot hypre_F90_NAME_BLAS(srot ,SROT ) +#define hypre_dscal hypre_F90_NAME_BLAS(sscal ,SSCAL ) +#define hypre_dswap hypre_F90_NAME_BLAS(sswap ,SSWAP ) +#define hypre_dsymm hypre_F90_NAME_BLAS(ssymm ,SSYMM ) +#define hypre_dsymv hypre_F90_NAME_BLAS(ssymv ,SSYMV ) +#define hypre_dsyr2 hypre_F90_NAME_BLAS(ssyr2 ,SSYR2 ) +#define hypre_dsyr2k hypre_F90_NAME_BLAS(ssyr2k,SSYR2K) +#define hypre_dsyrk hypre_F90_NAME_BLAS(ssyrk ,SSYRK ) +#define hypre_dtrmm hypre_F90_NAME_BLAS(strmm ,STRMM ) +#define hypre_dtrmv hypre_F90_NAME_BLAS(strmv ,STRMV ) +#define hypre_dtrsm hypre_F90_NAME_BLAS(strsm ,STRSM ) +#define hypre_dtrsv hypre_F90_NAME_BLAS(strsv ,STRSV ) +#define hypre_idamax hypre_F90_NAME_BLAS(isamax,ISAMAX) +#else #define hypre_dasum hypre_F90_NAME_BLAS(dasum ,DASUM ) #define hypre_daxpy hypre_F90_NAME_BLAS(daxpy ,DAXPY ) #define hypre_dcopy hypre_F90_NAME_BLAS(dcopy ,DCOPY ) @@ -48,6 +73,7 @@ extern "C" { #define hypre_dtrsm hypre_F90_NAME_BLAS(dtrsm ,DTRSM ) #define hypre_dtrsv hypre_F90_NAME_BLAS(dtrsv ,DTRSV ) #define hypre_idamax hypre_F90_NAME_BLAS(idamax,IDAMAX) +#endif #endif diff --git a/src/utilities/HYPRE_utilities.h b/src/utilities/HYPRE_utilities.h index e43278f24..09d651e75 100644 --- a/src/utilities/HYPRE_utilities.h +++ b/src/utilities/HYPRE_utilities.h @@ -83,9 +83,17 @@ typedef double HYPRE_Real; #endif #if defined(HYPRE_COMPLEX) +/* support for float double and long double complex types */ +#if defined(HYPRE_SINGLE) +typedef float _Complex HYPRE_Complex; +#define HYPRE_MPI_COMPLEX MPI_C_FLOAT_COMPLEX +#elif defined(HYPRE_LONG_DOUBLE) +typedef long double _Complex HYPRE_Complex; +#define HYPRE_MPI_COMPLEX MPI_C_LONG_DOUBLE_COMPLEX +#else /* default */ typedef double _Complex HYPRE_Complex; #define HYPRE_MPI_COMPLEX MPI_C_DOUBLE_COMPLEX /* or MPI_LONG_DOUBLE ? */ - +#endif #else /* default */ typedef HYPRE_Real HYPRE_Complex; #define HYPRE_MPI_COMPLEX HYPRE_MPI_REAL diff --git a/src/utilities/_hypre_utilities.h b/src/utilities/_hypre_utilities.h index 55493df6d..8db8ac2da 100644 --- a/src/utilities/_hypre_utilities.h +++ b/src/utilities/_hypre_utilities.h @@ -309,6 +309,9 @@ extern "C" { #define MPI_CHAR hypre_MPI_CHAR #define MPI_LONG hypre_MPI_LONG #define MPI_BYTE hypre_MPI_BYTE + +#define MPI_C_FLOAT_COMPLEX hypre_MPI_COMPLEX +#define MPI_C_LONG_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_C_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_SUM hypre_MPI_SUM diff --git a/src/utilities/complex.c b/src/utilities/complex.c index ba5cebb45..a53b7c2a1 100644 --- a/src/utilities/complex.c +++ b/src/utilities/complex.c @@ -14,31 +14,61 @@ HYPRE_Complex hypre_conj( HYPRE_Complex value ) { +#if defined(HYPRE_SINGLE) + return conjf(value); +#elif defined(HYPRE_LONG_DOUBLE) + return conjl(value); +#else return conj(value); +#endif } HYPRE_Real hypre_cabs( HYPRE_Complex value ) { +#if defined(HYPRE_SINGLE) + return cabsf(value); +#elif defined(HYPRE_LONG_DOUBLE) + return cabsl(value); +#else return cabs(value); +#endif } HYPRE_Real hypre_creal( HYPRE_Complex value ) { +#if defined(HYPRE_SINGLE) + return crealf(value); +#elif defined(HYPRE_LONG_DOUBLE) + return creall(value); +#else return creal(value); +#endif } HYPRE_Real hypre_cimag( HYPRE_Complex value ) { +#if defined(HYPRE_SINGLE) + return cimagf(value); +#elif defined(HYPRE_LONG_DOUBLE) + return cimagl(value); +#else return cimag(value); +#endif } HYPRE_Complex hypre_csqrt( HYPRE_Complex value ) { +#if defined(HYPRE_SINGLE) + return csqrtf(value); +#elif defined(HYPRE_LONG_DOUBLE) + return csqrtl(value); +#else return csqrt(value); +#endif } #endif diff --git a/src/utilities/mpistubs.h b/src/utilities/mpistubs.h index 0aa3fd66a..34c9b7100 100644 --- a/src/utilities/mpistubs.h +++ b/src/utilities/mpistubs.h @@ -55,6 +55,9 @@ extern "C" { #define MPI_CHAR hypre_MPI_CHAR #define MPI_LONG hypre_MPI_LONG #define MPI_BYTE hypre_MPI_BYTE + +#define MPI_C_FLOAT_COMPLEX hypre_MPI_COMPLEX +#define MPI_C_LONG_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_C_DOUBLE_COMPLEX hypre_MPI_COMPLEX #define MPI_SUM hypre_MPI_SUM