⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formula.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// formula.cc --- implementation of the MolecularFormula class//// Copyright (C) 1997 Limit Point Systems, Inc.//// Author: Edward Seidl <seidl@janed.com>// Maintainer: LPS//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB.  If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//#ifdef __GNUC__#pragma implementation#endif#include <map>#include <chemistry/molecule/formula.h>using namespace sc;static const char * symbols[] = {  "C", "H", "Ac", "Ag", "Al", "Am", "Ar", "As", "At", "Au", "B", "Ba", "Be",  "Bi", "Bk", "Br", "Ca", "Cd", "Ce", "Cf", "Cl", "Cm", "Co", "Cr", "Cs", "Cu",  "Dy", "Er", "Es", "Eu", "F", "Fe", "Fm", "Fr", "Ga", "Gd", "Ge", "Ha", "He",  "Hf", "Hg", "Ho", "I", "In", "Ir", "K", "Kr", "La", "Li", "Lr", "Lu", "Md",  "Mg", "Mn", "Mo", "N", "Na", "Nb", "Nd", "Ne", "Ni", "No", "Np", "O", "Os",  "P", "Pa", "Pb", "Pd", "Pm", "Po", "Pr", "Pt", "Pu", "Ra", "Rb", "Re", "Rf",  "Rh", "Rn", "Ru", "S", "Sb", "Sc", "Se", "Si", "Sm", "Sn", "Sr", "Ta", "Tb",  "Tc", "Te", "Th", "Ti", "Tl", "Tm", "U", "V", "W", "Xe", "Y", "Yb", "Zn",  "Zr", 0};MolecularFormula::MolecularFormula(const Ref<Molecule>&m):  form_(0){  compute_form(m.pointer());  compute_atomtypes(m.pointer());}MolecularFormula::MolecularFormula(const Molecule *m):  form_(0){  compute_form(m);  compute_atomtypes(m);}MolecularFormula::~MolecularFormula(){  delete[] form_;  delete[] Z_;  delete[] nZ_;}voidMolecularFormula::compute_form(const Molecule *m){  const Molecule& mol = *m;  memset(count_, 0, sizeof(count_));  int ntype=0;  int maxcount=0;  unsigned int maxsym=0;  for (int a=0; a < mol.natom(); a++) {    int i=0;    while(symbols[i]) {      if (!strcmp(AtomInfo::symbol(mol.Z(a)), symbols[i])) {        count_[i]++;        maxcount = (count_[i] > maxcount) ? count_[i] : maxcount;        maxsym = (strlen(symbols[i]) > maxsym) ? strlen(symbols[i]) : maxsym;                if (count_[i]==1)          ntype++;                break;      }      i++;    }  }  // allocate storage for formula  int ndigits = ((int) (log((double)maxcount)/log(10.0))) + 1;  form_ = new char[(ndigits+maxsym)*ntype+1];  form_[0] = 0;    int c;  for (int i=0; i < nelem_; i++) {    if ((c=count_[i])) {      char *temp = new char[ndigits+maxsym+1];      if (c > 1)        sprintf(temp, "%s%d", symbols[i], count_[i]);      else         sprintf(temp, "%s", symbols[i]);      strcat(form_, temp);      delete[] temp;    }  }}voidMolecularFormula::compute_atomtypes(const Molecule *m){  std::map<int, int> atomtypeinfo;  int natoms = m->natom();  int i, Z;  for (i=0; i< natoms; i++) {    if (m->charge(i) == 0.0) continue;    Z = m->Z(i);    if (atomtypeinfo.find(Z) != atomtypeinfo.end()) atomtypeinfo[Z]++;    else atomtypeinfo[Z] = 1;    }  natomtypes_ = atomtypeinfo.size();  Z_ = new int[natomtypes_];  nZ_ = new int[natomtypes_];  std::map<int, int>::iterator iter;  for (iter = atomtypeinfo.begin(), i=0; iter != atomtypeinfo.end(); iter++, i++) {    Z_[i] = iter->first;    nZ_[i] = iter->second;    }}const char *MolecularFormula::formula() const{  return form_;}intMolecularFormula::natomtypes() {  return(natomtypes_);}intMolecularFormula::Z(int itype) {  return Z_[itype];}intMolecularFormula::nZ(int itype) {  return nZ_[itype];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -