refactor(jacobiInvert): moved all jacobi inverting logic into dedicated function
This commit is contained in:
@@ -125,50 +125,6 @@ const mfem::BlockOperator &PolytropeOperator::GetJacobianOperator() const {
|
|||||||
return *m_jacobian;
|
return *m_jacobian;
|
||||||
}
|
}
|
||||||
|
|
||||||
mfem::Vector PolytropeOperator::GetJ00Diag() const {
|
|
||||||
}
|
|
||||||
|
|
||||||
mfem::Vector PolytropeOperator::GetJ01Diag() const {
|
|
||||||
if (!m_isFinalized) {
|
|
||||||
MFEM_ABORT("PolytropeOperator::Get01Diag -> GetJ01Diag called before finalization of PolytropeOperator");
|
|
||||||
}
|
|
||||||
if (m_Mmat == nullptr) {
|
|
||||||
MFEM_ABORT("PolytropeOperator::Get01Diag -> M sparse matrix has not been initialized before GetJ01Diag() call.");
|
|
||||||
}
|
|
||||||
|
|
||||||
mfem::Vector J01diag;
|
|
||||||
m_Mmat->GetDiag(J01diag);
|
|
||||||
J01diag *= -1;
|
|
||||||
return J01diag;
|
|
||||||
}
|
|
||||||
|
|
||||||
mfem::Vector PolytropeOperator::GetJ10diag() const {
|
|
||||||
if (!m_isFinalized) {
|
|
||||||
MFEM_ABORT("PolytropeOperator::Get10Diag -> GetJ10Diag called before finalization of PolytropeOperator");
|
|
||||||
}
|
|
||||||
if (m_Qmat == nullptr) {
|
|
||||||
MFEM_ABORT("PolytropeOperator::Get10Diag -> Q sparse matrix has not been initialized before GetJ10Diag() call.");
|
|
||||||
}
|
|
||||||
mfem::Vector J10diag;
|
|
||||||
m_Qmat->GetDiag(J10diag);
|
|
||||||
J10diag *= -1;
|
|
||||||
return J10diag;
|
|
||||||
}
|
|
||||||
|
|
||||||
mfem::Vector PolytropeOperator::GetJ11diag() const {
|
|
||||||
if (!m_isFinalized) {
|
|
||||||
MFEM_ABORT("PolytropeOperator::Get11Diag -> GetJ11Diag called before finalization of PolytropeOperator");
|
|
||||||
}
|
|
||||||
if (m_Dmat == nullptr) {
|
|
||||||
MFEM_ABORT("PolytropeOperator::Get11Diag -> D sparse matrix has not been initialized before GetJ11Diag() call.");
|
|
||||||
}
|
|
||||||
mfem::Vector J11diag;
|
|
||||||
m_Dmat->GetDiag(J11diag);
|
|
||||||
J11diag *= -1;
|
|
||||||
return J11diag;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PolytropeOperator::Mult(const mfem::Vector &x, mfem::Vector &y) const {
|
void PolytropeOperator::Mult(const mfem::Vector &x, mfem::Vector &y) const {
|
||||||
if (!m_isFinalized) {
|
if (!m_isFinalized) {
|
||||||
MFEM_ABORT("PolytropeOperator::Mult called before finalize");
|
MFEM_ABORT("PolytropeOperator::Mult called before finalize");
|
||||||
@@ -209,7 +165,6 @@ void PolytropeOperator::Mult(const mfem::Vector &x, mfem::Vector &y) const {
|
|||||||
subtract(Dphi_term, Qtheta_term, y_R1);
|
subtract(Dphi_term, Qtheta_term, y_R1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -- Apply essential boundary conditions --
|
// -- Apply essential boundary conditions --
|
||||||
for (int i = 0; i < m_theta_ess_tdofs.first.Size(); i++) {
|
for (int i = 0; i < m_theta_ess_tdofs.first.Size(); i++) {
|
||||||
int idx = m_theta_ess_tdofs.first[i];
|
int idx = m_theta_ess_tdofs.first[i];
|
||||||
@@ -232,16 +187,35 @@ void PolytropeOperator::Mult(const mfem::Vector &x, mfem::Vector &y) const {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: I was *very* stupid and I accidently deleted a lot of the code
|
||||||
|
// which I had written to find and use the preconditioner. This needs
|
||||||
|
// to be reimplemented. Once that is working you can get back to
|
||||||
|
// Trying to understand the multimodal hump in the residuals vector.
|
||||||
|
// There is a jupyter notebook about this. I was thinking that this was
|
||||||
|
// perhapse related to the non consistent application of boundary conditions.
|
||||||
|
void approxJacobiInvert(const mfem::SparseMatrix& mat, std::unique_ptr<mfem::SparseMatrix>& invMat, std::string name="matrix") {
|
||||||
|
// TODO: This likely can be made much more efficient and will probably be called in tight loops, a good
|
||||||
|
// place for some easy optimization might be here.
|
||||||
|
// Get the diagonal of the matrix
|
||||||
|
mfem::Vector diag;
|
||||||
|
mat.GetDiag(diag);
|
||||||
|
|
||||||
|
// Invert the diagonal
|
||||||
|
for (int i = 0; i < diag.Size(); i++) {
|
||||||
|
if (diag(i) == 0.0) {
|
||||||
|
MFEM_ABORT("Diagonal element (" + std::to_string(i) +") in " + name + " is zero, cannot invert.");
|
||||||
|
}
|
||||||
|
diag(i) = 1.0 / diag(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
invMat = std::make_unique<mfem::SparseMatrix>(diag);
|
||||||
|
}
|
||||||
|
|
||||||
void PolytropeOperator::updateInverseNonlinearJacobian(const mfem::Operator &grad) const {
|
void PolytropeOperator::updateInverseNonlinearJacobian(const mfem::Operator &grad) const {
|
||||||
if (const auto *sparse_mat = dynamic_cast<const mfem::SparseMatrix*>(&grad); sparse_mat != nullptr) {
|
if (const auto *sparse_mat = dynamic_cast<const mfem::SparseMatrix*>(&grad); sparse_mat != nullptr) {
|
||||||
mfem::Vector gradDiag;
|
approxJacobiInvert(*sparse_mat, m_invNonlinearJacobian, "Nonlinear Jacobian");
|
||||||
sparse_mat->GetDiag(gradDiag);
|
|
||||||
for (int i = 0; i < gradDiag.Size(); i++) {
|
|
||||||
gradDiag(i) = 1.0/gradDiag(i); // Invert the diagonals of the jacobian
|
|
||||||
}
|
|
||||||
m_invNonlinearJacobian = std::make_unique<mfem::SparseMatrix>(gradDiag);
|
|
||||||
} else {
|
} else {
|
||||||
MFEM_ABORT("PolytropeOperator::GetGradient called on nonlinear Jacobian");
|
MFEM_ABORT("PolytropeOperator::GetGradient called on nonlinear jacobian where nonlinear jacobian is not trivially castable to a sparse matrix");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,9 +232,6 @@ void PolytropeOperator::updateInverseSchurCompliment() const {
|
|||||||
|
|
||||||
schurCompliment->Add(-1, *temp_QxdfInvxM); // D - Q * df^{-1} * M
|
schurCompliment->Add(-1, *temp_QxdfInvxM); // D - Q * df^{-1} * M
|
||||||
|
|
||||||
writeOperatorToCSV(*schurCompliment, "/Users/tboudreaux/Desktop/SchursCompliment.csv");
|
|
||||||
std::cout << "Wrote" << std::endl;
|
|
||||||
|
|
||||||
// Note: EMB (April 9, 2025) Where I left for the day, so I don't pull my hair out tomorrow:
|
// Note: EMB (April 9, 2025) Where I left for the day, so I don't pull my hair out tomorrow:
|
||||||
/*
|
/*
|
||||||
* Need to calculate the inverse of Schur's compliment to precondition the jacobian
|
* Need to calculate the inverse of Schur's compliment to precondition the jacobian
|
||||||
|
|||||||
Reference in New Issue
Block a user