| 517 | } |
| 518 | |
| 519 | void EEDFTwoTermApproximation::setGridCache() |
| 520 | { |
| 521 | m_sigma.clear(); |
| 522 | m_sigma.resize(m_phase->nCollisions()); |
| 523 | m_eps.clear(); |
| 524 | m_eps.resize(m_phase->nCollisions()); |
| 525 | m_j.clear(); |
| 526 | m_j.resize(m_phase->nCollisions()); |
| 527 | m_i.clear(); |
| 528 | m_i.resize(m_phase->nCollisions()); |
| 529 | for (size_t k = 0; k < m_phase->nCollisions(); k++) { |
| 530 | auto& collision = m_phase->collisionRate(k); |
| 531 | auto& x = collision->energyLevels(); |
| 532 | auto& y = collision->crossSections(); |
| 533 | vector<double> eps1(m_points + 1); |
| 534 | int shiftFactor = (collision->kind() == "ionization") ? 2 : 1; |
| 535 | |
| 536 | for (size_t i = 0; i < m_points + 1; i++) { |
| 537 | eps1[i] = clip(shiftFactor * m_gridEdge[i] + collision->threshold(), |
| 538 | m_gridEdge[0] + 1e-9, m_gridEdge[m_points] - 1e-9); |
| 539 | } |
| 540 | vector<double> nodes = eps1; |
| 541 | for (size_t i = 0; i < m_points + 1; i++) { |
| 542 | if (m_gridEdge[i] >= eps1[0] && m_gridEdge[i] <= eps1[m_points]) { |
| 543 | nodes.push_back(m_gridEdge[i]); |
| 544 | } |
| 545 | } |
| 546 | for (size_t i = 0; i < x.size(); i++) { |
| 547 | if (x[i] >= eps1[0] && x[i] <= eps1[m_points]) { |
| 548 | nodes.push_back(x[i]); |
| 549 | } |
| 550 | } |
| 551 | |
| 552 | std::sort(nodes.begin(), nodes.end()); |
| 553 | auto last = std::unique(nodes.begin(), nodes.end()); |
| 554 | nodes.resize(std::distance(nodes.begin(), last)); |
| 555 | vector<double> sigma0(nodes.size()); |
| 556 | for (size_t i = 0; i < nodes.size(); i++) { |
| 557 | sigma0[i] = linearInterp(nodes[i], x, y); |
| 558 | } |
| 559 | |
| 560 | // search position of cell j |
| 561 | for (size_t i = 1; i < nodes.size(); i++) { |
| 562 | auto low = std::lower_bound(m_gridEdge.begin(), m_gridEdge.end(), nodes[i]); |
| 563 | m_j[k].push_back(low - m_gridEdge.begin() - 1); |
| 564 | } |
| 565 | |
| 566 | // search position of cell i |
| 567 | for (size_t i = 1; i < nodes.size(); i++) { |
| 568 | auto low = std::lower_bound(eps1.begin(), eps1.end(), nodes[i]); |
| 569 | m_i[k].push_back(low - eps1.begin() - 1); |
| 570 | } |
| 571 | |
| 572 | // construct sigma |
| 573 | for (size_t i = 0; i < nodes.size() - 1; i++) { |
| 574 | m_sigma[k].push_back({sigma0[i], sigma0[i+1]}); |
| 575 | } |
| 576 |
no test coverage detected