feat(preconditioner): major work on preconditioner system
first preconditioner MVP
This commit is contained in:
@@ -469,6 +469,35 @@ namespace mean_field::operators {
|
||||
m_densityMap.gather(m_fullResidual, residual);
|
||||
}
|
||||
|
||||
void PreparedBarotropicClosureOperator::AssembleDensityJacobianDiagonal(mfem::Vector &diagonal) const {
|
||||
VerifyPrepared();
|
||||
|
||||
mfem::Vector localDiagonal(m_fem.densityFes->GetVSize());
|
||||
localDiagonal = 0.0;
|
||||
mfem::Vector elementDiagonal;
|
||||
|
||||
for (const ElementPAData &data : m_elements) {
|
||||
MFEM_VERIFY(
|
||||
data.densityDofTransformation == nullptr,
|
||||
"Density mass-diagonal assembly currently requires scalar L2 element DOFs without a DOF transform."
|
||||
);
|
||||
elementDiagonal.SetSize(data.densityDofs.Size());
|
||||
elementDiagonal = 0.0;
|
||||
for (int trialDof = 0; trialDof < data.densityDofs.Size(); ++trialDof) {
|
||||
for (int quadraturePoint = 0; quadraturePoint < data.quadratureWeights.Size(); ++quadraturePoint) {
|
||||
const double basis = data.densityBasis(quadraturePoint, trialDof);
|
||||
elementDiagonal(trialDof) += data.quadratureWeights(quadraturePoint) * basis * basis;
|
||||
}
|
||||
}
|
||||
localDiagonal.AddElementVector(data.densityDofs, elementDiagonal);
|
||||
}
|
||||
|
||||
mfem::Vector trueDiagonal;
|
||||
local_to_true(*m_fem.densityFes, localDiagonal, trueDiagonal);
|
||||
diagonal.SetSize(m_densityMap.reduced_size());
|
||||
m_densityMap.gather(trueDiagonal, diagonal);
|
||||
}
|
||||
|
||||
void PreparedBarotropicClosureOperator::Mult(
|
||||
const mfem::Vector &densityVariation,
|
||||
const mfem::Vector &enthalpyVariation,
|
||||
|
||||
Reference in New Issue
Block a user