902f93f9286ceaaaf91a27c3669bd098d3990fa9
[alexxy/gromacs.git] / include / gmxcomplex.h
1 /*
2  * $Id: gmxcomplex.h,v 1.5 2009/03/07 13:30:36 lindahl Exp $
3  * 
4  *                This source code is part of
5  * 
6  *                 G   R   O   M   A   C   S
7  * 
8  *          GROningen MAchine for Chemical Simulations
9  * 
10  *                        VERSION 3.2.0
11  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13  * Copyright (c) 2001-2004, The GROMACS development team,
14  * check out http://www.gromacs.org for more information.
15
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  * 
21  * If you want to redistribute modifications, please consider that
22  * scientific software is very special. Version control is crucial -
23  * bugs must be traceable. We will be happy to consider code for
24  * inclusion in the official distribution, but derived work must not
25  * be called official GROMACS. Details are found in the README & COPYING
26  * files - if they are missing, get the official version at www.gromacs.org.
27  * 
28  * To help us fund GROMACS development, we humbly ask that you cite
29  * the papers on the package - you can find them in the top README file.
30  * 
31  * For more info, check our website at http://www.gromacs.org
32  * 
33  * And Hey:
34  * Gromacs Runs On Most of All Computer Systems
35  */
36 #ifndef _gmxcomplex_h
37 #define _gmxcomplex_h
38
39 #include <math.h>
40 #include "typedefs.h"
41
42 typedef struct {
43   real re,im;
44 } t_complex;
45
46 typedef t_complex cvec[DIM];
47
48 static t_complex cnul = { 0.0, 0.0 };
49
50 static t_complex rcmul(real r,t_complex c)
51 {
52   t_complex d;
53   
54   d.re = r*c.re;
55   d.im = r*c.im;
56   
57   return d;
58 }
59
60 static t_complex rcexp(real r)
61 {
62   t_complex c;
63   
64   c.re = (real)cos(r);
65   c.im = (real)sin(r);
66   
67   return c;
68 }
69
70
71 static t_complex cadd(t_complex a,t_complex b)
72 {
73   t_complex c;
74   
75   c.re = a.re+b.re;
76   c.im = a.im+b.im;
77   
78   return c;
79 }
80
81 static t_complex csub(t_complex a,t_complex b)
82 {
83   t_complex c;
84   
85   c.re = a.re-b.re;
86   c.im = a.im-b.im;
87   
88   return c;
89 }
90
91 static t_complex cmul(t_complex a,t_complex b)
92 {
93   t_complex c;
94   
95   c.re = a.re*b.re - a.im*b.im;
96   c.im = a.re*b.im + a.im*b.re;
97   
98   return c;
99 }
100
101 static t_complex conjugate(t_complex c)
102 {
103   t_complex d;
104   
105   d.re =  c.re;
106   d.im = -c.im;
107   
108   return d;
109 }
110
111 static real cabs2(t_complex c)
112 {
113 real abs2;
114 abs2=(c.re*c.re)+(c.im*c.im);
115
116 return abs2;
117 }
118
119
120
121 static t_complex cdiv(t_complex teller,t_complex noemer)
122 {
123   t_complex res,anoemer;
124   
125   anoemer = cmul(conjugate(noemer),noemer);
126   res = cmul(teller,conjugate(noemer));
127   
128   return rcmul(1.0/anoemer.re,res);
129 }
130 #endif