forked from lijiext/lammps
252 lines
9.4 KiB
C++
252 lines
9.4 KiB
C++
// ATC transfer headers
|
|
#include "SpeciesTimeIntegrator.h"
|
|
#include "TransferOperator.h"
|
|
#include "ATC_CouplingMass.h"
|
|
#include "TimeFilter.h"
|
|
#include "LammpsInterface.h"
|
|
#include "ATC_Error.h"
|
|
#include "PerAtomQuantityLibrary.h"
|
|
#include "AtomToMoleculeTransfer.h"
|
|
#include "MoleculeSet.h"
|
|
|
|
using std::pair;
|
|
using std::map;
|
|
using std::string;
|
|
|
|
namespace ATC {
|
|
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
// Class SpeciesTimeIntegrator
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
|
|
//--------------------------------------------------------
|
|
// Constructor
|
|
// Grab data from ATC
|
|
//--------------------------------------------------------
|
|
SpeciesTimeIntegrator::SpeciesTimeIntegrator(ATC_CouplingMass * atc,
|
|
TimeIntegrationType timeIntegrationType) :
|
|
TimeIntegrator(atc, timeIntegrationType),
|
|
moleculeIds_(atc->molecule_ids())
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// modify
|
|
// parses inputs and modifies state of the filter
|
|
//--------------------------------------------------------
|
|
bool SpeciesTimeIntegrator::modify(int /* narg */, char ** /* arg */)
|
|
{
|
|
bool match = false;
|
|
|
|
// no parsing needed
|
|
|
|
return match;
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// construct_methods
|
|
// creates algorithm objects
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegrator::construct_methods()
|
|
{
|
|
if (atc_->reset_methods()) {
|
|
if (timeIntegrationMethod_) delete timeIntegrationMethod_;
|
|
if (timeFilterManager_->need_reset()) {
|
|
switch (timeIntegrationType_) {
|
|
case FRACTIONAL_STEP: {
|
|
timeFilter_ = timeFilterManager_->construct(TimeFilterManager::EXPLICIT_IMPLICIT);
|
|
atc_->set_mass_mat_time_filter(SPECIES_CONCENTRATION,TimeFilterManager::EXPLICIT);
|
|
break;
|
|
}
|
|
default:
|
|
throw ATC_Error("Unknown time integration type in SpeciesTimeIntegrator::Initialize()");
|
|
}
|
|
}
|
|
if (timeFilterManager_->filter_dynamics()) {
|
|
switch (timeIntegrationType_) {
|
|
case FRACTIONAL_STEP: {
|
|
timeIntegrationMethod_ = new SpeciesTimeIntegratorFractionalStepFiltered(this,
|
|
moleculeIds_);
|
|
}
|
|
default:
|
|
throw ATC_Error("Unknown time integration type in SpeciesTimeIntegrator::Initialize()");
|
|
}
|
|
}
|
|
else {
|
|
timeIntegrationMethod_ = new SpeciesTimeIntegratorFractionalStep(this,
|
|
moleculeIds_);
|
|
}
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// pack_fields
|
|
// add persistent variables to data list
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegrator::pack_fields(RESTART_LIST & data)
|
|
{
|
|
|
|
TimeIntegrator::pack_fields(data);
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
// Class SpeciesIntegrationMethod
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
|
|
//--------------------------------------------------------
|
|
// Constructor
|
|
// Grab data from ATC
|
|
//--------------------------------------------------------
|
|
SpeciesIntegrationMethod::SpeciesIntegrationMethod(SpeciesTimeIntegrator * speciesTimeIntegrator,
|
|
const map<string,pair<MolSize,int> > & moleculeIds) :
|
|
TimeIntegrationMethod(speciesTimeIntegrator),
|
|
timeFilter_(speciesTimeIntegrator->time_filter()),
|
|
massDensity_(atc_->field(MASS_DENSITY)),
|
|
nodalAtomicMassDensityOut_(atc_->nodal_atomic_field(MASS_DENSITY)),
|
|
nodalAtomicMassDensity_(NULL),
|
|
speciesConcentration_(atc_->field(SPECIES_CONCENTRATION)),
|
|
nodalAtomicSpeciesConcentration_(NULL),
|
|
nodalAtomicSpeciesConcentrationFiltered_(speciesTimeIntegrator->nodal_atomic_species_concentration_filtered()),
|
|
moleculeIds_(moleculeIds)
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// construct_transfers
|
|
// sets up all the necessary transfer operators
|
|
//--------------------------------------------------------
|
|
void SpeciesIntegrationMethod::construct_transfers()
|
|
{
|
|
InterscaleManager & interscaleManager = atc_->interscale_manager();
|
|
|
|
// get existing data
|
|
nodalAtomicMassDensity_ = interscaleManager.dense_matrix(field_to_intrinsic_name(MASS_DENSITY));
|
|
if (atc_->has_tracked_species())
|
|
nodalAtomicSpeciesConcentration_ = interscaleManager.dense_matrix(field_to_intrinsic_name(SPECIES_CONCENTRATION));
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
// Class SpeciesTimeIntegratorFractionalStep
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
|
|
//--------------------------------------------------------
|
|
// Constructor
|
|
//--------------------------------------------------------
|
|
SpeciesTimeIntegratorFractionalStep::SpeciesTimeIntegratorFractionalStep(SpeciesTimeIntegrator * speciesTimeIntegrator,
|
|
const map<string,pair<MolSize,int> > & moleculeIds) :
|
|
SpeciesIntegrationMethod(speciesTimeIntegrator,moleculeIds)
|
|
{
|
|
// do nothing
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// initialize
|
|
// initialize all data
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegratorFractionalStep::initialize()
|
|
{
|
|
SpeciesIntegrationMethod::initialize();
|
|
|
|
TimeFilterManager * timeFilterManager = atc_->time_filter_manager();
|
|
if (timeFilterManager->need_reset()) {
|
|
timeFilter_->initialize();
|
|
}
|
|
|
|
if (!timeFilterManager->end_equilibrate()) {
|
|
nodalAtomicSpeciesConcentrationFiltered_ = nodalAtomicSpeciesConcentration_->quantity();
|
|
}
|
|
|
|
|
|
pre_final_integrate1(0.);
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// pre_initial_integrate1
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegratorFractionalStep::pre_initial_integrate1(double dt)
|
|
{
|
|
const DENS_MAT & my(nodalAtomicSpeciesConcentration_->quantity());
|
|
// updated filtered energy using explicit-implicit scheme
|
|
timeFilter_->apply_pre_step1(nodalAtomicSpeciesConcentrationFiltered_.set_quantity(),
|
|
my,dt);
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------
|
|
// pre_final_integrate1
|
|
// first time integration computations
|
|
// before FractionalStep step 2
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegratorFractionalStep::pre_final_integrate1(double /* dt */)
|
|
{
|
|
// Compute MD contribution to FEM equation
|
|
|
|
|
|
massDensity_ = nodalAtomicMassDensity_->quantity();
|
|
speciesConcentration_ = nodalAtomicSpeciesConcentration_->quantity();
|
|
atc_->set_fixed_nodes();
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// post_final_integrate2
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegratorFractionalStep::post_final_integrate2(double dt)
|
|
{
|
|
|
|
timeFilter_->apply_post_step1(
|
|
nodalAtomicSpeciesConcentrationFiltered_.set_quantity(),
|
|
nodalAtomicSpeciesConcentration_->quantity(),dt);
|
|
speciesConcentration_ = nodalAtomicSpeciesConcentrationFiltered_.quantity();
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// post_process
|
|
// post processing of variables before output
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegratorFractionalStep::post_process()
|
|
{
|
|
|
|
map<string,pair<MolSize,int> >::const_iterator molecule;
|
|
for (molecule = moleculeIds_.begin(); molecule != moleculeIds_.end(); molecule++) {
|
|
DENS_MAN & nodalMoleculeMassDensityOut(atc_->tagged_dens_man(molecule->first));
|
|
DENS_MAN * nodalMoleculeMassDensity((atc_->interscale_manager()).dense_matrix("NodalMoleculeMassDensity"+molecule->first));
|
|
nodalMoleculeMassDensityOut = nodalMoleculeMassDensity->quantity();
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
// Class SpeciesTimeIntegratorFractionalStepFiltered
|
|
//--------------------------------------------------------
|
|
//--------------------------------------------------------
|
|
|
|
//--------------------------------------------------------
|
|
// Constructor
|
|
// Grab data from ATC
|
|
//--------------------------------------------------------
|
|
|
|
SpeciesTimeIntegratorFractionalStepFiltered::SpeciesTimeIntegratorFractionalStepFiltered(
|
|
SpeciesTimeIntegrator * speciesTimeIntegrator,
|
|
const map<string,pair<MolSize,int> > & moleculeIds) :
|
|
SpeciesTimeIntegratorFractionalStep(speciesTimeIntegrator,moleculeIds)
|
|
{
|
|
throw ATC_Error("SpeciesTimeIntegratorFractionalStepFiltered work in progress");
|
|
// do nothing
|
|
}
|
|
//--------------------------------------------------------
|
|
// pre_initial_integrate1
|
|
//--------------------------------------------------------
|
|
void SpeciesTimeIntegratorFractionalStepFiltered::pre_final_integrate1(double /* dt */)
|
|
{
|
|
}
|
|
|
|
};
|