bool QTAIMWavefunction::initializeWithWFNFile(const QString &fileName)
  {

    m_initializationSuccessful = false;

    QFile file(fileName);
    bool fileExists = file.exists();

    if( !(fileExists) )
    {
      m_initializationSuccessful = false;
      m_fileDoesNotExist = true;
      return m_initializationSuccessful;
    }
    else
    {
      m_fileDoesNotExist = false;
    }

    bool success;
    success=file.open(QIODevice::ReadOnly | QIODevice::Text);

    if( !(success) )
    {
      m_initializationSuccessful = false;
      m_ioError = true;
      return m_initializationSuccessful;
    }
    else
    {
      m_ioError = false;
    }

    m_fileName=fileName;

    QTextStream in(&file);
    QString fileContents=in.readAll();

    file.close();

    QStringList fileContentsByLine(fileContents.split("\n"));

    // Title/Comment
    m_comment=fileContentsByLine.first();
    fileContentsByLine.removeFirst();

    m_numberOfMolecularOrbitals=fileContentsByLine.first().mid(8,15).toLongLong();
    m_numberOfGaussianPrimitives=fileContentsByLine.first().mid(36,8).toLongLong();;
    m_numberOfNuclei=fileContentsByLine.first().mid(54,10).toLongLong();;
    fileContentsByLine.removeFirst();

    // Maximum Number of Nuclei Due to Fixed Format
    if( m_numberOfNuclei > 999 )
    {
      m_initializationSuccessful = false;
      m_tooManyNuclei = true;
      return m_initializationSuccessful;
    }
    else
    {
      m_tooManyNuclei = false ;
    }

    m_xNuclearCoordinates.resize(m_numberOfNuclei);
    m_yNuclearCoordinates.resize(m_numberOfNuclei);
    m_zNuclearCoordinates.resize(m_numberOfNuclei);
    m_nuclearCharges.resize(m_numberOfNuclei);

    for( qint64 i=0; i < m_numberOfNuclei ; ++i )
    {
      m_xNuclearCoordinates[i]=fileContentsByLine.first().mid(24,13).toDouble();
      m_yNuclearCoordinates[i]=fileContentsByLine.first().mid(36,12).toDouble();
      m_zNuclearCoordinates[i]=fileContentsByLine.first().mid(48,12).toDouble();
      m_nuclearCharges[i]=fileContentsByLine.first().mid(70,3).toLongLong();
      fileContentsByLine.removeFirst();
    }


    QList<qint64> centerAssignmentsList;

    while( fileContentsByLine.first().startsWith("CENTRE ASSIGNMENTS")  )
    {
      QString line( fileContentsByLine.first().mid(20,-1) );

      qint64 counter=0;
      while( counter < line.length() )
      {
        centerAssignmentsList.append( line.mid(counter,3).toLongLong() );
        counter=counter+3;
      }

      fileContentsByLine.removeFirst();
    }

    m_xGaussianPrimitiveCenterCoordinates.resize(m_numberOfGaussianPrimitives);
    m_yGaussianPrimitiveCenterCoordinates.resize(m_numberOfGaussianPrimitives);
    m_zGaussianPrimitiveCenterCoordinates.resize(m_numberOfGaussianPrimitives);

    for( qint64 i=0 ; i < m_numberOfGaussianPrimitives ; ++i )
    {
      m_xGaussianPrimitiveCenterCoordinates[i]=m_xNuclearCoordinates[ centerAssignmentsList.at(i) - 1];
      m_yGaussianPrimitiveCenterCoordinates[i]=m_yNuclearCoordinates[ centerAssignmentsList.at(i) - 1];
      m_zGaussianPrimitiveCenterCoordinates[i]=m_zNuclearCoordinates[ centerAssignmentsList.at(i) - 1];
    }


    QList<qint64> typeAssignmentsList;

    while( fileContentsByLine.first().startsWith("TYPE ASSIGNMENTS")  )
    {
      QString line( fileContentsByLine.first().mid(20,-1) );
      QStringList splitLine( line.split(" ", QString::SkipEmptyParts) );

      for( qint64 i=0 ; i < splitLine.length() ; ++i )
      {
        typeAssignmentsList.append( splitLine.at(i).toLongLong() );
      }

      fileContentsByLine.removeFirst();
    }

    m_xGaussianPrimitiveAngularMomenta.resize(m_numberOfGaussianPrimitives);
    m_yGaussianPrimitiveAngularMomenta.resize(m_numberOfGaussianPrimitives);
    m_zGaussianPrimitiveAngularMomenta.resize(m_numberOfGaussianPrimitives);

    for( qint64 i=0 ; i < m_numberOfGaussianPrimitives ; ++i )
    {
      switch(typeAssignmentsList.at(i))
      {
      case 1:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 2:
        m_xGaussianPrimitiveAngularMomenta[i]=1;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 3:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=1;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 4:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=1;
        break;
      case 5:
        m_xGaussianPrimitiveAngularMomenta[i]=2;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 6:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=2;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 7:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=2;
        break;
      case 8:
        m_xGaussianPrimitiveAngularMomenta[i]=1;
        m_yGaussianPrimitiveAngularMomenta[i]=1;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 9:
        m_xGaussianPrimitiveAngularMomenta[i]=1;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=1;
        break;
      case 10:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=1;
        m_zGaussianPrimitiveAngularMomenta[i]=1;
        break;
      case 11:
        m_xGaussianPrimitiveAngularMomenta[i]=3;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 12:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=3;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 13:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=3;
        break;
      case 14:
        m_xGaussianPrimitiveAngularMomenta[i]=2;
        m_yGaussianPrimitiveAngularMomenta[i]=1;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 15:
        m_xGaussianPrimitiveAngularMomenta[i]=2;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=1;
        break;
      case 16:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=2;
        m_zGaussianPrimitiveAngularMomenta[i]=1;
        break;
      case 17:
        m_xGaussianPrimitiveAngularMomenta[i]=1;
        m_yGaussianPrimitiveAngularMomenta[i]=2;
        m_zGaussianPrimitiveAngularMomenta[i]=0;
        break;
      case 18:
        m_xGaussianPrimitiveAngularMomenta[i]=1;
        m_yGaussianPrimitiveAngularMomenta[i]=0;
        m_zGaussianPrimitiveAngularMomenta[i]=2;
        break;
      case 19:
        m_xGaussianPrimitiveAngularMomenta[i]=0;
        m_yGaussianPrimitiveAngularMomenta[i]=1;
        m_zGaussianPrimitiveAngularMomenta[i]=2;
        break;
      case 20:
        m_xGaussianPrimitiveAngularMomenta[i]=1;
        m_yGaussianPrimitiveAngularMomenta[i]=1;
        m_zGaussianPrimitiveAngularMomenta[i]=1;
        break;
      default:
        m_initializationSuccessful=false;
        m_maximumAngularMomentumExceeded=true;
        return m_initializationSuccessful;
      }
    }
    m_maximumAngularMomentumExceeded=false;


    QList<qreal> exponentsList;

    while( fileContentsByLine.first().startsWith("EXPONENTS")  )
    {
      QString line( fileContentsByLine.first().mid(9,-1) );
      QStringList splitLine( line.split(" ", QString::SkipEmptyParts) );

      for( qint64 i=0 ; i < splitLine.length() ; ++i )
      {
        QString str( splitLine.at(i) );
        QString replacedString( str.replace("d","e",Qt::CaseSensitive).replace("D","e",Qt::CaseSensitive).replace("E","e",Qt::CaseSensitive) );
        exponentsList.append( replacedString.toDouble() );
      }

      fileContentsByLine.removeFirst();
    }

    m_gaussianPrimitiveExponentCoefficients.resize(m_numberOfGaussianPrimitives);

    for( qint64 i=0 ; i < m_numberOfGaussianPrimitives ; ++i)
    {
      m_gaussianPrimitiveExponentCoefficients[i]=exponentsList.at(i);
    }

    m_totalEnergy = fileContentsByLine.last().mid(17,20).toDouble();
    m_virialRatio = fileContentsByLine.last().mid(55,-1).toDouble();

    fileContentsByLine.removeLast();
    fileContentsByLine.removeLast();
    if(fileContentsByLine.last().trimmed().contains("END DATA",Qt::CaseSensitive)) fileContentsByLine.removeLast();

    QStringList moHeaderStringList;
    QStringList moCoefficientsStringList;

    QList<qreal> moCoefficientsList;

    for( qint64 i=0; i< fileContentsByLine.length(); ++i)
    {
      if( fileContentsByLine.at(i).trimmed().startsWith("MO") )
      {
        moHeaderStringList.append( fileContentsByLine.at(i) );
      }
      else
      {
        moCoefficientsStringList.append( fileContentsByLine.at(i) );
      }
    }

    QList<qreal> molecularOrbitalOccupationNumbersList;
    QList<qreal> molecularOrbitalEigenvaluesList;

    for( qint64 i=0; i < moHeaderStringList.length() ; ++i)
    {
      molecularOrbitalOccupationNumbersList.append( moHeaderStringList.at(i).mid(34,13).toDouble() );
      molecularOrbitalEigenvaluesList.append( moHeaderStringList.at(i).mid(62,-1).toDouble() );
    }

    m_molecularOrbitalOccupationNumbers.resize(m_numberOfMolecularOrbitals);

    for( qint64 i=0; i < m_numberOfMolecularOrbitals ; ++i )
      m_molecularOrbitalOccupationNumbers[i]=molecularOrbitalOccupationNumbersList.at(i);

    m_molecularOrbitalEigenvalues.resize(m_numberOfMolecularOrbitals);

    for( qint64 i=0; i < m_numberOfMolecularOrbitals ; ++i )
      m_molecularOrbitalEigenvalues[i]=molecularOrbitalEigenvaluesList.at(i);

    moCoefficientsStringList=moCoefficientsStringList.join(" ").split(" ", QString::SkipEmptyParts);

    for( qint64 i=0; i < moCoefficientsStringList.length() ; ++i)
    {
      QString str( moCoefficientsStringList.at(i) );
      QString replacedString( str.replace("d","e",Qt::CaseSensitive).replace("D","e",Qt::CaseSensitive).replace("E","e",Qt::CaseSensitive) );

      moCoefficientsList.append( replacedString.toDouble() );
    }

    m_molecularOrbitalCoefficients.resize( m_numberOfMolecularOrbitals * m_numberOfGaussianPrimitives );

    for( qint64 i=0; i < (m_numberOfMolecularOrbitals * m_numberOfGaussianPrimitives) ; ++i )
      m_molecularOrbitalCoefficients[i]=moCoefficientsList.at(i);

    m_initializationSuccessful = true;

    return m_initializationSuccessful;

  }
Esempio n. 2
0
void PlasmoidHandler::createRequiredFiles(const QString &serviceType, const QString &pluginName,
                                         const QString &userName, const QString &userEmail, const QString &fileExtension)
{
    // a package may require a file like ui/main.qml
    // but the ui dir may not be required, so lets check for them
    for (const auto &it : package().requiredFiles()) {
        if (m_directoryDefinitions.values().contains(it)) {
            const QString dirName(m_directoryDefinitions.key(it));
            QDir dir(packagePath() + contentsPrefix());
            dir.mkpath(dirName);
            dir.cd(dirName);

            QFile f;
            const QString filePath = dir.path() + QLatin1Char('/') +
                                 m_fileDefinitions[it];
            QString templateFilePath;

            if (it == QLatin1String("mainscript")) {
                if (serviceType == "Plasma/Applet") {
                    templateFilePath.append("mainPlasmoid");
                } else if (serviceType == "KWin/WindowSwitcher") {
                    templateFilePath.append("mainTabbox");
                } else if (serviceType == "KWin/Script") {
                    templateFilePath.append("mainKWinScript");
                } else if (serviceType == "KWin/Effect") {
                    templateFilePath.append("mainKWinEffect");
                }
                f.setFileName(QStandardPaths::locate(QStandardPaths::DataLocation,
                                                 QStringLiteral("templates/") + templateFilePath + fileExtension));

                const bool ok = f.copy(filePath);
                if (!ok) {
                    emit error(QStringLiteral("The mainscript file hasn't been created"));
                }

                f.setFileName(filePath);
                f.open(QIODevice::ReadWrite);

                // Now open these files, and substitute the main class, author, email and date fields
                QByteArray tmpPluginName(pluginName.toLocal8Bit());
                QByteArray tmpAuthor(userName.toLocal8Bit());
                QByteArray tmpEmail(userEmail.toLocal8Bit());
                QByteArray rawData = f.readAll();
                f.close();
                f.open(QIODevice::WriteOnly);

                QByteArray replacedString("$PLASMOID_NAME");
                if (rawData.contains(replacedString)) {
                    rawData.replace(replacedString, tmpPluginName);
                }
                replacedString.clear();

                replacedString.append("$AUTHOR");
                if (rawData.contains(replacedString)) {
                    rawData.replace(replacedString, tmpAuthor);
                }
                replacedString.clear();

                replacedString.append("$EMAIL");
                if (rawData.contains(replacedString)) {
                    rawData.replace(replacedString, tmpEmail);
                }
                replacedString.clear();

                replacedString.append("$DATE");
                QDate date = QDate::currentDate();
                QByteArray datetime(date.toString().toUtf8());
                QTime time = QTime::currentTime();
                datetime.append(", " + time.toString().toUtf8());
                if (rawData.contains(replacedString)) {
                    rawData.replace(replacedString, datetime);
                }

                f.write(rawData);
                f.close();
            }
        }
    }

    loadPackage();
}