Revision | 2357dd34c881b4d9d1b1a86047009d94b90a41ac (tree) |
---|---|
Time | 2012-06-03 23:11:34 |
Author | Mikiya Fujii <mikiya.fujii@gmai...> |
Commiter | Mikiya Fujii |
Implementation of Mndo::GetSemiEmpiricalMultipoleInteractionSecondDerivative. #28554
git-svn-id: https://svn.sourceforge.jp/svnroot/molds/trunk@699 1136aad2-a195-0410-b898-f5ea1d11b9d8
@@ -79,6 +79,8 @@ void Am1::SetMessages(){ | ||
79 | 79 | = "Error in am1:: Am1::GetSemiEmpiricalMultipoleInteraction: Bad multipole combintaion is set\n"; |
80 | 80 | this->errorMessageGetSemiEmpiricalMultipoleInteractionFirstDeriBadMultipoles |
81 | 81 | = "Error in am1:: Am1::GetSemiEmpiricalMultipoleInteractionFirstDerivative: Bad multipole combintaion is set\n"; |
82 | + this->errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles | |
83 | + = "Error in am1:: Am1::GetSemiEmpiricalMultipoleInteractionSecondDerivative: Bad multipole combintaion is set\n"; | |
82 | 84 | this->errorMessageGetNddoRepulsionIntegral |
83 | 85 | = "Error in am1::Am1::GetNddoRepulsionIntegral: Bad orbital is set.\n"; |
84 | 86 | this->errorMessageGetNddoRepulsionIntegralFirstDerivative |
@@ -81,6 +81,8 @@ void Am1D::SetMessages(){ | ||
81 | 81 | = "Error in am1::Am1D::GetSemiEmpiricalMultipoleInteraction: Bad multipole combintaion is set\n"; |
82 | 82 | this->errorMessageGetSemiEmpiricalMultipoleInteractionFirstDeriBadMultipoles |
83 | 83 | = "Error in am1::Am1D::GetSemiEmpiricalMultipoleInteractionFirstDerivative: Bad multipole combintaion is set\n"; |
84 | + this->errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles | |
85 | + = "Error in am1::Am1D::GetSemiEmpiricalMultipoleInteractionSecondDerivative: Bad multipole combintaion is set\n"; | |
84 | 86 | this->errorMessageGetNddoRepulsionIntegral |
85 | 87 | = "Error in am1::Am1D::GetNddoRepulsionIntegral: Bad orbital is set.\n"; |
86 | 88 | this->errorMessageGetNddoRepulsionIntegralFirstDerivative |
@@ -110,6 +110,8 @@ void Mndo::SetMessages(){ | ||
110 | 110 | = "Error in mndo:: Mndo::GetSemiEmpiricalMultipoleInteraction: Bad multipole combintaion is set\n"; |
111 | 111 | this->errorMessageGetSemiEmpiricalMultipoleInteractionFirstDeriBadMultipoles |
112 | 112 | = "Error in mndo:: Mndo::GetSemiEmpiricalMultipoleInteractionFirstDerivative: Bad multipole combintaion is set\n"; |
113 | + this->errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles | |
114 | + = "Error in mndo:: Mndo::GetSemiEmpiricalMultipoleInteractionSecondDerivative: Bad multipole combintaion is set\n"; | |
113 | 115 | this->errorMessageMultipoleA = "Multipole A is: "; |
114 | 116 | this->errorMessageMultipoleB = "Multipole B is: "; |
115 | 117 | this->errorMessageGetNddoRepulsionIntegral |
@@ -4572,6 +4574,415 @@ double Mndo::GetSemiEmpiricalMultipoleInteractionFirstDerivative( | ||
4572 | 4574 | } |
4573 | 4575 | return value; |
4574 | 4576 | } |
4577 | +// Second derivative of semiempirical multipole-multipole interactions. | |
4578 | +// This derivativ is related to the nuclear distance Rab. | |
4579 | +// See Apendix in [DT_1977] | |
4580 | +double Mndo::GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4581 | + MultipoleType multipoleA, | |
4582 | + MultipoleType multipoleB, | |
4583 | + double rhoA, | |
4584 | + double rhoB, | |
4585 | + double DA, | |
4586 | + double DB, | |
4587 | + double Rab) const{ | |
4588 | + double value = 0.0; | |
4589 | + double a = rhoA + rhoB; | |
4590 | + | |
4591 | + // Eq. (52) in [DT_1977] | |
4592 | + if(multipoleA == sQ && multipoleB == sQ){ | |
4593 | + double c1 = 1.0; | |
4594 | + double f1 = pow(Rab,2.0); | |
4595 | + double a1 = pow(a,2.0); | |
4596 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4597 | + } | |
4598 | + // Eq. (53) in [DT_1977] | |
4599 | + else if(multipoleA == sQ && multipoleB == muz){ | |
4600 | + double c1 = 0.5; | |
4601 | + double c2 = -0.5; | |
4602 | + double f1 = pow(Rab+DB,2.0); | |
4603 | + double f2 = pow(Rab-DB,2.0); | |
4604 | + double a1 = pow(a,2.0); | |
4605 | + double a2 = pow(a,2.0); | |
4606 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4607 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4608 | + } | |
4609 | + else if(multipoleA == muz && multipoleB == sQ){ | |
4610 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4611 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4612 | + value *= pow(-1.0,1.0); | |
4613 | + } | |
4614 | + // Eq. (54) in [DT_1977] | |
4615 | + else if(multipoleA == sQ && multipoleB == Qxx){ | |
4616 | + double c1 = 0.5; | |
4617 | + double c2 = -0.5; | |
4618 | + double f1 = pow(Rab,2.0); | |
4619 | + double f2 = pow(Rab,2.0); | |
4620 | + double a1 = pow(2.0*DB,2.0) + pow(a,2.0); | |
4621 | + double a2 = pow(a,2.0); | |
4622 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4623 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4624 | + } | |
4625 | + else if(multipoleA == Qxx && multipoleB == sQ){ | |
4626 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4627 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4628 | + value *= pow(-1.0,2.0); | |
4629 | + } | |
4630 | + else if(multipoleA == sQ && multipoleB == Qyy){ | |
4631 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4632 | + multipoleA, Qxx, rhoA, rhoB, DA, DB, Rab); | |
4633 | + } | |
4634 | + else if(multipoleA == Qyy && multipoleB == sQ){ | |
4635 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4636 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4637 | + value *= pow(-1.0,2.0); | |
4638 | + } | |
4639 | + // Eq. (55) in [DT_1977] | |
4640 | + else if(multipoleA == sQ && multipoleB == Qzz){ | |
4641 | + double c1 = 0.25; | |
4642 | + double c2 = -0.50; | |
4643 | + double c3 = 0.25; | |
4644 | + double f1 = pow(Rab+2.0*DB,2.0); | |
4645 | + double f2 = pow(Rab,2.0); | |
4646 | + double f3 = pow(Rab-2.0*DB,2.0); | |
4647 | + double a1 = pow(a,2.0); | |
4648 | + double a2 = pow(a,2.0); | |
4649 | + double a3 = pow(a,2.0); | |
4650 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4651 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4652 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4653 | + } | |
4654 | + else if(multipoleA == Qzz && multipoleB == sQ){ | |
4655 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4656 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4657 | + value *= pow(-1.0,2.0); | |
4658 | + } | |
4659 | + // Eq. (56) in [DT_1977] | |
4660 | + else if(multipoleA == mux && multipoleB == mux){ | |
4661 | + double c1 = 0.50; | |
4662 | + double c2 = -0.50; | |
4663 | + double f1 = pow(Rab,2.0); | |
4664 | + double f2 = pow(Rab,2.0); | |
4665 | + double a1 = pow(DA-DB,2.0) + pow(a,2.0); | |
4666 | + double a2 = pow(DA+DB,2.0) + pow(a,2.0); | |
4667 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4668 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4669 | + } | |
4670 | + else if(multipoleA == muy && multipoleB == muy){ | |
4671 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4672 | + mux, mux, rhoA, rhoB, DA, DB, Rab); | |
4673 | + } | |
4674 | + // Eq. (57) in [DT_1977] | |
4675 | + else if(multipoleA == muz && multipoleB == muz){ | |
4676 | + double c1 = 0.25; | |
4677 | + double c2 = -0.25; | |
4678 | + double c3 = -0.25; | |
4679 | + double c4 = 0.25; | |
4680 | + double f1 = pow(Rab+DA-DB,2.0); | |
4681 | + double f2 = pow(Rab+DA+DB,2.0); | |
4682 | + double f3 = pow(Rab-DA-DB,2.0); | |
4683 | + double f4 = pow(Rab-DA+DB,2.0); | |
4684 | + double a1 = pow(a,2.0); | |
4685 | + double a2 = pow(a,2.0); | |
4686 | + double a3 = pow(a,2.0); | |
4687 | + double a4 = pow(a,2.0); | |
4688 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4689 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4690 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4691 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4692 | + } | |
4693 | + // Eq. (58) in [DT_1977] | |
4694 | + else if(multipoleA == mux && multipoleB == Qxz){ | |
4695 | + double c1 = -0.25; | |
4696 | + double c2 = 0.25; | |
4697 | + double c3 = 0.25; | |
4698 | + double c4 = -0.25; | |
4699 | + double f1 = pow(Rab-DB,2.0); | |
4700 | + double f2 = pow(Rab-DB,2.0); | |
4701 | + double f3 = pow(Rab+DB,2.0); | |
4702 | + double f4 = pow(Rab+DB,2.0); | |
4703 | + double a1 = pow(DA-DB,2.0) + pow(a,2.0); | |
4704 | + double a2 = pow(DA+DB,2.0) + pow(a,2.0); | |
4705 | + double a3 = pow(DA-DB,2.0) + pow(a,2.0); | |
4706 | + double a4 = pow(DA+DB,2.0) + pow(a,2.0); | |
4707 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4708 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4709 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4710 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4711 | + } | |
4712 | + else if(multipoleA == Qxz && multipoleB == mux){ | |
4713 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4714 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4715 | + value *= pow(-1.0,3.0); | |
4716 | + } | |
4717 | + else if(multipoleA == muy && multipoleB == Qyz){ | |
4718 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4719 | + mux, Qxz, rhoA, rhoB, DA, DB, Rab); | |
4720 | + } | |
4721 | + else if(multipoleA == Qyz && multipoleB == muy){ | |
4722 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4723 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4724 | + value *= pow(-1.0,3.0); | |
4725 | + } | |
4726 | + // Eq. (59) in [DT_1977] | |
4727 | + else if(multipoleA == muz && multipoleB == Qxx){ | |
4728 | + double c1 = -0.25; | |
4729 | + double c2 = 0.25; | |
4730 | + double c3 = 0.25; | |
4731 | + double c4 = -0.25; | |
4732 | + double f1 = pow(Rab+DA,2.0); | |
4733 | + double f2 = pow(Rab-DA,2.0); | |
4734 | + double f3 = pow(Rab+DA,2.0); | |
4735 | + double f4 = pow(Rab-DA,2.0); | |
4736 | + double a1 = pow(2.0*DB,2.0) + pow(a,2.0); | |
4737 | + double a2 = pow(2.0*DB,2.0) + pow(a,2.0); | |
4738 | + double a3 = pow(a,2.0); | |
4739 | + double a4 = pow(a,2.0); | |
4740 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4741 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4742 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4743 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4744 | + } | |
4745 | + else if(multipoleA == Qxx && multipoleB == muz){ | |
4746 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4747 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4748 | + value *= pow(-1.0,3.0); | |
4749 | + } | |
4750 | + else if(multipoleA == muz && multipoleB == Qyy){ | |
4751 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4752 | + muz, Qxx, rhoA, rhoB, DA, DB, Rab); | |
4753 | + } | |
4754 | + else if(multipoleA == Qyy && multipoleB == muz){ | |
4755 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4756 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4757 | + value *= pow(-1.0,3.0); | |
4758 | + } | |
4759 | + // Eq. (60) in [DT_1977] | |
4760 | + else if(multipoleA == muz && multipoleB == Qzz){ | |
4761 | + double c1 = -0.125; | |
4762 | + double c2 = 0.125; | |
4763 | + double c3 = -0.125; | |
4764 | + double c4 = 0.125; | |
4765 | + double c5 = 0.25; | |
4766 | + double c6 = -0.25; | |
4767 | + double f1 = pow(Rab+DA-2.0*DB,2.0); | |
4768 | + double f2 = pow(Rab-DA-2.0*DB,2.0); | |
4769 | + double f3 = pow(Rab+DA+2.0*DB,2.0); | |
4770 | + double f4 = pow(Rab-DA+2.0*DB,2.0); | |
4771 | + double f5 = pow(Rab+DA,2.0); | |
4772 | + double f6 = pow(Rab-DA,2.0); | |
4773 | + double a1 = pow(a,2.0); | |
4774 | + double a2 = pow(a,2.0); | |
4775 | + double a3 = pow(a,2.0); | |
4776 | + double a4 = pow(a,2.0); | |
4777 | + double a5 = pow(a,2.0); | |
4778 | + double a6 = pow(a,2.0); | |
4779 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4780 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4781 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4782 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4783 | + value += c5*(3.0*f5*pow(f5+a5,-2.5) - pow(f5+a5,-1.5)); | |
4784 | + value += c6*(3.0*f6*pow(f6+a6,-2.5) - pow(f6+a6,-1.5)); | |
4785 | + } | |
4786 | + else if(multipoleA == Qzz && multipoleB == muz){ | |
4787 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4788 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4789 | + value *= pow(-1.0,3.0); | |
4790 | + } | |
4791 | + // Eq. (61) in [DT_1977] | |
4792 | + else if(multipoleA == Qxx && multipoleB == Qxx){ | |
4793 | + double c1 = 0.125; | |
4794 | + double c2 = 0.125; | |
4795 | + double c3 = -0.25; | |
4796 | + double c4 = -0.25; | |
4797 | + double c5 = 0.25; | |
4798 | + double f1 = pow(Rab,2.0); | |
4799 | + double f2 = pow(Rab,2.0); | |
4800 | + double f3 = pow(Rab,2.0); | |
4801 | + double f4 = pow(Rab,2.0); | |
4802 | + double f5 = pow(Rab,2.0); | |
4803 | + double a1 = 4.0*pow(DA-DB,2.0) + pow(a,2.0); | |
4804 | + double a2 = 4.0*pow(DA+DB,2.0) + pow(a,2.0); | |
4805 | + double a3 = pow(2.0*DA,2.0) + pow(a,2.0); | |
4806 | + double a4 = pow(2.0*DB,2.0) + pow(a,2.0); | |
4807 | + double a5 = pow(a,2.0); | |
4808 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4809 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4810 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4811 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4812 | + value += c5*(3.0*f5*pow(f5+a5,-2.5) - pow(f5+a5,-1.5)); | |
4813 | + } | |
4814 | + else if(multipoleA == Qyy && multipoleB == Qyy){ | |
4815 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4816 | + Qxx, Qxx, rhoA, rhoB, DA, DB, Rab); | |
4817 | + } | |
4818 | + // Eq. (62) in [DT_1977] | |
4819 | + else if(multipoleA == Qxx && multipoleB == Qyy){ | |
4820 | + double c1 = 0.25; | |
4821 | + double c2 = -0.25; | |
4822 | + double c3 = -0.25; | |
4823 | + double c4 = 0.25; | |
4824 | + double f1 = pow(Rab,2.0); | |
4825 | + double f2 = pow(Rab,2.0); | |
4826 | + double f3 = pow(Rab,2.0); | |
4827 | + double f4 = pow(Rab,2.0); | |
4828 | + double a1 = pow(2.0*DA,2.0) + pow(2.0*DB,2.0) + pow(a,2.0); | |
4829 | + double a2 = pow(2.0*DA,2.0) + pow(a,2.0); | |
4830 | + double a3 = pow(2.0*DB,2.0) + pow(a,2.0); | |
4831 | + double a4 = pow(a,2.0); | |
4832 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4833 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4834 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4835 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4836 | + } | |
4837 | + else if(multipoleA == Qyy && multipoleB == Qxx){ | |
4838 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4839 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4840 | + value *= pow(-1.0,4.0); | |
4841 | + } | |
4842 | + // Eq. (63) in [DT_1977] | |
4843 | + else if(multipoleA == Qxx && multipoleB == Qzz){ | |
4844 | + double c1 = 0.125; | |
4845 | + double c2 = 0.125; | |
4846 | + double c3 = -0.125; | |
4847 | + double c4 = -0.125; | |
4848 | + double c5 = -0.25; | |
4849 | + double c6 = 0.25; | |
4850 | + double f1 = pow(Rab-2.0*DB,2.0); | |
4851 | + double f2 = pow(Rab+2.0*DB,2.0); | |
4852 | + double f3 = pow(Rab-2.0*DB,2.0); | |
4853 | + double f4 = pow(Rab+2.0*DB,2.0); | |
4854 | + double f5 = pow(Rab ,2.0); | |
4855 | + double f6 = pow(Rab ,2.0); | |
4856 | + double a1 = pow(2.0*DA,2.0) + pow(a,2.0); | |
4857 | + double a2 = pow(2.0*DA,2.0) + pow(a,2.0); | |
4858 | + double a3 = pow(a,2.0); | |
4859 | + double a4 = pow(a,2.0); | |
4860 | + double a5 = pow(2.0*DA,2.0) + pow(a,2.0); | |
4861 | + double a6 = pow(a,2.0); | |
4862 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4863 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4864 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4865 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4866 | + value += c5*(3.0*f5*pow(f5+a5,-2.5) - pow(f5+a5,-1.5)); | |
4867 | + value += c6*(3.0*f6*pow(f6+a6,-2.5) - pow(f6+a6,-1.5)); | |
4868 | + } | |
4869 | + else if(multipoleA == Qzz && multipoleB == Qxx){ | |
4870 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4871 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4872 | + value *= pow(-1.0,4.0); | |
4873 | + } | |
4874 | + else if(multipoleA == Qyy && multipoleB == Qzz){ | |
4875 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4876 | + Qxx, multipoleB, rhoA, rhoB, DA, DB, Rab); | |
4877 | + } | |
4878 | + else if(multipoleA == Qzz && multipoleB == Qyy){ | |
4879 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4880 | + multipoleB, multipoleA, rhoB, rhoA, DB, DA, Rab); | |
4881 | + value *= pow(-1.0,4.0); | |
4882 | + } | |
4883 | + // Eq. (64) in [DT_1977] | |
4884 | + else if(multipoleA == Qzz && multipoleB == Qzz){ | |
4885 | + double c1 = 0.0625; | |
4886 | + double c2 = 0.0625; | |
4887 | + double c3 = 0.0625; | |
4888 | + double c4 = 0.0625; | |
4889 | + double c5 = -0.125; | |
4890 | + double c6 = -0.125; | |
4891 | + double c7 = -0.125; | |
4892 | + double c8 = -0.125; | |
4893 | + double c9 = 0.25; | |
4894 | + double f1 = pow(Rab+2.0*DA-2.0*DB,2.0); | |
4895 | + double f2 = pow(Rab+2.0*DA+2.0*DB,2.0); | |
4896 | + double f3 = pow(Rab-2.0*DA-2.0*DB,2.0); | |
4897 | + double f4 = pow(Rab-2.0*DA+2.0*DB,2.0); | |
4898 | + double f5 = pow(Rab+2.0*DA ,2.0); | |
4899 | + double f6 = pow(Rab-2.0*DA ,2.0); | |
4900 | + double f7 = pow(Rab+2.0*DB ,2.0); | |
4901 | + double f8 = pow(Rab-2.0*DB ,2.0); | |
4902 | + double f9 = pow(Rab ,2.0); | |
4903 | + double a1 = pow(a,2.0); | |
4904 | + double a2 = pow(a,2.0); | |
4905 | + double a3 = pow(a,2.0); | |
4906 | + double a4 = pow(a,2.0); | |
4907 | + double a5 = pow(a,2.0); | |
4908 | + double a6 = pow(a,2.0); | |
4909 | + double a7 = pow(a,2.0); | |
4910 | + double a8 = pow(a,2.0); | |
4911 | + double a9 = pow(a,2.0); | |
4912 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4913 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4914 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4915 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4916 | + value += c5*(3.0*f5*pow(f5+a5,-2.5) - pow(f5+a5,-1.5)); | |
4917 | + value += c6*(3.0*f6*pow(f6+a6,-2.5) - pow(f6+a6,-1.5)); | |
4918 | + value += c7*(3.0*f7*pow(f7+a7,-2.5) - pow(f7+a7,-1.5)); | |
4919 | + value += c8*(3.0*f8*pow(f8+a8,-2.5) - pow(f8+a8,-1.5)); | |
4920 | + value += c9*(3.0*f9*pow(f9+a9,-2.5) - pow(f9+a9,-1.5)); | |
4921 | + } | |
4922 | + // Eq. (65) in [DT_1977] | |
4923 | + else if(multipoleA == Qxz && multipoleB == Qxz){ | |
4924 | + double c1 = 0.125; | |
4925 | + double c2 = -0.125; | |
4926 | + double c3 = -0.125; | |
4927 | + double c4 = 0.125; | |
4928 | + double c5 = -0.125; | |
4929 | + double c6 = 0.125; | |
4930 | + double c7 = 0.125; | |
4931 | + double c8 = -0.125; | |
4932 | + double f1 = pow(Rab+DA-DB,2.0); | |
4933 | + double f2 = pow(Rab+DA-DB,2.0); | |
4934 | + double f3 = pow(Rab+DA+DB,2.0); | |
4935 | + double f4 = pow(Rab+DA+DB,2.0); | |
4936 | + double f5 = pow(Rab-DA-DB,2.0); | |
4937 | + double f6 = pow(Rab-DA-DB,2.0); | |
4938 | + double f7 = pow(Rab-DA+DB,2.0); | |
4939 | + double f8 = pow(Rab-DA+DB,2.0); | |
4940 | + double a1 = pow(DA-DB,2.0) + pow(a,2.0); | |
4941 | + double a2 = pow(DA+DB,2.0) + pow(a,2.0); | |
4942 | + double a3 = pow(DA-DB,2.0) + pow(a,2.0); | |
4943 | + double a4 = pow(DA+DB,2.0) + pow(a,2.0); | |
4944 | + double a5 = pow(DA-DB,2.0) + pow(a,2.0); | |
4945 | + double a6 = pow(DA+DB,2.0) + pow(a,2.0); | |
4946 | + double a7 = pow(DA-DB,2.0) + pow(a,2.0); | |
4947 | + double a8 = pow(DA+DB,2.0) + pow(a,2.0); | |
4948 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4949 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4950 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4951 | + value += c4*(3.0*f4*pow(f4+a4,-2.5) - pow(f4+a4,-1.5)); | |
4952 | + value += c5*(3.0*f5*pow(f5+a5,-2.5) - pow(f5+a5,-1.5)); | |
4953 | + value += c6*(3.0*f6*pow(f6+a6,-2.5) - pow(f6+a6,-1.5)); | |
4954 | + value += c7*(3.0*f7*pow(f7+a7,-2.5) - pow(f7+a7,-1.5)); | |
4955 | + value += c8*(3.0*f8*pow(f8+a8,-2.5) - pow(f8+a8,-1.5)); | |
4956 | + } | |
4957 | + else if(multipoleA == Qyz && multipoleB == Qyz){ | |
4958 | + value = this->GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
4959 | + Qxz, Qxz, rhoA, rhoB, DA, DB, Rab); | |
4960 | + } | |
4961 | + // Eq. (66) in [DT_1977] | |
4962 | + else if(multipoleA == Qxy && multipoleB == Qxy){ | |
4963 | + double c1 = 0.25; | |
4964 | + double c2 = 0.25; | |
4965 | + double c3 = -0.50; | |
4966 | + double f1 = pow(Rab,2.0); | |
4967 | + double f2 = pow(Rab,2.0); | |
4968 | + double f3 = pow(Rab,2.0); | |
4969 | + double a1 = 2.0*pow(DA-DB,2.0) + pow(a,2.0); | |
4970 | + double a2 = 2.0*pow(DA+DB,2.0) + pow(a,2.0); | |
4971 | + double a3 = 2.0*pow(DA,2.0) + 2.0*pow(DB,2.0) + pow(a,2.0); | |
4972 | + value = c1*(3.0*f1*pow(f1+a1,-2.5) - pow(f1+a1,-1.5)); | |
4973 | + value += c2*(3.0*f2*pow(f2+a2,-2.5) - pow(f2+a2,-1.5)); | |
4974 | + value += c3*(3.0*f3*pow(f3+a3,-2.5) - pow(f3+a3,-1.5)); | |
4975 | + } | |
4976 | + else{ | |
4977 | + stringstream ss; | |
4978 | + ss << this->errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles; | |
4979 | + ss << this->errorMessageMultipoleA << MultipoleTypeStr(multipoleA) << endl; | |
4980 | + ss << this->errorMessageMultipoleB << MultipoleTypeStr(multipoleB) << endl; | |
4981 | + throw MolDSException(ss.str()); | |
4982 | + } | |
4983 | + return value; | |
4984 | +} | |
4985 | + | |
4575 | 4986 | } |
4576 | 4987 | |
4577 | 4988 |
@@ -32,6 +32,7 @@ public: | ||
32 | 32 | protected: |
33 | 33 | std::string errorMessageGetSemiEmpiricalMultipoleInteractionBadMultipoles; |
34 | 34 | std::string errorMessageGetSemiEmpiricalMultipoleInteractionFirstDeriBadMultipoles; |
35 | + std::string errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles; | |
35 | 36 | std::string errorMessageGetNddoRepulsionIntegral; |
36 | 37 | std::string errorMessageGetNddoRepulsionIntegralFirstDerivative; |
37 | 38 | std::string errorMessageCalcTwoElecTwoCoreDiatomicNullMatrix; |
@@ -237,6 +238,14 @@ private: | ||
237 | 238 | double DA, |
238 | 239 | double DB, |
239 | 240 | double Rab) const; |
241 | + double GetSemiEmpiricalMultipoleInteractionSecondDerivative( | |
242 | + MolDS_base::MultipoleType multipoleA, | |
243 | + MolDS_base::MultipoleType multipoleB, | |
244 | + double rhoA, | |
245 | + double rhoB, | |
246 | + double DA, | |
247 | + double DB, | |
248 | + double Rab) const; | |
240 | 249 | void FreeCalcForceTempMatrices(double**** overlapDer, |
241 | 250 | double****** twoElecTwoCoreFirstDeriv) const; |
242 | 251 | void CalcForceSCFElecCoreAttractionPart(double* force, |
@@ -81,6 +81,8 @@ void Pm3::SetMessages(){ | ||
81 | 81 | = "Error in pm3:: Pm3::GetSemiEmpiricalMultipoleInteraction: Bad multipole combintaion is set\n"; |
82 | 82 | this->errorMessageGetSemiEmpiricalMultipoleInteractionFirstDeriBadMultipoles |
83 | 83 | = "Error in pm3:: Pm3::GetSemiEmpiricalMultipoleInteractionFirstDerivative: Bad multipole combintaion is set\n"; |
84 | + this->errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles | |
85 | + = "Error in pm3:: Pm3::GetSemiEmpiricalMultipoleInteractionSecondDerivative: Bad multipole combintaion is set\n"; | |
84 | 86 | this->errorMessageGetNddoRepulsionIntegral |
85 | 87 | = "Error in pm3::Pm3::GetNddoRepulsionIntegral: Bad orbital is set.\n"; |
86 | 88 | this->errorMessageGetNddoRepulsionIntegralFirstDerivative |
@@ -82,6 +82,8 @@ void Pm3D::SetMessages(){ | ||
82 | 82 | = "Error in pm3::Pm3D::GetSemiEmpiricalMultipoleInteraction: Bad multipole combintaion is set\n"; |
83 | 83 | this->errorMessageGetSemiEmpiricalMultipoleInteractionFirstDeriBadMultipoles |
84 | 84 | = "Error in pm3::Pm3D::GetSemiEmpiricalMultipoleInteractionFirstDerivative: Bad multipole combintaion is set\n"; |
85 | + this->errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles | |
86 | + = "Error in pm3::Pm3D::GetSemiEmpiricalMultipoleInteractionSecondDerivative: Bad multipole combintaion is set\n"; | |
85 | 87 | this->errorMessageGetNddoRepulsionIntegral |
86 | 88 | = "Error in pm3::Pm3D::GetNddoRepulsionIntegral: Bad orbital is set.\n"; |
87 | 89 | this->errorMessageGetNddoRepulsionIntegralFirstDerivative |
@@ -82,6 +82,8 @@ void Pm3Pddg::SetMessages(){ | ||
82 | 82 | = "Error in pm3:: Pm3Pddg::GetSemiEmpiricalMultipoleInteraction: Bad multipole combintaion is set\n"; |
83 | 83 | this->errorMessageGetSemiEmpiricalMultipoleInteractionFirstDeriBadMultipoles |
84 | 84 | = "Error in pm3:: Pm3Pddg::GetSemiEmpiricalMultipoleInteractionFirstDerivative: Bad multipole combintaion is set\n"; |
85 | + this->errorMessageGetSemiEmpiricalMultipoleInteractionSecondDeriBadMultipoles | |
86 | + = "Error in pm3:: Pm3Pddg::GetSemiEmpiricalMultipoleInteractionSecondDerivative: Bad multipole combintaion is set\n"; | |
85 | 87 | this->errorMessageGetNddoRepulsionIntegral |
86 | 88 | = "Error in pm3::Pm3Pddg::GetNddoRepulsionIntegral: Bad orbital is set.\n"; |
87 | 89 | this->errorMessageGetNddoRepulsionIntegralFirstDerivative |