long NormalModeRelax::run(const long numTimesteps) {
    if( numTimesteps < 1 ) return 0;

    //check valid eigenvectors
    if(*Q == NULL)
        report << error << "No Eigenvectors for NormalMode integrator."<<endr;
    //
    //do minimization with local forces, max loop 100, set subSpace minimization true
    itrs = minimizer(minLim, 100, simpleMin, reDiag, true, &forceCalc, &lastLambda, &app->energies, &app->positions, app->topology);
    Real minPotEnergy = app->energies.potentialEnergy();				//save potential energy before random
    //constraints?
    app->energies.clear();
    //run brownian if any remaining modes
    if(testRemainingModes()) myNextIntegrator->run(myCycleLength);	//cyclelength 
    (app->energies)[ScalarStructure::OTHER] = minPotEnergy;			//store minimum potential energy
    if(*Q == NULL){	//rediagonalize?
        if(myPreviousIntegrator == NULL) 
            report << error << "[NormalModeRelax::Run] Re-diagonalization forced with NormalModeRelax as outermost Integrator. Aborting."<<endr;
        return numTimesteps;
    }
    //
    postStepModify();
    
    return numTimesteps;
  }  
  void NormalModeLangLf::run(int numTimesteps) {
    //Real h = getTimestep() * Constant::INV_TIMEFACTOR;
    Real actTime;

    if( numTimesteps < 1 )
      return;

    //check valid eigenvectors
    if(*Q == NULL)
        report << error << "No Eigenvectors for NormalMode integrator."<<endr;
    //
    //time calculated in forces! so fix here
    actTime = app->topology->time + numTimesteps * getTimestep();
    //
    //main loop
    for( int i = 0; i < numTimesteps; i++ ) {
      //****main loop*************************************
      preStepModify();
      genProjGauss(&gaussRandCoord1, app->topology);
      doHalfKick();
      //
      //nmlDrift(&app->positions, &app->velocities, h, app->topology);
      doDrift();
      //constraints?
      app->energies.clear();
      //run minimizer if any remaining modes
      if(testRemainingModes()) myNextIntegrator->run(myCycleLength); //cyclelength 
      if(app->eigenInfo.reDiagonalize){	//rediagonalize?
            app->topology->time = actTime + (i - numTimesteps) * getTimestep();
            if(myPreviousIntegrator == NULL) 
                report << error << "[NormalModeLangLf::Run] Re-diagonalization forced with NormalModeLangLf as outermost Integrator. Aborting."<<endr;
            return;
      }
      //calculate sub space forces
      app->energies.clear();
      calculateForces();
      //
      genProjGauss(&gaussRandCoord1, app->topology);
      doHalfKick();
      //
      postStepModify();
    }
    //fix time
    app->topology->time = actTime;
    //
  }  
Exemple #3
0
  long NormalModeMori::run(const long numTimesteps) {
    Real h = getTimestep() * Constant::INV_TIMEFACTOR;
    Real actTime;

    if( numTimesteps < 1 ) return 0;

    //check valid eigenvectors
    if(*Q == NULL)
        report << error << "No Eigenvectors for NormalMode integrator."<<endr;
    //
    //time calculated in forces! so fix here
    actTime = app->topology->time + numTimesteps * getTimestep();
    //
    //main loop
    for( int i = 0; i < numTimesteps; i++ ) {
      //****main loop*************************************
      preStepModify();
      doHalfKick();
      //
      nmlDrift(&app->positions, &app->velocities, h, app->topology);
      //constraints?
      app->energies.clear();
      //run minimizer if any remaining modes
      if(testRemainingModes()) myNextIntegrator->run(myCycleLength); //cyclelength 
      if(*Q == NULL){	//rediagonalize?
            app->topology->time = actTime - (i - numTimesteps) * getTimestep();
            if(myPreviousIntegrator == NULL) 
                report << error << "[NormalModeMori::Run] Re-diagonalization forced with NormalModeMori as outermost Integrator. Aborting."<<endr;
            return i;
      }
      //#################Put averaged force code here##############################
      //calculate sub space forces, just do this for the energy
      Real minPotEnergy = (app->energies)[ScalarStructure::OTHER];	//save minimum potential energy
      app->energies.clear();
      calculateForces();
      //transfer the real average force, Note: force fields must be identical
      if(!instForce){
        for( unsigned int i=0;i < app->positions.size(); i++) (*myForces)[i] = myBottomNormalMode->tempV3DBlk[i];
      }
      (app->energies)[ScalarStructure::OTHER] = minPotEnergy;			//restore minimum potential energy
      //###########################################################################
      //
      doHalfKick();
      //
      postStepModify();
    }	
    //####diagnostics
    //output modes?
    if(modeOutput != ""){
        //get modes
        modeSpaceProj(tmpC, &app->positions, ex0);
        //Output modes for analysis
        ofstream myFile;
        myFile.open(modeOutput.c_str(),ofstream::app);
        myFile.precision(10);
        for(int ii=0;ii<_rfM-1;ii++) myFile << tmpC[ii] << ", ";
        myFile << tmpC[_rfM-1] << endl; //last
        //close file
        myFile.close();
    }
    //####
    //fix time
    app->topology->time = actTime;
    
    return numTimesteps;
  }