//--------------------------------------------------------- // init_filter // sets up the time filtering operations in all objects //--------------------------------------------------------- void ATC_CouplingEnergy::init_filter() { TimeIntegrator::TimeIntegrationType timeIntegrationType = timeIntegrators_[TEMPERATURE]->time_integration_type(); if (timeFilterManager_.end_equilibrate()) { if (timeIntegrationType==TimeIntegrator::GEAR) { if (equilibriumStart_) { if (atomicRegulator_->regulator_target()==AtomicRegulator::DYNAMICS) { // based on FE equation DENS_MAT vdotflamMat(-2.*(nodalAtomicFields_[TEMPERATURE].quantity())); // note 2 is for 1/2 vdotflam addition atomicRegulator_->reset_lambda_contribution(vdotflamMat); } else { // based on MD temperature equation DENS_MAT vdotflamMat(-1.*(nodalAtomicFields_[TEMPERATURE].quantity())); atomicRegulator_->reset_lambda_contribution(vdotflamMat); } } } else if (timeIntegrationType==TimeIntegrator::FRACTIONAL_STEP) { if (equilibriumStart_) { DENS_MAT powerMat(-1.*(nodalAtomicFields_[TEMPERATURE].quantity())); atomicRegulator_->reset_lambda_contribution(powerMat); } } } }
void ATC_TransferThermal::init_filter() { // NOTE assume total filtered time derivatives are zero ATC_Transfer::init_filter(); if (integrationType_==TimeIntegrator::VERLET) { // initialize restricted fields // NOTE: comment in to initialize fieldRateNdOld_ to current time deriviative // current assumption is that it is zero //DenseMatrix<double> atomicPower(nLocal_,1); //compute_atomic_power(atomicPower, // lammpsInterface_->vatom(), // lammpsInterface_->fatom()); //restrict(atomicPower,fieldRateNdOld_[TEMPERATURE]); //fieldRateNdOld *= 2.; DENS_MAT atomicKineticEnergy(nLocal_,1); DENS_MAT nodalAtomicTemperature(nNodes_,1); compute_atomic_temperature(atomicKineticEnergy, lammpsInterface_->vatom()); restrict(atomicKineticEnergy, nodalAtomicTemperature); nodalAtomicTemperature *= 2.; fieldNdOld_[TEMPERATURE] = nodalAtomicTemperature; } if (timeFilterManager_.end_equilibrate()) { // set up correct initial lambda power to enforce initial temperature rate of 0 if (integrationType_==TimeIntegrator::VERLET) { if (equilibriumStart_) { if (thermostat_.get_thermostat_type()==Thermostat::FLUX) { // based on FE equation DENS_MAT vdotflamMat(-2.*fieldRateNdFiltered_[TEMPERATURE]); // note 2 is for 1/2 vdotflam addition thermostat_.reset_lambda_power(vdotflamMat); } else { // based on MD temperature equation DENS_MAT vdotflamMat(-1.*fieldRateNdFiltered_[TEMPERATURE]); thermostat_.reset_lambda_power(vdotflamMat); } } } } else { // set up space for filtered atomic power // should set up all data structures common to equilibration and filtering, // specifically filtered atomic power if (integrationType_==TimeIntegrator::FRACTIONAL_STEP) { dot_atomicTemp.reset(nNodes_,1); dot_atomicTempOld.reset(nNodes_,1); dot_dot_atomicTemp.reset(nNodes_,1); dot_dot_atomicTempOld.reset(nNodes_,1); } } }