OSDN Git Service

removes destructor of QCalcUnit
[qcad/qcad.git] / calcunits / QC_rot.cpp
1 //---------------------------------------------------------------------------\r
2 // Rotate Gate\r
3 //---------------------------------------------------------------------------\r
4 #include <cmath>\r
5 #include <math.h>\r
6 #include "QC_rot.h"\r
7 //---------------------------------------------------------------------------\r
8 /**\r
9  *\r
10  */\r
11 QC_rot::QC_rot(int _TargetBit,double degree) : QCalcUnit() {\r
12     TargetBit = _TargetBit;\r
13     Theta = M_PI * degree / 180.0;\r
14 }\r
15 //---------------------------------------------------------------------------\r
16 /**\r
17  * Calculation\r
18  */\r
19 void\r
20 QC_rot::calc(int target, double theta,\r
21              double R[], double I[], int NumberOfBits) {\r
22     const double c     = std::cos(theta);\r
23     const double s     = std::sin(theta);\r
24     double r1, i1;\r
25     unsigned int states = (1 << (NumberOfBits - 1));\r
26     for (unsigned int i = 0; i < states; i++) {\r
27         unsigned int ix1 = QCalcUnit::insert1(i, target);\r
28         double r1 = R[ix1];\r
29         double i1 = I[ix1];\r
30 \r
31         R[ix1] =  c*r1 - s*i1;\r
32         I[ix1] =  s*r1 + c*i1;\r
33     }\r
34 }\r
35 //---------------------------------------------------------------------------\r
36 void QC_rot::Calc(QBits *qBits)\r
37 {\r
38     int N = qBits->GetNumberOfQBits();\r
39     double *R = qBits->GetBitsR();//Real Part\r
40     double *I = qBits->GetBitsI();//Imaginary Part\r
41     QC_rot::calc(TargetBit, Theta, R, I, N);\r
42 }\r
43 //---------------------------------------------------------------------------\r
44 #ifdef __USE__MPI\r
45 void\r
46 QC_rot::calcmpi(int t1, double theta, double R[], double I[], int N) {\r
47     const double c     = std::cos(theta);\r
48     const double s     = std::sin(theta);\r
49     double r0 = 0.0;\r
50     double i0 = 0.0;\r
51     double r1 = 0.0;\r
52     double i1 = 0.0;\r
53     unsigned int ix0, ix1;\r
54 \r
55     for (int i = 0; i < (1 << (N - 1)); i++) {\r
56         // Obtain indices of state:\r
57         ix0 = QCalcUnit::insert0(i, t1);\r
58         ix1 = QCalcUnit::insert1(i, t1);\r
59 \r
60         bool bstore = setup(R, I, ix0, ix1, r0, i0, r1, i1);\r
61 \r
62         if (bstore) {\r
63             double nr0 = r0;\r
64             double ni0 = i0;\r
65             double nr1 = c*r1 - s*i1;\r
66             double ni1 = s*r1 + c*i1;\r
67             // Store:\r
68             store(R, I, ix0, ix1, nr0, ni0, nr1, ni1);\r
69         }\r
70     }\r
71 }\r
72 #endif\r
73 //---------------------------------------------------------------------------\r