@@ -315,35 +315,37 @@ void PlasmaPhase::setCollisions()
315315 m_collisions.clear ();
316316 m_collisionRates.clear ();
317317 m_targetSpeciesIndices.clear ();
318+ m_electronCollisionReactionIndices.clear ();
318319
319320 if (shared_ptr<Solution> soln = m_soln.lock ()) {
320- shared_ptr<Kinetics> kin = soln->kinetics ();
321- if (!kin ) {
321+ m_kin = soln->kinetics ();
322+ if (!m_kin ) {
322323 return ;
323324 }
324325
325326 // add collision from the initial list of reactions
326- for (size_t i = 0 ; i < kin ->nReactions (); i ++) {
327- std::shared_ptr<Reaction> R = kin ->reaction (i );
327+ for (size_t j = 0 ; j < m_kin ->nReactions (); j ++) {
328+ std::shared_ptr<Reaction> R = m_kin ->reaction (j );
328329 if (R->rate ()->type () != " electron-collision-plasma" ) {
329330 continue ;
330331 }
331- addCollision (R );
332+ addCollision (j );
332333 }
333334
334335 // register callback when reaction is added later
335336 // Modifying collision reactions is not supported
336- kin ->registerReactionAddedCallback (this , [this , kin ]() {
337- size_t i = kin ->nReactions () - 1 ;
338- if (kin ->reaction (i )->type () == " electron-collision-plasma" ) {
339- addCollision (kin-> reaction (i) );
337+ m_kin ->registerReactionAddedCallback (this , [this ]() {
338+ size_t j = m_kin ->nReactions () - 1 ;
339+ if (m_kin ->reaction (j )->type () == " electron-collision-plasma" ) {
340+ addCollision (j );
340341 }
341342 });
342343 }
343344}
344345
345- void PlasmaPhase::addCollision (std::shared_ptr<Reaction> collision )
346+ void PlasmaPhase::addCollision (size_t j )
346347{
348+ std::shared_ptr<Reaction> collision = m_kin->reaction (j);
347349 size_t i = nCollisions ();
348350
349351 // setup callback to signal updating the cross-section-related
@@ -368,8 +370,11 @@ void PlasmaPhase::addCollision(std::shared_ptr<Reaction> collision)
368370 std::dynamic_pointer_cast<ElectronCollisionPlasmaRate>(collision->rate ()));
369371 m_interp_cs_ready.emplace_back (false );
370372
373+ m_electronCollisionReactionIndices.push_back (j);
374+
371375 // resize parameters
372376 m_elasticElectronEnergyLossCoefficients.resize (nCollisions ());
377+ m_fwd_collision_rate_constants.resize (nCollisions ());
373378}
374379
375380bool PlasmaPhase::updateInterpolatedCrossSection (size_t i)
@@ -464,6 +469,36 @@ void PlasmaPhase::updateElasticElectronEnergyLossCoefficient(size_t i)
464469 m_electronEnergyLevels.pow (3.0 ));
465470}
466471
472+ void PlasmaPhase::updateCollisionRateConstants ()
473+ {
474+ static const int cacheId = m_cache.getId ();
475+ CachedScalar last = m_cache.getScalar (cacheId);
476+
477+ // combine the distribution and energy level number
478+ int stateNum = m_distNum + m_levelNum;
479+
480+ // update only if the reaction rates coefficients have changed
481+ // which depends on the energy distribution, and energy levels
482+ if (!last.validate (stateNum)) {
483+ for (size_t i = 0 ; i < nCollisions (); i++) {
484+ m_fwd_collision_rate_constants[i] =
485+ m_kin->fwdRateConstant (m_electronCollisionReactionIndices[i]);
486+ }
487+ }
488+ }
489+
490+ double PlasmaPhase::inelasticPowerLoss ()
491+ {
492+ updateCollisionRateConstants ();
493+ double rate = 0.0 ;
494+ for (size_t i = 0 ; i < nCollisions (); i++) {
495+ rate += concentration (m_targetSpeciesIndices[i]) *
496+ m_collisionRates[i]->energyLevels ()[0 ] *
497+ m_fwd_collision_rate_constants[i];
498+ }
499+ return Avogadro * ElectronCharge * concentration (m_electronSpeciesIndex) * rate;
500+ }
501+
467502double PlasmaPhase::elasticPowerLoss ()
468503{
469504 updateElasticElectronEnergyLossCoefficients ();
0 commit comments