#include "WeakEquationElectronTemperature.h"
#include "Material.h"
#include <iostream>
#include <fstream>
namespace ATC {
WeakEquationElectronTemperature::WeakEquationElectronTemperature()
: WeakEquation(DYNAMIC_PDE,ELECTRON_TEMPERATURE,1)
{
}
WeakEquationElectronTemperature::~WeakEquationElectronTemperature(void)
{}
void WeakEquationElectronTemperature::E_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT & energy ) const
{
material->electron_thermal_energy(fields, energy);
}
void WeakEquationElectronTemperature::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT & capacity ) const
{
material->electron_heat_capacity(fields, capacity);
}
void WeakEquationElectronTemperature::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
material->electron_heat_flux(fields, grad_fields, flux);
}
bool WeakEquationElectronTemperature::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
DENS_MAT exchange_flux;
bool has = material->electron_phonon_exchange(fields, exchange_flux);
if (has) flux = -1.*exchange_flux;
return has;
}
WeakEquationElectronTemperatureJouleHeating::WeakEquationElectronTemperatureJouleHeating()
: WeakEquationElectronTemperature()
{
eV2E_ = ATC::LammpsInterface::instance()->qv2e();
int nSD = 3;
_J_.assign(nSD, DENS_MAT());
_E_.assign(nSD, DENS_MAT());
}
WeakEquationElectronTemperatureJouleHeating::~WeakEquationElectronTemperatureJouleHeating(void)
{}
void WeakEquationElectronTemperatureJouleHeating::E_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &energy) const
{
WeakEquationElectronTemperature::E_integrand(fields, grad_fields, material, energy);
}
void WeakEquationElectronTemperatureJouleHeating::M_integrand(
const FIELD_MATS &fields,
const Material * material,
DENS_MAT &capacity) const
{
WeakEquationElectronTemperature::M_integrand(fields, material, capacity);
}
void WeakEquationElectronTemperatureJouleHeating::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
WeakEquationElectronTemperature::B_integrand(fields, grad_fields, material, flux);
}
bool WeakEquationElectronTemperatureJouleHeating::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
WeakEquationElectronTemperature::N_integrand(fields, grad_fields, material, flux);
DENS_MAT jouleHeating;
material->electron_flux (fields, grad_fields, _J_);
material->electric_field(fields, grad_fields, _E_);
jouleHeating = _J_[0].mult_by_element(_E_[0]);
for (DENS_MAT_VEC::size_type i=1; i < _J_.size(); i++)
jouleHeating += _J_[i].mult_by_element(_E_[i]);
jouleHeating *= eV2E_;
flux -= jouleHeating;
return true;
}
WeakEquationElectronTemperatureConvection::WeakEquationElectronTemperatureConvection()
: WeakEquationElectronTemperatureJouleHeating()
{
int nSD = 3;
_convectiveFlux_.assign(nSD, DENS_MAT());
}
WeakEquationElectronTemperatureConvection::~WeakEquationElectronTemperatureConvection(void)
{
}
void WeakEquationElectronTemperatureConvection::B_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT_VEC &flux) const
{
WeakEquationElectronTemperatureJouleHeating::B_integrand(fields, grad_fields, material, flux);
DENS_MAT_VEC convectiveFlux;
material->electron_heat_convection(fields,_convectiveFlux_);
flux[0] += _convectiveFlux_[0];
flux[1] += _convectiveFlux_[1];
flux[2] += _convectiveFlux_[2];
}
bool WeakEquationElectronTemperatureConvection::N_integrand(
const FIELD_MATS &fields,
const GRAD_FIELD_MATS &grad_fields,
const Material * material,
DENS_MAT &flux) const
{
WeakEquationElectronTemperatureJouleHeating::N_integrand(fields, grad_fields, material, flux);
#ifdef TEST
DENS_MAT keExchange;
DENS_MAT capacity;
material->electron_heat_capacity(fields, capacity);
capacity *= 2./3.;
FIELD_MATS::const_iterator tField = fields.find(ELECTRON_TEMPERATURE);
const DENS_MAT & temperature = tField->second;
GRAD_FIELD_MATS::const_iterator velocityGradients = grad_fields.find(ELECTRON_VELOCITY);
const DENS_MAT_VEC & dv = velocityGradients->second;
CLON_VEC vxx(dv[0],CLONE_COL,0);
CLON_VEC vyy(dv[1],CLONE_COL,1);
CLON_VEC vzz(dv[2],CLONE_COL,2);
keExchange = vxx + vyy + vzz;
keExchange *= temperature;
keExchange *= capacity;
flux -= keExchange;
#endif
return true;
}
};