Révision | 812e934b205f76ca1f8c7c934f688c43fa70750a (tree) |
---|---|
l'heure | 2011-09-27 22:40:44 |
Auteur | Mikiya Fujii <mikiya.fujii@gmai...> |
Commiter | Mikiya Fujii |
First derivative of Nishimoto-Mataga in ZindoS.h is implemented.
git-svn-id: https://svn.sourceforge.jp/svnroot/molds/MolDS/trunk@141 1136aad2-a195-0410-b898-f5ea1d11b9d8
@@ -47,7 +47,10 @@ private: | ||
47 | 47 | OrbitalType orbital2, |
48 | 48 | Atom* atom); // Apendix in [BZ_1979] |
49 | 49 | double GetNishimotoMatagaTwoEleInt(Atom* atomA, OrbitalType orbitalA, |
50 | - Atom* atomB, OrbitalType orbitalB); // ref. [MN_1957] and (5a) in [AEZ_1986] | |
50 | + Atom* atomB, OrbitalType orbitalB); // ref. [MN_1957] and (5a) in [AEZ_1986] | |
51 | + double GetNishimotoMatagaTwoEleIntFirstDerivative(Atom* atomA, OrbitalType orbitalA, | |
52 | + Atom* atomB, OrbitalType orbitalB, | |
53 | + CartesianType axisA); | |
51 | 54 | double nishimotoMatagaParamA; |
52 | 55 | double nishimotoMatagaParamB; |
53 | 56 | struct MoEnergy{ |
@@ -580,6 +583,69 @@ double ZindoS::GetNishimotoMatagaTwoEleInt(Atom* atomA, OrbitalType orbitalA, | ||
580 | 583 | |
581 | 584 | } |
582 | 585 | |
586 | +// First derivative of Nishimoto-Mataga related to the coordinate of atom A. | |
587 | +// For Nishimoto-Mataga, See ZindoS::GetNishimotoMatagaTwoEleInt | |
588 | +// or ref. [MN_1957] and (5a) in [AEZ_1986] | |
589 | +double ZindoS::GetNishimotoMatagaTwoEleIntFirstDerivative(Atom* atomA, OrbitalType orbitalA, | |
590 | + Atom* atomB, OrbitalType orbitalB, | |
591 | + CartesianType axisA){ | |
592 | + double gammaAA; | |
593 | + if(orbitalA == s || | |
594 | + orbitalA == px || | |
595 | + orbitalA == py || | |
596 | + orbitalA == pz ){ | |
597 | + gammaAA = atomA->GetZindoF0ss(); | |
598 | + } | |
599 | + /* | |
600 | + else if(orbitalA == dxy || | |
601 | + orbitalA == dyz || | |
602 | + orbitalA == dzz || | |
603 | + orbitalA == dzx || | |
604 | + orbitalA == dxxyy ){ | |
605 | + gammaAA = atomA->GetZindoF0dd(); | |
606 | + } | |
607 | + */ | |
608 | + else{ | |
609 | + stringstream ss; | |
610 | + ss << this->errorMessageNishimotoMataga; | |
611 | + ss << this->errorMessageAtomType << AtomTypeStr(atomA->GetAtomType()) << "\n"; | |
612 | + ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbitalA) << "\n"; | |
613 | + throw MolDSException(ss.str()); | |
614 | + } | |
615 | + | |
616 | + double gammaBB; | |
617 | + if(orbitalB == s || | |
618 | + orbitalB == px || | |
619 | + orbitalB == py || | |
620 | + orbitalB == pz ){ | |
621 | + gammaBB = atomB->GetZindoF0ss(); | |
622 | + } | |
623 | + /* | |
624 | + else if(orbitalB == dxy || | |
625 | + orbitalB == dyz || | |
626 | + orbitalB == dzz || | |
627 | + orbitalB == dzx || | |
628 | + orbitalB == dxxyy ){ | |
629 | + gammaBB = atomB->GetZindoF0dd(); | |
630 | + } | |
631 | + */ | |
632 | + else{ | |
633 | + stringstream ss; | |
634 | + ss << this->errorMessageNishimotoMataga; | |
635 | + ss << this->errorMessageAtomType << AtomTypeStr(atomB->GetAtomType()) << "\n"; | |
636 | + ss << this->errorMessageOrbitalType << OrbitalTypeStr(orbitalB) << "\n"; | |
637 | + throw MolDSException(ss.str()); | |
638 | + } | |
639 | + | |
640 | + double r = this->molecule->GetDistanceAtoms(atomA, atomB); | |
641 | + double dCartesian = atomA->GetXyz()[axisA] - atomB->GetXyz()[axisA]; | |
642 | + double value = -1.0*dCartesian/r; | |
643 | + value *= this->nishimotoMatagaParamA; | |
644 | + value *= pow( r+this->nishimotoMatagaParamB/(gammaAA+gammaBB) ,-2.0); | |
645 | + return value; | |
646 | + | |
647 | +} | |
648 | + | |
583 | 649 | void ZindoS::CalcDiatomicOverlapInDiatomicFrame(double** diatomicOverlap, Atom* atomA, Atom* atomB){ |
584 | 650 | |
585 | 651 | MolDS_cndo::Cndo2::CalcDiatomicOverlapInDiatomicFrame(diatomicOverlap, atomA, atomB); |