Extend hypre complex (#824)

* Enable HYPRE_COMPLEX to accept precision types supported by hypre.
This commit is contained in:
Daniel Osei-Kuffuor 2023-02-08 10:13:20 -08:00 committed by GitHub
parent c964884062
commit ddc548f906
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 71 additions and 1 deletions

View File

@ -17,6 +17,8 @@
#include "_hypre_utilities.h"
#include "fortran.h"
#include <HYPRE_config.h>
#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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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