79 _geomFields(geomFields),
80 _electricFields(electricFields),
81 _potentialGradientModel(
_meshes,_electricFields.potential,
82 _electricFields.potential_gradient,_geomFields),
83 _chargeGradientModel (
_meshes, _electricFields.charge,
84 _electricFields.chargeGradient,_geomFields),
85 _initialElectroStaticsNorm(),
86 _initialChargeTransportNorm(),
93 const int numMeshes =
_meshes.size();
94 for (
int n=0; n<numMeshes; n++)
100 _vcMap[mesh.
getID()] = vc;
110 bc->
bcType =
"SpecifiedPotential";
125 const int numMeshes =
_meshes.size();
126 for (
int n=0; n<numMeshes; n++)
138 if (_options.electrostatics_enable){
143 shared_ptr<TArray> pCell(
new TArray(nCells));
144 *pCell = _options[
"initialPotential"];
145 _electricFields.potential.addArray(cells,pCell);
148 shared_ptr<TArray> permCell(
new TArray(nCells));
149 *permCell = vc[
"dielectric_constant"] *
E0_SI ;
151 _electricFields.dielectric_constant.addArray(cells,permCell);
154 if ( vc.
vcType ==
"dielectric"){
155 shared_ptr<TArray> sdCell(
new TArray(nCells));
156 *sdCell = _options[
"initialTotalCharge"]*-
QE;
157 _electricFields.total_charge.addArray(cells,sdCell);
160 shared_ptr<TArray> saCell(
new TArray(nCells));
162 _electricFields.total_charge.addArray(cells,saCell);
165 shared_ptr<PGradArray> gradp(
new PGradArray(nCells));
167 _electricFields.potential_gradient.addArray(cells,gradp);
172 _electricFields.electric_field.addArray(cells,ef);
182 _electricFields.potential_flux.addArray(faces,pFlux);
192 _electricFields.potential_flux.addArray(faces,pFlux);
197 shared_ptr<TArray> sCCell(
new TArray(nCells));
199 _electricFields.speciesConcentration.addArray(cells,sCCell);
201 shared_ptr<TArray> lnSCCell(
new TArray(nCells));
203 _electricFields.lnSpeciesConcentration.addArray(cells,lnSCCell);
205 shared_ptr<PGradArray> gradLnSC(
new PGradArray(nCells));
207 _electricFields.lnSpeciesConcentrationGradient.addArray(cells,gradLnSC);
218 if (_options.chargetransport_enable){
220 if ( vc.
vcType ==
"dielectric" ) {
225 shared_ptr<TArray> cb(
new TArray(nCells));
227 _electricFields.conduction_band.addArray(cells,cb);
230 shared_ptr<TArray> vb(
new TArray(nCells));
232 _electricFields.valence_band.addArray(cells, vb);
237 _electricFields.charge.addArray(cells, ch);
239 if (_options.transient_enable)
241 _electricFields.chargeN1.addArray(cells,dynamic_pointer_cast<ArrayBase>(ch->newCopy()));
242 if (_options.timeDiscretizationOrder > 1)
243 _electricFields.chargeN2.addArray(cells, dynamic_pointer_cast<ArrayBase>(ch->newCopy()));
249 _electricFields.electron_velocity.addArray(cells, vcell);
254 _electricFields.free_electron_capture_cross.addArray(cells, fecr);
259 _electricFields.convectionFlux.addArray(faces, mf);
263 const T diffCoeff = _constants[
"electron_mobility"] *
K_SI * _constants[
"OP_temperature"] /
QE;
264 *diffCell = diffCoeff;
265 _electricFields.diffusivity.addArray(cells,diffCell);
270 _electricFields.zero.addArray(cells,zeroCell);
275 _electricFields.one.addArray(cells,oneCell);
280 _electricFields.chargeGradient.addArray(cells,gradC);
290 _electricFields.chargeFlux.addArray(faces,cFlux);
299 _electricFields.chargeFlux.addArray(faces,cFlux);
305 _electricFields.dielectric_constant.syncLocal();
307 _initialElectroStaticsNorm =
MFRPtr();
308 if (_options.chargetransport_enable)
309 _initialChargeTransportNorm =
MFRPtr();
329 const int numMeshes =
_meshes.size();
330 for (
int n=0; n<numMeshes; n++) {
339 dynamic_cast<VectorTNArray&
>(_electricFields.chargeN1[cells]);
341 dynamic_cast<TArray&
> (_electricFields.total_charge[cells]);
343 if (_options.timeDiscretizationOrder > 1)
346 dynamic_cast<VectorTNArray&
>(_electricFields.chargeN2[cells]);
359 if (vc.
vcType ==
"dielectric"){
360 const TArray& cellVolume =
361 dynamic_cast<const TArray&
> (_geomFields.volume[cells]);
365 for (
int c=0; c<nCells; c++){
366 volumeSum += cellVolume[c];
367 chargeSum += totalcharge[c]*cellVolume[c];
369 _avgCharge = chargeSum/volumeSum;
371 cout <<
"the avergae charge " << _avgCharge << endl;
381 initElectroStaticsLinearization(ls);
385 linearizeElectroStatics(ls);
389 MFRPtr rNorm(_options.getElectroStaticsLinearSolver().solve(ls));
391 if (!_initialElectroStaticsNorm) _initialElectroStaticsNorm = rNorm;
393 _options.getElectroStaticsLinearSolver().cleanup();
399 updateElectricField();
401 if (_options.chargetransport_enable){
403 updateElectronVelocity();
405 updateConvectionFlux();
416 initChargeTransportLinearization(ls);
420 linearizeChargeTransport(ls);
424 MFRPtr rNorm(_options.getChargeTransportLinearSolver().solve(ls));
426 if (!_initialChargeTransportNorm) _initialChargeTransportNorm = rNorm;
428 _options.getChargeTransportLinearSolver().cleanup();
440 const int numMeshes =
_meshes.size();
441 for (
int n=0; n<numMeshes; n++)
448 ls.
getX().
addArray(tIndex,_electricFields.potential.getArrayPtr(cells));
462 ls.
getX().
addArray(fIndex,_electricFields.potential_flux.getArrayPtr(faces));
479 ls.
getX().
addArray(fIndex,_electricFields.potential_flux.getArrayPtr(faces));
495 const int numMeshes =
_meshes.size();
496 for (
int n=0; n<numMeshes; n++)
508 ls.
getX().
addArray(cIndex,_electricFields.charge.getArrayPtr(cells));
522 ls.
getX().
addArray(fIndex,_electricFields.chargeFlux.getArrayPtr(faces));
538 ls.
getX().
addArray(fIndex,_electricFields.chargeFlux.getArrayPtr(faces));
554 _potentialGradientModel.compute();
558 shared_ptr<Discretization>
560 _electricFields.potential,
561 _electricFields.dielectric_constant,
562 _electricFields.potential_gradient,
563 _constants[
"dielectric_thickness"]));
564 discretizations.push_back(dd);
566 shared_ptr<Discretization>
570 _electricFields.potential,
571 _electricFields.total_charge
573 discretizations.push_back(sd);
575 if(_options.ibm_enable){
576 shared_ptr<Discretization>
578 (
_meshes,_geomFields,_electricFields.potential));
579 discretizations.push_back(ibm);
582 if(_options.ButlerVolmer)
585 for (
int n=0; n<
_meshes.size(); n++)
589 const TArray& speciesConc =
dynamic_cast<const TArray&
>(_electricFields.speciesConcentration[cells]);
590 TArray& lnSpeciesConc =
dynamic_cast<TArray&
>(_electricFields.lnSpeciesConcentration[cells]);
591 for (
int c=0; c<cells.
getCount(); c++)
593 T CellConc = speciesConc[c];
596 cout <<
"Error: Cell Concentration <= 0 MeshID: " << n <<
" CellNum: " << c << endl;
599 lnSpeciesConc[c] = log(CellConc);
605 _electricFields.lnSpeciesConcentrationGradient,_geomFields);
606 lnSpeciesGradientModel.
compute();
609 shared_ptr<Discretization>
611 _electricFields.potential,
612 _electricFields.dielectric_constant,
613 _electricFields.lnSpeciesConcentration,
614 _electricFields.lnSpeciesConcentrationGradient,
615 _options[
"BatteryElectrolyteMeshID"]));
616 discretizations.push_back(bedd);
628 const int numMeshes =
_meshes.size();
649 for (
int n=0; n<numMeshes; n++)
659 if (_options.ButlerVolmer)
661 bool Cathode =
false;
663 if (n == _options[
"ButlerVolmerCathodeShellMeshID"])
667 else if (n == _options[
"ButlerVolmerAnodeShellMeshID"])
672 _electricFields.potential,
673 _electricFields.speciesConcentration,
674 _options[
"ButlerVolmerRRConstant"],
675 _options[
"Interface_A_coeff"],
676 _options[
"Interface_B_coeff"],
686 _options[
"Interface_B_coeff"],
687 _electricFields.potential);
696 for (
int n=0; n<numMeshes; n++)
705 const int nFaces = faces.
getCount();
711 _electricFields.potential,
712 _electricFields.potential_flux,
715 if (bc.
bcType ==
"SpecifiedPotential")
718 for(
int f=0; f<nFaces; f++)
720 gbc.applyDirichletBC(f, bT[f]);
723 else if (bc.
bcType ==
"SpecifiedPotentialFlux")
725 const T specifiedFlux(bc[
"specifiedPotentialFlux"]);
726 gbc.applyNeumannBC(specifiedFlux);
728 else if (bc.
bcType ==
"Symmetry")
731 gbc.applyNeumannBC(zeroFlux);
733 else if (bc.
bcType ==
"SpecialDielectricBoundary")
737 const T dielectric_thickness = _constants[
"dielectric_thickness"];
738 const T dielectric_constant = _constants[
"dielectric_constant"] *
E0_SI;
739 const T coeff = dielectric_constant / dielectric_thickness;
744 for(
int f=0; f<nFaces; f++)
745 gbc.applyDielectricInterfaceBC(f, coeff, bT[f], src);
760 _electricFields.potential,
761 _electricFields.potential_flux,
773 _chargeGradientModel.compute();
777 if (_options.tunneling_enable){
778 shared_ptr<Discretization>
781 _electricFields.charge,
782 _electricFields.conduction_band,
787 discretizations.push_back(tnd);
790 if (_options.injection_enable){
791 shared_ptr<Discretization>
794 _electricFields.charge,
795 _electricFields.electric_field,
796 _electricFields.conduction_band,
799 discretizations.push_back(inj);
802 if (_options.emission_enable){
803 shared_ptr<Discretization>
806 _electricFields.charge,
807 _electricFields.electric_field,
809 discretizations.push_back(em);
812 if (_options.capture_enable){
813 shared_ptr<Discretization>
816 _electricFields.charge,
817 _electricFields.free_electron_capture_cross,
819 discretizations.push_back(capt);
823 if (_options.trapbandtunneling_enable){
824 shared_ptr<Discretization>
827 _electricFields.charge,
828 _electricFields.electric_field,
829 _electricFields.conduction_band,
831 discretizations.push_back(tbt);
836 if (_options.diffusion_enable){
837 shared_ptr<Discretization>
840 _electricFields.charge,
841 _electricFields.diffusivity,
842 _electricFields.chargeGradient));
843 discretizations.push_back(dd);
847 if (_options.drift_enable){
848 shared_ptr<Discretization>
851 _electricFields.charge,
852 _electricFields.convectionFlux,
853 _constants[
"nTrap"]));
854 discretizations.push_back(cd);
857 if (_options.transient_enable)
859 shared_ptr<Discretization>
862 _electricFields.charge,
863 _electricFields.chargeN1,
864 _electricFields.chargeN2,
866 _options[
"timeStep"]));
867 discretizations.push_back(td);
878 if (_options.diffusion_enable || _options.drift_enable){
879 const int numMeshes =
_meshes.size();
880 for (
int n=0; n<numMeshes; n++)
894 _electricFields.charge,
895 _electricFields.chargeFlux,
898 VectorTN zero(VectorTN::getZero());;
901 if (bc.
bcType ==
"Symmetry")
903 gbc.applyDirichletBC(zero);
905 gbc.applyDirichletBC(zero);
915 _electricFields.charge,
916 _electricFields.chargeFlux,
934 if(_options.electrostatics_enable){
936 for(
int n=0; n<niter; n++)
938 MFRPtr eNorm = solveElectroStatics();
941 _initialElectroStaticsNorm->setMax(*eNorm);
943 MFRPtr eNormRatio(eNorm->normalize(*_initialElectroStaticsNorm));
946 if (_options.printNormalizedResiduals)
947 cout << _niters <<
": " << *eNormRatio <<
";" << endl;
949 cout << _niters <<
": " << *eNorm <<
";" << endl;
953 if ( MPI::COMM_WORLD.Get_rank() == 0 ){
954 if (_options.printNormalizedResiduals)
955 cout << _niters <<
": " << *eNormRatio <<
";" << endl;
957 cout << _niters <<
": " << *eNorm <<
";" << endl;
961 if (*eNormRatio < _options.electrostaticsTolerance ) {
971 if(_options.chargetransport_enable){
972 for(
int n=0; n<niter; n++)
974 generateBandDiagram();
976 MFRPtr cNorm = solveChargeTransport();
979 _initialChargeTransportNorm->setMax(*cNorm);
981 MFRPtr cNormRatio((*cNorm)/(*_initialChargeTransportNorm));
983 if (_options.printNormalizedResiduals)
984 cout << _niters <<
": " << *cNormRatio << endl;
986 cout << _niters <<
": " << *cNorm << endl;
988 if (*cNormRatio < _options.chargetransportTolerance){
1003 _potentialGradientModel.compute();
1005 const int numMeshes =
_meshes.size();
1006 for (
int n=0; n<numMeshes; n++)
1012 const PGradArray& potential_gradient =
dynamic_cast<const PGradArray&
> (_electricFields.potential_gradient[cells]);
1014 for(
int c=0; c<nCells; c++){
1015 electric_field[c][0] = -potential_gradient[c][0];
1016 electric_field[c][1] = -potential_gradient[c][1];
1017 electric_field[c][2] = -potential_gradient[c][2];
1025 const int numMeshes =
_meshes.size();
1026 for (
int n=0; n<numMeshes; n++)
1033 const T electron_mobility = _constants[
"electron_mobility"];
1034 const T electron_saturation_velocity = _constants[
"electron_saturation_velocity"];
1037 for(
int c=0; c<nCells; c++){
1038 VectorT3 vel = electron_mobility * electric_field[c];
1039 if (
mag(vel) < electron_saturation_velocity ){
1040 electron_velocity[c] = - electron_mobility * electric_field[c];
1043 electron_velocity[c] = - electron_saturation_velocity * (electric_field[c] /
mag(electric_field[c]));
1052 const int numMeshes =
_meshes.size();
1053 for (
int n=0; n<numMeshes; n++)
1058 const int nFaces = faces.
getCount();
1060 TArray& convFlux =
dynamic_cast<TArray&
> (_electricFields.convectionFlux[faces]);
1064 for (
int f=0; f<nFaces; f++){
1065 const int c0 = faceCells(f, 0);
1066 const int c1 = faceCells(f, 1);
1067 convFlux[f] = 0.5 * (
dot(vel[c0], faceArea[f]) +
dot(vel[c1], faceArea[f]));
1074 const int nFaces = faces.
getCount();
1075 TArray& convFlux =
dynamic_cast<TArray&
> (_electricFields.convectionFlux[faces]);
1079 if(bc.
bcType ==
"Symmetry")
1084 for(
int f=0; f<nFaces; f++){
1085 const int c0 = faceCells(f,0);
1086 convFlux[f] =
dot(vel[c0], faceArea[f]);
1097 const int numMeshes =
_meshes.size();
1098 for (
int n=0; n<numMeshes; n++)
1108 const T& dielectric_ionization = _constants[
"dielectric_ionization"];
1109 const T& dielectric_bandgap = _constants[
"dielectric_bandgap"];
1110 const TArray& potential =
dynamic_cast<const TArray&
> (_electricFields.potential[cells]);
1112 TArray& conduction_band =
dynamic_cast< TArray&
> (_electricFields.conduction_band[cells]);
1113 TArray& valence_band =
dynamic_cast< TArray&
> (_electricFields.valence_band[cells]);
1115 if (vc.
vcType ==
"dielectric"){
1116 for(
int c=0; c<nCells; c++){
1117 conduction_band[c] = -(dielectric_ionization + potential[c]);
1118 valence_band[c] = conduction_band[c] - dielectric_bandgap;
1121 else if (vc.
vcType ==
"air"){
1122 for(
int c=0; c<nCells; c++){
1123 conduction_band[c] = -(dielectric_ionization + potential[c]) + 2;
1124 valence_band[c] = conduction_band[c] - dielectric_bandgap - 4;
1138 const T membrane_workfunction = _constants[
"membrane_workfunction"];
1139 const T substrate_workfunction = _constants[
"substrate_workfunction"];
1140 const T dielectric_thickness = _constants[
"dielectric_thickness"];
1141 const T optical_dielectric_constant = _constants[
"optical_dielectric_constant"];
1142 const T dielectric_ionization = _constants[
"dielectric_ionization"];
1143 const T temperature = _constants[
"OP_temperature"];
1144 const T electron_effmass = _constants[
"electron_effmass"];
1145 const T poole_frenkel_emission_frequency = _constants[
"poole_frenkel_emission_frequency"];
1146 const int normal = _constants[
"normal_direction"];
1147 const int nTrap = _constants[
"nTrap"];
1148 vector<T> electron_trapdensity = _constants.electron_trapdensity;
1149 vector<T> electron_trapdepth = _constants.electron_trapdepth;
1151 if (
int(electron_trapdensity.size()) != nTrap ||
int(electron_trapdepth.size()) != nTrap){
1155 T effefield = (membrane_workfunction - substrate_workfunction) / dielectric_thickness;
1157 T alpha =
sqrt(
QE / (
PI *
E0_SI * optical_dielectric_constant));
1159 const int numMeshes =
_meshes.size();
1161 for (
int n=0; n<numMeshes; n++)
1165 if (vc.
vcType ==
"dielectric"){
1172 VectorTNArray& free_electron_capture_cross =
dynamic_cast<VectorTNArray&
> (_electricFields.free_electron_capture_cross[cells]);
1180 if (_options.timeDiscretizationOrder > 1){
1181 chargeN2 = &(
dynamic_cast<VectorTNArray&
> (_electricFields.chargeN2[cells]));
1184 for(
int c=0; c<nCells; c++)
1187 T fermilevel = -substrate_workfunction+effefield*cellCentroid[c][normal];
1190 for (
int i=0; i<nTrap; i++){
1192 energy = -dielectric_ionization - electron_trapdepth[i];
1194 charge[c][i] = electron_trapdensity[i] *
FermiFunction(energy, fermilevel, temperature);
1195 chargeN1[c][i] = charge[c][i];
1197 if (_options.timeDiscretizationOrder > 1)
1198 (*chargeN2)[c][i] = charge[c][i];
1200 energy = -dielectric_ionization;
1202 charge[c][nTrap] += electron_trapdensity[i] *
FermiFunction(energy, fermilevel, temperature);
1203 chargeN1[c][nTrap] = charge[c][nTrap];
1206 if (_options.timeDiscretizationOrder > 1)
1207 (*chargeN2)[c][nTrap] = charge[c][nTrap];
1210 for (
int i=0; i<nTrap; i++){
1211 T expt = (electron_trapdepth[i] - alpha *
sqrt(
fabs(effefield))) *
QE / (
K_SI*temperature);
1212 T beta = exp(-expt);
1213 T velocity =
sqrt(8 *
K_SI * temperature / (
PI *
ME * electron_effmass));
1215 free_electron_capture_cross[c][i] = charge[c][i] * poole_frenkel_emission_frequency * beta;
1216 free_electron_capture_cross[c][i] /= (velocity*(electron_trapdensity[i]-charge[c][i])*charge[c][nTrap]);
1231 dynamic_cast<const TArray&
>(_electricFields.potential[solid]);
1233 const int numMeshes =
_meshes.size();
1234 for (
int n=0; n<numMeshes; n++)
1243 const IMatrix& mIC =
1244 dynamic_cast<const IMatrix&
>
1245 (*_geomFields._interpolationMatrices[key1]);
1248 const IMatrix& mIP =
1249 dynamic_cast<const IMatrix&
>
1250 (*_geomFields._interpolationMatrices[key2]);
1255 dynamic_cast<const TArray&
>(_electricFields.potential[cells]);
1262 mIC.multiplyAndAdd(*ibP,cP);
1263 mIP.multiplyAndAdd(*ibP,sP);
1265 _electricFields.potential.addArray(ibFaces,ibP);
1279 const int nSolidFaces = solidFaces.
getCount();
1281 updateElectricField();
1283 boost::shared_ptr<VectorT3Array>
1288 _electricFields.force.addArray(solidFaces,forcePtr);
1291 dynamic_cast<const VectorT3Array&
>(_geomFields.area[solidFaces]);
1293 const TArray& solidFaceAreaMag =
1294 dynamic_cast<const TArray&
>(_geomFields.areaMag[solidFaces]);
1300 const int numMeshes =
_meshes.size();
1301 for (
int n=0; n<numMeshes; n++)
1310 dynamic_cast<const VectorT3Array&
> (_electricFields.electric_field[cells]);
1312 const TArray& dielectric_constant =
1313 dynamic_cast<const TArray&
>(_electricFields.dielectric_constant[cells]);
1322 const IMatrix& mIC =
dynamic_cast<const IMatrix&
>
1323 (*_geomFields._interpolationMatrices[key1]);
1325 const Array<T>& iCoeffs = mIC.getCoeff();
1327 for(
int f=0; f<solidFaces.
getCount(); f++)
1332 for(
int nc = sFCRow[f]; nc<sFCRow[f+1]; nc++) {
1333 const int c = sFCCol[nc];
1334 const T coeff = iCoeffs[nc];
1335 T efmag =
mag(electric_field[c]);
1337 forceSign =
dot(electric_field[c], solidFaceArea[f]);
1339 if (
fabs(forceSign) > 0.0)
1340 forceSign /=
fabs(forceSign);
1345 forceMag += 0.5 * coeff* dielectric_constant[c] * efmag * efmag * forceSign;
1350 const VectorT3& Af = solidFaceArea[f];
1351 force[f] += Af * forceMag;
1354 force[f] /= solidFaceAreaMag[f];
1364 foreach(
typename ElectricBCMap::value_type& pos, _bcMap)
1366 cout <<
"Face Group " << pos.first <<
":" << endl;
1367 cout <<
" bc type " << pos.second->bcType << endl;
1370 cout <<
" " << vp.first <<
" " << vp.second.constant << endl;
1383 if (fg.
id == faceGroupId)
1386 const int nFaces = faces.
getCount();
1387 const TArray& potentialFlux =
1388 dynamic_cast<const TArray&
>(_electricFields.potential_flux[faces]);
1389 for(
int f=0; f<nFaces; f++)
1390 r += potentialFlux[f];
1398 if (fg.
id == faceGroupId)
1401 const int nFaces = faces.
getCount();
1402 const TArray& potentialFlux =
1403 dynamic_cast<const TArray&
>(_electricFields.potential_flux[faces]);
1404 for(
int f=0; f<nFaces; f++)
1405 r += potentialFlux[f];
1412 throw CException(
"getPotentialFluxIntegral: invalid faceGroupID");
1416 map<string,shared_ptr<ArrayBase> >&
1422 (*niterArray)[0] = _niters;
1425 if (_initialElectroStaticsNorm)
1428 _initialElectroStaticsNorm->getArrayPtr(_electricFields.potential);
1434 _persistenceData[
"initialElectroStaticsNorm"]=shared_ptr<ArrayBase>(xArray);
1446 _niters = niterArray[0];
1452 _initialElectroStaticsNorm->addArray(_electricFields.potential,r);
1459 flux.push_back(_tunnelCurrentIn);
1460 flux.push_back(_tunnelCurrentOut);
1500 _impl(new
Impl(geomFields,electricFields,meshes))
1542 _impl->updateTime();
1580 return _impl->advance(niter);
1587 _impl->calculateEquilibriumParameters();
1594 _impl->computeIBFacePotential(particles);
1601 return _impl->computeSolidSurfaceForce(particles,
false);
1608 return _impl->getPotentialFluxIntegral(mesh, faceGroupId);
1615 return _impl->computeSolidSurfaceForce(particles,
true);
1619 map<string,shared_ptr<ArrayBase> >&
1622 return _impl->getPersistenceData();
1637 return _impl->getTunnelCurrent();
ElectricModelOptions< T > & getOptions()
const FaceGroupList & getBoundaryFaceGroups() const
const Array< int > & getCol() const
bool isDoubleShell() const
const Array< int > & getRow() const
ElectricFields & _electricFields
shared_ptr< FaceGroup > FaceGroupPtr
Impl(const GeomFields &geomFields, ElectricFields &electricFields, const MeshList &meshes)
Array< TensorNxN > TensorNxNArray
ElectricBCMap & getBCMap()
const StorageSite & getIBFaces() const
ElectricModelConstants< T > & getConstants()
ElectricVCMap & getVCMap()
const CRConnectivity & getConnectivity(const StorageSite &from, const StorageSite &to) const
bool advance(const int niter)
ElectricModelOptions< T > _options
void updateConvectionFlux()
map< string, shared_ptr< ArrayBase > > _persistenceData
T getPotentialFluxIntegral(const Mesh &mesh, const int faceGroupId)
ElectricVC< T > & getVC(const int id)
GradientModel< VectorTN > _chargeGradientModel
const GeomFields & _geomFields
void calculateEquilibriumParameters()
const T FermiFunction(const T &energy, const T &fermilevel, const T &temperature)
ElectricModelOptions< T > & getOptions()
ElectricVC< T > & getVC(const int id)
Array< VectorTN > VectorTNArray
map< string, shared_ptr< ArrayBase > > _persistenceData
ElectricModel(const GeomFields &geomFields, ElectricFields &electricFields, const MeshList &meshes)
T mag(const Vector< T, 3 > &a)
Array< Gradient< T > > PGradArray
vector< T > getTunnelCurrent()
void updateElectricField()
void calculateEquilibriumParameters()
void generateBandDiagram()
T getPotentialFluxIntegral(const Mesh &mesh, const int faceGroupId)
FloatVal< T > getVal(const string varName) const
void updateElectronVelocity()
int getOtherMeshID() const
Tangent sqrt(const Tangent &a)
const CRConnectivity & getAllFaceCells() const
ElectricBC< T > & getBC(const int id)
void computeIBFacePotential(const StorageSite &solid)
ElectricVCMap & getVCMap()
MFRPtr solveElectroStatics()
pair< const Field *, const StorageSite * > ArrayIndex
Gradient< VectorTN > CGradType
ElectricBCMap & getBCMap()
vector< shared_ptr< Discretization > > DiscrList
Vector< double, 3 > VectorD3
const StorageSite & getFaces() const
MFRPtr _initialChargeTransportNorm
const CRConnectivity & getCellCells() const
void computeIBFacePotential(const StorageSite &solid)
const StorageSite & getCells() const
GradientModel< T > _potentialGradientModel
void initElectroStaticsLinearization(LinearSystem &ls)
void applyInterfaceBC(const int f) const
void discretize(const Mesh &mesh, const Mesh &parentMesh, const Mesh &otherMesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
ElectricModelConstants< T > & getConstants()
void initChargeTransportLinearization(LinearSystem &ls)
int getCountLevel1() const
Array< VectorT3 > VectorT3Array
const CRConnectivity & getFaceCells(const StorageSite &site) const
std::map< int, ElectricBC< T > * > ElectricBCMap
MFRPtr solveChargeTransport()
void computeSolidSurfaceForcePerUnitArea(const StorageSite &particles)
Tangent fabs(const Tangent &a)
int getParentMeshID() const
void addMatrix(const Index &rowI, const Index &colI, shared_ptr< Matrix > m)
Array< Gradient< VectorTN > > CGradArray
vector< T > getTunnelCurrent()
void computeSolidSurfaceForce(const StorageSite &solidFaces, bool perUnitArea)
std::map< int, ElectricVC< T > * > ElectricVCMap
virtual map< string, shared_ptr< ArrayBase > > & getPersistenceData()
shared_ptr< MultiFieldReduction > MFRPtr
void addArray(const ArrayIndex &aIndex, shared_ptr< ArrayBase > a)
void linearizeElectroStatics(LinearSystem &ls)
const FaceGroupList & getInterfaceGroups() const
ElectricBC< T > & getBC(const int id)
void linearizeChargeTransport(LinearSystem &ls)
Array< VectorT3 > VectorT3Array
bool advance(const int niter)
ElectricModelConstants< T > _constants
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
void computeSolidSurfaceForce(const StorageSite &particles)
MFRPtr _initialElectroStaticsNorm
map< string, shared_ptr< ArrayBase > > & getPersistenceData()
virtual void linearize(DiscrList &discretizations, const MeshList &meshes, MultiFieldMatrix &matrix, MultiField &x, MultiField &b)
void discretize(const Mesh &mesh, const Mesh &parentMesh, const Mesh &otherMesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
SquareTensor< T, 3 > TensorNxN
pair< const StorageSite *, const StorageSite * > SSPair
MultiFieldMatrix & getMatrix()
vector< Mesh * > MeshList