GPUE  v1.0
GPU Gross-Pitaevskii Equation numerical solver for Bose-Einstein condensates
minions.cu
Go to the documentation of this file.
1 
2 #include "../include/minions.h"
3 
4 namespace Minions{
5 
6  double psi2(double2 in){
7  return in.x*in.x + in.y*in.y;
8  }
9 
10  double maxValue(double* grid,int len){
11  double max = grid[0];
12  for (int i=1;i<len-1;++i){
13  if(max<grid[i]){
14  max=grid[i];
15  }
16  }
17  return max;
18  }
19 
20  double minValue(double* grid,int len){
21  double min = grid[0];
22  for (int i=1;i<len-1;++i){
23  if(min>grid[i])
24  min=grid[i];
25  }
26  return min;
27  }
28 
29  double sumAvg(double* in, int len){
30  double avg = 0.0;
31 
32  for (int i=0; i<len; ++i){
33  avg += in[i];
34  }
35  return avg/len;
36  }
37 
38  /**
39  * Double precision fast inverse square-root. Useless, but necessary to have.
40  */
41  double fInvSqRt(double in){
42  long long l;
43  double in05, calc;
44 
45  in05 = in*0.5;
46  calc=in;
47  l = * (long long*) &calc;
48  l = 0x5fe6eb50c7b537a9LL - (l >> 1);
49  calc = *(double *) &l;
50  calc = calc*( 1.5 - (in05*calc*calc) );
51 
52  return calc;
53  }
54 
55  void coordSwap(struct Vtx::Vortex *vCoords, int src, int dest){
56  struct Vtx::Vortex d = vCoords[dest];
57  vCoords[dest] = vCoords[src];
58  vCoords[src] = d;
59  //std::swap(vCoords[src],vCoords[dest]);
60  }
61 
62  double complexMag(double2 in){
63  return sqrt(in.x*in.x + in.y*in.y);
64  }
65 
66  double complexMag2(double2 in){
67  return in.x*in.x + in.y*in.y;
68  }
69 
70  double2 complexMult(double2 in1, double2 in2){
71  double2 result;
72  result.x = (in1.x*in2.x - in1.y*in2.y);
73  result.y = (in1.x*in2.y + in1.y*in2.x);
74  return result;
75  }
76 
77  double2 complexScale(double2 comp, double scale){
78  double2 result;
79  result.x = comp.x*scale;
80  result.y = comp.y*scale;
81  return result;
82  }
83 
84  double2 conj(double2 c){
85  double2 result = c;
86  result.y = -result.y;
87  return result;
88  }
89 
90  double2 complexDiv(double2 num, double2 den){
91  double2 c = conj(den);
92  return complexScale(complexMult(num,c),(1.0/complexMag2(den)));
93  }
94 
95  void trans2x2(double *in, double *out){
96  out[0] = in[0];
97  out[1] = in[2];
98  out[2] = in[1];
99  out[3] = in[3];
100  }
101 
102  void inv2x2(double *in, double *out){
103  double det = 1.0/(in[0]*in[3] - in[1]*in[2]);
104  out[0] = det*in[3];
105  out[1] = -det*in[1];
106  out[2] = -det*in[2];
107  out[3] = det*in[0];
108  }
109 }
110 
111  /*
112  int qSort(int2 *vCoords, int *vCoordsP int index, int length){
113  if(index < 2){
114  return 0;
115  }
116  int2 pivot;
117  int l = 0;
118  int r = length - 1;
119  while (l <= r){
120  0;
121  }
122  }
123 */