QCMndoParam.cpp

Go to the documentation of this file.
00001 //*****************************************************************************//
00002 //                                                                             //
00003 //   Copyright (c) 2001                                                        //
00004 //      INRIA                                                                  //
00005 //      54600 VILLERS LES NANCY                                                //
00006 //      France                                                                 //
00007 //                                                                             //
00008 //*****************************************************************************//
00009 //                                                                             //
00010 //               *** NOTICE OF PROPRIETARY INFORMATION ***                     //
00011 //                                                                             //
00012 // The information contained in this file is considered proprietary and the    //
00013 // exclusive property of  INRIA. This information may not be disclosed,        //
00014 // duplicated or used, in whole or in part, for  any purpose  whatsoever       //
00015 // without express written authorization from INRIA                            //
00016 //                                                                             //
00017 //*****************************************************************************//
00018 
00019 
00020 #include <string.h>
00021 
00022 
00023 #include "QCMndoParam.hpp"
00024 
00025 
00029 enum QCMonocentricIntegrals {
00030   s_s,  px_px,  py_py,  pz_pz
00031 };
00032 
00033 
00034 
00038 const int      QCMndoParam::S_ORB_IND       = 0;
00040 const int      QCMndoParam::FIRST_P_ORB_IND = 1;
00042 const int      QCMndoParam::FIRST_D_ORB_IND = 4;
00044 const int      QCMndoParam::NB_S_ORB        = 1;
00046 const int      QCMndoParam::NB_P_ORB        = 3;
00048 const int      QCMndoParam::NB_D_ORB        = 5;
00049 
00050 const string   QCMndoParam::U_S ("U s");
00051 const string   QCMndoParam::U_P ("U p");
00052 const string   QCMndoParam::DZETA_S ("dzeta s");
00053 const string   QCMndoParam::DZETA_P ("dzeta p");
00054 const string   QCMndoParam::BETA_S ("beta s");
00055 const string   QCMndoParam::BETA_P ("beta p");
00056 const string   QCMndoParam::ALPHA ("alpha");
00057 const string   QCMndoParam::G_SS ("Gss");
00058 const string   QCMndoParam::G_SP ("Gsp");
00059 const string   QCMndoParam::G_PP ("Gpp");
00060 const string   QCMndoParam::G_P2 ("Gp2");
00061 const string   QCMndoParam::H_SP ("Hsp");
00062 const string   QCMndoParam::D_1 ("D1");
00063 const string   QCMndoParam::D_2 ("D2");
00064 const string   QCMndoParam::R_O0 ("ro0");
00065 const string   QCMndoParam::R_O1 ("ro1");
00066 const string   QCMndoParam::R_O2 ("ro2");
00067 const string   QCMndoParam::ELECTRONIC_ENERGY ("electronic energy");
00068 const string   QCMndoParam::HEAT_OF_FORMATION ("heat of formation");
00069 
00070 
00074 QCMndoParam::QCMndoParam (void) :
00075   QCParameter(),
00076   GPtr(NULL),
00077   HPtr(NULL),
00078   D1(0e0),
00079   D2(0e0),
00080   ro0(0e0),
00081   ro1(0e0),
00082   ro2(0e0),
00083   UPtr(NULL),
00084   betaPtr(NULL),
00085   dzetaS(0e0),
00086   dzetaP(0e0),
00087   alpha(0e0),
00088   elecEnergyOfAtom(0e0),
00089   heatOfFormation(0e0) 
00090 {
00091   const int NB_S_n_P = NB_S_ORB + NB_P_ORB;
00092   
00093   //Allocations.
00094   betaPtr = new QCFloat [NB_S_n_P];
00095   UPtr    = new QCFloat [NB_S_n_P];
00096 
00097   //integrales coulombiennes monocentriques.
00098   GPtr = new QCFloat* [NB_S_n_P];
00099   for (int i=0; i < NB_S_n_P; i++) {
00100     GPtr[i] = new QCFloat [NB_S_n_P];
00101   }
00102 
00103   //integrales d echanges monocentriques.
00104   HPtr = new QCFloat* [NB_S_n_P];
00105   for (int i=0; i < NB_S_n_P; i++) {
00106     HPtr[i] = new QCFloat [NB_S_n_P];
00107   }
00108   
00109   //Init a 0.
00110   memset(betaPtr, 0, NB_S_n_P*sizeof(QCFloat) );
00111   memset(UPtr,    0, NB_S_n_P*sizeof(QCFloat) );
00112   for (int i=0; i < NB_S_n_P; i++) {
00113     memset(GPtr[i], 0, NB_S_n_P*sizeof(QCFloat) );
00114     memset(HPtr[i], 0, NB_S_n_P*sizeof(QCFloat) );
00115   }
00116 }
00117 
00118 
00119 
00123 QCMndoParam::~QCMndoParam (void) {
00124   const int NB_S_n_P = NB_S_ORB + NB_P_ORB;  
00125   
00126   if (betaPtr) { 
00127     delete [] betaPtr; 
00128     betaPtr = NULL; 
00129   }
00130   //
00131   if (UPtr) { 
00132     delete [] UPtr; 
00133     UPtr = NULL; 
00134   }
00135   //
00136   for (int i=0; i < NB_S_n_P; i++) {
00137     if (GPtr[i]) { 
00138       delete [] GPtr[i]; 
00139     }
00140   }
00141   //
00142   if (GPtr) { 
00143     delete [] GPtr; 
00144     GPtr = NULL; 
00145   }
00146   //
00147   for (int i=0; i < NB_S_n_P; i++) {
00148     if (HPtr[i]) { 
00149       delete [] HPtr[i]; 
00150     }
00151   }
00152   //
00153   if (HPtr) { 
00154     delete [] HPtr; 
00155     HPtr = NULL; 
00156   }
00157 }
00158 
00159 
00160 
00161 
00165 void
00166 QCMndoParam::readSetOfParameters (QCReader *reader) {
00167   
00168   QCFloat  value;
00169   QCFloat  Gss, Gsp, Gpp, Gp2, Hsp;
00170   
00171   QCParameter::readSetOfParameters (reader);
00172   
00173   reader->readLiteralAndVal(U_S, UPtr[S_ORB_IND]);
00174   reader->readLiteralAndVal(U_P, UPtr[FIRST_P_ORB_IND]);
00175   for (int i=FIRST_P_ORB_IND+1; i < FIRST_D_ORB_IND; i++) {
00176     UPtr[i] = UPtr[FIRST_P_ORB_IND];
00177   }
00178 
00179   reader->readLiteralAndVal(DZETA_S, dzetaS);
00180   reader->readLiteralAndVal(DZETA_P, dzetaP);
00181   reader->readLiteralAndVal(BETA_S, betaPtr[S_ORB_IND]);
00182   reader->readLiteralAndVal(BETA_P, betaPtr[FIRST_P_ORB_IND]);
00183   for (int i=FIRST_P_ORB_IND+1; i < FIRST_D_ORB_IND; i++) {
00184     betaPtr[i] = betaPtr[FIRST_P_ORB_IND];
00185   }
00186 
00187   reader->readLiteralAndVal(ALPHA, alpha);
00188 
00189   reader->readLiteralAndVal(G_SS, Gss);
00190   reader->readLiteralAndVal(G_SP, Gsp);
00191   reader->readLiteralAndVal(G_PP, Gpp);
00192   reader->readLiteralAndVal(G_P2, Gp2);
00193   reader->readLiteralAndVal(H_SP, Hsp);
00194 
00195   fillGPtr(Gss, Gsp, Gpp, Gp2);
00196   fillHPtr(Gss, Gpp, Gp2, Hsp);
00197 
00198   reader->readLiteralAndVal(D_1, D1);
00199   reader->readLiteralAndVal(D_2, D2);
00200 
00201   reader->readLiteralAndVal(R_O0, value);
00202   setRo0(value);
00203   reader->readLiteralAndVal(R_O1, value);
00204   setRo1(value);
00205   reader->readLiteralAndVal(R_O2, value);
00206   setRo2(value);
00207 
00208   reader->readLiteralAndVal(ELECTRONIC_ENERGY, elecEnergyOfAtom);
00209   reader->readLiteralAndVal(HEAT_OF_FORMATION, heatOfFormation);
00210 
00211 
00212 }
00213 
00214 
00215 
00216 
00217 
00221 void
00222 QCMndoParam::setRo0 (const QCFloat& extVal) {
00223   if (extVal) {
00224     ro0 = QC_HALF / extVal;
00225   }
00226 }
00227 
00228 
00232 void
00233 QCMndoParam::setRo1 (const QCFloat& extVal) {
00234   if (extVal) {
00235     ro1 = QC_HALF / extVal;
00236   }
00237 }
00238 
00239 
00243 void
00244 QCMndoParam::setRo2 (const QCFloat& extVal) {
00245   if (extVal) {
00246     ro2 = QC_HALF / extVal;
00247   }
00248 }
00249 
00250 
00254 void
00255 QCMndoParam::fillGPtr (const QCFloat& Gss, const QCFloat& Gsp,
00256                        const QCFloat& Gpp, const QCFloat& Gp2) {
00257 
00258   // [s_s][pz_pz] represents the <s s|pz pz> integral
00259   GPtr[s_s]  [s_s]   = Gss;
00260   GPtr[s_s]  [px_px] = Gsp;
00261   GPtr[s_s]  [py_py] = Gsp;
00262   GPtr[s_s]  [pz_pz] = Gsp;
00263   GPtr[px_px][s_s]   = Gsp;
00264   GPtr[px_px][px_px] = Gpp;
00265   GPtr[px_px][py_py] = Gp2;
00266   GPtr[px_px][pz_pz] = Gp2;
00267   GPtr[py_py][s_s]   = Gsp;
00268   GPtr[py_py][px_px] = Gp2;
00269   GPtr[py_py][py_py] = Gpp;
00270   GPtr[py_py][pz_pz] = Gp2;
00271   GPtr[pz_pz][s_s]   = Gsp;
00272   GPtr[pz_pz][px_px] = Gp2;
00273   GPtr[pz_pz][py_py] = Gp2;
00274   GPtr[pz_pz][pz_pz] = Gpp;
00275 }
00276 
00277 
00278 
00282 void
00283 QCMndoParam::fillHPtr (const QCFloat& Gss, const QCFloat& Gpp, 
00284                        const QCFloat& Gp2, const QCFloat& Hsp) {
00285 
00286   const QCFloat Hp2 = QC_HALF * (Gpp - Gp2);
00287 
00288   //Warning: [s_s][pz_pz] represents the <s pz|s pz> integral
00289   HPtr[s_s]  [s_s]   = Gss;
00290   HPtr[s_s]  [px_px] = Hsp;
00291   HPtr[s_s]  [py_py] = Hsp;
00292   HPtr[s_s]  [pz_pz] = Hsp;
00293   HPtr[px_px][s_s]   = Hsp;
00294   HPtr[px_px][px_px] = Gpp;
00295   HPtr[px_px][py_py] = Hp2;
00296   HPtr[px_px][pz_pz] = Hp2;
00297   HPtr[py_py][s_s]   = Hsp;
00298   HPtr[py_py][px_px] = Hp2;
00299   HPtr[py_py][py_py] = Gpp;
00300   HPtr[py_py][pz_pz] = Hp2;
00301   HPtr[pz_pz][s_s]   = Hsp;
00302   HPtr[pz_pz][px_px] = Hp2;
00303   HPtr[pz_pz][py_py] = Hp2;
00304   HPtr[pz_pz][pz_pz] = Gpp;
00305 }
00306 
00307 
00308 
00312 ostream&
00313 operator << (ostream& out, const QCMndoParam& param) {
00314   
00315   out << param.QCParameter::asBase();
00316 
00317   out << " * Us:               " << param.UPtr[QCMndoParam::S_ORB_IND]
00318       << "\n * Up:               " << param.UPtr[QCMndoParam::FIRST_P_ORB_IND]
00319       << "\n * dzetaS:           " << param.dzetaS
00320       << "\n * dzetaP:           " << param.dzetaP
00321       << "\n * betaS:            " << param.betaPtr[QCMndoParam::S_ORB_IND]
00322       << "\n * betaP:            " << param.betaPtr[QCMndoParam::FIRST_P_ORB_IND]
00323       << "\n * alpha:            " << param.alpha
00324       << "\n * Gss:              " << param.GPtr[s_s][s_s]
00325       << "\n * Gsp:              " << param.GPtr[px_px][s_s]
00326       << "\n * Gpp:              " << param.GPtr[px_px][px_px]
00327       << "\n * Gp2:              " << param.GPtr[py_py][px_px]
00328       << "\n * Hsp:              " << param.HPtr[px_px][s_s]
00329       << "\n * D1:               " << param.D1
00330       << "\n * D2:               " << param.D2
00331       << "\n * ro0:              " << param.ro0
00332       << "\n * ro1:              " << param.ro1
00333       << "\n * ro2:              " << param.ro2
00334       << "\n * elecEnergyOfAtom: " << param.elecEnergyOfAtom
00335       << "\n * HeatOfFormation:  " << param.heatOfFormation
00336       << endl;
00337 
00338   return out;
00339 }

Generated on Sat Jan 28 21:07:28 2006 for QC++ by  doxygen 1.4.4