Ejemplo n.º 1
0
  void OBOrbitalData::LoadBetaOrbitals(std::vector<double> energies, std::vector<std::string> symmetries, int betaHOMO)
  {
    if (energies.size() < symmetries.size())
      return; // something is very weird -- it's OK to pass no symmetries (we'll assume "A")
    if (energies.size() == 0)
      return;
    if (betaHOMO > energies.size())
      return;

    _betaHOMO = betaHOMO;
    _betaOrbitals.clear();
    _openShell = true;

    if (symmetries.size() < energies.size()) // pad with "A" symmetry
      for (unsigned int i = symmetries.size(); i < energies.size(); ++i)
        symmetries.push_back("A");

    OBOrbital currentOrbital;
    for (unsigned int i = 0; i < energies.size(); ++i)
      {
        if (i < betaHOMO)
          currentOrbital.SetData(energies[i], 2.0, symmetries[i]);
        else
          currentOrbital.SetData(energies[i], 0.0, symmetries[i]);

        _betaOrbitals.push_back(currentOrbital);
      }
  }
Ejemplo n.º 2
0
  /**
  Method reads orbital information from input stream (ifs)
  and writes them to supplied OBMol object (molecule).
  Input stream must be set to begining of orbital data
  section in nwo file. (Line after "... Molecular Orbital Analysis")
  Stream will be set at next line after end of orbital section.
  */
  void NWChemOutputFormat::ReadOrbitals(istream* ifs, OBMol* molecule)
  {
    if ((ifs == NULL) || (molecule == NULL))
        return;
    vector<string> vs;
    char buffer[BUFF_SIZE];
    vector<OBOrbital> orbitals;
    OBOrbitalData* orbital_data = new OBOrbitalData;
    ifs->getline(buffer, BUFF_SIZE); // ---------
    ifs->getline(buffer, BUFF_SIZE); // blank line

    while (ifs->getline(buffer,BUFF_SIZE))
    {
        if (strstr(buffer, ORBITAL_START_PATTERN))
        {
            tokenize(vs, buffer);
            // Vector   N  Occ=X  E= Y  Symmetry=a'
            //   0      1    2    3  4  5(optional)
            if (vs.size() < 5)
                break; // Orbital data is broken

            double energy = atof(vs[4].c_str()) * HARTREE_TO_KCAL;
            double occupation = atof(vs[2].c_str()+4); // Start from symbol after '='
            string symbol;
            if (vs.size() > 5)
                symbol = vs[5].substr(9, string::npos);
            else
                symbol = " "; // Symmetry is unknown
            OBOrbital orbital;
            orbital.SetData(energy, occupation, symbol);
            orbitals.push_back(orbital);

            ifs->getline(buffer, BUFF_SIZE); // MO Center ...
            ifs->getline(buffer, BUFF_SIZE); // Table header
            ifs->getline(buffer,BUFF_SIZE); // ----------
            while (ifs->getline(buffer,BUFF_SIZE))
                if (strlen(buffer) < 2) // If blank line detected
                    break;
        }// if Vector ...
        else if ((strstr(buffer, ORBITAL_SECTION_PATTERN_2) != NULL)&&(strstr(buffer, ORBITAL_SECTION_PATTERN_1) != NULL))
        {
            orbital_data->SetAlphaOrbitals(orbitals);
            orbital_data->SetOpenShell(true);
            orbitals.clear();
            ifs->getline(buffer, BUFF_SIZE); // ---------
            ifs->getline(buffer, BUFF_SIZE); // blank line
        }// if beta orbital section found
        else
        {
            if (orbital_data->IsOpenShell())
                orbital_data->SetBetaOrbitals(orbitals);
            else
                orbital_data->SetAlphaOrbitals(orbitals);
            molecule->SetData(orbital_data);
            return;
        }
    }
  delete orbital_data;
  }