Main Page   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

periodic_table.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  * RCS INFORMATION:
00003  *
00004  *      $RCSfile: periodic_table.h,v $
00005  *      $Author: johns $       $Locker:  $             $State: Exp $
00006  *      $Revision: 1.10 $       $Date: 2005/08/22 22:00:27 $
00007  *
00008  ***************************************************************************/
00009 
00010 /*
00011  * periodic table of elements and helper functions to convert
00012  * ordinal numbers to labels and back.
00013  * all tables and functions are declared static, so that it
00014  * can be safely included by all plugins that may need it.
00015  *
00016  * 2002-2005 axel.kohlmeyer@theochem.ruhr-uni-bochum.de, vmd@ks.uiuc.edu
00017  */
00018 
00019 #include <string.h>
00020 #include <ctype.h>
00021 
00022 /* periodic table of elements for translation of ordinal to atom type */
00023 static const char *pte_label[] = { 
00024     "X",  "H",  "He", "Li", "Be", "B",  "C",  "N",  "O",  "F",  "Ne",
00025     "Na", "Mg", "Al", "Si", "P" , "S",  "Cl", "Ar", "K",  "Ca", "Sc",
00026     "Ti", "V",  "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", 
00027     "As", "Se", "Br", "Kr", "Rb", "Sr", "Y",  "Zr", "Nb", "Mo", "Tc",
00028     "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I",  "Xe",
00029     "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb",
00030     "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W",  "Re", "Os",
00031     "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr",
00032     "Ra", "Ac", "Th", "Pa", "U",  "Np", "Pu", "Am", "Cm", "Bk", "Cf",
00033     "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt",
00034     "Ds", "Rg"
00035 };
00036 static const int nr_pte_entries = sizeof(pte_label) / sizeof(char *);
00037 
00038 /* corresponding table of masses. */
00039 static const float pte_mass[] = { 
00040     /* X  */ 0.00000, 1.00794, 4.00260, 6.941, 9.012182, 10.811,  
00041     /* C  */ 12.0107, 14.0067, 15.9994, 18.9984032, 20.1797, 
00042     /* Na */ 22.989770, 24.3050, 26.981538, 28.0855, 30.973761,
00043     /* S  */ 32.065, 35.453, 39.948, 39.0983, 40.078, 44.955910,
00044     /* Ti */ 47.867, 50.9415, 51.9961, 54.938049, 55.845, 58.9332,
00045     /* Ni */ 58.6934, 63.546, 65.409, 69.723, 72.64, 74.92160, 
00046     /* Se */ 78.96, 79.904, 83.798, 85.4678, 87.62, 88.90585, 
00047     /* Zr */ 91.224, 92.90638, 95.94, 98.0, 101.07, 102.90550,
00048     /* Pd */ 106.42, 107.8682, 112.411, 114.818, 118.710, 121.760, 
00049     /* Te */ 127.60, 126.90447, 131.293, 132.90545, 137.327, 
00050     /* La */ 138.9055, 140.116, 140.90765, 144.24, 145.0, 150.36,
00051     /* Eu */ 151.964, 157.25, 158.92534, 162.500, 164.93032, 
00052     /* Er */ 167.259, 168.93421, 173.04, 174.967, 178.49, 180.9479,
00053     /* W  */ 183.84, 186.207, 190.23, 192.217, 195.078, 196.96655, 
00054     /* Hg */ 200.59, 204.3833, 207.2, 208.98038, 209.0, 210.0, 222.0, 
00055     /* Fr */ 223.0, 226.0, 227.0, 232.0381, 231.03588, 238.02891,
00056     /* Np */ 237.0, 244.0, 243.0, 247.0, 247.0, 251.0, 252.0, 257.0,
00057     /* Md */ 258.0, 259.0, 262.0, 261.0, 262.0, 266.0, 264.0, 269.0,
00058     /* Mt */ 268.0, 271.0, 272.0
00059 };
00060 
00061 /*
00062  * corresponding table of VDW radii.
00063  * van der Waals radii are taken from A. Bondi, 
00064  * J. Phys. Chem., 68, 441 - 452, 1964, 
00065  * except the value for H, which is taken from R.S. Rowland & R. Taylor, 
00066  * J.Phys.Chem., 100, 7384 - 7391, 1996. Radii that are not available in 
00067  * either of these publications have RvdW = 2.00 Å.
00068  */
00069 static const float pte_vdw_radius[] = { 
00070     /* X  */ 1.5, 1.2, 1.4, 1.82, 2.0, 2.0,  
00071     /* C  */ 1.7, 1.55, 1.52, 1.47, 1.54, 
00072     /* Na */ 2.27, 1.73, 2.0, 2.1, 1.8,
00073     /* S  */ 1.8, 1.75, 1.88, 2.75, 2.0, 2.0,
00074     /* Ti */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0,
00075     /* Ni */ 1.63, 1.4, 1.39, 1.07, 2.0, 1.85,
00076     /* Se */ 1.9, 1.85, 2.02, 2.0, 2.0, 2.0, 
00077     /* Zr */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0,
00078     /* Pd */ 1.63, 1.72, 1.58, 1.93, 2.17, 2.0, 
00079     /* Te */ 2.06, 1.98, 2.16, 2.0, 2.0,
00080     /* La */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0,
00081     /* Eu */ 2.0, 2.0, 2.0, 2.0, 2.0,
00082     /* Er */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0,
00083     /* W  */ 2.0, 2.0, 2.0, 2.0, 1.72, 1.66,
00084     /* Hg */ 1.55, 1.96, 2.02, 2.0, 2.0, 2.0, 2.0,
00085     /* Fr */ 2.0, 2.0, 2.0, 2.0, 2.0, 1.86,
00086     /* Np */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0,
00087     /* Md */ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0,
00088     /* Mt */ 2.0, 2.0, 2.0
00089 };
00090 
00091 /* lookup functions */
00092 
00093 static const char *get_pte_label(const int idx)
00094 {
00095     if ((idx < 1) || (idx >= nr_pte_entries)) return pte_label[0];
00096 
00097     return pte_label[idx];
00098 }
00099 
00100 static float get_pte_mass(const int idx)
00101 {
00102     if ((idx < 1) || (idx >= nr_pte_entries)) return pte_mass[0];
00103 
00104     return pte_mass[idx];
00105 }
00106 
00107 static float get_pte_vdw_radius(const int idx)
00108 {
00109     if ((idx < 1) || (idx >= nr_pte_entries)) return pte_vdw_radius[0];
00110 
00111 #if 1
00112     /* Replace with Hydrogen radius with an "all-atom" radius */
00113     if (idx == 1)
00114       return 1.0;    /* H  */
00115 #else
00116     /* Replace with old VMD atom radii values */
00117     switch (idx) {
00118       case  1: return 1.0;    /* H  */
00119       case  6: return 1.5;    /* C  */
00120       case  7: return 1.4;    /* N  */
00121       case  8: return 1.3;    /* O  */
00122       case  9: return 1.2;    /* F  */
00123       case 15: return 1.5;    /* P  */
00124       case 16: return 1.9;    /* S  */ 
00125     }
00126 #endif
00127 
00128     return pte_vdw_radius[idx];
00129 }
00130 
00131 static int get_pte_idx(const char *label)
00132 {
00133     int i;
00134     char atom[3];
00135     
00136     /* zap string */
00137     atom[0] = (char) 0;
00138     atom[1] = (char) 0;
00139     atom[2] = (char) 0;
00140     /* if we don't have a null-pointer, there must be at least two 
00141      * chars, which is all we need. we convert to the capitalization 
00142      * convention of the table above during assignment. */
00143     if (label != NULL) {
00144         atom[0] = (char) toupper((int) label[0]);
00145         atom[1] = (char) tolower((int) label[1]);
00146     }
00147     
00148     for (i=0; i < nr_pte_entries; ++i) {
00149         if ( (pte_label[i][0] == atom[0])
00150              && (pte_label[i][1] == atom[1]) ) return i;
00151     }
00152     
00153     return 0;
00154 }
00155 
00156 static int get_pte_idx_from_string(const char *label) {
00157   int i, ind;
00158   char atom[3];
00159 
00160   if (label != NULL) {
00161     /* zap string */
00162     atom[0] = atom[1] = atom[2] = '\0';
00163 
00164     for (ind=0,i=0; (ind<2) && (label[i]!='\0'); i++) {
00165       if (label[i] != ' ') {
00166         atom[ind] = toupper(label[i]);
00167         ind++;
00168       }
00169     }
00170 
00171     if (ind < 1)
00172       return 0; /* no non-whitespace characters */
00173  
00174     for (i=0; i < nr_pte_entries; ++i) {
00175       if ((toupper(pte_label[i][0]) == atom[0]) && (toupper(pte_label[i][1]) == atom[1])) 
00176         return i;
00177     }
00178   }  
00179 
00180   return 0;
00181 }
00182 
00183 #if 0
00184 #include <stdio.h>
00185 
00186 int main() {
00187   int i;
00188 
00189   printf("Periodic table check/dump\n");
00190   printf("  Table contains data for %d elements\n", nr_pte_entries);
00191   printf("   Mass table size check: %d\n", sizeof(pte_mass) / sizeof(float));
00192   printf("    VDW table size check: %d\n", sizeof(pte_vdw_radius) / sizeof(float));
00193   printf("\n");
00194   printf("Symbol Num    Mass   rVDW\n");
00195   for (i=0; i<nr_pte_entries; i++) {
00196     printf("   %-2s  %3d  %6.2f  %4.2f\n",
00197       get_pte_label(i), i, get_pte_mass(i), get_pte_vdw_radius(i));
00198   } 
00199   return 0;
00200 }
00201 #endif

Generated on Wed Mar 22 13:15:30 2006 for VMD Plugins (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002