リビジョン | 7ce00af20ec2a294cf61e022258c3534bf666d50 (tree) |
---|---|
日時 | 2010-12-20 19:12:56 |
作者 | Mikiya Fujii <mikiya.fujii@gmai...> |
コミッター | Mikiya Fujii |
ZINDO/S is implemented, although it is not completed yet.
git-svn-id: https://svn.sourceforge.jp/svnroot/molds/MolDS/trunk@26 1136aad2-a195-0410-b898-f5ea1d11b9d8
@@ -1,3 +1,4 @@ | ||
1 | +[MN_1957] N. Mataga and K. Nishinoto, Z. Phys. Chem., 13, 140 (1957) | |
1 | 2 | [PSS_1965] J. A. Pople, D. P. Santry, and G. A. Segal, J. Chem. Phys., 43, S129 (1965) |
2 | 3 | [PS_1965] J. A. Pople and G. A. Segal, J. Chem. Phys., 43, S136 (1965) |
3 | 4 | [PS_1966] J. A. Pople and G. A. Segal, J. Chem. Phys., 44, 3289 (1966) |
@@ -5,9 +6,9 @@ | ||
5 | 6 | [GD_1972] G. P.-Guillouzo and D. G. ET J. Deschamps, J. Mol. Strct., 14, 81 (1972) |
6 | 7 | [RZ_1976] J. E. Ridley and M. C. Zerner, Theort. Chim. Acta (Berl.) 42, 223 (1976) |
7 | 8 | [BZ_1979] A. D. Bacon and M. C. Zerner, Theort. Chim. Acta (Berl.) 53, 21 (1979) |
9 | +[HKLWNZ_1982] Z. S. Herman, R. F. Kirachner, G. H. Loew, U. T. M.-WesterHoff, A. Nazzal, and M. C. Zerner, Inorg. Chem., 21, 46 (1982) | |
8 | 10 | [AEZ_1986] W. P. Anderson, W. D. Edwards, and M. C. Zerner, Inorg. Chem. 25, 2728 (1986) |
9 | 11 | [BFB_1997] M. A. Blanco, M. Fl{\'o}rez, and M. Bermejo, J. Mol. Struct. 419, 19 (1997) |
10 | 12 | |
11 | 13 | |
12 | 14 | |
13 | - |
@@ -41,6 +41,8 @@ protected: | ||
41 | 41 | double imuAmuP; // Table 3.4 or 3.5 in J. A. Pople book |
42 | 42 | double imuAmuD; // Table 3.4 or 3.5 in J. A. Pople book |
43 | 43 | double bondingParameter; // Table 3.2 and 3.4 in J. A. Pople book |
44 | + double bondingParameterSZindo; // Table 1 in [RZ_1976], table 1 in [HKLWNZ_1982], or table 3 in [AEZ_1986] | |
45 | + double bondingParameterDZindo; // Table 1 in [RZ_1976], table 1 in [HKLWNZ_1982], or table 3 in [AEZ_1986] | |
44 | 46 | double coreCharge; // = Z_A in J. A. Pople book. |
45 | 47 | double effectiveNuclearChargeK; // Table 1.5 in J. A. Pople book |
46 | 48 | double effectiveNuclearChargeL; // Table 1.5 in J. A. Pople book |
@@ -74,6 +76,7 @@ public: | ||
74 | 76 | void SetXyz(double x, double y, double z); |
75 | 77 | vector<OrbitalType> GetValence(); |
76 | 78 | double GetBondingParameter(); |
79 | + double GetBondingParameter(TheoryType theory, OrbitalType orbital); | |
77 | 80 | double GetCoreCharge(); |
78 | 81 | int GetFirstAOIndex(); |
79 | 82 | void SetFirstAOIndex(int firstAOIndex); |
@@ -82,8 +85,31 @@ public: | ||
82 | 85 | double GetImuAmu(OrbitalType orbitalType); // return 0.5*(I_mu + A_mu) |
83 | 86 | double GetOrbitalExponent(ShellType shellType, OrbitalType orbitalType); // (1.73) in J. A. Pople book. |
84 | 87 | virtual double GetCoreIntegral(OrbitalType orbital, double gamma, bool isGuess, TheoryType theory) = 0; // P82 - 83 in J. A. Pople book for INDO or Eq. (13) in [BZ_1979] for ZINDO/S |
88 | + double GetCoreIntegral(OrbitalType orbital, bool isGuess, TheoryType theory); | |
85 | 89 | double GetIndoF2(); |
86 | 90 | double GetIndoG1(); |
91 | + double GetZindoF0ss(); // Table 1 in ref. [RZ_1976], Table 1 in [AEZ_1986], or Table 1 in [GD_1972] | |
92 | + double GetZindoF0sd(); // Table 1 in [AEZ_1986] | |
93 | + double GetZindoF0dd(); // Table 1 in [AEZ_1986] | |
94 | + double GetZindoG1sp(); // Table 3 in ref. [BZ_1979] | |
95 | + double GetZindoF2pp(); // Table 3 in ref. [BZ_1979] | |
96 | + double GetZindoG2sd(); // Table 3 in ref. [BZ_1979] | |
97 | + double GetZindoG1pd(); // Table 3 in ref. [BZ_1979] | |
98 | + double GetZindoF2pd(); // Table 3 in ref. [BZ_1979] | |
99 | + double GetZindoG3pd(); // Table 3 in ref. [BZ_1979] | |
100 | + double GetZindoF2dd(); // Table 3 in ref. [BZ_1979] | |
101 | + double GetZindoF4dd(); // Table 3 in ref. [BZ_1979] | |
102 | + double GetZindoF0ssLower(); // Apendix in ref. [BZ_1979] | |
103 | + double GetZindoF0sdLower(); // Apendix in ref. [BZ_1979] | |
104 | + double GetZindoF0ddLower(); // Apendix in ref. [BZ_1979] | |
105 | + double GetZindoG1spLower(); // Apendix in ref. [BZ_1979] | |
106 | + double GetZindoF2ppLower(); // Apendix in ref. [BZ_1979] | |
107 | + double GetZindoG2sdLower(); // Apendix in ref. [BZ_1979] | |
108 | + double GetZindoG1pdLower(); // Apendix in ref. [BZ_1979] | |
109 | + double GetZindoF2pdLower(); // Apendix in ref. [BZ_1979] | |
110 | + double GetZindoG3pdLower(); // Apendix in ref. [BZ_1979] | |
111 | + double GetZindoF2ddLower(); // Apendix in ref. [BZ_1979] | |
112 | + double GetZindoF4ddLower(); // Apendix in ref. [BZ_1979] | |
87 | 113 | }; |
88 | 114 | |
89 | 115 | Atom::Atom(){ |
@@ -137,8 +163,32 @@ vector<OrbitalType> Atom::GetValence(){ | ||
137 | 163 | return this->valence; |
138 | 164 | } |
139 | 165 | |
166 | +double Atom::GetBondingParameter(TheoryType theory, OrbitalType orbital){ | |
167 | + | |
168 | + double value = 0.0; | |
169 | + if(theory == CNDO2 || theory == INDO){ | |
170 | + value = this->bondingParameter; | |
171 | + } | |
172 | + else if(theory == ZINDOS && ( orbital == s || | |
173 | + orbital == px || | |
174 | + orbital == py || | |
175 | + orbital == pz ) ){ | |
176 | + value = this->bondingParameterSZindo; | |
177 | + } | |
178 | + else if(theory == ZINDOS && ( orbital == dxy || | |
179 | + orbital == dyz || | |
180 | + orbital == dzz || | |
181 | + orbital == dzx || | |
182 | + orbital == dxxyy ) ){ | |
183 | + value = this->bondingParameterDZindo; | |
184 | + } | |
185 | + | |
186 | + return value; | |
187 | + | |
188 | +} | |
189 | + | |
140 | 190 | double Atom::GetBondingParameter(){ |
141 | - return this->bondingParameter; | |
191 | + return this->GetBondingParameter(CNDO2, s); | |
142 | 192 | } |
143 | 193 | |
144 | 194 | double Atom::GetCoreCharge(){ |
@@ -268,7 +318,7 @@ double Atom::GetJpd(){ | ||
268 | 318 | |
269 | 319 | // Part of Eq. (13) in [BZ_1979] |
270 | 320 | double Atom::GetJdd(){ |
271 | - return this->zindoF0dd - 2.0*(this->zindoF2dd - this->zindoF4dd)/63.0; | |
321 | + return this->zindoF0dd - 2.0*(this->zindoF2dd + this->zindoF4dd)/63.0; | |
272 | 322 | } |
273 | 323 | |
274 | 324 | // Eq. (13) in [BZ_1979] |
@@ -313,6 +363,123 @@ double Atom::GetIndoG1(){ | ||
313 | 363 | } |
314 | 364 | |
315 | 365 | |
366 | +// Table 1 in ref. [RZ_1976], Table 1 in [AEZ_1986], or Table 1 in [GD_1972] | |
367 | +double Atom::GetZindoF0ss(){ | |
368 | + return this->zindoF0ss; | |
369 | +} | |
370 | + | |
371 | +// Table 1 in [AEZ_1986] | |
372 | +double Atom::GetZindoF0sd(){ | |
373 | + return this->zindoF0sd; | |
374 | +} | |
375 | + | |
376 | + | |
377 | +// Table 1 in [AEZ_1986] | |
378 | +double Atom::GetZindoF0dd(){ | |
379 | + return this->zindoF0dd; | |
380 | +} | |
381 | + | |
382 | +// Table 3 in ref. [BZ_1979] | |
383 | +double Atom::GetZindoG1sp(){ | |
384 | + return this->zindoG1sp; | |
385 | +} | |
386 | + | |
387 | +// Table 3 in ref. [BZ_1979] | |
388 | +double Atom::GetZindoF2pp(){ | |
389 | + return this->zindoF2pp; | |
390 | +} | |
391 | + | |
392 | +// Table 3 in ref. [BZ_1979] | |
393 | +double Atom::GetZindoG2sd(){ | |
394 | + return this->zindoG2sd; | |
395 | +} | |
396 | + | |
397 | +// Table 3 in ref. [BZ_1979] | |
398 | +double Atom::GetZindoG1pd(){ | |
399 | + return this->zindoG1pd; | |
400 | +} | |
401 | + | |
402 | +// Table 3 in ref. [BZ_1979] | |
403 | +double Atom::GetZindoF2pd(){ | |
404 | + return this->zindoF2pd; | |
405 | +} | |
406 | + | |
407 | +// Table 3 in ref. [BZ_1979] | |
408 | +double Atom::GetZindoG3pd(){ | |
409 | + return this->zindoG3pd; | |
410 | +} | |
411 | + | |
412 | +// Table 3 in ref. [BZ_1979] | |
413 | +double Atom::GetZindoF2dd(){ | |
414 | + return this->zindoF2dd; | |
415 | +} | |
416 | + | |
417 | +// Table 3 in ref. [BZ_1979] | |
418 | +double Atom::GetZindoF4dd(){ | |
419 | + return this->zindoF4dd; | |
420 | +} | |
421 | + | |
422 | +// Apendix in ref. [BZ_1979] | |
423 | +double Atom::GetZindoF0ssLower(){ | |
424 | + return this->zindoF0ss; | |
425 | +} | |
426 | + | |
427 | +// Apendix in ref. [BZ_1979] | |
428 | +double Atom::GetZindoF0sdLower(){ | |
429 | + return this->zindoF0sd; | |
430 | +} | |
431 | + | |
432 | +// Apendix in ref. [BZ_1979] | |
433 | +double Atom::GetZindoF0ddLower(){ | |
434 | + return this->zindoF0dd; | |
435 | +} | |
436 | + | |
437 | +// Apendix in ref. [BZ_1979] | |
438 | +double Atom::GetZindoG1spLower(){ | |
439 | + return this->zindoG1sp/3.0; | |
440 | +} | |
441 | + | |
442 | +// Apendix in ref. [BZ_1979] | |
443 | +double Atom::GetZindoF2ppLower(){ | |
444 | + return this->zindoF2pp/25.0; | |
445 | +} | |
446 | + | |
447 | +// Apendix in ref. [BZ_1979] | |
448 | +double Atom::GetZindoG2sdLower(){ | |
449 | + return this->zindoG2sd/5.0; | |
450 | +} | |
451 | + | |
452 | +// Apendix in ref. [BZ_1979] | |
453 | +double Atom::GetZindoG1pdLower(){ | |
454 | + return this->zindoG1pd/15.0; | |
455 | +} | |
456 | + | |
457 | +// Apendix in ref. [BZ_1979] | |
458 | +double Atom::GetZindoF2pdLower(){ | |
459 | + return this->zindoF2pd/35.0; | |
460 | +} | |
461 | + | |
462 | +// Apendix in ref. [BZ_1979] | |
463 | +double Atom::GetZindoG3pdLower(){ | |
464 | + return this->zindoG3pd/245.0; | |
465 | +} | |
466 | + | |
467 | +// Apendix in ref. [BZ_1979] | |
468 | +double Atom::GetZindoF2ddLower(){ | |
469 | + return this->zindoF2dd/49.0; | |
470 | +} | |
471 | + | |
472 | +// Apendix in ref. [BZ_1979] | |
473 | +double Atom::GetZindoF4ddLower(){ | |
474 | + return this->zindoF4dd/441.0; | |
475 | +} | |
476 | + | |
477 | + | |
478 | +double Atom::GetCoreIntegral(OrbitalType orbital, bool isGuess, TheoryType theory){ | |
479 | + return this->GetCoreIntegral(orbital, 0.0, isGuess, theory); | |
480 | +} | |
481 | + | |
482 | + | |
316 | 483 | |
317 | 484 | } |
318 | 485 | #endif |
@@ -321,3 +488,18 @@ double Atom::GetIndoG1(){ | ||
321 | 488 | |
322 | 489 | |
323 | 490 | |
491 | + | |
492 | + | |
493 | + | |
494 | + | |
495 | + | |
496 | + | |
497 | + | |
498 | + | |
499 | + | |
500 | + | |
501 | + | |
502 | + | |
503 | + | |
504 | + | |
505 | + |
@@ -21,6 +21,8 @@ Catom::Catom(double x, double y, double z) : Atom(x, y, z){ | ||
21 | 21 | this->valence.push_back(pz); |
22 | 22 | this->valence.push_back(px); |
23 | 23 | this->bondingParameter = -21.0*Parameters::GetInstance()->GetEV2AU(); |
24 | + this->bondingParameterSZindo = -17.0*Parameters::GetInstance()->GetEV2AU(); | |
25 | + this->bondingParameterDZindo = 0.0; | |
24 | 26 | this->coreCharge = 4.0; |
25 | 27 | this->imuAmuS = 14.051*Parameters::GetInstance()->GetEV2AU(); |
26 | 28 | this->imuAmuP = 5.572*Parameters::GetInstance()->GetEV2AU(); |
@@ -44,8 +46,8 @@ Catom::Catom(double x, double y, double z) : Atom(x, y, z){ | ||
44 | 46 | this->zindoG3pd = 0.0; |
45 | 47 | this->zindoF2dd = 0.0; |
46 | 48 | this->zindoF4dd = 0.0; |
47 | - this->IonPotS = -19.84 * Parameters::GetInstance()->GetEV2AU(); | |
48 | - this->IonPotP = -10.93 * Parameters::GetInstance()->GetEV2AU(); | |
49 | + this->IonPotS = 19.84 * Parameters::GetInstance()->GetEV2AU(); | |
50 | + this->IonPotP = 10.93 * Parameters::GetInstance()->GetEV2AU(); | |
49 | 51 | this->IonPotD = 0.0 * Parameters::GetInstance()->GetEV2AU(); |
50 | 52 | } |
51 | 53 |
@@ -19,6 +19,8 @@ Hatom::Hatom(double x, double y, double z) : Atom(x, y, z){ | ||
19 | 19 | this->atomType = H; |
20 | 20 | this->valence.push_back(s); |
21 | 21 | this->bondingParameter = -9.0*Parameters::GetInstance()->GetEV2AU(); |
22 | + this->bondingParameterSZindo = -9.0*Parameters::GetInstance()->GetEV2AU(); | |
23 | + this->bondingParameterDZindo = 0.0; | |
22 | 24 | this->coreCharge = 1.0; |
23 | 25 | this->imuAmuS = 7.176*Parameters::GetInstance()->GetEV2AU(); |
24 | 26 | this->imuAmuP = 0.0; |
@@ -42,7 +44,7 @@ Hatom::Hatom(double x, double y, double z) : Atom(x, y, z){ | ||
42 | 44 | this->zindoG3pd = 0.0; |
43 | 45 | this->zindoF2dd = 0.0; |
44 | 46 | this->zindoF4dd = 0.0; |
45 | - this->IonPotS = -13.06 * Parameters::GetInstance()->GetEV2AU(); | |
47 | + this->IonPotS = 13.06 * Parameters::GetInstance()->GetEV2AU(); | |
46 | 48 | this->IonPotP = 0.0 * Parameters::GetInstance()->GetEV2AU(); |
47 | 49 | this->IonPotD = 0.0 * Parameters::GetInstance()->GetEV2AU(); |
48 | 50 | } |
@@ -22,6 +22,8 @@ Liatom::Liatom(double x, double y, double z) : Atom(x, y, z){ | ||
22 | 22 | this->valence.push_back(pz); |
23 | 23 | this->valence.push_back(px); |
24 | 24 | this->bondingParameter = -9.0*Parameters::GetInstance()->GetEV2AU(); |
25 | + this->bondingParameterSZindo = 0.0; | |
26 | + this->bondingParameterDZindo = 0.0; | |
25 | 27 | this->coreCharge = 1.0; |
26 | 28 | this->imuAmuS = 3.106*Parameters::GetInstance()->GetEV2AU(); |
27 | 29 | this->imuAmuP = 1.258*Parameters::GetInstance()->GetEV2AU(); |
@@ -45,8 +47,8 @@ Liatom::Liatom(double x, double y, double z) : Atom(x, y, z){ | ||
45 | 47 | this->zindoG3pd = 0.0; |
46 | 48 | this->zindoF2dd = 0.0; |
47 | 49 | this->zindoF4dd = 0.0; |
48 | - this->IonPotS = -5.39 * Parameters::GetInstance()->GetEV2AU(); | |
49 | - this->IonPotP = -3.54 * Parameters::GetInstance()->GetEV2AU(); | |
50 | + this->IonPotS = 5.39 * Parameters::GetInstance()->GetEV2AU(); | |
51 | + this->IonPotP = 3.54 * Parameters::GetInstance()->GetEV2AU(); | |
50 | 52 | this->IonPotD = 0.0 * Parameters::GetInstance()->GetEV2AU(); |
51 | 53 | } |
52 | 54 |
@@ -29,6 +29,8 @@ Satom::Satom(double x, double y, double z) : Atom(x, y, z){ | ||
29 | 29 | this->valence.push_back(dxxyy); |
30 | 30 | } |
31 | 31 | this->bondingParameter = -18.150*Parameters::GetInstance()->GetEV2AU(); |
32 | + this->bondingParameterSZindo = -14.0*Parameters::GetInstance()->GetEV2AU(); | |
33 | + this->bondingParameterDZindo = 4.0*Parameters::GetInstance()->GetEV2AU(); | |
32 | 34 | this->coreCharge = 6.0; |
33 | 35 | this->imuAmuS = 17.650*Parameters::GetInstance()->GetEV2AU(); |
34 | 36 | this->imuAmuP = 6.989*Parameters::GetInstance()->GetEV2AU(); |
@@ -52,9 +54,9 @@ Satom::Satom(double x, double y, double z) : Atom(x, y, z){ | ||
52 | 54 | this->zindoG3pd = 20587*Parameters::GetInstance()->GetKayser2AU(); |
53 | 55 | this->zindoF2dd = 28411*Parameters::GetInstance()->GetKayser2AU(); |
54 | 56 | this->zindoF4dd = 18529*Parameters::GetInstance()->GetKayser2AU(); |
55 | - this->IonPotS = -21.11 * Parameters::GetInstance()->GetEV2AU(); | |
56 | - this->IonPotP = -12.39 * Parameters::GetInstance()->GetEV2AU(); | |
57 | - this->IonPotD = -4.11 * Parameters::GetInstance()->GetEV2AU(); | |
57 | + this->IonPotS = 21.11 * Parameters::GetInstance()->GetEV2AU(); | |
58 | + this->IonPotP = 12.39 * Parameters::GetInstance()->GetEV2AU(); | |
59 | + this->IonPotD = 4.11 * Parameters::GetInstance()->GetEV2AU(); | |
58 | 60 | } |
59 | 61 | |
60 | 62 | double Satom::GetCoreIntegral(OrbitalType orbital, double gamma, bool isGuess, TheoryType theory){ |
@@ -57,12 +57,9 @@ private: | ||
57 | 57 | double** orbitalElectronPopulation, Molecule* molecule); |
58 | 58 | void CalcOverlap(double** overlap, Molecule* molecule); |
59 | 59 | void CalcRotatingMatrix(double** rotatingMatrix, Atom* atomA, Atom* atomB); |
60 | - void CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB); | |
61 | 60 | void CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** overlap, double** gammaAB, |
62 | 61 | double** orbitalElectronPopulation, double* atomicElectronPopulation, |
63 | 62 | bool isGuess); |
64 | - double GetReducedOverlap(int na, int la, int m, int nb, int lb, double alpha, double beta); | |
65 | - double GetReducedOverlap(int na, int nb, double alpha, double beta); | |
66 | 63 | void RotateDiatmicOverlapToSpaceFrame(double** diatomicOverlap, double** rotatingMatrix); |
67 | 64 | void SetOverlapElement(double** overlap, double** diatomicOverlap, Atom* atomA, Atom* atomB); |
68 | 65 | double GetAuxiliaryA(int k, double rho); |
@@ -86,17 +83,19 @@ protected: | ||
86 | 83 | string messageStartSCF; |
87 | 84 | string messageDoneSCF; |
88 | 85 | vector<AtomType> enableAtomTypes; |
86 | + double GetReducedOverlap(int na, int la, int m, int nb, int lb, double alpha, double beta); | |
87 | + double GetReducedOverlap(int na, int nb, double alpha, double beta); | |
89 | 88 | virtual void CalcGammaAB(double** gammaAB, Molecule* molecule); |
90 | 89 | virtual void SetMessages(); |
91 | 90 | virtual void SetEnableAtomTypes(); |
92 | - virtual double GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, | |
91 | + virtual double GetFockDiagElement(Atom* atomA, int atomAIndex, | |
93 | 92 | int mu, Molecule* molecule, double** gammaAB, |
94 | 93 | double** orbitalElectronPopulation, double* atomicElectronPopulation, |
95 | 94 | bool isGuess); |
96 | 95 | virtual double GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex, |
97 | - int firstAOIndexA, int firstAOIndexB, | |
98 | 96 | int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap, |
99 | 97 | double** orbitalElectronPopulation, bool isGuess); |
98 | + virtual void CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB); | |
100 | 99 | TheoryType theory; |
101 | 100 | public: |
102 | 101 | Cndo2(); |
@@ -453,7 +452,6 @@ void Cndo2::CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** ove | ||
453 | 452 | // diagonal part |
454 | 453 | fockMatrix[mu][mu] = this->GetFockDiagElement(atomA, |
455 | 454 | A, |
456 | - firstAOIndexA, | |
457 | 455 | mu, |
458 | 456 | molecule, |
459 | 457 | gammaAB, |
@@ -467,8 +465,6 @@ void Cndo2::CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** ove | ||
467 | 465 | atomB, |
468 | 466 | A, |
469 | 467 | B, |
470 | - firstAOIndexA, | |
471 | - firstAOIndexB, | |
472 | 468 | mu, |
473 | 469 | nu, |
474 | 470 | molecule, |
@@ -499,11 +495,12 @@ void Cndo2::CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** ove | ||
499 | 495 | |
500 | 496 | } |
501 | 497 | |
502 | -double Cndo2::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, int mu, | |
498 | +double Cndo2::GetFockDiagElement(Atom* atomA, int atomAIndex, int mu, | |
503 | 499 | Molecule* molecule, double** gammaAB, |
504 | 500 | double** orbitalElectronPopulation, double* atomicElectronPopulation, |
505 | 501 | bool isGuess){ |
506 | 502 | double value; |
503 | + int firstAOIndexA = atomA->GetFirstAOIndex(); | |
507 | 504 | value = -1.0 * atomA->GetImuAmu(atomA->GetValence()[mu-firstAOIndexA]); |
508 | 505 | if(!isGuess){ |
509 | 506 | double temp = atomicElectronPopulation[atomAIndex] - atomA->GetCoreCharge() |
@@ -525,7 +522,6 @@ double Cndo2::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, | ||
525 | 522 | } |
526 | 523 | |
527 | 524 | double Cndo2::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex, |
528 | - int firstAOIndexA, int firstAOIndexB, | |
529 | 525 | int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap, |
530 | 526 | double** orbitalElectronPopulation, bool isGuess){ |
531 | 527 | double value; |
@@ -23,15 +23,14 @@ private: | ||
23 | 23 | double GetExchangeInt(OrbitalType orbital1, OrbitalType orbital2, double gamma, Atom* atom); // Indo Exchange Interaction, (3.87) - (3.91) in J. A. Pople book. |
24 | 24 | protected: |
25 | 25 | virtual void SetMessages(); |
26 | - virtual double GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, | |
26 | + virtual void SetEnableAtomTypes(); | |
27 | + virtual double GetFockDiagElement(Atom* atomA, int atomAIndex, | |
27 | 28 | int mu, Molecule* molecule, double** gammaAB, |
28 | 29 | double** orbitalElectronPopulation, double* atomicElectronPopulation, |
29 | 30 | bool isGuess); |
30 | 31 | virtual double GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex, |
31 | - int firstAOIndexA, int firstAOIndexB, | |
32 | 32 | int mu, int nu, Molecule* molecule, double** gammaAB, double** overelap, |
33 | 33 | double** orbitalElectronPopulation, bool isGuess); |
34 | - virtual void SetEnableAtomTypes(); | |
35 | 34 | |
36 | 35 | public: |
37 | 36 | Indo(); |
@@ -77,11 +76,12 @@ void Indo::SetEnableAtomTypes(){ | ||
77 | 76 | this->enableAtomTypes.push_back(F); |
78 | 77 | } |
79 | 78 | |
80 | -double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, int mu, | |
79 | +double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int mu, | |
81 | 80 | Molecule* molecule, double** gammaAB, |
82 | 81 | double** orbitalElectronPopulation, double* atomicElectronPopulation, |
83 | 82 | bool isGuess){ |
84 | 83 | double value; |
84 | + int firstAOIndexA = atomA->GetFirstAOIndex(); | |
85 | 85 | value = atomA->GetCoreIntegral(atomA->GetValence()[mu-firstAOIndexA], |
86 | 86 | gammaAB[atomAIndex][atomAIndex], |
87 | 87 | isGuess, this->theory); |
@@ -102,11 +102,11 @@ double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, | ||
102 | 102 | value += temp; |
103 | 103 | |
104 | 104 | temp = 0.0; |
105 | - for(int BB=0; BB<molecule->GetAtomVect()->size(); BB++){ | |
106 | - if(BB != atomAIndex){ | |
107 | - Atom* atomBB = (*molecule->GetAtomVect())[BB]; | |
108 | - temp += ( atomicElectronPopulation[BB] - atomBB->GetCoreCharge() ) | |
109 | - *gammaAB[atomAIndex][BB]; | |
105 | + for(int B=0; B<molecule->GetAtomVect()->size(); B++){ | |
106 | + if(B != atomAIndex){ | |
107 | + Atom* atomB = (*molecule->GetAtomVect())[B]; | |
108 | + temp += ( atomicElectronPopulation[B] - atomB->GetCoreCharge() ) | |
109 | + *gammaAB[atomAIndex][B]; | |
110 | 110 | } |
111 | 111 | } |
112 | 112 | value += temp; |
@@ -116,7 +116,6 @@ double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, | ||
116 | 116 | } |
117 | 117 | |
118 | 118 | double Indo::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex, |
119 | - int firstAOIndexA, int firstAOIndexB, | |
120 | 119 | int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap, |
121 | 120 | double** orbitalElectronPopulation, bool isGuess){ |
122 | 121 | double value; |
@@ -133,8 +132,8 @@ double Indo::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int | ||
133 | 132 | double coulomb = 0.0; |
134 | 133 | double exchange = 0.0; |
135 | 134 | if(atomAIndex == atomBIndex){ |
136 | - OrbitalType orbitalMu = atomA->GetValence()[mu-firstAOIndexA]; | |
137 | - OrbitalType orbitalNu = atomA->GetValence()[nu-firstAOIndexA]; | |
135 | + OrbitalType orbitalMu = atomA->GetValence()[mu-atomA->GetFirstAOIndex()]; | |
136 | + OrbitalType orbitalNu = atomA->GetValence()[nu-atomA->GetFirstAOIndex()]; | |
138 | 137 | coulomb = this->GetCoulombInt(orbitalMu, orbitalNu, gammaAB[atomAIndex][atomAIndex], atomA); |
139 | 138 | exchange = this->GetExchangeInt(orbitalMu, orbitalNu, gammaAB[atomAIndex][atomAIndex], atomA); |
140 | 139 | value = (1.5*exchange - 0.5*coulomb)*orbitalElectronPopulation[mu][nu]; |
@@ -5,18 +5,18 @@ SCF_END | ||
5 | 5 | |
6 | 6 | THEORY |
7 | 7 | //cndo/2 |
8 | - indo | |
9 | - //zindo/s | |
8 | + //indo | |
9 | + zindo/s | |
10 | 10 | THEORY_END |
11 | 11 | |
12 | 12 | //metane |
13 | -GEOMETRY | |
14 | - C -0.37687006 0.95490165 0.00000000 | |
15 | - H -0.02021563 -0.05390835 0.00000000 | |
16 | - H -0.02019722 1.45929984 0.87365150 | |
17 | - H -0.02019722 1.45929984 -0.87365150 | |
18 | - H -1.44687006 0.95491483 0.00000000 | |
19 | -GEOMETRY_END | |
13 | +//GEOMETRY | |
14 | +// C -0.37687006 0.95490165 0.00000000 | |
15 | +// H -0.02021563 -0.05390835 0.00000000 | |
16 | +// H -0.02019722 1.45929984 0.87365150 | |
17 | +// H -0.02019722 1.45929984 -0.87365150 | |
18 | +// H -1.44687006 0.95491483 0.00000000 | |
19 | +//GEOMETRY_END | |
20 | 20 | |
21 | 21 | |
22 | 22 | // c2 |
@@ -38,11 +38,11 @@ GEOMETRY_END | ||
38 | 38 | //GEOMETRY_END |
39 | 39 | |
40 | 40 | // sh2 |
41 | -//GEOMETRY | |
42 | -// S -0.559299 0.471698 0.000000 | |
43 | -// H 0.750701 0.471698 0.000000 | |
44 | -// H -0.996586 1.706558 0.000000 | |
45 | -//GEOMETRY_END | |
41 | +GEOMETRY | |
42 | + S -0.559299 0.471698 0.000000 | |
43 | + H 0.750701 0.471698 0.000000 | |
44 | + H -0.996586 1.706558 0.000000 | |
45 | +GEOMETRY_END | |
46 | 46 | |
47 | 47 | // benzene |
48 | 48 | //GEOMETRY |
@@ -19,20 +19,27 @@ namespace MolDS_zindo{ | ||
19 | 19 | */ |
20 | 20 | class ZindoS : public MolDS_cndo::Cndo2{ |
21 | 21 | private: |
22 | - double GetCoulombInt(OrbitalType orbital1, OrbitalType orbital2, double gamma, Atom* atom); // Apendix in [BZ_1979] | |
23 | - double GetExchangeInt(OrbitalType orbital1, OrbitalType orbital2, double gamma, Atom* atom); // Apendix in [BZ_1979] | |
22 | + double GetCoulombInt(OrbitalType orbital1, | |
23 | + OrbitalType orbital2, | |
24 | + Atom* atom); // Apendix in [BZ_1979] | |
25 | + double GetExchangeInt(OrbitalType orbital1, | |
26 | + OrbitalType orbital2, | |
27 | + Atom* atom); // Apendix in [BZ_1979] | |
28 | + double GetNishimotoMatagaTwoEleInt(Atom* atomA, OrbitalType orbitalA, | |
29 | + Atom* atomB, OrbitalType orbitalB); // ref. [MN_1957] and (5a) in [AEZ_1986] | |
30 | + string errorMessageNishimotoMataga; | |
24 | 31 | protected: |
25 | 32 | virtual void CalcGammaAB(double** gammaAB, Molecule* molecule); |
26 | 33 | virtual void SetMessages(); |
27 | - virtual double GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, | |
34 | + virtual void SetEnableAtomTypes(); | |
35 | + virtual double GetFockDiagElement(Atom* atomA, int atomAIndex, | |
28 | 36 | int mu, Molecule* molecule, double** gammaAB, |
29 | 37 | double** orbitalElectronPopulation, double* atomicElectronPopulation, |
30 | 38 | bool isGuess); |
31 | 39 | virtual double GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex, |
32 | - int firstAOIndexA, int firstAOIndexB, | |
33 | 40 | int mu, int nu, Molecule* molecule, double** gammaAB, double** overelap, |
34 | 41 | double** orbitalElectronPopulation, bool isGuess); |
35 | - virtual void SetEnableAtomTypes(); | |
42 | + virtual void CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB); | |
36 | 43 | public: |
37 | 44 | ZindoS(); |
38 | 45 | ~ZindoS(); |
@@ -60,6 +67,7 @@ void ZindoS::SetMessages(){ | ||
60 | 67 | = "Error in zindo::ZindoS::CheckEnableAtomType: Non available atom is contained.\n"; |
61 | 68 | this->errorMessageCoulombInt = "Error in base_zindo::ZindoS::GetCoulombInt: Invalid orbitalType.\n"; |
62 | 69 | this->errorMessageExchangeInt = "Error in base_zindo::ZindoS::GetExchangeInt: Invalid orbitalType.\n"; |
70 | + this->errorMessageNishimotoMataga = "Error in base_zindo::ZindoS::GetNishimotoMatagaTwoEleInt: Invalid orbitalType.\n"; | |
63 | 71 | this->messageSCFMetConvergence = "\n\n\n\t\tZINDO/S-SCF met convergence criterion(^^b\n\n\n"; |
64 | 72 | this->messageStartSCF = "********** START: ZINDO/S-SCF **********\n"; |
65 | 73 | this->messageDoneSCF = "********** DONE: ZINDO/S-SCF **********\n\n\n"; |
@@ -74,14 +82,14 @@ void ZindoS::SetEnableAtomTypes(){ | ||
74 | 82 | this->enableAtomTypes.push_back(S); |
75 | 83 | } |
76 | 84 | |
77 | -double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, int mu, | |
85 | +double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int mu, | |
78 | 86 | Molecule* molecule, double** gammaAB, |
79 | 87 | double** orbitalElectronPopulation, double* atomicElectronPopulation, |
80 | 88 | bool isGuess){ |
81 | - double value; | |
89 | + double value=0.0; | |
90 | + int firstAOIndexA = atomA->GetFirstAOIndex(); | |
82 | 91 | value = atomA->GetCoreIntegral(atomA->GetValence()[mu-firstAOIndexA], |
83 | - gammaAB[atomAIndex][atomAIndex], | |
84 | - isGuess, this->theory); | |
92 | + isGuess, this->theory); | |
85 | 93 | if(!isGuess){ |
86 | 94 | double temp = 0.0; |
87 | 95 | double coulomb = 0.0; |
@@ -90,19 +98,25 @@ double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA | ||
90 | 98 | OrbitalType orbitalMu = atomA->GetValence()[mu-firstAOIndexA]; |
91 | 99 | for(int v=0; v<atomA->GetValence().size(); v++){ |
92 | 100 | OrbitalType orbitalLam = atomA->GetValence()[v]; |
93 | - coulomb = this->GetCoulombInt(orbitalMu, orbitalLam, gammaAB[atomAIndex][atomAIndex], atomA); | |
94 | - exchange = this->GetExchangeInt(orbitalMu, orbitalLam, gammaAB[atomAIndex][atomAIndex], atomA); | |
95 | - lammda = firstAOIndexA + v; | |
101 | + coulomb = this->GetCoulombInt(orbitalMu, orbitalLam, atomA); | |
102 | + exchange = this->GetExchangeInt(orbitalMu, orbitalLam, atomA); | |
103 | + lammda = v + firstAOIndexA; | |
96 | 104 | temp += orbitalElectronPopulation[lammda][lammda]*(coulomb - 0.5*exchange); |
97 | 105 | } |
98 | 106 | value += temp; |
99 | 107 | |
100 | 108 | temp = 0.0; |
101 | - for(int BB=0; BB<molecule->GetAtomVect()->size(); BB++){ | |
102 | - if(BB != atomAIndex){ | |
103 | - Atom* atomBB = (*molecule->GetAtomVect())[BB]; | |
104 | - temp += ( atomicElectronPopulation[BB] - atomBB->GetCoreCharge() ) | |
105 | - *gammaAB[atomAIndex][BB]; | |
109 | + for(int B=0; B<molecule->GetAtomVect()->size(); B++){ | |
110 | + if(B != atomAIndex){ | |
111 | + Atom* atomB = (*molecule->GetAtomVect())[B]; | |
112 | + for(int i=0; i<atomB->GetValence().size(); i++){ | |
113 | + int sigma = i + atomB->GetFirstAOIndex(); | |
114 | + OrbitalType orbitalSigma = atomB->GetValence()[i]; | |
115 | + temp += orbitalElectronPopulation[sigma][sigma] | |
116 | + *this->GetNishimotoMatagaTwoEleInt(atomA, orbitalMu, atomB, orbitalSigma); | |
117 | + } | |
118 | + temp -= atomB->GetCoreCharge() | |
119 | + *this->GetNishimotoMatagaTwoEleInt(atomA, s, atomB, s); | |
106 | 120 | } |
107 | 121 | } |
108 | 122 | value += temp; |
@@ -112,15 +126,14 @@ double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA | ||
112 | 126 | } |
113 | 127 | |
114 | 128 | double ZindoS::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex, |
115 | - int firstAOIndexA, int firstAOIndexB, | |
116 | 129 | int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap, |
117 | 130 | double** orbitalElectronPopulation, bool isGuess){ |
118 | - double value; | |
119 | - double K = 1.0; | |
120 | - if(m <= atomA->GetValenceShellType() || m <= atomB->GetValenceShellType()){ | |
121 | - K = 0.75; | |
122 | - } | |
123 | - double bondParameter = 0.5*K*(atomA->GetBondingParameter() + atomB->GetBondingParameter()); | |
131 | + double value = 0.0; | |
132 | + OrbitalType orbitalMu = atomA->GetValence()[mu-atomA->GetFirstAOIndex()]; | |
133 | + OrbitalType orbitalNu = atomB->GetValence()[nu-atomB->GetFirstAOIndex()]; | |
134 | + | |
135 | + double bondParameter = 0.5*(atomA->GetBondingParameter(this->theory, orbitalMu) | |
136 | + +atomB->GetBondingParameter(this->theory, orbitalNu)); | |
124 | 137 | |
125 | 138 | if(isGuess){ |
126 | 139 | value = bondParameter*overlap[mu][nu]; |
@@ -129,18 +142,17 @@ double ZindoS::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, i | ||
129 | 142 | double coulomb = 0.0; |
130 | 143 | double exchange = 0.0; |
131 | 144 | if(atomAIndex == atomBIndex){ |
132 | - OrbitalType orbitalMu = atomA->GetValence()[mu-firstAOIndexA]; | |
133 | - OrbitalType orbitalNu = atomA->GetValence()[nu-firstAOIndexA]; | |
134 | - coulomb = this->GetCoulombInt(orbitalMu, orbitalNu, gammaAB[atomAIndex][atomAIndex], atomA); | |
135 | - exchange = this->GetExchangeInt(orbitalMu, orbitalNu, gammaAB[atomAIndex][atomAIndex], atomA); | |
145 | + coulomb = this->GetCoulombInt(orbitalMu, orbitalNu, atomA); | |
146 | + exchange = this->GetExchangeInt(orbitalMu, orbitalNu, atomA); | |
136 | 147 | value = (1.5*exchange - 0.5*coulomb)*orbitalElectronPopulation[mu][nu]; |
137 | 148 | } |
138 | 149 | else{ |
139 | 150 | value = bondParameter*overlap[mu][nu]; |
140 | - value -= 0.5*orbitalElectronPopulation[mu][nu]*gammaAB[atomAIndex][atomBIndex]; | |
151 | + value -= 0.5*orbitalElectronPopulation[mu][nu] | |
152 | + *this->GetNishimotoMatagaTwoEleInt(atomA, orbitalMu, atomB, orbitalNu); | |
141 | 153 | } |
142 | 154 | } |
143 | - | |
155 | + | |
144 | 156 | return value; |
145 | 157 | } |
146 | 158 |
@@ -150,29 +162,131 @@ void ZindoS::CalcGammaAB(double** gammaAB, Molecule* molecule){ | ||
150 | 162 | |
151 | 163 | // Apendix in [BZ_1972] |
152 | 164 | // ZINDO Coulomb Interaction |
153 | -double ZindoS::GetCoulombInt(OrbitalType orbital1, OrbitalType orbital2, double gamma, Atom* atom){ | |
165 | +double ZindoS::GetCoulombInt(OrbitalType orbital1, OrbitalType orbital2, Atom* atom){ | |
154 | 166 | |
155 | 167 | double value=0.0; |
156 | - | |
157 | - // ToDo: Coulomb interaction | |
158 | - /* | |
168 | + | |
159 | 169 | if( orbital1 == s && orbital2 == s){ |
160 | - value = gamma; | |
170 | + value = atom->GetZindoF0ssLower(); | |
161 | 171 | } |
162 | 172 | else if( orbital1 == s && ( orbital2 == px || orbital2 == py || orbital2 == pz )){ |
163 | - value = gamma; | |
173 | + value = atom->GetZindoF0ssLower(); | |
164 | 174 | } |
165 | - else if( (orbital1 == px || orbital1 == py || orbital1 == pz ) && orbital2 == s){ | |
166 | - value = gamma; | |
175 | + else if( orbital2 == s && ( orbital1 == px || orbital1 == py || orbital1 == pz )){ | |
176 | + value = atom->GetZindoF0ssLower(); | |
167 | 177 | } |
168 | 178 | else if( (orbital1 == orbital2) && ( orbital1 == px || orbital1 == py || orbital1 == pz )){ |
169 | - value = gamma + 4.0*atom->GetIndoF2()/25.0; | |
179 | + value = atom->GetZindoF0ssLower() | |
180 | + +atom->GetZindoF2ppLower()*4.0; | |
170 | 181 | } |
171 | 182 | else if( (orbital1 != orbital2) |
172 | 183 | && ( orbital1 == px || orbital1 == py || orbital1 == pz ) |
173 | 184 | && ( orbital2 == px || orbital2 == py || orbital2 == pz ) ){ |
174 | - value = gamma - 2.0*atom->GetIndoF2()/25.0; | |
185 | + value = atom->GetZindoF0ssLower() | |
186 | + -atom->GetZindoF2ppLower()*2.0; | |
187 | + } | |
188 | + else if( orbital1 == s && ( orbital2 == dxy || | |
189 | + orbital2 == dyz || | |
190 | + orbital2 == dzz || | |
191 | + orbital2 == dzx || | |
192 | + orbital2 == dxxyy )){ | |
193 | + value = atom->GetZindoF0sdLower(); | |
175 | 194 | } |
195 | + else if( orbital2 == s && ( orbital1 == dxy || | |
196 | + orbital1 == dyz || | |
197 | + orbital1 == dzz || | |
198 | + orbital1 == dzx || | |
199 | + orbital1 == dxxyy )){ | |
200 | + value = atom->GetZindoF0sdLower(); | |
201 | + } | |
202 | + else if( orbital1 == dzz && (orbital2 == px || orbital2==py) ){ | |
203 | + value = atom->GetZindoF0sdLower() | |
204 | + -atom->GetZindoF2pdLower()*2.0; | |
205 | + } | |
206 | + else if( orbital2 == dzz && (orbital1 == px || orbital1==py) ){ | |
207 | + value = atom->GetZindoF0sdLower() | |
208 | + -atom->GetZindoF2pdLower()*2.0; | |
209 | + } | |
210 | + else if( (orbital1 == dzz && orbital2 == pz) || | |
211 | + (orbital2 == dzz && orbital1 == pz) ){ | |
212 | + value = atom->GetZindoF0sdLower() | |
213 | + +atom->GetZindoF2pdLower()*4.0; | |
214 | + } | |
215 | + else if( (orbital1 == orbital2) && ( orbital1 == dxy || | |
216 | + orbital1 == dyz || | |
217 | + orbital1 == dzz || | |
218 | + orbital1 == dzx || | |
219 | + orbital1 == dxxyy )){ | |
220 | + value = atom->GetZindoF0ddLower() | |
221 | + +atom->GetZindoF2ddLower()*4.0 | |
222 | + +atom->GetZindoF4ddLower()*36.0; | |
223 | + } | |
224 | + else if( (orbital1 == dxxyy && orbital2 == px) || | |
225 | + (orbital2 == dxxyy && orbital1 == px) || | |
226 | + (orbital1 == dxxyy && orbital2 == py) || | |
227 | + (orbital2 == dxxyy && orbital1 == py) || | |
228 | + (orbital1 == dxy && orbital2 == px) || | |
229 | + (orbital2 == dxy && orbital1 == px) || | |
230 | + (orbital1 == dxy && orbital2 == py) || | |
231 | + (orbital2 == dxy && orbital1 == py) || | |
232 | + (orbital1 == dzx && orbital2 == px) || | |
233 | + (orbital2 == dzx && orbital1 == px) || | |
234 | + (orbital1 == dzx && orbital2 == pz) || | |
235 | + (orbital2 == dzx && orbital1 == pz) || | |
236 | + (orbital1 == dyz && orbital2 == py) || | |
237 | + (orbital2 == dyz && orbital1 == py) || | |
238 | + (orbital1 == dyz && orbital2 == pz) || | |
239 | + (orbital2 == dyz && orbital1 == pz) ){ | |
240 | + value = atom->GetZindoF0sdLower() | |
241 | + +atom->GetZindoF2pdLower()*2.0; | |
242 | + } | |
243 | + else if( (orbital1 == dxxyy && orbital2 == pz) || | |
244 | + (orbital2 == dxxyy && orbital1 == pz) || | |
245 | + (orbital1 == dxy && orbital2 == pz) || | |
246 | + (orbital2 == dxy && orbital1 == pz) || | |
247 | + (orbital1 == dzx && orbital2 == py) || | |
248 | + (orbital2 == dzx && orbital1 == py) || | |
249 | + (orbital1 == dyz && orbital2 == px) || | |
250 | + (orbital2 == dyz && orbital1 == px) ){ | |
251 | + value = atom->GetZindoF0sdLower() | |
252 | + -atom->GetZindoF2pdLower()*4.0; | |
253 | + } | |
254 | + else if( (orbital1 == dxxyy && orbital2 == dzz) || | |
255 | + (orbital2 == dxxyy && orbital1 == dzz) || | |
256 | + (orbital1 == dxy && orbital2 == dzz) || | |
257 | + (orbital2 == dxy && orbital1 == dzz) ){ | |
258 | + value = atom->GetZindoF0ddLower() | |
259 | + -atom->GetZindoF2ddLower()*4.0 | |
260 | + +atom->GetZindoF4ddLower()*6.0; | |
261 | + } | |
262 | + else if( (orbital1 == dxy && orbital2 == dxxyy) || | |
263 | + (orbital2 == dxy && orbital1 == dxxyy) ){ | |
264 | + value = atom->GetZindoF0ddLower() | |
265 | + +atom->GetZindoF2ddLower()*4.0 | |
266 | + -atom->GetZindoF4ddLower()*34.0; | |
267 | + } | |
268 | + else if( (orbital1 == dzx && orbital2 == dzz) || | |
269 | + (orbital2 == dzx && orbital1 == dzz) || | |
270 | + (orbital1 == dyz && orbital2 == dzz) || | |
271 | + (orbital2 == dyz && orbital1 == dzz) ){ | |
272 | + value = atom->GetZindoF0ddLower() | |
273 | + +atom->GetZindoF2ddLower()*2.0 | |
274 | + -atom->GetZindoF4ddLower()*24.0; | |
275 | + } | |
276 | + else if( (orbital1 == dzx && orbital2 == dxxyy) || | |
277 | + (orbital2 == dzx && orbital1 == dxxyy) || | |
278 | + (orbital1 == dzx && orbital2 == dxy) || | |
279 | + (orbital2 == dzx && orbital1 == dxy) || | |
280 | + (orbital1 == dyz && orbital2 == dxxyy) || | |
281 | + (orbital2 == dyz && orbital1 == dxxyy) || | |
282 | + (orbital1 == dyz && orbital2 == dxy) || | |
283 | + (orbital2 == dyz && orbital1 == dxy) || | |
284 | + (orbital1 == dyz && orbital2 == dzx) || | |
285 | + (orbital2 == dyz && orbital1 == dzx) ){ | |
286 | + value = atom->GetZindoF0ddLower() | |
287 | + -atom->GetZindoF2ddLower()*2.0 | |
288 | + -atom->GetZindoF4ddLower()*4.0; | |
289 | + } | |
176 | 290 | else{ |
177 | 291 | stringstream ss; |
178 | 292 | ss << this->errorMessageCoulombInt; |
@@ -181,33 +295,117 @@ double ZindoS::GetCoulombInt(OrbitalType orbital1, OrbitalType orbital2, double | ||
181 | 295 | ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbital2) << "\n"; |
182 | 296 | throw MolDSException(ss.str()); |
183 | 297 | } |
184 | - */ | |
298 | + | |
185 | 299 | return value; |
186 | 300 | |
187 | 301 | } |
188 | 302 | |
189 | 303 | // Apendix in [BZ_1972] |
190 | 304 | // ZINDO Exchange Interaction |
191 | -double ZindoS::GetExchangeInt(OrbitalType orbital1, OrbitalType orbital2, double gamma, Atom* atom){ | |
305 | +double ZindoS::GetExchangeInt(OrbitalType orbital1, OrbitalType orbital2, Atom* atom){ | |
192 | 306 | |
193 | 307 | double value=0.0; |
194 | 308 | |
195 | - // ToDo: Exchange interaction | |
196 | - /* | |
197 | 309 | if( orbital1 == orbital2){ |
198 | - value = this->GetCoulombInt(orbital1, orbital2, gamma, atom); | |
310 | + value = this->GetCoulombInt(orbital1, orbital2, atom); | |
311 | + } | |
312 | + else if( orbital1 == s && (orbital2 == px || orbital2 == py || orbital2 == pz ) ){ | |
313 | + value = atom->GetZindoG1spLower(); | |
314 | + } | |
315 | + else if( orbital2 == s && (orbital1 == px || orbital1 == py || orbital1 == pz ) ){ | |
316 | + value = atom->GetZindoG1spLower(); | |
199 | 317 | } |
200 | - else if( (orbital1 == s) && (orbital2 == px || orbital2 == py || orbital2 == pz ) ){ | |
201 | - value = atom->GetIndoG1()/3.0; | |
318 | + else if( (orbital1 == s) && (orbital2 == dxy || | |
319 | + orbital2 == dyz || | |
320 | + orbital2 == dzz || | |
321 | + orbital2 == dzx || | |
322 | + orbital2 == dxxyy ) ){ | |
323 | + value = atom->GetZindoG2sdLower(); | |
202 | 324 | } |
203 | - else if( (orbital1 == px || orbital1 == py || orbital1 == pz) && orbital2 == s ){ | |
204 | - value = atom->GetIndoG1()/3.0; | |
325 | + else if( (orbital2 == s) && (orbital1 == dxy || | |
326 | + orbital1 == dyz || | |
327 | + orbital1 == dzz || | |
328 | + orbital1 == dzx || | |
329 | + orbital1 == dxxyy ) ){ | |
330 | + value = atom->GetZindoG2sdLower(); | |
205 | 331 | } |
206 | 332 | else if( (orbital1 != orbital2) |
207 | 333 | && ( orbital1 == px || orbital1 == py || orbital1 == pz ) |
208 | 334 | && ( orbital2 == px || orbital2 == py || orbital2 == pz ) ){ |
209 | - value = 3.0*atom->GetIndoF2()/25.0; | |
210 | - } | |
335 | + value = atom->GetZindoF2ppLower()*3.0; | |
336 | + } | |
337 | + else if( (orbital1 == px && orbital2 == dzz) || | |
338 | + (orbital2 == px && orbital1 == dzz) || | |
339 | + (orbital1 == py && orbital2 == dzz) || | |
340 | + (orbital2 == py && orbital1 == dzz) ){ | |
341 | + value = atom->GetZindoG1pdLower() | |
342 | + +atom->GetZindoG3pdLower()*18.0; | |
343 | + } | |
344 | + else if( (orbital1 == px && orbital2 == dxxyy) || | |
345 | + (orbital2 == px && orbital1 == dxxyy) || | |
346 | + (orbital1 == px && orbital2 == dxy) || | |
347 | + (orbital2 == px && orbital1 == dxy) || | |
348 | + (orbital1 == px && orbital2 == dzx) || | |
349 | + (orbital2 == px && orbital1 == dzx) || | |
350 | + (orbital1 == py && orbital2 == dxxyy) || | |
351 | + (orbital2 == py && orbital1 == dxxyy) || | |
352 | + (orbital1 == py && orbital2 == dxy) || | |
353 | + (orbital2 == py && orbital1 == dxy) || | |
354 | + (orbital1 == py && orbital2 == dyz) || | |
355 | + (orbital2 == py && orbital1 == dyz) || | |
356 | + (orbital1 == pz && orbital2 == dzx) || | |
357 | + (orbital2 == pz && orbital1 == dzx) || | |
358 | + (orbital1 == pz && orbital2 == dyz) || | |
359 | + (orbital2 == pz && orbital1 == dyz) ){ | |
360 | + value = atom->GetZindoG1pdLower()*3.0 | |
361 | + +atom->GetZindoG3pdLower()*24.0; | |
362 | + } | |
363 | + else if( (orbital1 == px && orbital2 == dyz) || | |
364 | + (orbital2 == px && orbital1 == dyz) || | |
365 | + (orbital1 == py && orbital2 == dzx) || | |
366 | + (orbital2 == py && orbital1 == dzx) || | |
367 | + (orbital1 == pz && orbital2 == dxxyy) || | |
368 | + (orbital2 == pz && orbital1 == dxxyy) || | |
369 | + (orbital1 == pz && orbital2 == dxy) || | |
370 | + (orbital2 == pz && orbital1 == dxy) ){ | |
371 | + value = atom->GetZindoG3pdLower()*15.0; | |
372 | + } | |
373 | + else if( (orbital1 == pz && orbital2 == dzz) || | |
374 | + (orbital2 == pz && orbital1 == dzz) ){ | |
375 | + value = atom->GetZindoG1pdLower()*4.0 | |
376 | + +atom->GetZindoG3pdLower()*27.0; | |
377 | + } | |
378 | + else if( (orbital1 == dzz && orbital2 == dxxyy) || | |
379 | + (orbital2 == dzz && orbital1 == dxxyy) || | |
380 | + (orbital1 == dzz && orbital2 == dxy) || | |
381 | + (orbital2 == dzz && orbital1 == dxy) ){ | |
382 | + value = atom->GetZindoF2ddLower()*4.0 | |
383 | + +atom->GetZindoF4ddLower()*15.0; | |
384 | + } | |
385 | + else if( (orbital1 == dzz && orbital2 == dzx) || | |
386 | + (orbital2 == dzz && orbital1 == dzx) || | |
387 | + (orbital1 == dzz && orbital2 == dyz) || | |
388 | + (orbital2 == dzz && orbital1 == dyz) ){ | |
389 | + value = atom->GetZindoF2ddLower() | |
390 | + +atom->GetZindoF4ddLower()*30.0; | |
391 | + } | |
392 | + else if( (orbital1 == dxxyy && orbital2 == dxy) || | |
393 | + (orbital2 == dxxyy && orbital1 == dxy) ){ | |
394 | + value = atom->GetZindoF4ddLower()*35.0; | |
395 | + } | |
396 | + else if( (orbital1 == dxxyy && orbital2 == dzx) || | |
397 | + (orbital2 == dxxyy && orbital1 == dzx) || | |
398 | + (orbital1 == dxxyy && orbital2 == dyz) || | |
399 | + (orbital2 == dxxyy && orbital1 == dyz) || | |
400 | + (orbital1 == dxy && orbital2 == dzx) || | |
401 | + (orbital2 == dxy && orbital1 == dzx) || | |
402 | + (orbital1 == dxy && orbital2 == dyz) || | |
403 | + (orbital2 == dxy && orbital1 == dyz) || | |
404 | + (orbital1 == dzx && orbital2 == dyz) || | |
405 | + (orbital2 == dzx && orbital1 == dyz) ){ | |
406 | + value = atom->GetZindoF2ddLower()*3.0 | |
407 | + +atom->GetZindoF4ddLower()*20.0; | |
408 | + } | |
211 | 409 | else{ |
212 | 410 | stringstream ss; |
213 | 411 | ss << this->errorMessageExchangeInt; |
@@ -216,11 +414,92 @@ double ZindoS::GetExchangeInt(OrbitalType orbital1, OrbitalType orbital2, double | ||
216 | 414 | ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbital2) << "\n"; |
217 | 415 | throw MolDSException(ss.str()); |
218 | 416 | } |
219 | - */ | |
417 | + | |
220 | 418 | |
221 | 419 | return value; |
222 | 420 | } |
223 | 421 | |
422 | +// ref. [MN_1957] and (5a) in [AEZ_1986] | |
423 | +double ZindoS::GetNishimotoMatagaTwoEleInt(Atom* atomA, OrbitalType orbitalA, | |
424 | + Atom* atomB, OrbitalType orbitalB){ | |
425 | + | |
426 | + double r =sqrt( | |
427 | + pow(atomA->GetXyz()[0] - atomB->GetXyz()[0], 2.0) | |
428 | + +pow(atomA->GetXyz()[1] - atomB->GetXyz()[1], 2.0) | |
429 | + +pow(atomA->GetXyz()[2] - atomB->GetXyz()[2], 2.0) ); | |
430 | + | |
431 | + double gammaAA; | |
432 | + if(orbitalA == s || | |
433 | + orbitalA == px || | |
434 | + orbitalA == py || | |
435 | + orbitalA == pz ){ | |
436 | + gammaAA = atomA->GetZindoF0ss(); | |
437 | + } | |
438 | + else if(orbitalA == dxy || | |
439 | + orbitalA == dyz || | |
440 | + orbitalA == dzz || | |
441 | + orbitalA == dzx || | |
442 | + orbitalA == dxxyy ){ | |
443 | + gammaAA = atomA->GetZindoF0dd(); | |
444 | + } | |
445 | + else{ | |
446 | + stringstream ss; | |
447 | + ss << this->errorMessageNishimotoMataga; | |
448 | + ss << this->errorMessageAtomType << AtomTypeStr(atomA->GetAtomType()) << "\n"; | |
449 | + ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbitalA) << "\n"; | |
450 | + throw MolDSException(ss.str()); | |
451 | + } | |
452 | + | |
453 | + double gammaBB; | |
454 | + if(orbitalB == s || | |
455 | + orbitalB == px || | |
456 | + orbitalB == py || | |
457 | + orbitalB == pz ){ | |
458 | + gammaBB = atomB->GetZindoF0ss(); | |
459 | + } | |
460 | + else if(orbitalB == dxy || | |
461 | + orbitalB == dyz || | |
462 | + orbitalB == dzz || | |
463 | + orbitalB == dzx || | |
464 | + orbitalB == dxxyy ){ | |
465 | + gammaBB = atomB->GetZindoF0dd(); | |
466 | + } | |
467 | + else{ | |
468 | + stringstream ss; | |
469 | + ss << this->errorMessageNishimotoMataga; | |
470 | + ss << this->errorMessageAtomType << AtomTypeStr(atomB->GetAtomType()) << "\n"; | |
471 | + ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbitalB) << "\n"; | |
472 | + throw MolDSException(ss.str()); | |
473 | + } | |
474 | + | |
475 | + return 1.2/( r+2.4/(gammaAA+gammaBB) ); | |
476 | + | |
477 | +} | |
478 | + | |
479 | + | |
480 | +void ZindoS::CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB){ | |
481 | + | |
482 | + MolDS_cndo::Cndo2::CalcDiatomicOverlapInDiatomicFrame(diatomicOverlap, atomA, atomB); | |
483 | + | |
484 | + // see (4f) in [AEZ_1986] | |
485 | + diatomicOverlap[pz][pz] *= 1.267; | |
486 | + diatomicOverlap[py][py] *= 0.585; | |
487 | + diatomicOverlap[px][px] *= 0.585; | |
488 | + | |
489 | + /* | |
490 | + for(int i=0;i<OrbitalType_end;i++){ | |
491 | + for(int j=0;j<OrbitalType_end;j++){ | |
492 | + printf("diatomicOverlap[%d][%d]=%lf\n",i,j,diatomicOverlap[i][j]); | |
493 | + } | |
494 | + } | |
495 | + */ | |
496 | + | |
497 | + | |
498 | +} | |
499 | + | |
500 | + | |
501 | + | |
502 | + | |
224 | 503 | } |
225 | 504 | #endif |
226 | 505 |