1 
2 /*! @file slu_dcomplex.h
3  * \brief Header file for complex operations
4  * <pre>
5  *  -- SuperLU routine (version 2.0) --
6  * Univ. of California Berkeley, Xerox Palo Alto Research Center,
7  * and Lawrence Berkeley National Lab.
8  * November 15, 1997
9  *
10  * Contains definitions for various complex operations.
11  * This header file is to be included in source files z*.c
12  * </pre>
13  */
14 #ifndef __SUPERLU_DCOMPLEX /* allow multiple inclusions */
15 #define __SUPERLU_DCOMPLEX
16 
17 
18 #ifndef DCOMPLEX_INCLUDE
19 #define DCOMPLEX_INCLUDE
20 
21 typedef struct { double r, i; } doublecomplex;
22 
23 
24 /* Macro definitions */
25 
26 /*! \brief Complex Addition c = a + b */
27 #define z_add(c, a, b) { (c)->r = (a)->r + (b)->r; \
28 			 (c)->i = (a)->i + (b)->i; }
29 
30 /*! \brief Complex Subtraction c = a - b */
31 #define z_sub(c, a, b) { (c)->r = (a)->r - (b)->r; \
32 			 (c)->i = (a)->i - (b)->i; }
33 
34 /*! \brief Complex-Double Multiplication */
35 #define zd_mult(c, a, b) { (c)->r = (a)->r * (b); \
36                            (c)->i = (a)->i * (b); }
37 
38 /*! \brief Complex-Complex Multiplication */
39 #define zz_mult(c, a, b) { \
40 	double cr, ci; \
41     	cr = (a)->r * (b)->r - (a)->i * (b)->i; \
42     	ci = (a)->i * (b)->r + (a)->r * (b)->i; \
43     	(c)->r = cr; \
44     	(c)->i = ci; \
45     }
46 
47 #define zz_conj(a, b) { \
48         (a)->r = (b)->r; \
49         (a)->i = -((b)->i); \
50     }
51 
52 /*! \brief Complex equality testing */
53 #define z_eq(a, b)  ( (a)->r == (b)->r && (a)->i == (b)->i )
54 
55 
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
59 
60 /* Prototypes for functions in dcomplex.c */
61 void z_div(doublecomplex *, doublecomplex *, doublecomplex *);
62 double z_abs(doublecomplex *);     /* exact */
63 double z_abs1(doublecomplex *);    /* approximate */
64 void z_exp(doublecomplex *, doublecomplex *);
65 void d_cnjg(doublecomplex *r, doublecomplex *z);
66 double d_imag(doublecomplex *);
67 doublecomplex z_sgn(doublecomplex *);
68 doublecomplex z_sqrt(doublecomplex *);
69 
70 
71 
72 #ifdef __cplusplus
73   }
74 #endif
75 
76 #endif
77 
78 #endif  /* __SUPERLU_DCOMPLEX */
79