19 #ifndef __HERMES_COMMON_COMMON_H
20 #define __HERMES_COMMON_COMMON_H
64 typedef double double2[2];
65 typedef double double3[3];
66 typedef double double4[4];
67 typedef double double2x2[2][2];
68 typedef double double3x2[3][2];
69 typedef double double3x3[3][3];
71 template<
typename Scalar>
79 val[0] = v1; val[1] = v2;
82 Scalar& operator[] (
int idx)
84 assert(idx >= 0 && idx < 2);
89 template<
typename Scalar>
95 Scalar3(Scalar v1, Scalar v2, Scalar v3)
97 val[0] = v1; val[1] = v2, val[2] = v3;
100 Scalar& operator[] (
int idx)
102 assert(idx >= 0 && idx < 3);
109 typedef __int8 int8_t;
110 typedef __int16 int16_t;
111 typedef __int32 int32_t;
112 typedef __int64 int64_t;
114 typedef unsigned __int8 uint8_t;
115 typedef unsigned __int16 uint16_t;
116 typedef unsigned __int32 uint32_t;
117 typedef unsigned __int64 uint64_t;
119 #include <inttypes.h>
124 #define M_PI 3.14159265358979323846
129 inline double sqr(
int x) {
return x*x; }
130 inline double sqr(
double x) {
return x*x; }
131 inline double sqrt(
double x) {
return std::sqrt(x); }
132 inline double sqr(std::complex<double> x) {
return std::norm(x); }
133 inline double magn(
double x) {
return fabs(x); }
134 inline double conj(
double a) {
return a; }
135 inline double cos(
double x) {
return std::cos(x); }
136 inline double sin(
double x) {
return std::sin(x); }
137 inline double atan(
double x) {
return std::atan(x); }
138 inline double atan2(
double x,
double y) {
return std::atan2(x, y); }
139 inline double abs(
double x) {
return std::abs(x); }
140 inline double pow(
double x,
double y) {
return std::pow(x, y); }
141 inline double log(
double x) {
return std::log(x); }
144 #undef HERMES_LOG_FILE
145 #ifdef HERMES_REPORT_NO_FILE
146 # define HERMES_LOG_FILE NULL
148 # ifdef HERMES_REPORT_FILE
149 # define HERMES_LOG_FILE HERMES_REPORT_FILE
152 # define HERMES_LOG_FILE "hermes.log" // default filename for a library
154 # define HERMES_LOG_FILE "test.log" // default filename for a library test
160 #define HERMES_EC_ERROR 'E'
161 #define HERMES_EC_WARNING 'W'
162 #define HERMES_EC_INFO 'I'
165 #define HERMES_LOG_FILE_DELIM_SIZE 80
171 #ifdef _WIN32 //Win32
172 # ifdef __MINGW32__ //MinGW
173 # define __CURRENT_FUNCTION __func__
174 # else //MSVC and other compilers
175 # define __CURRENT_FUNCTION __FUNCTION__
177 #else //Linux and Mac
178 # define __CURRENT_FUNCTION __PRETTY_FUNCTION__
182 const std::string HERMES_ANY =
"-1234";
184 const int HERMES_ANY_INT = -1234;
188 inline void fprint_num(FILE*f,
double x,
char* number_format)
190 fprintf(f, number_format, x);
193 inline void fprint_num(FILE*f, std::complex<double> x,
char* number_format)
195 char* number_formatComplex =
new char[20];
196 sprintf(number_formatComplex,
"(%s, %s)", number_format, number_format);
197 fprintf(f, number_formatComplex, x.real(), x.imag());
211 extern int zscal_(
int *, std::complex<double> *, std::complex<double> *,
int *);
212 extern int zaxpy_(
int *, std::complex<double> *, std::complex<double> *,
int *, std::complex<double> *,
int *);
213 extern int zcopy_(
int *, std::complex<double> *,
int *, std::complex<double> *,
int *);
215 extern int dscal_(
int *,
double *,
double *,
int *);
216 extern int daxpy_(
int *,
double *,
double *,
int *,
double *,
int *);
217 extern int dcopy_(
int *,
double *,
int *,
double *,
int *);
224 inline void blas_scal(
int n, std::complex<double> alpha, std::complex<double> *x,
int incx) { zscal_(&n, &alpha, x, &incx); }
226 inline void blas_axpy(
int n, std::complex<double> alpha, std::complex<double> *x,
int incx, std::complex<double> *y,
int incy) { zaxpy_(&n, &alpha, x, &incx, y, &incy); }
228 inline void blas_copy(
int n, std::complex<double> *x,
int incx, std::complex<double> *y,
int incy) { zcopy_(&n, x, &incx, y, &incx); }
231 inline void blas_scal(
int n,
double alpha,
double *x,
int incx) { dscal_(&n, &alpha, x, &incx); }
233 inline void blas_axpy(
int n,
double alpha,
double *x,
int incx,
double *y,
int incy) { daxpy_(&n, &alpha, x, &incx, y, &incy); }
235 inline void blas_copy(
int n,
double *x,
int incx,
double *y,
int incy) { dcopy_(&n, x, &incx, y, &incx); }