-
Notifications
You must be signed in to change notification settings - Fork 0
/
complex.c
140 lines (107 loc) · 2.72 KB
/
complex.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "cudaglobal.h"
#include "global.h"
#include "complex.h"
#include "stdio.h"
#include "stdlib.h"
#include <math.h>
/*
inline complex crealmult(complex c1, double real){//multipliziert c1 mit reeller zahl re
complex erg;
erg.re = real*c1.re;
erg.im = real*c1.im;
return erg;
}
inline complex cmult (complex c1, complex c2){//multiplizier zwei komplexe Zahlen
complex erg;
erg.re = c1.re * c2.re - c1.im * c2.im;
erg.im = c1.re * c2.im + c1.im * c2.re;
return erg;
}
*/
complex cconj (complex c){ /*konjugiert komplexe Zahl*/
complex erg;
erg.re = c.re;
erg.im = -1.0*c.im;
return erg;
}
void ccopy(complex* von, complex* nach){/*kopiert complex von nach complex nach*/
nach->re = von->re;
nach->im = von->im;
}
double cabssquare (complex c){ /*gibt abs^2 einer komplexen Zahl zurück*/
return c.re*c.re + c.im*c.im;
}
double cabsolute (complex c){/*gibt Betrag einer kompl. zahl zurück*/
return sqrt(c.re*c.re + c.im*c.im);
}
complex crealmult(complex c1, double real){ /*multipliziert c1 mit reeller zahl re*/
complex erg;
erg.re = real*c1.re;
erg.im = real*c1.im;
return erg;
}
complex cmult (complex c1, complex c2){ /*multiplizier zwei komplexe Zahlen*/
complex erg;
erg.re = c1.re * c2.re - c1.im * c2.im;
erg.im = c1.re * c2.im + c1.im * c2.re;
return erg;
}
complex cadd (complex c1, complex c2){ /*addiert zwei komplexe Zahlen */
complex erg;
erg.re = c1.re + c2.re;
erg.im = c1.im + c2.im;
return erg;
}
complex cdiv(complex c1, complex c2) { /* dividiert c1 durch c2 */
complex erg;
double oneovernenner = 1.0/(c2.re*c2.re + c2.im*c2.im);
erg.re = oneovernenner*(c1.re*c2.re + c1.im*c2.im);
erg.im = oneovernenner*(c1.im*c2.re - c1.re*c2.im);
return erg;
}
complex csub(complex c1, complex c2){
complex erg;
erg.re = c1.re - c2.re;
erg.im = c1.im - c2.im;
return erg;
}
void showcomplex(complex c){
printf("(%f,%f)",(double)c.re,(double)c.im);
return;
}
complex initcomplex(double re, double im){/* gibt komplexe Zahl mit Realt re und Imt im zurück*/
complex erg;
erg.re = re;
erg.im = im;
return erg;
}
double host_skalarprod_spinor_field(spinor* s1, spinor* s2){
int i,j,k;
double skalprod = 0.0l;
complex conj;
complex prod;
for(i=0;i<VOLUME;i++){
for(j=0;j<12;j++){
conj = cconj(s1[i][j]);
prod = cmult(conj,s2[i][j]);
skalprod += prod.re;
}
}
return skalprod;
}
void host_add_spinor_field(spinor* s1, spinor* s2, spinor* so){
int i,j,k;
for(i=0;i<VOLUME;i++){
for(j=0;j<12;j++){
so[i][j] = cadd(s1[i][j], s2[i][j]);
}
}
}
void host_skalarmult_spinor_field(spinor* s1, complex alpha, spinor* so){
int i,j,k;
for(i=0;i<VOLUME;i++){
for(j=0;j<12;j++){
so[i][j] = cmult(s1[i][j], alpha);
}
}
}