53 {
54
55 std::cout << " + solving poisson potential " << std::endl;
56 double dx0 = m_dx[0];
57 double dx1 = m_dx[m_cap_cells[0]+1];
58 double dx2 = m_dx[m_cap_cells[0]+m_cap_cells[1]+1];
59
60
61 Eigen::VectorXd timestep_rhs0 =
62 rho.segment(1, m_cap_cells[0]-1) * std::pow(dx0,2) / constants::eps0;
63 Eigen::VectorXd timestep_rhs1 =
64 rho.segment(m_cap_cells[0]+2, m_cap_cells[1]-1) * std::pow(dx1, 2) / constants::eps0;
65 Eigen::VectorXd timestep_rhs2 =
66 rho.segment(m_cap_cells[0] + m_cap_cells[1] + 2, m_cap_cells[2]-1) * std::pow(dx2, 2) / constants::eps0;
67 timestep_rhs0(0) += m_cap_pots[0];
68 timestep_rhs0.tail(1)(0) += m_cap_pots[1];
69 timestep_rhs1(0) += m_cap_pots[1];
70 timestep_rhs1.tail(1)(0) += m_cap_pots[2];
71 timestep_rhs2(0) += m_cap_pots[2];
72 timestep_rhs2.tail(1)(0) += m_cap_pots[3];
73
74
75 Eigen::SimplicialLLT<Eigen::SparseMatrix<double>> solver;
76
77 solver.compute(m_cap0_mat);
78 Eigen::VectorXd phi0 = solver.solve(timestep_rhs0);
79 solver.compute(m_cap1_mat);
80 Eigen::VectorXd phi1 = solver.solve(timestep_rhs1);
81 solver.compute(m_cap2_mat);
82 Eigen::VectorXd phi2 = solver.solve(timestep_rhs2);
83 if(solver.info()!=Eigen::Success) {
84 std::cerr << "Solving failed!" << std::endl;
85 }
86
87
88 Eigen::VectorXd nodal_phi(m_nodes.size());
89 nodal_phi <<
90 Eigen::VectorXd::Constant(1, m_cap_pots[0]),
91 phi0,
92 Eigen::VectorXd::Constant(1, m_cap_pots[1]),
93 phi1,
94 Eigen::VectorXd::Constant(1, m_cap_pots[2]),
95 phi2,
96 Eigen::VectorXd::Constant(1, m_cap_pots[3]);
97
98 return nodal_phi;
99};