feat(preconditioner): major work on preconditioner system
first preconditioner MVP
This commit is contained in:
@@ -346,20 +346,32 @@ namespace mean_field::operators {
|
||||
make_residual_view(action, m_residual_offsets, gravity_poisson_residual_block);
|
||||
const field::FieldDofMap &flux_map = geometry_context.GetMassOperator().GetFluxMap();
|
||||
const field::FieldDofMap &potential_map = geometry_context.GetSourceOperator().GetPotentialMap();
|
||||
mfem::Vector potential_true(potential_map.full_size());
|
||||
mfem::Vector transpose_divergence_action_true(flux_map.full_size());
|
||||
mfem::Vector transpose_divergence_action(flux_map.reduced_size());
|
||||
mfem::Vector gradient_true(flux_map.full_size());
|
||||
mfem::Vector divergence_action_true(potential_map.full_size());
|
||||
|
||||
geometry_context.GetMassOperator().Mult(gravity_gradient, gravity_gradient_action);
|
||||
potential_map.scatter(gravity_potential, potential_true);
|
||||
geometry_context.GetTransposeDivergenceOperator().Mult(potential_true, transpose_divergence_action_true);
|
||||
flux_map.gather(transpose_divergence_action_true, transpose_divergence_action);
|
||||
gravity_gradient_action += transpose_divergence_action;
|
||||
flux_map.scatter(gravity_gradient, gradient_true);
|
||||
geometry_context.GetDivergenceOperator().Mult(gradient_true, divergence_action_true);
|
||||
potential_map.gather(divergence_action_true, gravity_poisson_action);
|
||||
|
||||
if (flux_map.is_identity() && potential_map.is_identity()) [[likely]] {
|
||||
m_transpose_divergence_action_true.SetSize(flux_map.full_size());
|
||||
geometry_context.GetTransposeDivergenceOperator().Mult(
|
||||
gravity_potential, m_transpose_divergence_action_true
|
||||
);
|
||||
gravity_gradient_action += m_transpose_divergence_action_true;
|
||||
geometry_context.GetDivergenceOperator().Mult(gravity_gradient, gravity_poisson_action);
|
||||
return;
|
||||
}
|
||||
|
||||
m_potential_true.SetSize(potential_map.full_size());
|
||||
m_transpose_divergence_action_true.SetSize(flux_map.full_size());
|
||||
m_transpose_divergence_action.SetSize(flux_map.reduced_size());
|
||||
m_gradient_true.SetSize(flux_map.full_size());
|
||||
m_divergence_action_true.SetSize(potential_map.full_size());
|
||||
|
||||
potential_map.scatter(gravity_potential, m_potential_true);
|
||||
geometry_context.GetTransposeDivergenceOperator().Mult(m_potential_true, m_transpose_divergence_action_true);
|
||||
flux_map.gather(m_transpose_divergence_action_true, m_transpose_divergence_action);
|
||||
gravity_gradient_action += m_transpose_divergence_action;
|
||||
flux_map.scatter(gravity_gradient, m_gradient_true);
|
||||
geometry_context.GetDivergenceOperator().Mult(m_gradient_true, m_divergence_action_true);
|
||||
potential_map.gather(m_divergence_action_true, gravity_poisson_action);
|
||||
}
|
||||
|
||||
void GravityFieldOperator::ApplyDensitySource(
|
||||
@@ -529,7 +541,7 @@ namespace mean_field::operators {
|
||||
++displacement_revision.value;
|
||||
}
|
||||
|
||||
m_gravity_field_geometry_context.Prepare(displacement, discretization_revision, displacement_revision);
|
||||
m_gravity_field_geometry_context.PreparePrimal(displacement, discretization_revision, displacement_revision);
|
||||
m_displacement = displacement;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user