Ejemplo n.º 1
0
// Print out details of Molecule, taking the form:
// ========
// MOLECULE
// ========
// No. of e- = nel,  charge = q,  singlet/doublet/triplet etc.
// Enuc = nuclear energy
// (if inertia = true then also prints the section:
// ............................
// Principal Moments of Inertia
// ............................
// Ia = ...,  Ib = ...,  Ic = ...
// Rotational type: ...
// ....................
// Rotational Constants
// ....................
// (the coordinate system is also transformed to inertial coords)
// =====
// ATOMS
// =====
// Atom     z     Mass (a.m.u)     Coordinates
// ...............................................................
// C        6     12.014           (0.0, 3.53, -1.24)
// etc...
void Logger::print(Molecule& mol, bool inertia) const
{
  title("Molecule");
  // Print out basic details
  outfile << "# electrons = " << mol.getNel() << ",  ";
  outfile << "charge = " << mol.getCharge() << ",  ";
  std::string temp;
  // Get the state type
  switch (mol.getMultiplicity()) {
  case 1: { temp = "Singlet"; break; }
  case 2: { temp = "Doublet"; break; }
  case 3: { temp = "Triplet"; break; }
  case 4: { temp = "Quartet"; break; }
  case 5: { temp = "Quintet"; break; }
  default: { temp = "Spintacular"; break; } // Are hextets even a thing?!
  }
  outfile << temp << "\n";
  outfile << "ENUC = " << mol.getEnuc() << " Hartree\n";
  
  // Print inertial details if needed, and rotate
  // into the inertial coordinate system
  if (inertia) {
    // Get it
    temp = mol.rType();
    Vector rconsts(3);
    rconsts = mol.rConsts(1); // MHz
    Vector inert(3);
    inert = mol.getInertia(true);
    // Print it out
    outfile << std::string(30, '.') << "\n";
    outfile << "Principal Moments of Inertia\n";
    outfile << std::string(30, '.') << "\n";
    outfile << "Ia = " << std::setw(12) << inert(0);
    outfile << ",  Ib = " << std::setw(12) << inert(1);
    outfile << ",  Ic = " << std::setw(12) << inert(2) << "\n";
    outfile << "Rotational type: " << temp << "\n";
    outfile << std::string(29, '.') << "\n";
    outfile << "Rotational Constants / GHz\n";
    outfile << std::string(29, '.') << "\n";
    outfile << "A = " << std::setw(12) << rconsts(0);
    outfile << ",  B = " << std::setw(12) << rconsts(1);
    outfile << ",  C = " << std::setw(12) << rconsts(2) << "\n";
    
  }
  
  // Finally, print out all the atoms
  title("Atoms");
  outfile << std::setw(10) << "Atom" << std::setw(10) << "z";
  outfile << std::setw(10) << "Mass" << std::setw(10) << "#CGBFs"; 
  outfile << std::setw(30) << "Coordinates" << "\n";
  outfile << std::string(70, '.') << "\n";
  for (int i = 0; i < mol.getNAtoms(); i++){
    print(mol.getAtom(i));
  }
}