IPCC  1.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
KNHamiltonianBuilder.cpp
Go to the documentation of this file.
1 
7 #include "KNHamiltonianBuilder.h"
8 #include "KNTwoCenterl.h"
9 #include "KNGeometricShape.h"
10 #include "KNMaterialParam.h"
11 
12 vector<CKNMatrixOperation::CKNDMatrix*> CKNHamiltonianBuilder::m_vectMatrixNbr;
13 map<int, unsigned int> CKNHamiltonianBuilder::m_mapMatrixIndex;
16 double CKNHamiltonianBuilder::m_Trans_anion[4][4] = { { 1. / 2, 1. / 2, 1. / 2, 1. / 2 },
17  { 1. / 2, 1. / 2, -1. / 2, -1. / 2 },
18  { 1. / 2, -1. / 2, 1. / 2, -1. / 2 },
19  { 1. / 2, -1. / 2, -1. / 2, 1. / 2 } };
20 double CKNHamiltonianBuilder::m_Trans_cation[4][4] = { { 1. / 2, -1. / 2, -1. / 2, -1. / 2 },
21  { 1. / 2, -1. / 2, 1. / 2, 1. / 2 },
22  { 1. / 2, 1. / 2, -1. / 2, 1. / 2 },
23  { 1. / 2, 1. / 2, 1. / 2, -1. / 2 } };
24 
26 {
27 }
28 
29 
31 {
32 }
33 
34 
40 {
41  int i = 0;
42  pVector->SetAt(i++, lpParameter->fEsc, 0);
43  pVector->SetAt(i++, lpParameter->fEpc, 0);
44  pVector->SetAt(i++, lpParameter->fEpc, 0);
45  pVector->SetAt(i++, lpParameter->fEpc, 0);
46  pVector->SetAt(i++, lpParameter->fEstarc, 0);
47  pVector->SetAt(i++, lpParameter->fEdc, 0);
48  pVector->SetAt(i++, lpParameter->fEdc, 0);
49  pVector->SetAt(i++, lpParameter->fEdc, 0);
50  pVector->SetAt(i++, lpParameter->fEdc, 0);
51  pVector->SetAt(i++, lpParameter->fEdc, 0);
52 }
53 
59 {
60  int i = 0;
61  pVector->SetAt(i++, lpParameter->fEsa, 0);
62  pVector->SetAt(i++, lpParameter->fEpa, 0);
63  pVector->SetAt(i++, lpParameter->fEpa, 0);
64  pVector->SetAt(i++, lpParameter->fEpa, 0);
65  pVector->SetAt(i++, lpParameter->fEstara, 0);
66  pVector->SetAt(i++, lpParameter->fEda, 0);
67  pVector->SetAt(i++, lpParameter->fEda, 0);
68  pVector->SetAt(i++, lpParameter->fEda, 0);
69  pVector->SetAt(i++, lpParameter->fEda, 0);
70  pVector->SetAt(i++, lpParameter->fEda, 0);
71 }
72 
79 {
80  CKNMatrixOperation::CKNVector vectorDiagonalTemp;
81 
82  vectorDiagonalTemp.SetSize(10);
83  BuildHaaDiagonalFor10Band(&vectorDiagonalTemp, lpParameter);
84  pMatrixHonsiteAnion->SetDiagonal(vectorDiagonalTemp);
85  BuildHccDiagonalFor10Band(&vectorDiagonalTemp, lpParameter);
86  pMatrixHonsiteCation->SetDiagonal(vectorDiagonalTemp);
87 
88  vectorDiagonalTemp.Finalize();
89 }
90 
99 {
100  CKNTwoCenterl twoCenterl;
102  CKNMatrixOperation::CKNDMatrix *pMatrixNbr[4];
103  double fNormValue, fValueArray[10][10];
104  int i, j, k;
105  GEO_PARAMETER parameterNeighbor;
106  CKNMaterialParam materialParam;
107  int mapKey = materialFrom | materialDest;
108  bool bRtn;
109 
110  if (CKNGeometricAtom::C == type)
111  mapKey *= -1;
112 
113  if (m_mapMatrixIndex.find(mapKey) != m_mapMatrixIndex.end())
114  return;
115 
116  for (i = 0; i < 4; ++i)
117  {
118  pMatrixNbr[i] = new CKNMatrixOperation::CKNDMatrix();
119  pMatrixNbr[i]->BuildMatrixFirst(m_nBandSize, m_nBandSize);
120  }
121 
122  parameterNeighbor = materialParam.BuildMaterialParam(materialFrom, materialDest, bRtn);
123 
124  switch (type)
125  {
126  case CKNGeometricAtom::A:
127  for (i = 0; i < 4; i++)
128  {
129  pMatrixACNbr->GetRowByVector(i, &vectorNbr);
130  fNormValue = vectorNbr.GetNorm();
131  parameterNeighbor.fL = vectorNbr.GetAt(0).GetRealNumber() / fNormValue;
132  parameterNeighbor.fM = vectorNbr.GetAt(1).GetRealNumber() / fNormValue;
133  parameterNeighbor.fN = vectorNbr.GetAt(2).GetRealNumber() / fNormValue;
134  twoCenterl.BuildTwoCenterlParam(parameterNeighbor, CKNGeometricAtom::A);
135 
136  fValueArray[0][0] = parameterNeighbor.fVsasc; fValueArray[0][1] = parameterNeighbor.fVsapxc; fValueArray[0][2] = parameterNeighbor.fVsapyc; fValueArray[0][3] = parameterNeighbor.fVsapzc; fValueArray[0][4] = parameterNeighbor.fVsastc; fValueArray[0][5] = parameterNeighbor.fVsad1c; fValueArray[0][6] = parameterNeighbor.fVsad2c; fValueArray[0][7] = parameterNeighbor.fVsad3c; fValueArray[0][8] = parameterNeighbor.fVsad4c; fValueArray[0][9] = parameterNeighbor.fVsad5c;
137  fValueArray[1][0] = parameterNeighbor.fVpxasc; fValueArray[1][1] = parameterNeighbor.fVpxapxc; fValueArray[1][2] = parameterNeighbor.fVpxapyc; fValueArray[1][3] = parameterNeighbor.fVpxapzc; fValueArray[1][4] = parameterNeighbor.fVpxastc; fValueArray[1][5] = parameterNeighbor.fVpxad1c; fValueArray[1][6] = parameterNeighbor.fVpxad2c; fValueArray[1][7] = parameterNeighbor.fVpxad3c; fValueArray[1][8] = parameterNeighbor.fVpxad4c; fValueArray[1][9] = parameterNeighbor.fVpxad5c;
138  fValueArray[2][0] = parameterNeighbor.fVpyasc; fValueArray[2][1] = parameterNeighbor.fVpyapxc; fValueArray[2][2] = parameterNeighbor.fVpyapyc; fValueArray[2][3] = parameterNeighbor.fVpyapzc; fValueArray[2][4] = parameterNeighbor.fVpyastc; fValueArray[2][5] = parameterNeighbor.fVpyad1c; fValueArray[2][6] = parameterNeighbor.fVpyad2c; fValueArray[2][7] = parameterNeighbor.fVpyad3c; fValueArray[2][8] = parameterNeighbor.fVpyad4c; fValueArray[2][9] = parameterNeighbor.fVpyad5c;
139  fValueArray[3][0] = parameterNeighbor.fVpzasc; fValueArray[3][1] = parameterNeighbor.fVpzapxc; fValueArray[3][2] = parameterNeighbor.fVpzapyc; fValueArray[3][3] = parameterNeighbor.fVpzapzc; fValueArray[3][4] = parameterNeighbor.fVpzastc; fValueArray[3][5] = parameterNeighbor.fVpzad1c; fValueArray[3][6] = parameterNeighbor.fVpzad2c; fValueArray[3][7] = parameterNeighbor.fVpzad3c; fValueArray[3][8] = parameterNeighbor.fVpzad4c; fValueArray[3][9] = parameterNeighbor.fVpzad5c;
140  fValueArray[4][0] = parameterNeighbor.fVstasc; fValueArray[4][1] = parameterNeighbor.fVstapxc; fValueArray[4][2] = parameterNeighbor.fVstapyc; fValueArray[4][3] = parameterNeighbor.fVstapzc; fValueArray[4][4] = parameterNeighbor.fVstastc; fValueArray[4][5] = parameterNeighbor.fVstad1c; fValueArray[4][6] = parameterNeighbor.fVstad2c; fValueArray[4][7] = parameterNeighbor.fVstad3c; fValueArray[4][8] = parameterNeighbor.fVstad4c; fValueArray[4][9] = parameterNeighbor.fVstad5c;
141  fValueArray[5][0] = parameterNeighbor.fVd1asc; fValueArray[5][1] = parameterNeighbor.fVd1apxc; fValueArray[5][2] = parameterNeighbor.fVd1apyc; fValueArray[5][3] = parameterNeighbor.fVd1apzc; fValueArray[5][4] = parameterNeighbor.fVd1astc; fValueArray[5][5] = parameterNeighbor.fVd1ad1c; fValueArray[5][6] = parameterNeighbor.fVd1ad2c; fValueArray[5][7] = parameterNeighbor.fVd1ad3c; fValueArray[5][8] = parameterNeighbor.fVd1ad4c; fValueArray[5][9] = parameterNeighbor.fVd1ad5c;
142  fValueArray[6][0] = parameterNeighbor.fVd2asc; fValueArray[6][1] = parameterNeighbor.fVd2apxc; fValueArray[6][2] = parameterNeighbor.fVd2apyc; fValueArray[6][3] = parameterNeighbor.fVd2apzc; fValueArray[6][4] = parameterNeighbor.fVd2astc; fValueArray[6][5] = parameterNeighbor.fVd2ad1c; fValueArray[6][6] = parameterNeighbor.fVd2ad2c; fValueArray[6][7] = parameterNeighbor.fVd2ad3c; fValueArray[6][8] = parameterNeighbor.fVd2ad4c; fValueArray[6][9] = parameterNeighbor.fVd2ad5c;
143  fValueArray[7][0] = parameterNeighbor.fVd3asc; fValueArray[7][1] = parameterNeighbor.fVd3apxc; fValueArray[7][2] = parameterNeighbor.fVd3apyc; fValueArray[7][3] = parameterNeighbor.fVd3apzc; fValueArray[7][4] = parameterNeighbor.fVd3astc; fValueArray[7][5] = parameterNeighbor.fVd3ad1c; fValueArray[7][6] = parameterNeighbor.fVd3ad2c; fValueArray[7][7] = parameterNeighbor.fVd3ad3c; fValueArray[7][8] = parameterNeighbor.fVd3ad4c; fValueArray[7][9] = parameterNeighbor.fVd3ad5c;
144  fValueArray[8][0] = parameterNeighbor.fVd4asc; fValueArray[8][1] = parameterNeighbor.fVd4apxc; fValueArray[8][2] = parameterNeighbor.fVd4apyc; fValueArray[8][3] = parameterNeighbor.fVd4apzc; fValueArray[8][4] = parameterNeighbor.fVd4astc; fValueArray[8][5] = parameterNeighbor.fVd4ad1c; fValueArray[8][6] = parameterNeighbor.fVd4ad2c; fValueArray[8][7] = parameterNeighbor.fVd4ad3c; fValueArray[8][8] = parameterNeighbor.fVd4ad4c; fValueArray[8][9] = parameterNeighbor.fVd4ad5c;
145  fValueArray[9][0] = parameterNeighbor.fVd5asc; fValueArray[9][1] = parameterNeighbor.fVd5apxc; fValueArray[9][2] = parameterNeighbor.fVd5apyc; fValueArray[9][3] = parameterNeighbor.fVd5apzc; fValueArray[9][4] = parameterNeighbor.fVd5astc; fValueArray[9][5] = parameterNeighbor.fVd5ad1c; fValueArray[9][6] = parameterNeighbor.fVd5ad2c; fValueArray[9][7] = parameterNeighbor.fVd5ad3c; fValueArray[9][8] = parameterNeighbor.fVd5ad4c; fValueArray[9][9] = parameterNeighbor.fVd5ad5c;
146 
147  for (j = 0; j < 10; j++)
148  for (k = 0; k < 10; k++)
149  pMatrixNbr[i]->SetElement(j, k, fValueArray[j][k], 0);
150  }
151 
152  break;
153  case CKNGeometricAtom::C:
154  for (i = 0; i < 4; i++)
155  {
156  pMatrixACNbr->GetRowByVector(i, &vectorNbr);
157  fNormValue = vectorNbr.GetNorm();
158  parameterNeighbor.fL = vectorNbr.GetAt(0).GetRealNumber() / fNormValue;
159  parameterNeighbor.fM = vectorNbr.GetAt(1).GetRealNumber() / fNormValue;
160  parameterNeighbor.fN = vectorNbr.GetAt(2).GetRealNumber() / fNormValue;
161  twoCenterl.BuildTwoCenterlParam(parameterNeighbor, CKNGeometricAtom::C);
162 
163  fValueArray[0][0] = parameterNeighbor.fVscsa; fValueArray[0][1] = parameterNeighbor.fVscpxa; fValueArray[0][2] = parameterNeighbor.fVscpya; fValueArray[0][3] = parameterNeighbor.fVscpza; fValueArray[0][4] = parameterNeighbor.fVscsta; fValueArray[0][5] = parameterNeighbor.fVscd1a; fValueArray[0][6] = parameterNeighbor.fVscd2a; fValueArray[0][7] = parameterNeighbor.fVscd3a; fValueArray[0][8] = parameterNeighbor.fVscd4a; fValueArray[0][9] = parameterNeighbor.fVscd5a;
164  fValueArray[1][0] = parameterNeighbor.fVpxcsa; fValueArray[1][1] = parameterNeighbor.fVpxcpxa; fValueArray[1][2] = parameterNeighbor.fVpxcpya; fValueArray[1][3] = parameterNeighbor.fVpxcpza; fValueArray[1][4] = parameterNeighbor.fVpxcsta; fValueArray[1][5] = parameterNeighbor.fVpxcd1a; fValueArray[1][6] = parameterNeighbor.fVpxcd2a; fValueArray[1][7] = parameterNeighbor.fVpxcd3a; fValueArray[1][8] = parameterNeighbor.fVpxcd4a; fValueArray[1][9] = parameterNeighbor.fVpxcd5a;
165  fValueArray[2][0] = parameterNeighbor.fVpycsa; fValueArray[2][1] = parameterNeighbor.fVpycpxa; fValueArray[2][2] = parameterNeighbor.fVpycpya; fValueArray[2][3] = parameterNeighbor.fVpycpza; fValueArray[2][4] = parameterNeighbor.fVpycsta; fValueArray[2][5] = parameterNeighbor.fVpycd1a; fValueArray[2][6] = parameterNeighbor.fVpycd2a; fValueArray[2][7] = parameterNeighbor.fVpycd3a; fValueArray[2][8] = parameterNeighbor.fVpycd4a; fValueArray[2][9] = parameterNeighbor.fVpycd5a;
166  fValueArray[3][0] = parameterNeighbor.fVpzcsa; fValueArray[3][1] = parameterNeighbor.fVpzcpxa; fValueArray[3][2] = parameterNeighbor.fVpzcpya; fValueArray[3][3] = parameterNeighbor.fVpzcpza; fValueArray[3][4] = parameterNeighbor.fVpzcsta; fValueArray[3][5] = parameterNeighbor.fVpzcd1a; fValueArray[3][6] = parameterNeighbor.fVpzcd2a; fValueArray[3][7] = parameterNeighbor.fVpzcd3a; fValueArray[3][8] = parameterNeighbor.fVpzcd4a; fValueArray[3][9] = parameterNeighbor.fVpzcd5a;
167  fValueArray[4][0] = parameterNeighbor.fVstcsa; fValueArray[4][1] = parameterNeighbor.fVstcpxa; fValueArray[4][2] = parameterNeighbor.fVstcpya; fValueArray[4][3] = parameterNeighbor.fVstcpza; fValueArray[4][4] = parameterNeighbor.fVstcsta; fValueArray[4][5] = parameterNeighbor.fVstcd1a; fValueArray[4][6] = parameterNeighbor.fVstcd2a; fValueArray[4][7] = parameterNeighbor.fVstcd3a; fValueArray[4][8] = parameterNeighbor.fVstcd4a; fValueArray[4][9] = parameterNeighbor.fVstcd5a;
168  fValueArray[5][0] = parameterNeighbor.fVd1csa; fValueArray[5][1] = parameterNeighbor.fVd1cpxa; fValueArray[5][2] = parameterNeighbor.fVd1cpya; fValueArray[5][3] = parameterNeighbor.fVd1cpza; fValueArray[5][4] = parameterNeighbor.fVd1csta; fValueArray[5][5] = parameterNeighbor.fVd1cd1a; fValueArray[5][6] = parameterNeighbor.fVd1cd2a; fValueArray[5][7] = parameterNeighbor.fVd1cd3a; fValueArray[5][8] = parameterNeighbor.fVd1cd4a; fValueArray[5][9] = parameterNeighbor.fVd1cd5a;
169  fValueArray[6][0] = parameterNeighbor.fVd2csa; fValueArray[6][1] = parameterNeighbor.fVd2cpxa; fValueArray[6][2] = parameterNeighbor.fVd2cpya; fValueArray[6][3] = parameterNeighbor.fVd2cpza; fValueArray[6][4] = parameterNeighbor.fVd2csta; fValueArray[6][5] = parameterNeighbor.fVd2cd1a; fValueArray[6][6] = parameterNeighbor.fVd2cd2a; fValueArray[6][7] = parameterNeighbor.fVd2cd3a; fValueArray[6][8] = parameterNeighbor.fVd2cd4a; fValueArray[6][9] = parameterNeighbor.fVd2cd5a;
170  fValueArray[7][0] = parameterNeighbor.fVd3csa; fValueArray[7][1] = parameterNeighbor.fVd3cpxa; fValueArray[7][2] = parameterNeighbor.fVd3cpya; fValueArray[7][3] = parameterNeighbor.fVd3cpza; fValueArray[7][4] = parameterNeighbor.fVd3csta; fValueArray[7][5] = parameterNeighbor.fVd3cd1a; fValueArray[7][6] = parameterNeighbor.fVd3cd2a; fValueArray[7][7] = parameterNeighbor.fVd3cd3a; fValueArray[7][8] = parameterNeighbor.fVd3cd4a; fValueArray[7][9] = parameterNeighbor.fVd3cd5a;
171  fValueArray[8][0] = parameterNeighbor.fVd4csa; fValueArray[8][1] = parameterNeighbor.fVd4cpxa; fValueArray[8][2] = parameterNeighbor.fVd4cpya; fValueArray[8][3] = parameterNeighbor.fVd4cpza; fValueArray[8][4] = parameterNeighbor.fVd4csta; fValueArray[8][5] = parameterNeighbor.fVd4cd1a; fValueArray[8][6] = parameterNeighbor.fVd4cd2a; fValueArray[8][7] = parameterNeighbor.fVd4cd3a; fValueArray[8][8] = parameterNeighbor.fVd4cd4a; fValueArray[8][9] = parameterNeighbor.fVd4cd5a;
172  fValueArray[9][0] = parameterNeighbor.fVd5csa; fValueArray[9][1] = parameterNeighbor.fVd5cpxa; fValueArray[9][2] = parameterNeighbor.fVd5cpya; fValueArray[9][3] = parameterNeighbor.fVd5cpza; fValueArray[9][4] = parameterNeighbor.fVd5csta; fValueArray[9][5] = parameterNeighbor.fVd5cd1a; fValueArray[9][6] = parameterNeighbor.fVd5cd2a; fValueArray[9][7] = parameterNeighbor.fVd5cd3a; fValueArray[9][8] = parameterNeighbor.fVd5cd4a; fValueArray[9][9] = parameterNeighbor.fVd5cd5a;
173 
174  for (j = 0; j < 10; j++)
175  for (k = 0; k < 10; k++)
176  pMatrixNbr[i]->SetElement(j, k, fValueArray[j][k], 0);
177  }
178 
179  break;
180  }
181 
182  m_mapMatrixIndex[mapKey] = (unsigned int)m_vectMatrixNbr.size();
183  for (i = 0; i < 4; ++i)
184  m_vectMatrixNbr.push_back(pMatrixNbr[i]);
185 
186  vectorNbr.Finalize();
187 }
188 
196 {
197  int i, j;
198  CKNMatrixOperation::CKNDMatrix matrixACNbr, matrixCANbr;
199  double ac_nbr_100[4][3] = { { 0.25, 0.25, 0.25 },
200  { 0.25, -0.25, -0.25 },
201  { -0.25, 0.25, -0.25 },
202  { -0.25, -0.25, 0.25 } };
203 
204  double ca_nbr_100[4][3] = { { -0.25, -0.25, -0.25 },
205  { -0.25, 0.25, 0.25 },
206  { 0.25, -0.25, 0.25 },
207  { 0.25, 0.25, -0.25 } };
208  matrixACNbr.BuildMatrixFirst(4, 3);
209  matrixCANbr.BuildMatrixFirst(4, 3);
210 
211  for (i = 0; i < 4; i++)
212  {
213  for (j = 0; j < 3; j++)
214  {
215  matrixACNbr.SetElement(i, j, ac_nbr_100[i][j], 0);
216  matrixCANbr.SetElement(i, j, ca_nbr_100[i][j], 0);
217  }
218  }
219 
220  if (lpParam->bNeedRotate)
221  {
222  matrixACNbr.TrnasPos();
224  pMatrixACNbr->TrnasPos();
225 
226  matrixCANbr.TrnasPos();
228  pMatrixCANbr->TrnasPos();
229  }
230  else
231  {
232  *pMatrixACNbr = matrixACNbr;
233  *pMatrixCANbr = matrixCANbr;
234  }
235 
236 }
237 
246 {
247  bool bRtn = false;
248  double nTotalAtomSize = 0;
249 
250  nTotalAtomSize = lpMapInfo->fItemCount;
251  m_fAtomIDStartIndex = fAtomStartID;
252 
253  if (10 != lpParam->nBandSize && 20 != lpParam->nBandSize)
254  m_nBandSize = 10;
255  else
256  m_nBandSize = lpParam->nBandSize;
257 
258  switch (m_nBandSize)
259  {
260  case 10:
261  bRtn = FillMatrixFor10Band(pCSRResult, lpParam, lpMapInfo);
262  break;
263  case 20:
264  break;
265  }
266 
267  bRtn = true;
268  return bRtn;
269 }
270 
277 {
278  unsigned int i, j, nInsertColumn;
279  const double fBondingE = 30.; //< %(eV)
280  CKNMatrixOperation::CKNDMatrix matrixTransAnion, matrixTransAnionTranspos;
281  CKNMatrixOperation::CKNDMatrix matrixTransCation, matrixTransCationTranspos;
282  CKNMatrixOperation::CKNDMatrix matrixTempSpinUp, matrixTempSpinUpResult, matrixTempSpinUpInterResult;
283  CKNMatrixOperation::CKNDMatrix *pMatrixHonsite = NULL;
284  CKNMatrixOperation::CKNDMatrix matrixNbr1Transpos, matrixNbr2Transpos, matrixNbr3Transpos, matrixNbr4Transpos;
285  CKNMatrixOperation::CKNDMatrix matrixHonsiteAnion, matrixHonsiteCation;
286  CKNMatrixOperation::CKNDMatrix matrixACNbr, matrixCANbr;
287  CKNMaterialParam materialParam;
288  GEO_PARAMETER parameter;
289  bool bRtn = false;
290  int mapKey;
291 
292  BuildACCANeighborFor10Band(&matrixACNbr, &matrixCANbr, lpParam);
293 
295  if (lpParam->bNeedRotate)
297 
298  InitMatirxsFor10BandFillMatrix(&matrixTransAnion, &matrixTransAnionTranspos, &matrixTransCation, &matrixTransCationTranspos, &matrixTempSpinUp, &matrixTempSpinUpResult, &matrixHonsiteAnion, &matrixHonsiteCation);
299 
300  for (i = 0; i < lpMapInfo->fItemCount; ++i)
301  {
302  CKNMatrixOperation::CKNDMatrix matrixHonsitePassivated;
303  CKNMatrixOperation::CKNDMatrix *matrixTrans, *matrixTransTranspos;
304  CKNComplex tempNumber;
305  double fNeighborIndex[4];
306  int nMatrixIndex = 0;
308 
309  parameter = materialParam.BuildMaterialParam(lpMapInfo->pDomainMaterialNumber[i], bRtn);
310 
311  if (false == bRtn)
312  return bRtn;
313 
314  BuildHonsiteBasicMatrixFor10Band(&matrixHonsiteAnion, &matrixHonsiteCation, &parameter);
315 
316  for (j = 0; j < 4; ++j)
317  fNeighborIndex[j] = lpMapInfo->pfNeighbor[j][i];
318 
319  if (CKNGeometricAtom::A == lpMapInfo->pAtomType[i])
320  {
321  pMatrixHonsite = &matrixHonsiteAnion;
322  matrixTrans = &matrixTransAnion;
323  matrixTransTranspos = &matrixTransAnionTranspos;
324  }
325  else
326  {
327  pMatrixHonsite = &matrixHonsiteCation;
328  matrixTrans = &matrixTransCation;
329  matrixTransTranspos = &matrixTransCationTranspos;
330  }
331  matrixHonsitePassivated = pMatrixHonsite;
332  pMatrixHonsite = &matrixHonsitePassivated;
333 
334  for (j = 0; j < 4; j++)
335  {
336  if (ATOM_DEFAULT_INDEX == fNeighborIndex[j])
337  {
338  CKNMatrixOperation::CKNDMatrix matrixSymetic;
339 
340  pMatrixHonsite->GetSmallMatrix(0, 0, 4, 4, &matrixTempSpinUp);
341 
342  CKNMatrixOperation::MMMul(matrixTrans, &matrixTempSpinUp, &matrixTempSpinUpInterResult);
343  CKNMatrixOperation::MMMul(&matrixTempSpinUpInterResult, matrixTransTranspos, &matrixTempSpinUpResult);
344 
345  tempNumber = matrixTempSpinUpResult.GetElement(j, j);
346  tempNumber.SetRealNumber(tempNumber.GetRealNumber() + fBondingE);
347  matrixTempSpinUpResult.SetElement(j, j, tempNumber);
348 
349  CKNMatrixOperation::MMMul(matrixTransTranspos, &matrixTempSpinUpResult, &matrixTempSpinUpInterResult);
350  CKNMatrixOperation::MMMul(&matrixTempSpinUpInterResult, matrixTrans, &matrixTempSpinUpResult);
351 
352  matrixSymetic.BuildMatrixFirst(4, 4);
353  matrixSymetic = matrixTempSpinUpResult;
354  matrixSymetic.TrnasPos();
355  matrixSymetic += matrixTempSpinUpResult;
356  matrixSymetic.ScalarDivision(2.0);
357 
358  pMatrixHonsite->SetElement(0, 0, 0, 0, 4, 4, matrixSymetic);
359 
360  elementData[j + 1].nColumnIndex = ATOM_DEFAULT_INDEX;
361  elementData[j + 1].pMatrix = NULL;
362  }
363  else
364  {
365  switch (lpMapInfo->pAtomType[i])
366  {
367  case CKNGeometricAtom::A:
368  BuildOffsiteMatrixFor10Band(parameter, &matrixACNbr, lpMapInfo->pMaterialNumber[i], lpMapInfo->pNeighborMaterial[j][i], lpMapInfo->pAtomType[i]);
369  break;
370  case CKNGeometricAtom::C:
371  BuildOffsiteMatrixFor10Band(parameter, &matrixCANbr, lpMapInfo->pMaterialNumber[i], lpMapInfo->pNeighborMaterial[j][i], lpMapInfo->pAtomType[i]);
372  break;
373  }
374 
375  mapKey = lpMapInfo->pMaterialNumber[i] | lpMapInfo->pNeighborMaterial[j][i];
376  if (CKNGeometricAtom::C == lpMapInfo->pAtomType[i])
377  mapKey *= -1;
378 
379  elementData[j + 1].nColumnIndex = (int)fNeighborIndex[j];
380  elementData[j + 1].pMatrix = m_vectMatrixNbr[m_mapMatrixIndex[mapKey] + j];
381  }
382  }
383 #ifdef DISABLE_MPI_ROUTINE
384  nInsertColumn = i;
385 #else //DISABLE_MPI_ROUTINE
386  nInsertColumn = i + (unsigned int)m_fAtomIDStartIndex;
387 #endif //DISABLE_MPI_ROUTINE
388  elementData[0].nColumnIndex = nInsertColumn;
389  elementData[0].pMatrix = pMatrixHonsite;
390  pResult->PushMatrixConcurrent(i, &elementData[0], false);
391  }
392 
393  bRtn = true;
394  return bRtn;
395 }
396 
402 {
403  int i, j;;
404  double fNeighborIndex[4];
405  bool bPeriodic[4];
406  int mapKey;
407 
408  for (i = 0; i < lpMapInfo->fItemCount; i++)
409  {
410  int nMatrixIndex = 0;
411 
412  for (j = 0; j < 4; ++j)
413  {
414  fNeighborIndex[j] = lpMapInfo->pfNeighbor[j][i];
415  bPeriodic[j] = lpMapInfo->pbPeriodicCondition[j][i];
416  }
417 
418  for (j = 0; j < 4; j++)
419  {
420  if (ATOM_DEFAULT_INDEX != fNeighborIndex[j] && false != bPeriodic[j])
421  {
422  mapKey = lpMapInfo->pMaterialNumber[i] | lpMapInfo->pNeighborMaterial[j][i];
423  if (CKNGeometricAtom::C == lpMapInfo->pAtomType[i])
424  mapKey *= -1;
425 
426  pResult->InsertMatrix(i * m_nBandSize, (unsigned int)fNeighborIndex[j] * m_nBandSize, 0, 0, m_nBandSize, m_nBandSize, m_vectMatrixNbr[m_mapMatrixIndex[mapKey] + j], true);
427  }
428  }
429  }
430 }
431 
433 {
434  CKNMatrixOperation::CKNVector Vector, Result;
435  CKNMatrixOperation::CKNDMatrix matrixRotate;
436  int i, j;
437 
438  Vector.SetSize(3);
439  Result.SetSize(3);
440 
441  for (i = 0; i < 4; ++i)
442  {
443  for (j = 0; j < 3; ++j)
444  Vector.SetAt(j, m_Trans_anion[i][j + 1], 0);
445 
447 
448  for (j = 0; j < 3; ++j)
449  m_Trans_anion[i][j + 1] = Result.GetAt(j).GetRealNumber();
450  }
451 
452  for (i = 0; i < 4; ++i)
453  {
454  for (j = 0; j < 3; ++j)
455  Vector.SetAt(j, m_Trans_cation[i][j + 1], 0);
456 
458 
459  for (j = 0; j < 3; ++j)
460  m_Trans_cation[i][j + 1] = Result.GetAt(j).GetRealNumber();
461  }
462 }
463 
465 {
466  m_Trans_anion[0][0] = 1. / 2;
467  m_Trans_anion[0][1] = 1. / 2;
468  m_Trans_anion[0][2] = 1. / 2;
469  m_Trans_anion[0][3] = 1. / 2;
470 
471  m_Trans_anion[1][0] = 1. / 2;
472  m_Trans_anion[1][1] = 1. / 2;
473  m_Trans_anion[1][2] = -1. / 2;
474  m_Trans_anion[1][3] = -1. / 2;
475 
476  m_Trans_anion[2][0] = 1. / 2;
477  m_Trans_anion[2][1] = -1. / 2;
478  m_Trans_anion[2][2] = 1. / 2;
479  m_Trans_anion[2][3] = -1. / 2;
480 
481  m_Trans_anion[3][0] = 1. / 2;
482  m_Trans_anion[3][1] = -1. / 2;
483  m_Trans_anion[3][2] = -1. / 2;
484  m_Trans_anion[3][3] = 1. / 2;
485 
486 
487  m_Trans_cation[0][0] = 1. / 2;
488  m_Trans_cation[0][1] = -1. / 2;
489  m_Trans_cation[0][2] = -1. / 2;
490  m_Trans_cation[0][3] = -1. / 2;
491 
492  m_Trans_cation[1][0] = 1. / 2;
493  m_Trans_cation[1][1] = -1. / 2;
494  m_Trans_cation[1][2] = 1. / 2;
495  m_Trans_cation[1][3] = 1. / 2;
496 
497  m_Trans_cation[2][0] = 1. / 2;
498  m_Trans_cation[2][1] = 1. / 2;
499  m_Trans_cation[2][2] = -1. / 2;
500  m_Trans_cation[2][3] = 1. / 2;
501 
502  m_Trans_cation[3][0] = 1. / 2;
503  m_Trans_cation[3][1] = 1. / 2;
504  m_Trans_cation[3][2] = 1. / 2;
505  m_Trans_cation[3][3] = -1. / 2;
506 }
507 
518 void CKNHamiltonianBuilder::InitMatirxsFor10BandFillMatrix(CKNMatrixOperation::CKNDMatrix *pMatrixTransAnion, CKNMatrixOperation::CKNDMatrix *pMatrixTransAnionTranspos, CKNMatrixOperation::CKNDMatrix *pMatrixTransCation, CKNMatrixOperation::CKNDMatrix *pMatrixTransCationTranspos, CKNMatrixOperation::CKNDMatrix *pMatrixTempSpinUp, CKNMatrixOperation::CKNDMatrix *pMatrixTempSpinUpResult, CKNMatrixOperation::CKNDMatrix *pMatrixHonsiteAnion, CKNMatrixOperation::CKNDMatrix *pMatrixHonsiteCation)
519 {
520  unsigned int i, j;
521 
522  pMatrixTransAnion->BuildMatrixFirst(4, 4);
523  pMatrixTransAnionTranspos->BuildMatrixFirst(4, 4);
524 
525  pMatrixTransCation->BuildMatrixFirst(4, 4);
526  pMatrixTransCationTranspos->BuildMatrixFirst(4, 4);
527 
528  pMatrixTempSpinUp->BuildMatrixFirst(4, 4);
529  pMatrixTempSpinUpResult->BuildMatrixFirst(4, 4);
530 
531  pMatrixHonsiteAnion->BuildMatrixFirst(m_nBandSize, m_nBandSize);
532  pMatrixHonsiteCation->BuildMatrixFirst(m_nBandSize, m_nBandSize);
533 
534  for (i = 0; i < 4; i++)
535  {
536  for (j = 0; j < 4; j++)
537  {
538  pMatrixTransAnion->SetElement(i, j, m_Trans_anion[i][j], 0);
539  pMatrixTransAnionTranspos->SetElement(j, i, m_Trans_anion[i][j], 0);
540 
541  pMatrixTransCation->SetElement(i, j, m_Trans_cation[i][j], 0);
542  pMatrixTransCationTranspos->SetElement(j, i, m_Trans_cation[i][j], 0);
543  }
544  }
545 
546  m_mapMatrixIndex.clear();
547  m_vectMatrixNbr.clear();
548 }
549 
551 {
552  CKNMatrixOperation::CKNDMatrix *pMatrix = NULL;
553  int i;
554 
555  for (i = 0; i < m_vectMatrixNbr.size(); ++i)
556  {
557  pMatrix = m_vectMatrixNbr[i];
558  delete pMatrix;
559  pMatrix = NULL;
560  }
561 
562  m_mapMatrixIndex.clear();
563  m_vectMatrixNbr.clear();
564 }
bool SetDiagonal(CKNVector vector)
Set diagonal elements.
MATERIAL_INDEX
Definition: CKNGlobal.h:106
void SetSize(unsigned int nSize)
Set Vector elements size.
static unsigned int m_fAtomIDStartIndex
Start index of atom in shape, using in MPI running enviroment.
bool InsertMatrix(unsigned int nRow, unsigned int nColumn, unsigned int nRowStart, unsigned int nColumnStart, unsigned int nRowCount, unsigned int nColumnCount, CKNMatrixOperation::CKNDMatrix *pMatrix, bool bCopyZero)
Set element by reference matrix.
static bool BuildHamiltonian(CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam, LPNEIGHBOR_MAP_INFO lpMapInfo, CKNMatrixOperation::CKNCSR *pCSRResult, unsigned int fAtomStartID)
Build Hamiltonian matrxi from mapinfo data.
bool * pbPeriodicCondition[MAX_NEIGHBOR]
An array of Neighbor no 1 bondary condition.
static unsigned int m_nBandSize
Band size 5, 10, 20.
static void InitMatirxsFor10BandFillMatrix(CKNMatrixOperation::CKNDMatrix *pMatrixTransAnion, CKNMatrixOperation::CKNDMatrix *pMatrixTransAnionTranspos, CKNMatrixOperation::CKNDMatrix *pMatrixTransCation, CKNMatrixOperation::CKNDMatrix *pMatrixTransCationTranspos, CKNMatrixOperation::CKNDMatrix *pMatrixTempSpinUp, CKNMatrixOperation::CKNDMatrix *pMatrixTempSpinUpResult, CKNMatrixOperation::CKNDMatrix *pMatrixHonsiteAnion, CKNMatrixOperation::CKNDMatrix *pMatrixHonsiteCation)
Initializing matrix for 10 band basis Hamiltonian.
static void BuildHaaDiagonalFor10Band(CKNMatrixOperation::CKNVector *pVector, LPGEO_PARAMETER lpParameter)
Build aion diagonal basic element.
bool GetSmallMatrix(unsigned int nRowStartIndex, unsigned int nColumnStartIndex, unsigned int nRowCount, unsigned int nColumnCount, CKNMatrixOperation::CKNDMatrix *pMatrix)
Get matrix from large matrix.
This class includes functions for Hamiltonian building.
Data and operation representation of Matrix.
static bool FillMatrixFor10Band(CKNMatrixOperation::CKNCSR *pResult, CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam, LPNEIGHBOR_MAP_INFO lpMapInfo)
Fill Hamiltonian matrix.
static void BuildHccDiagonalFor10Band(CKNMatrixOperation::CKNVector *pVector, LPGEO_PARAMETER lpParameter)
Build cation diagonal basic element.
double GetRealNumber() const
Get real part.
Definition: KNComplex.h:26
Data and operation representation of CSR(Compressed Sparse Row)
static double m_Trans_cation[4][4]
Trans matrix for cation.
static void BuildACCANeighborFor10Band(CKNMatrixOperation::CKNDMatrix *pMatrixACNbr, CKNMatrixOperation::CKNDMatrix *pMatrixCANbr, CKNCommandFileParser::LPINPUT_CMD_PARAM lpParam)
Build aion to cation, cation to aion direction calculation elements.
Class for calculating parameter.
Definition: KNTwoCenterl.h:17
MATERIAL_INDEX * pNeighborMaterial[MAX_NEIGHBOR]
An array of Neighbor material Number.
double fVd5cd5a
--------------------— To this point generated by twoCenterl
static map< int, unsigned int > m_mapMatrixIndex
Hamiltonian offdiagonal elements mapper.
static vector< CKNMatrixOperation::CKNDMatrix * > m_vectMatrixNbr
Hamiltonian offdiagonal elements.
GEO_PARAMETER BuildMaterialParam(char *pszMaterialName, bool &bResult)
Load material parameter.
Class for calculating parameter.
unsigned int nBandSize
Band basis size.
static void MMMul(CKNDMatrix *pMatrix, CKNDMatrix *pMatrixOperand, CKNDMatrix *pResult)
Matrix and matrix multiple operation.
static void BuildHonsiteBasicMatrixFor10Band(CKNMatrixOperation::CKNDMatrix *pMatrixHonsiteAnion, CKNMatrixOperation::CKNDMatrix *pMatrixHonsiteCation, LPGEO_PARAMETER lpParameter)
Build aion and cation basic element.
bool bNeedRotate
Calculation parameter that need to apply rotation matrix.
static void InitTransMatrixFor10Band()
Initializing Trans matrix for 10 band basis Hamiltonian.
Structure for save input command file parsing result.
CKNComplex GetAt(unsigned int nIndex)
Get element value from specific index.
bool TrnasPos()
Transpos matrix.
bool PushMatrixConcurrent(unsigned int nRow, CKNMatrixOperation::LPFILL_MATRIX_DATA lpData, bool bCopyZeroOnSite)
Pushing matrix into CSR several sub matrixs.
double fItemCount
Item count at atom map.
bool SetElement(unsigned int nRow, unsigned int nColumn, CKNComplex element)
Set matrix elements value.
Class for Material Parameter.
#define ATOM_DEFAULT_INDEX
Atom index default value that empty atom instance.
Definition: CKNGlobal.h:53
static void MVMul(CKNCSR *pAMatrix, CKNVector *pVector, CKNVector *pResult)
Matrix and vector multiple operation.
void BuildTwoCenterlParam(GEO_PARAMETER &parameter, CKNGeometricAtom::ATOM_TYPE type)
Calculating parameter.
double * pfNeighbor[MAX_NEIGHBOR]
An array of Neighbor no 1 index.
Class for Geometric shape.
void Finalize()
Free allocated memory for vector elements.
void ScalarDivision(double fScalar)
Scalar division operation.
static double m_Trans_anion[4][4]
Trans matrix for anion.
double GetNorm(bool bMPI=false)
Getting norm of vector.
CKNComplex GetElement(unsigned int nRowIndex, unsigned int nColumnIndex)
Get matrix element with row, column index.
void SetAt(unsigned int nIndex, CKNComplex value)
Set element value in specific index, Call by value.
static void ResetPeriodicBinding(CKNMatrixOperation::CKNCSR *pResult, LPNEIGHBOR_MAP_INFO lpMapInfo)
Reset Hamiltonian before applying phase.
static void RotateTransMatrixFor10Band()
Rotating 10 band basis anion and cation base matrix.
void SetRealNumber(double fRealNumber)
Set real part.
Definition: KNComplex.h:31
This class for complex operation and saving value.
Definition: KNComplex.h:18
MATERIAL_INDEX * pMaterialNumber
An array of Atom number.
CKNGeometricAtom::ATOM_TYPE * pAtomType
An array of atom type 0:A, 1:C.
Structure for saving geometric parameter.
bool GetRowByVector(unsigned int nRowIndex, CKNMatrixOperation::CKNVector *pVector)
Get row elements.
static void FinalizeMatrixBuffer()
Release all temporary buffer.
Class for Material Parameter.
MATERIAL_INDEX * pDomainMaterialNumber
An array of Domain Atom number.
bool BuildMatrixFirst(unsigned int nRow, unsigned int nColumn)
Building matrix elements.
CKNMatrixOperation::CKNDMatrix * pMatrix
Structure for neighbor information.
Hamiltonian building data.
static CKNMatrixOperation::CKNDMatrix m_rotationMatrix
Rotation matrix for given direction.
This class for describing vector for Lanczos method.
static void BuildOffsiteMatrixFor10Band(GEO_PARAMETER &parameter, CKNMatrixOperation::CKNDMatrix *pMatrixACNbr, MATERIAL_INDEX materialFrom, MATERIAL_INDEX materialDest, CKNGeometricAtom::ATOM_TYPE type)
Build offdiable elements.