#ifndef MATERIAL_H #define MATERIAL_H #include #include #include #include "MatrixLibrary.h" #include "ATC_TypeDefs.h" #include "ATC_Error.h" #include "LammpsInterface.h" namespace ATC { class ATC_Transfer; class Stress; class ElectronHeatCapacity; class ElectronHeatFlux; class ElectronFlux; class ElectronPhononExchange; class Material { public: Material(); virtual ~Material() {}; /** this constructor parses material file */ Material(string & tag, fstream & fileId); /** return label */ string label(void) {return tag_;} /** check material has required interfaces */ bool check_registry(const set functionList) const { set::const_iterator itr; for (itr=functionList.begin(); itr!=functionList.end(); itr++) { if (registry_.find(*itr) == registry_.end()) return false; } return true; } /** access to material parameters */ bool get_parameter(const string name, double & value) const { map::const_iterator iter = parameters_.find(name); if ( iter == parameters_.end()) { value = 0.0; return false; } value = iter->second; return true; } /** true if rhs flux is linear (per field) */ bool linear_flux(FieldName name) { return linearFlux_(name); }; /** true if rhs source is linear (per field) */ bool linear_source(FieldName name) { return linearSource_(name); }; /** true if lhs density is constant (per field) */ bool constant_density(FieldName name) { return constantDensity_(name); }; /** each of these is a field function computed at a set of points */ /** if there is only one function it is in the base class ** otherwise, a subsidary class is setup */ /* -----------------------------------------------------------------*/ /** densitities */ /* -----------------------------------------------------------------*/ /** thermal energy */ void thermal_energy(const FIELDS & fields, FIELD & energy); /** heat capacity */ void heat_capacity(const FIELDS & fields, FIELD & capacity); /** thermal energy */ void electron_thermal_energy(const FIELDS & fields, FIELD & energy); /** electron heat capacity */ void electron_heat_capacity(const FIELDS &fields, FIELD &capacity); /** kinetic energy */ void kinetic_energy(const FIELDS & fields, FIELD & energy); /** mass density */ void mass_density(const FIELDS &fields, FIELD &density); /** elastic energy */ void elastic_energy(const FIELDS & fields, const GRAD_FIELDS & gradFields, FIELD & energy); /* -----------------------------------------------------------------*/ /** fluxes */ /* -----------------------------------------------------------------*/ /** heat_flux */ void heat_flux(const FIELDS & fields, const GRAD_FIELDS & gradFields, GRAD_FIELD & heatFlux); /** electron conduction flux */ void electron_heat_flux(const FIELDS &fields, const GRAD_FIELDS &gradFields, GRAD_FIELD &flux); /** stress */ void stress(const FIELDS &fields, const GRAD_FIELDS &gradFields, GRAD_FIELD &stress); /** computes electron flux */ void electron_flux(const FIELDS &fields, const GRAD_FIELDS &gradFields, GRAD_FIELD &flux); /** computes electric displacement */ void electric_displacement(const FIELDS &fields, const GRAD_FIELDS &gradFields, GRAD_FIELD &flux); /** computes electric field */ void electric_field(const FIELDS &fields, const GRAD_FIELDS &gradFields, GRAD_FIELD &flux); /* -----------------------------------------------------------------*/ /** sources */ /* -----------------------------------------------------------------*/ /** electron-phonon exchange flux */ void electron_phonon_exchange(const FIELDS &fields, FIELD &flux); /** computes net generation */ virtual void electron_recombination(const FIELDS &fields, const GRAD_FIELDS &gradFields, FIELD &flux); /** computes drift diffusion charge density */ virtual void charge_density(const FIELDS &fields, const GRAD_FIELDS &gradFields, FIELD &flux); protected: /** material's label */ string tag_; /** dictionary of material parameters */ map parameters_; /** dictionary of instantiated functions */ set registry_; /** per eqn flag of constant density */ Array constantDensity_; /** per eqn flag of linearity/nonlinearity */ Array linearFlux_, linearSource_; /** default heat capacity */ double rhoCp_; /** default mass density */ double rho_; /** heat capacity */ double heatCapacity_; /** electron heat capacity */ ElectronHeatCapacity * electronHeatCapacity_; /** mass density */ double massDensity_; /** charge density */ double chargeDensity_; /** thermal conductivity */ double heatConductivity_; /** electron heat flux */ ElectronHeatFlux * electronHeatFlux_; /** stress */ Stress * stress_; /** electron-phonon exchange */ ElectronPhononExchange * electronPhononExchange_; /** electron heat flux */ ElectronFlux * electronFlux_; /** electric permittivity */ double permittivity_; /** equilibrium carrier density */ double electronEquilibriumDensity_; /** relaxation time */ double electronRecombinationInvTau_; /** uniform donor concentration */ double donorConcentration_; // NOTE only for uniform }; } #endif // Material.h