• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

コミットメタ情報

リビジョン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

変更サマリ

差分

--- a/doc/refferences.txt
+++ b/doc/refferences.txt
@@ -1,3 +1,4 @@
1+[MN_1957] N. Mataga and K. Nishinoto, Z. Phys. Chem., 13, 140 (1957)
12 [PSS_1965] J. A. Pople, D. P. Santry, and G. A. Segal, J. Chem. Phys., 43, S129 (1965)
23 [PS_1965] J. A. Pople and G. A. Segal, J. Chem. Phys., 43, S136 (1965)
34 [PS_1966] J. A. Pople and G. A. Segal, J. Chem. Phys., 44, 3289 (1966)
@@ -5,9 +6,9 @@
56 [GD_1972] G. P.-Guillouzo and D. G. ET J. Deschamps, J. Mol. Strct., 14, 81 (1972)
67 [RZ_1976] J. E. Ridley and M. C. Zerner, Theort. Chim. Acta (Berl.) 42, 223 (1976)
78 [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)
810 [AEZ_1986] W. P. Anderson, W. D. Edwards, and M. C. Zerner, Inorg. Chem. 25, 2728 (1986)
911 [BFB_1997] M. A. Blanco, M. Fl{\'o}rez, and M. Bermejo, J. Mol. Struct. 419, 19 (1997)
1012
1113
1214
13-
--- a/src/base/atoms/Atom.h
+++ b/src/base/atoms/Atom.h
@@ -41,6 +41,8 @@ protected:
4141 double imuAmuP; // Table 3.4 or 3.5 in J. A. Pople book
4242 double imuAmuD; // Table 3.4 or 3.5 in J. A. Pople book
4343 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]
4446 double coreCharge; // = Z_A in J. A. Pople book.
4547 double effectiveNuclearChargeK; // Table 1.5 in J. A. Pople book
4648 double effectiveNuclearChargeL; // Table 1.5 in J. A. Pople book
@@ -74,6 +76,7 @@ public:
7476 void SetXyz(double x, double y, double z);
7577 vector<OrbitalType> GetValence();
7678 double GetBondingParameter();
79+ double GetBondingParameter(TheoryType theory, OrbitalType orbital);
7780 double GetCoreCharge();
7881 int GetFirstAOIndex();
7982 void SetFirstAOIndex(int firstAOIndex);
@@ -82,8 +85,31 @@ public:
8285 double GetImuAmu(OrbitalType orbitalType); // return 0.5*(I_mu + A_mu)
8386 double GetOrbitalExponent(ShellType shellType, OrbitalType orbitalType); // (1.73) in J. A. Pople book.
8487 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);
8589 double GetIndoF2();
8690 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]
87113 };
88114
89115 Atom::Atom(){
@@ -137,8 +163,32 @@ vector<OrbitalType> Atom::GetValence(){
137163 return this->valence;
138164 }
139165
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+
140190 double Atom::GetBondingParameter(){
141- return this->bondingParameter;
191+ return this->GetBondingParameter(CNDO2, s);
142192 }
143193
144194 double Atom::GetCoreCharge(){
@@ -268,7 +318,7 @@ double Atom::GetJpd(){
268318
269319 // Part of Eq. (13) in [BZ_1979]
270320 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;
272322 }
273323
274324 // Eq. (13) in [BZ_1979]
@@ -313,6 +363,123 @@ double Atom::GetIndoG1(){
313363 }
314364
315365
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+
316483
317484 }
318485 #endif
@@ -321,3 +488,18 @@ double Atom::GetIndoG1(){
321488
322489
323490
491+
492+
493+
494+
495+
496+
497+
498+
499+
500+
501+
502+
503+
504+
505+
--- a/src/base/atoms/Catom.h
+++ b/src/base/atoms/Catom.h
@@ -21,6 +21,8 @@ Catom::Catom(double x, double y, double z) : Atom(x, y, z){
2121 this->valence.push_back(pz);
2222 this->valence.push_back(px);
2323 this->bondingParameter = -21.0*Parameters::GetInstance()->GetEV2AU();
24+ this->bondingParameterSZindo = -17.0*Parameters::GetInstance()->GetEV2AU();
25+ this->bondingParameterDZindo = 0.0;
2426 this->coreCharge = 4.0;
2527 this->imuAmuS = 14.051*Parameters::GetInstance()->GetEV2AU();
2628 this->imuAmuP = 5.572*Parameters::GetInstance()->GetEV2AU();
@@ -44,8 +46,8 @@ Catom::Catom(double x, double y, double z) : Atom(x, y, z){
4446 this->zindoG3pd = 0.0;
4547 this->zindoF2dd = 0.0;
4648 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();
4951 this->IonPotD = 0.0 * Parameters::GetInstance()->GetEV2AU();
5052 }
5153
--- a/src/base/atoms/Hatom.h
+++ b/src/base/atoms/Hatom.h
@@ -19,6 +19,8 @@ Hatom::Hatom(double x, double y, double z) : Atom(x, y, z){
1919 this->atomType = H;
2020 this->valence.push_back(s);
2121 this->bondingParameter = -9.0*Parameters::GetInstance()->GetEV2AU();
22+ this->bondingParameterSZindo = -9.0*Parameters::GetInstance()->GetEV2AU();
23+ this->bondingParameterDZindo = 0.0;
2224 this->coreCharge = 1.0;
2325 this->imuAmuS = 7.176*Parameters::GetInstance()->GetEV2AU();
2426 this->imuAmuP = 0.0;
@@ -42,7 +44,7 @@ Hatom::Hatom(double x, double y, double z) : Atom(x, y, z){
4244 this->zindoG3pd = 0.0;
4345 this->zindoF2dd = 0.0;
4446 this->zindoF4dd = 0.0;
45- this->IonPotS = -13.06 * Parameters::GetInstance()->GetEV2AU();
47+ this->IonPotS = 13.06 * Parameters::GetInstance()->GetEV2AU();
4648 this->IonPotP = 0.0 * Parameters::GetInstance()->GetEV2AU();
4749 this->IonPotD = 0.0 * Parameters::GetInstance()->GetEV2AU();
4850 }
--- a/src/base/atoms/Liatom.h
+++ b/src/base/atoms/Liatom.h
@@ -22,6 +22,8 @@ Liatom::Liatom(double x, double y, double z) : Atom(x, y, z){
2222 this->valence.push_back(pz);
2323 this->valence.push_back(px);
2424 this->bondingParameter = -9.0*Parameters::GetInstance()->GetEV2AU();
25+ this->bondingParameterSZindo = 0.0;
26+ this->bondingParameterDZindo = 0.0;
2527 this->coreCharge = 1.0;
2628 this->imuAmuS = 3.106*Parameters::GetInstance()->GetEV2AU();
2729 this->imuAmuP = 1.258*Parameters::GetInstance()->GetEV2AU();
@@ -45,8 +47,8 @@ Liatom::Liatom(double x, double y, double z) : Atom(x, y, z){
4547 this->zindoG3pd = 0.0;
4648 this->zindoF2dd = 0.0;
4749 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();
5052 this->IonPotD = 0.0 * Parameters::GetInstance()->GetEV2AU();
5153 }
5254
--- a/src/base/atoms/Satom.h
+++ b/src/base/atoms/Satom.h
@@ -29,6 +29,8 @@ Satom::Satom(double x, double y, double z) : Atom(x, y, z){
2929 this->valence.push_back(dxxyy);
3030 }
3131 this->bondingParameter = -18.150*Parameters::GetInstance()->GetEV2AU();
32+ this->bondingParameterSZindo = -14.0*Parameters::GetInstance()->GetEV2AU();
33+ this->bondingParameterDZindo = 4.0*Parameters::GetInstance()->GetEV2AU();
3234 this->coreCharge = 6.0;
3335 this->imuAmuS = 17.650*Parameters::GetInstance()->GetEV2AU();
3436 this->imuAmuP = 6.989*Parameters::GetInstance()->GetEV2AU();
@@ -52,9 +54,9 @@ Satom::Satom(double x, double y, double z) : Atom(x, y, z){
5254 this->zindoG3pd = 20587*Parameters::GetInstance()->GetKayser2AU();
5355 this->zindoF2dd = 28411*Parameters::GetInstance()->GetKayser2AU();
5456 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();
5860 }
5961
6062 double Satom::GetCoreIntegral(OrbitalType orbital, double gamma, bool isGuess, TheoryType theory){
--- a/src/cndo/Cndo2.h
+++ b/src/cndo/Cndo2.h
@@ -57,12 +57,9 @@ private:
5757 double** orbitalElectronPopulation, Molecule* molecule);
5858 void CalcOverlap(double** overlap, Molecule* molecule);
5959 void CalcRotatingMatrix(double** rotatingMatrix, Atom* atomA, Atom* atomB);
60- void CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB);
6160 void CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** overlap, double** gammaAB,
6261 double** orbitalElectronPopulation, double* atomicElectronPopulation,
6362 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);
6663 void RotateDiatmicOverlapToSpaceFrame(double** diatomicOverlap, double** rotatingMatrix);
6764 void SetOverlapElement(double** overlap, double** diatomicOverlap, Atom* atomA, Atom* atomB);
6865 double GetAuxiliaryA(int k, double rho);
@@ -86,17 +83,19 @@ protected:
8683 string messageStartSCF;
8784 string messageDoneSCF;
8885 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);
8988 virtual void CalcGammaAB(double** gammaAB, Molecule* molecule);
9089 virtual void SetMessages();
9190 virtual void SetEnableAtomTypes();
92- virtual double GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA,
91+ virtual double GetFockDiagElement(Atom* atomA, int atomAIndex,
9392 int mu, Molecule* molecule, double** gammaAB,
9493 double** orbitalElectronPopulation, double* atomicElectronPopulation,
9594 bool isGuess);
9695 virtual double GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex,
97- int firstAOIndexA, int firstAOIndexB,
9896 int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap,
9997 double** orbitalElectronPopulation, bool isGuess);
98+ virtual void CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB);
10099 TheoryType theory;
101100 public:
102101 Cndo2();
@@ -453,7 +452,6 @@ void Cndo2::CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** ove
453452 // diagonal part
454453 fockMatrix[mu][mu] = this->GetFockDiagElement(atomA,
455454 A,
456- firstAOIndexA,
457455 mu,
458456 molecule,
459457 gammaAB,
@@ -467,8 +465,6 @@ void Cndo2::CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** ove
467465 atomB,
468466 A,
469467 B,
470- firstAOIndexA,
471- firstAOIndexB,
472468 mu,
473469 nu,
474470 molecule,
@@ -499,11 +495,12 @@ void Cndo2::CalcFockMatrix(double** fockMatrix, Molecule* molecule, double** ove
499495
500496 }
501497
502-double Cndo2::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, int mu,
498+double Cndo2::GetFockDiagElement(Atom* atomA, int atomAIndex, int mu,
503499 Molecule* molecule, double** gammaAB,
504500 double** orbitalElectronPopulation, double* atomicElectronPopulation,
505501 bool isGuess){
506502 double value;
503+ int firstAOIndexA = atomA->GetFirstAOIndex();
507504 value = -1.0 * atomA->GetImuAmu(atomA->GetValence()[mu-firstAOIndexA]);
508505 if(!isGuess){
509506 double temp = atomicElectronPopulation[atomAIndex] - atomA->GetCoreCharge()
@@ -525,7 +522,6 @@ double Cndo2::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA,
525522 }
526523
527524 double Cndo2::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex,
528- int firstAOIndexA, int firstAOIndexB,
529525 int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap,
530526 double** orbitalElectronPopulation, bool isGuess){
531527 double value;
--- a/src/indo/Indo.h
+++ b/src/indo/Indo.h
@@ -23,15 +23,14 @@ private:
2323 double GetExchangeInt(OrbitalType orbital1, OrbitalType orbital2, double gamma, Atom* atom); // Indo Exchange Interaction, (3.87) - (3.91) in J. A. Pople book.
2424 protected:
2525 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,
2728 int mu, Molecule* molecule, double** gammaAB,
2829 double** orbitalElectronPopulation, double* atomicElectronPopulation,
2930 bool isGuess);
3031 virtual double GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex,
31- int firstAOIndexA, int firstAOIndexB,
3232 int mu, int nu, Molecule* molecule, double** gammaAB, double** overelap,
3333 double** orbitalElectronPopulation, bool isGuess);
34- virtual void SetEnableAtomTypes();
3534
3635 public:
3736 Indo();
@@ -77,11 +76,12 @@ void Indo::SetEnableAtomTypes(){
7776 this->enableAtomTypes.push_back(F);
7877 }
7978
80-double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, int mu,
79+double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int mu,
8180 Molecule* molecule, double** gammaAB,
8281 double** orbitalElectronPopulation, double* atomicElectronPopulation,
8382 bool isGuess){
8483 double value;
84+ int firstAOIndexA = atomA->GetFirstAOIndex();
8585 value = atomA->GetCoreIntegral(atomA->GetValence()[mu-firstAOIndexA],
8686 gammaAB[atomAIndex][atomAIndex],
8787 isGuess, this->theory);
@@ -102,11 +102,11 @@ double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA,
102102 value += temp;
103103
104104 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];
110110 }
111111 }
112112 value += temp;
@@ -116,7 +116,6 @@ double Indo::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA,
116116 }
117117
118118 double Indo::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex,
119- int firstAOIndexA, int firstAOIndexB,
120119 int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap,
121120 double** orbitalElectronPopulation, bool isGuess){
122121 double value;
@@ -133,8 +132,8 @@ double Indo::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int
133132 double coulomb = 0.0;
134133 double exchange = 0.0;
135134 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()];
138137 coulomb = this->GetCoulombInt(orbitalMu, orbitalNu, gammaAB[atomAIndex][atomAIndex], atomA);
139138 exchange = this->GetExchangeInt(orbitalMu, orbitalNu, gammaAB[atomAIndex][atomAIndex], atomA);
140139 value = (1.5*exchange - 0.5*coulomb)*orbitalElectronPopulation[mu][nu];
--- a/src/input.in
+++ b/src/input.in
@@ -5,18 +5,18 @@ SCF_END
55
66 THEORY
77 //cndo/2
8- indo
9- //zindo/s
8+ //indo
9+ zindo/s
1010 THEORY_END
1111
1212 //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
2020
2121
2222 // c2
@@ -38,11 +38,11 @@ GEOMETRY_END
3838 //GEOMETRY_END
3939
4040 // 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
4646
4747 // benzene
4848 //GEOMETRY
--- a/src/zindo/ZindoS.h
+++ b/src/zindo/ZindoS.h
@@ -19,20 +19,27 @@ namespace MolDS_zindo{
1919 */
2020 class ZindoS : public MolDS_cndo::Cndo2{
2121 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;
2431 protected:
2532 virtual void CalcGammaAB(double** gammaAB, Molecule* molecule);
2633 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,
2836 int mu, Molecule* molecule, double** gammaAB,
2937 double** orbitalElectronPopulation, double* atomicElectronPopulation,
3038 bool isGuess);
3139 virtual double GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex,
32- int firstAOIndexA, int firstAOIndexB,
3340 int mu, int nu, Molecule* molecule, double** gammaAB, double** overelap,
3441 double** orbitalElectronPopulation, bool isGuess);
35- virtual void SetEnableAtomTypes();
42+ virtual void CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB);
3643 public:
3744 ZindoS();
3845 ~ZindoS();
@@ -60,6 +67,7 @@ void ZindoS::SetMessages(){
6067 = "Error in zindo::ZindoS::CheckEnableAtomType: Non available atom is contained.\n";
6168 this->errorMessageCoulombInt = "Error in base_zindo::ZindoS::GetCoulombInt: Invalid orbitalType.\n";
6269 this->errorMessageExchangeInt = "Error in base_zindo::ZindoS::GetExchangeInt: Invalid orbitalType.\n";
70+ this->errorMessageNishimotoMataga = "Error in base_zindo::ZindoS::GetNishimotoMatagaTwoEleInt: Invalid orbitalType.\n";
6371 this->messageSCFMetConvergence = "\n\n\n\t\tZINDO/S-SCF met convergence criterion(^^b\n\n\n";
6472 this->messageStartSCF = "********** START: ZINDO/S-SCF **********\n";
6573 this->messageDoneSCF = "********** DONE: ZINDO/S-SCF **********\n\n\n";
@@ -74,14 +82,14 @@ void ZindoS::SetEnableAtomTypes(){
7482 this->enableAtomTypes.push_back(S);
7583 }
7684
77-double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA, int mu,
85+double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int mu,
7886 Molecule* molecule, double** gammaAB,
7987 double** orbitalElectronPopulation, double* atomicElectronPopulation,
8088 bool isGuess){
81- double value;
89+ double value=0.0;
90+ int firstAOIndexA = atomA->GetFirstAOIndex();
8291 value = atomA->GetCoreIntegral(atomA->GetValence()[mu-firstAOIndexA],
83- gammaAB[atomAIndex][atomAIndex],
84- isGuess, this->theory);
92+ isGuess, this->theory);
8593 if(!isGuess){
8694 double temp = 0.0;
8795 double coulomb = 0.0;
@@ -90,19 +98,25 @@ double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA
9098 OrbitalType orbitalMu = atomA->GetValence()[mu-firstAOIndexA];
9199 for(int v=0; v<atomA->GetValence().size(); v++){
92100 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;
96104 temp += orbitalElectronPopulation[lammda][lammda]*(coulomb - 0.5*exchange);
97105 }
98106 value += temp;
99107
100108 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);
106120 }
107121 }
108122 value += temp;
@@ -112,15 +126,14 @@ double ZindoS::GetFockDiagElement(Atom* atomA, int atomAIndex, int firstAOIndexA
112126 }
113127
114128 double ZindoS::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, int atomBIndex,
115- int firstAOIndexA, int firstAOIndexB,
116129 int mu, int nu, Molecule* molecule, double** gammaAB, double** overlap,
117130 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));
124137
125138 if(isGuess){
126139 value = bondParameter*overlap[mu][nu];
@@ -129,18 +142,17 @@ double ZindoS::GetFockOffDiagElement(Atom* atomA, Atom* atomB, int atomAIndex, i
129142 double coulomb = 0.0;
130143 double exchange = 0.0;
131144 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);
136147 value = (1.5*exchange - 0.5*coulomb)*orbitalElectronPopulation[mu][nu];
137148 }
138149 else{
139150 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);
141153 }
142154 }
143-
155+
144156 return value;
145157 }
146158
@@ -150,29 +162,131 @@ void ZindoS::CalcGammaAB(double** gammaAB, Molecule* molecule){
150162
151163 // Apendix in [BZ_1972]
152164 // 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){
154166
155167 double value=0.0;
156-
157- // ToDo: Coulomb interaction
158- /*
168+
159169 if( orbital1 == s && orbital2 == s){
160- value = gamma;
170+ value = atom->GetZindoF0ssLower();
161171 }
162172 else if( orbital1 == s && ( orbital2 == px || orbital2 == py || orbital2 == pz )){
163- value = gamma;
173+ value = atom->GetZindoF0ssLower();
164174 }
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();
167177 }
168178 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;
170181 }
171182 else if( (orbital1 != orbital2)
172183 && ( orbital1 == px || orbital1 == py || orbital1 == pz )
173184 && ( 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();
175194 }
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+ }
176290 else{
177291 stringstream ss;
178292 ss << this->errorMessageCoulombInt;
@@ -181,33 +295,117 @@ double ZindoS::GetCoulombInt(OrbitalType orbital1, OrbitalType orbital2, double
181295 ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbital2) << "\n";
182296 throw MolDSException(ss.str());
183297 }
184- */
298+
185299 return value;
186300
187301 }
188302
189303 // Apendix in [BZ_1972]
190304 // 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){
192306
193307 double value=0.0;
194308
195- // ToDo: Exchange interaction
196- /*
197309 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();
199317 }
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();
202324 }
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();
205331 }
206332 else if( (orbital1 != orbital2)
207333 && ( orbital1 == px || orbital1 == py || orbital1 == pz )
208334 && ( 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+ }
211409 else{
212410 stringstream ss;
213411 ss << this->errorMessageExchangeInt;
@@ -216,11 +414,92 @@ double ZindoS::GetExchangeInt(OrbitalType orbital1, OrbitalType orbital2, double
216414 ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbital2) << "\n";
217415 throw MolDSException(ss.str());
218416 }
219- */
417+
220418
221419 return value;
222420 }
223421
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+
224503 }
225504 #endif
226505