cartesius.h

Go to the documentation of this file.
00001 // cartesius.h - description of classes from 00002 // 00003 //! Version 0.0 of June 6 2003 00004 //! A.L. Tchougreeff 00005 //! A toolkit for molecular modelling 00006 // 00007 // 00008 // Created by YuK 04.12.2004 00009 // 00010 // 00011 #include <stdio.h> 00012 #include <math.h> 00013 #include <stdlib.h> 00014 #include <ostream.h> 00015 #include <fstream.h> 00016 #include <list> 00017 #include <vector> 00018 #include <string> 00019 #include <algorithm> 00020 #include <map> 00021 //--> Added by YuK 21.11.2004 00022 #include <gsl/gsl_math.h> 00023 #include <gsl/gsl_vector.h> 00024 #include <gsl/gsl_matrix.h> 00025 #include <gsl/gsl_linalg.h> 00026 #include <gsl/gsl_eigen.h> 00027 00028 #ifndef CARTESIUSH 00029 #define CARTESIUSH 1 00030  00031 using namespace std; 00032 00033 int bf_func(char*,long int*,double*,\ 00034 double*,double*,long int*,long int*); 00035 00036 namespace periodic { 00037 00038 class render{ //! Type designed to represent each element 00039 public: 00040 string Symbol; //! Symbol like H, He, Li etc 00041  double Radius; //! Formal radius. No physics so far, 00042  double R,G,B; //! Color of an atom. No physics so far 00043 render(void); 00044 ~render(void); 00045 // GetSymbol(void); 00046 render(string s, double ra, double rc, double gc, double bc); 00047 }; 00048 00049 class element{ 00050 public: 00051 int Row; // Row of the periodic Table 00052 int AtomicNumber; // Atomic Number = Nuclear charge 00053 double AtomicWeight; // Atomic weight 00054 int NuclearMultiplicity; 00055 render Render; 00056 element(void); 00057 ~element(void); 00058 element(int r,int na,double aw,int sm, render re); 00059 00060 /*element MendeleevPeriodicTable[];= \ 00061 //! 00062 //! Refers to standard Periodic table. Weight corresponds to average over 00063 //! isotope distribution. Nuclear multiplicity is set to zero to indicate 00064 //! that it is not a real isotope. The same data type periodic::element can  00065 //! be used to reprsent isotopes. Then the weight is a precise isotope weight 00066 //! and NuclearMultiplicity is a positive integer.  00067 //! 00068 { periodic::element(0,0,0.00 ,0, periodic::render("Xx",1.200,1.00,1.00,1.00)), \ 00069 periodic::element(1,1,1.008 ,0, periodic::render("H" ,1.200,1.00,1.00,1.00)), \ 00070 periodic::element(1,2,4.003 ,0, periodic::render("He",1.400,0.85,1.00,1.00)), \ 00071 periodic::element(2,3,6.941 ,0, periodic::render("Li",1.820,0.80,0.50,1.00)), \ 00072 periodic::element(2,4,9.012 ,0, periodic::render("Be",1.700,0.76,1.00,0.00)), \ 00073 periodic::element(2,5,10.812 ,0, periodic::render("B" ,2.080,1.00,0.71,0.71)), \ 00074 periodic::element(2,6,12.011 ,0, periodic::render("C" ,1.950,0.50,0.0,0.0)), \ 00075 periodic::element(2,7,14.007 ,0, periodic::render("N" ,1.850,0.05,0.05,1.00)), \ 00076 periodic::element(2,8,15.999 ,0, periodic::render("O" ,1.700,1.00,0.05,0.05)), \ 00077 periodic::element(2,9,18.998 ,0, periodic::render("F" ,1.730,0.70,1.00,1.00)), \ 00078 periodic::element(2,10,20.180 ,0, periodic::render("Ne",1.540,0.70,0.89,0.96)), \ 00079 periodic::element(3,11,22.990 ,0, periodic::render("Na",2.270,0.67,0.36,0.95)), \ 00080 periodic::element(3,12,24.305 ,0, periodic::render("Mg",1.730,0.54,1.00,0.00)), \ 00081 periodic::element(3,13,26.982 ,0, periodic::render("Al",2.050,0.75,0.65,0.65)), \ 00082 periodic::element(3,14,28.086 ,0, periodic::render("Si",2.100,0.50,0.60,0.60)), \ 00083 periodic::element(3,15,30.974 ,0, periodic::render("P" ,2.080,1.00,0.50,0.00)), \ 00084 periodic::element(3,16,32.067 ,0, periodic::render("S" ,2.000,1.00,1.00,0.19)), \ 00085 periodic::element(3,17,35.453 ,0, periodic::render("Cl",1.970,0.12,0.94,0.12)), \ 00086 periodic::element(3,18,39.948 ,0, periodic::render("Ar",1.880,0.50,0.82,0.89)), \ 00087 periodic::element(4,19,39.098 ,0, periodic::render("K" ,2.750,0.56,0.25,0.83)), \ 00088 periodic::element(4,20,40.078 ,0, periodic::render("Ca",1.973,0.24,1.00,0.00)), \ 00089 periodic::element(4,21,44.956 ,0, periodic::render("Sc",1.700,0.90,0.90,0.90)), \ 00090 periodic::element(4,22,47.867 ,0, periodic::render("Ti",1.700,0.75,0.76,0.78)), \ 00091 periodic::element(4,23,50.942 ,0, periodic::render("V" ,1.700,0.65,0.65,0.67)), \ 00092 periodic::element(4,24,51.996 ,0, periodic::render("Cr",1.700,0.54,0.60,0.78)), \ 00093 periodic::element(4,25,54.938 ,0, periodic::render("Mn",1.700,0.61,0.48,0.78)), \ 00094 periodic::element(4,26,55.845 ,0, periodic::render("Fe",1.700,0.50,0.48,0.78)), \ 00095 periodic::element(4,27,58.933 ,0, periodic::render("Co",1.700,0.44,0.48,0.78)), \ 00096 periodic::element(4,28,58.693 ,0, periodic::render("Ni",1.630,0.36,0.48,0.76)), \ 00097 periodic::element(4,29,63.546 ,0, periodic::render("Cu",1.400,1.00,0.48,0.38)), \ 00098 periodic::element(4,30,65.39 ,0, periodic::render("Zn",1.390,0.49,0.50,0.69)), \ 00099 periodic::element(4,31,69.723 ,0, periodic::render("Ga",1.870,0.76,0.56,0.56)), \ 00100 periodic::element(4,32,72.61 ,0, periodic::render("Ge",1.700,0.40,0.56,0.56)), \ 00101 periodic::element(4,33,74.922 ,0, periodic::render("As",1.850,0.74,0.50,0.89)), \ 00102 periodic::element(4,34,78.96 ,0, periodic::render("Se",1.900,1.00,0.63,0.00)), \ 00103 periodic::element(4,35,79.904 ,0, periodic::render("Br",2.100,0.65,0.16,0.16)), \ 00104 periodic::element(4,36,83.80 ,0, periodic::render("Kr",2.020,0.36,0.72,0.82)), \ 00105 periodic::element(5,37,85.468 ,0, periodic::render("Rb",1.700,0.44,0.18,0.69)), \ 00106 periodic::element(5,38,87.62 ,0, periodic::render("Sr",1.700,0.00,1.00,0.00)), \ 00107 periodic::element(5,39,88.906 ,0, periodic::render("Y" ,1.700,0.58,1.00,1.00)), \ 00108 periodic::element(5,40,91.224 ,0, periodic::render("Zr",1.700,0.58,0.88,0.88)), \ 00109 periodic::element(5,41,92.906 ,0, periodic::render("Nb",1.700,0.45,0.76,0.79)), \ 00110 periodic::element(5,42,95.94 ,0, periodic::render("Mo",1.700,0.33,0.71,0.71)), \ 00111 periodic::element(5,43,98.0 ,0, periodic::render("Tc",1.700,0.23,0.62,0.62)), \ 00112 periodic::element(5,44,101.07 ,0, periodic::render("Ru",1.700,0.14,0.56,0.56)), \ 00113 periodic::element(5,45,102.906,0, periodic::render("Rh",1.700,0.04,0.49,0.55)), \ 00114 periodic::element(5,46,106.42 ,0, periodic::render("Pd",1.630,0.00,0.41,0.52)), \ 00115 periodic::element(5,47,107.868,0, periodic::render("Ag",1.720,0.88,0.88,1.00)), \ 00116 periodic::element(5,48,112.412,0, periodic::render("Cd",1.580,1.00,0.85,0.56)), \ 00117 periodic::element(5,49,114.818,0, periodic::render("In",1.930,0.65,0.46,0.45)), \ 00118 periodic::element(5,50,118.711,0, periodic::render("Sn",2.170,0.40,0.50,0.50)), \ 00119 periodic::element(5,51,121.760,0, periodic::render("Sb",2.200,0.62,0.39,0.71)), \ 00120 periodic::element(5,52,127.60 ,0, periodic::render("Te",2.060,0.83,0.48,0.00)), \ 00121 periodic::element(5,53,126.904,0, periodic::render("I" ,2.150,0.58,0.00,0.58)), \ 00122 periodic::element(5,54,131.29 ,0, periodic::render("Xe",2.160,0.26,0.62,0.69)), \ 00123 periodic::element(6,55,132.905,0, periodic::render("Cs",1.700,0.34,0.09,0.56)), \ 00124 periodic::element(6,56,137.328,0, periodic::render("Ba",1.700,0.00,0.79,0.00)), \ 00125 periodic::element(6,57,138.906,0, periodic::render("La",1.700,0.44,0.83,1.00)), \ 00126 periodic::element(6,58,140.116,0, periodic::render("Ce",1.700,1.00,1.00,0.78)), \ 00127 periodic::element(6,59,140.908,0, periodic::render("Pr",1.700,0.85,1.00,0.78)), \ 00128 periodic::element(6,60,144.24 ,0, periodic::render("Nd",1.700,0.78,1.00,0.78)), \ 00129 periodic::element(6,61,145.0 ,0, periodic::render("Pm",1.700,0.64,1.00,0.78)), \ 00130 periodic::element(6,62,150.36 ,0, periodic::render("Sm",1.700,0.56,1.00,0.78)), \ 00131 periodic::element(6,63,151.964,0, periodic::render("Eu",1.700,0.38,1.00,0.78)), \ 00132 periodic::element(6,64,157.25 ,0, periodic::render("Gd",1.700,0.27,1.00,0.78)), \ 00133 periodic::element(6,65,158.925,0, periodic::render("Tb",1.700,0.19,1.00,0.78)), \ 00134 periodic::element(6,66,162.50 ,0, periodic::render("Dy",1.700,0.12,1.00,0.78)), \ 00135 periodic::element(6,67,164.930,0, periodic::render("Ho",1.700,0.00,1.00,0.61)), \ 00136 periodic::element(6,68,167.26 ,0, periodic::render("Er",1.700,0.00,0.90,0.46)), \ 00137 periodic::element(6,69,168.934,0, periodic::render("Tm",1.700,0.00,0.83,0.32)), \ 00138 periodic::element(6,70,173.04 ,0, periodic::render("Yb",1.700,0.00,0.75,0.22)), \ 00139 periodic::element(6,71,174.967,0, periodic::render("Lu",1.700,0.00,0.67,0.14)), \ 00140 periodic::element(6,72,178.49 ,0, periodic::render("Hf",1.700,0.30,0.76,1.00)), \ 00141 periodic::element(6,73,180.948,0, periodic::render("Ta",1.700,0.30,0.65,1.00)), \ 00142 periodic::element(6,74,183.84 ,0, periodic::render("W" ,1.700,0.13,0.58,0.84)), \ 00143 periodic::element(6,75,186.207,0, periodic::render("Re",1.700,0.15,0.49,0.67)), \ 00144 periodic::element(6,76,190.23 ,0, periodic::render("Os",1.700,0.15,0.40,0.59)), \ 00145 periodic::element(6,77,192.217,0, periodic::render("Ir",1.700,0.09,0.33,0.53)), \ 00146 periodic::element(6,78,195.078,0, periodic::render("Pt",1.720,0.96,0.93,0.82)), \ 00147 periodic::element(6,79,196.967,0, periodic::render("Au",1.660,0.80,0.82,0.12)), \ 00148 periodic::element(6,80,200.59 ,0, periodic::render("Hg",1.550,0.71,0.71,0.76)), \ 00149 periodic::element(6,81,204.383,0, periodic::render("Tl",1.960,0.65,0.33,0.30)), \ 00150 periodic::element(6,82,207.2 ,0, periodic::render("Pb",2.020,0.34,0.35,0.38)), \ 00151 periodic::element(6,83,208.980,0, periodic::render("Bi",1.700,0.62,0.31,0.71)), \ 00152 periodic::element(6,84,209.0 ,0, periodic::render("Po",1.700,0.67,0.36,0.00)), \ 00153 periodic::element(6,85,210.0 ,0, periodic::render("At",1.700,0.46,0.31,0.27)), \ 00154 periodic::element(6,86,222.0 ,0, periodic::render("Rn",1.700,0.26,0.51,0.59)), \ 00155 periodic::element(7,87,223.0 ,0, periodic::render("Fr",1.700,0.26,0.00,0.40)), \ 00156 periodic::element(7,88,226.0 ,0, periodic::render("Ra",1.700,0.00,0.49,0.00)), \ 00157 periodic::element(7,89,227.0 ,0, periodic::render("Ac",1.700,0.44,0.67,0.98)), \ 00158 periodic::element(7,90,232.038,0, periodic::render("Th",1.700,0.00,0.73,1.00)), \ 00159 periodic::element(7,91,231.036,0, periodic::render("Pa",1.700,0.00,0.63,1.00)), \ 00160 periodic::element(7,92,238.029,0, periodic::render("U" ,1.860,0.00,0.56,1.00)), \ 00161 periodic::element(7,93,237.0 ,0, periodic::render("Np",1.700,0.00,0.50,1.00)), \ 00162 periodic::element(7,94,244.0 ,0, periodic::render("Pu",1.700,0.00,0.42,1.00)), \ 00163 periodic::element(7,95,243.0 ,0, periodic::render("Am",1.700,0.33,0.36,0.95)), \ 00164 periodic::element(7,96,247.0 ,0, periodic::render("Cm",1.700,0.47,0.36,0.89)), \ 00165 periodic::element(7,97,247.0 ,0, periodic::render("Bk",1.700,0.54,0.31,0.89)), \ 00166 periodic::element(7,98,251.0 ,0, periodic::render("Cf",1.700,0.63,0.21,0.83)), \ 00167 periodic::element(7,99,252.0 ,0, periodic::render("Es",1.700,0.70,0.12,0.83)), \ 00168 periodic::element(7,100,257.0 ,0, periodic::render("Fm",1.700,0.70,0.12,0.73)), \ 00169 periodic::element(7,101,258.0 ,0, periodic::render("Md",1.700,0.70,0.05,0.65)), \ 00170 periodic::element(7,102,259.0 ,0, periodic::render("No",1.700,0.74,0.05,0.53)), \ 00171 periodic::element(7,103,262.0 ,0, periodic::render("Lr",1.700,0.78,0.00,0.40)), \ 00172 periodic::element(7,104,261.0 ,0, periodic::render("Rf",1.700,0.80,0.00,0.35)), \ 00173 periodic::element(7,105,262.0 ,0, periodic::render("Db",1.700,0.82,0.00,0.31)), \ 00174 periodic::element(7,106,263.0 ,0, periodic::render("Sg",1.700,0.85,0.00,0.27)), \ 00175 periodic::element(7,107,264.0 ,0, periodic::render("Bh",1.700,0.88,0.00,0.22)), \ 00176 periodic::element(7,108,265.0 ,0, periodic::render("Hs",1.700,0.90,0.00,0.18)), \ 00177 periodic::element(7,109,268.0 ,0, periodic::render("Mt",1.700,0.92,0.00,0.15)), \ 00178 periodic::element(7,110,269.0 ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00179 periodic::element(7,111,272. ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00180 periodic::element(7,112,277. ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00181 periodic::element(7,113,282. ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00182 periodic::element(7,114,285. ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00183 periodic::element(7,115,288. ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00184 periodic::element(7,116,289. ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00185 periodic::element(7,117,290. ,0, periodic::render("Un",1.700,0.95,0.00,0.11)), \ 00186 periodic::element(7,118,293. ,0, periodic::render("Un",1.700,0.95,0.00,0.11))}*/}; 00187 } 00188 00189 using namespace periodic; 00190 00191 namespace MolSys{ 00192 00193 typedef enum {VALENCE,RYDBERG} atombasistype; 00194 typedef enum {BF2002,CATAL,ECF,GEOMO,MOLCRYST,PPP} inputtype; 00195 00196 class point{ 00197 public: 00198 int Id; 00199 double R[3]; 00200 00201 point(void); // constructor 00202 ~point(void); // destructor 00203 00204 int GetPointId(void); 00205 }; 00206 00207 class node{ 00208 public: 00209 int Id; 00210 int AtomId; 00211 int Valence; 00212 char Stereo; 00213 00214 node(void); // constructor 00215 ~node(void); // destructor 00216 void SetNodeId(int i); 00217 }; 00218 00219 class atom{ 00220 public: 00221 int Id; 00222 element* pElement; 00223 point* pPoint; 00224 node* pNode; 00225 // type(Model), pointer :: Model 00226 atom(void); // constructor 00227 ~atom(void); // destructor 00228 }; 00229 00230 class arc{ 00231 public: 00232 int Id; 00233 node* pLe; 00234 node* pRe; 00235 char Stereo; 00236 int Order; 00237 00238 arc(void); // constructor 00239 ~arc(void); // destructor 00240 }; 00241 00242 class ao{ // Atomic Orbital 00243 public: 00244 int n; //! Principal quantum number n 00245  int l; //! Orbital quantum number l 00246  int m; //! Magnetic quantum number m 00247  //! positive values refer to cosines 00248  //! negative values refer to sines 00249  //! of the polar angle 00250  //! type(Radial),pointer :: Radial 00251  00252 ao(void); // constructor 00253 ~ao(void); // destructor 00254 }; 00255 00256 class cao{ // CenteredAtomicOrbital 00257 public: 00258 atom* pAtom; 00259 ao Orbital; 00260 00261 cao(void); // constructor 00262 ~cao(void); // destructor 00263 }; 00264 00265 class cpao{ //!Centered Parameterized AO 00266 public: 00267 cao* pOrbital; 00268 int ParamId; 00269 00270 cpao(void); // constructor 00271 ~cpao(void); // destructor 00272 }; 00273 00274 class term{ 00275 double Density1; 00276 double Green1; 00277 double Density2; 00278 double Green2; 00279 double Energy; 00280 00281 public: 00282 00283 term(void); // constructor 00284 ~term(void); // destructor 00285 }; 00286 00287 class oes{ // Class to represent one-electron states 00288 public: 00289 int Id; 00290 map<cao*,double> Lcao; 00291 00292 oes(void); // constructor 00293 ~oes(void); // destructor 00294 }; 00295 00296 class group{ 00297 public: 00298 int NumberOfElectrons; 00299 int SpinMultiplicity; 00300 double SelfEnergy; 00301 string Treatment; 00302 vector<atom*> Touches; 00303 vector<oes*> Subspace; 00304 term Term; 00305 00306 group(void); // constructor 00307 ~group(void); // destructor 00308 }; 00309 00310 class composition{ 00311 public: 00312 int Charge; 00313 int NumberOfElectrons; 00314 int NumberOfAtoms; 00315 vector<atom*> pAtoms; 00316 00317 composition(void); // constructor 00318 ~composition(void);// destructor 00319 00320 void AddAtom(int i, point* pPoint, node* pNode, element* pElement); 00321 int GetNumberOfAtoms(void); 00322 }; 00323 00324 class geometry{ 00325 public: 00326 vector<point*> pPoints; 00327 00328 geometry(void); // constructor 00329 ~geometry(void); // destructor 00330 00331 void AddPoint(int i, double r[3]); 00332 }; 00333 00334 class molgraph{ 00335 public: 00336 vector<node*> pNodes; 00337 vector<arc*> pArcs; 00338 00339 molgraph(void); // constructor 00340 ~molgraph(void); // destructor 00341 00342 void AddNode(int i); 00343 void AddArc(node* ple,node* pre); 00344 }; 00345 00346 class structure{ 00347 public: 00348 int SpinMultiplicity; 00349 int NumberOfAtomicOrbitals; 00350 vector<cao*> pAOBasis; 00351 vector<group*> pGroups; 00352 double Energy; 00353 00354 structure(void); // constructor 00355 ~structure(void); // destructor 00356 00357 void AddGroup(int NumberOfElectrons,\ 00358 int SpinMultiplicity,\ 00359 string Treatment,\ 00360 vector<atom*> Touches,\ 00361 vector<oes*> subspace); 00362 void AddAtomBasis(atombasistype model,atom* pAtom); 00363 void AddShell(int n, atom* pAtom); 00364 void AddSubshell(int n, int l, atom* pAtom); 00365 cao* GetpCAO(int n, int l, int m, atom* pAtom); 00366 }; 00367 00368 //type Fragment 00369 // type(Composition):: Composition 00370 // type(Geometry) :: Geometry 00371 // type(MolGraph) :: MolGraph 00372 // type(Model) :: Model 00373 //end type Fragment 00374 class molecule{ 00375 composition Composition; 00376 geometry Geometry; 00377 molgraph MolGraph; 00378 structure Structure; 00379 00380 public: 00381 double TenIn[3][3]; 00382 double TenInDiag[3][3]; 00383 double TenInEigVec[3][3]; 00384 00385 molecule(void); // constructor 00386 ~molecule(void); // destructor 00387 00388 double MolecularWeight(void); 00389 point* CenterOfMass(void); 00390 void WriteXML(char* fileout); // Added by YuK 16.06.2004 00391 void WriteVRML(void);// Zabalov 07-08.2004; 00392 // Changes added by YuK 31.08.2004 00393 void ReadOldData(void); 00394 void ReadBF(void); // Added by YuK 4.06.2004 00395 void ReadECF(char* filein); // Added by YuK 7.06.2004 00396 void ReadBFSCF(char* filein);// Added by YuK 10.06.2004 00397 void ReadMolCryst(void);//Added by YuK 8.06.2004 00398 void TenInCalc(void);// Added by YuK 2.10.2004 00399 void RotateMol(double U[3][3],point* pCenter);//Added by YuK 2.10.2004 00400 void UnMatForm(char* filename);// Added by YuK 2.10.2004 00401 void usage(void); // Added by YuK (not complete) 00402 void WriteMol(void); 00403 }; 00404 } // close namespace MolSys 00405 00406 using namespace MolSys; 00407 00408 namespace Model { 00409 typedef enum {SinglePoint,Optimize,MonteCarlo,ClassDynamics,QuantDynamics} ModelProtocol; 00410 typedef enum {Vacuum,Crystal,Field,Matrix} ModelEnvironment; 00411 class ModelPlayer{ 00412 public: 00413 ModelPlayer(void); 00414 ~ModelPlayer(void); 00415 }; // end class ModelPlayer 00416 } // close namespace Model 00417 using Model; 00418 00419 namespace Properties { 00420 typedef enum {Energy} Property; 00421 } // close namespace Properties 00422 using Properties; 00423 #endif 

Generated for Cartesius by doxygen1.2.18