lammps/lib/atc/ThermalTimeIntegrator.h

349 lines
9.9 KiB
C++

#ifndef THERMAL_TIME_INTEGRATOR_H
#define THERMAL_TIME_INTEGRATOR_H
// ATC headers
#include "TimeIntegrator.h"
namespace ATC {
// forward declarations
class ThermalIntegrationMethod;
class AtfShapeFunctionRestriction;
/**
* @class ThermalTimeIntegrator
* @brief Class for various time integrators for thermal FE quantities
* (handles parsing and stores basic data structures)
*/
class ThermalTimeIntegrator : public TimeIntegrator {
public:
// constructor
ThermalTimeIntegrator(ATC_Coupling * atc,
TimeIntegrationType timeIntegrationType);
// destructor
virtual ~ThermalTimeIntegrator(){};
/** parser/modifier */
virtual bool modify(int narg, char **arg);
/** create objects to implement requested numerical method */
virtual void construct_methods();
/** pack persistent fields */
virtual void pack_fields(RESTART_LIST & data);
// Member data access
/** access for filtered atomic power */
DENS_MAN & nodal_atomic_power_filtered(){return nodalAtomicPowerFiltered_;};
/** access for filtered atomic energy */
// note: nodalAtomicEnergy_ should always be reset as it tracks the original energy + MD evolution
DENS_MAN & nodal_atomic_energy_filtered(){return nodalAtomicEnergyFiltered_;};
protected:
/** filtered atomic power */
DENS_MAN nodalAtomicPowerFiltered_;
/** filtered atomic energy due initial conditions and MD updates */
DENS_MAN nodalAtomicEnergyFiltered_;
private:
// DO NOT define this
ThermalTimeIntegrator();
};
/**
* @class ThermalIntegrationMethod
* @brief Class for various time integration methods for thermal FE quantities
*/
class ThermalIntegrationMethod : public TimeIntegrationMethod {
public:
// constructor
ThermalIntegrationMethod(ThermalTimeIntegrator * thermalTimeIntegrator);
// destructor
virtual ~ThermalIntegrationMethod() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** checks to see if first RHS computation is needed */
virtual bool has_final_predictor() {return true;};
protected:
/** time filtering object */
TimeFilter * timeFilter_;
/** finite element temperature field */
DENS_MAN & temperature_;
/** finite element temperature Rate of change (Roc) */
DENS_MAN & temperatureRoc_;
/** finite element temperature 2nd time derivative */
DENS_MAN & temperature2Roc_;
/** atomic nodal temperature field for output */
DENS_MAN & nodalAtomicTemperatureOut_;
/** interscale operator for instantaneous temperature */
DENS_MAN * nodalAtomicTemperature_;
/** right-hand side of temperature equation */
DENS_MAN & temperatureRhs_;
/** finite element power from atomic quantities for output */
DENS_MAN & nodalAtomicPowerOut_;
/** workspace for gear integration */
DENS_MAT _temperatureResidual_;
private:
// DO NOT define this
ThermalIntegrationMethod();
};
/**
* @class ThermalTimeIntegratorGear
* @brief Class uses 3rd order Gear integration for time integration of FE temperature field
*/
class ThermalTimeIntegratorGear : public ThermalIntegrationMethod {
public:
// constructor
ThermalTimeIntegratorGear(ThermalTimeIntegrator * ThermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorGear() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** parallel post-processing operations pre-output */
virtual void post_process();
/** finalize state of some unfiltered variables */
virtual void finish();
protected:
/** filtered atomic power */
DENS_MAN & nodalAtomicPowerFiltered_;
/** instantaneous atomic power */
AtfShapeFunctionRestriction * nodalAtomicPower_;
private:
// DO NOT define this
ThermalTimeIntegratorGear();
};
/**
* @class ThermalTimeIntegratorGearFiltered
* @brief Gear integration for FE thermal quantities with time filtering
*/
class ThermalTimeIntegratorGearFiltered : public ThermalTimeIntegratorGear {
public:
// constructor
ThermalTimeIntegratorGearFiltered(ThermalTimeIntegrator * thermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorGearFiltered(){};
// time step methods, corresponding to ATC_Transfer
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** third part of post_final_integrate */
virtual void post_final_integrate3(double dt);
/** parallel post-processing operations pre-output */
virtual void post_process();
protected:
/** finite element temperature 3rd time derivative */
DENS_MAN & temperature3Roc_;
private:
// DO NOT define this
ThermalTimeIntegratorGearFiltered();
};
/**
* @class ThermalTimeIntegratorFractionalStep
* @brief Class for using 3rd order Gear integration to update FE contributions to temperature field
* (Uses same update for the atomic contributions to the finite
* elements as are used by the LAMMPS integration scheme
* for the atomic velocities and positions, i.e. Verlet.)
*/
class ThermalTimeIntegratorFractionalStep : public ThermalIntegrationMethod {
public:
// constructor
ThermalTimeIntegratorFractionalStep(ThermalTimeIntegrator * ThermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorFractionalStep() {};
/** create and get necessary transfer operators */
virtual void construct_transfers();
/** pre time integration initialization of data */
virtual void initialize();
// time step methods, corresponding to ATC_Transfer
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt);
/** second part of pre_initial_integrate */
virtual void pre_initial_integrate2(double dt);
/** first part of pre_final_integrate */
virtual void pre_final_integrate1(double dt);
/** first part of post_final_integrate */
virtual void post_final_integrate1(double dt);
/** third part of post_final_integrate */
virtual void post_final_integrate3(double dt);
/** checks to see if first RHS computation is needed */
virtual bool has_final_corrector() {return true;};
/** post-process data */
virtual void post_process();
/** finalize state of some unfiltered variables */
virtual void finish();
protected:
// methods
/** applies Gear predictor */
virtual void apply_gear_predictor(double dt);
/** applies Gear corrector */
virtual void apply_gear_corrector(const DENS_MAT & R_theta,
double dt);
/** compute old energy and temperature for use in time integrators */
virtual void compute_old_time_data();
/** computes temperature change associated with atomic energy change */
virtual void compute_temperature_delta(const DENS_MAT & atomicEnergyDelta,
double dt);
// data
/** filtered restricted atomic energy */
DENS_MAN & nodalAtomicEnergyFiltered_;
/** filtered atomic power, for post-processing only */
DENS_MAN & nodalAtomicPowerFiltered_;
/** change in FE temperature due to atomic motions */
DENS_MAN atomicTemperatureDelta_;
/** fractional step auxilliary storage for restricted atomic energy */
DENS_MAN * nodalAtomicEnergy_;
/** power associated with thermostat for post-processing */
DENS_MAT nodalAtomicPower_;
/** restricted atomic energy from previous time step */
DENS_MAN nodalAtomicEnergyOld_;
/** FE atomic temperature contribution from previous time step */
DENS_MAN nodalAtomicTemperatureOld_;
private:
// DO NOT define this
ThermalTimeIntegratorFractionalStep();
};
/**
* @class ThermalTimeIntegratorFractionalStepFiltered
* @brief Class for using filtered results from a 3rd order Gear integration to update FE contributions to temperature field
*/
class ThermalTimeIntegratorFractionalStepFiltered : public ThermalTimeIntegratorFractionalStep {
public:
// constructor
ThermalTimeIntegratorFractionalStepFiltered(ThermalTimeIntegrator * ThermalTimeIntegrator);
// destructor
virtual ~ThermalTimeIntegratorFractionalStepFiltered();
// time step methods, corresponding to ATC_Transfer
/** first part of pre_initial_integrate */
virtual void pre_initial_integrate1(double dt);
/** add output data */
virtual void output(OUTPUT_LIST & outputData);
/** finalize state of some unfiltered variables */
virtual void finish(){};
protected:
// methods
/** applies Gear predictor */
virtual void apply_gear_predictor(double dt);
/** applies Gear corrector */
virtual void apply_gear_corrector(const DENS_MAT & R_theta,
double dt);
/** compute old energy and temperature for use in time integrators */
virtual void compute_old_time_data();
/** computes temperature change associated with atomic energy change */
virtual void compute_temperature_delta(const DENS_MAT & atomicEnergyDelta,
double dt);
// data
/** nodal temperature 3rd time derivative */
DENS_MAN & temperature3Roc_;
private:
// DO NOT define this
ThermalTimeIntegratorFractionalStepFiltered();
};
};
#endif