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; // }
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; }