perf(jacobian-action): major updates to jacobian action application by removing redudant quadrature work. ~5x increase in speed
This commit is contained in:
@@ -217,16 +217,22 @@ namespace mean_field::mapping {
|
||||
);
|
||||
MFEM_VERIFY(std::isfinite(determinant_variation), "The mapping determinant variation must be finite.");
|
||||
|
||||
mfem::DenseMatrix determinant_correction(dimension, dimension);
|
||||
ComputeHDivMassTensor(context, determinant_correction);
|
||||
determinant_correction *= determinant_variation / determinant;
|
||||
const mfem::DenseMatrix &jacobian = context.mapping_jacobian;
|
||||
const mfem::DenseMatrix &jacobianVariation = variation.mapping_jacobian_variation;
|
||||
const double inverseDeterminant = 1.0 / determinant;
|
||||
const double determinantScale = determinant_variation * inverseDeterminant;
|
||||
|
||||
mfem::DenseMatrix right_jacobian_variation(dimension, dimension);
|
||||
mfem::MultAtB(context.mapping_jacobian, variation.mapping_jacobian_variation, right_jacobian_variation);
|
||||
mfem::MultAtB(variation.mapping_jacobian_variation, context.mapping_jacobian, mass_tensor_variation);
|
||||
|
||||
mass_tensor_variation += right_jacobian_variation;
|
||||
mass_tensor_variation *= 1 / determinant;
|
||||
mass_tensor_variation -= determinant_correction;
|
||||
for (int row = 0; row < dimension; ++row) {
|
||||
for (int column = 0; column < dimension; ++column) {
|
||||
double gram{0.0};
|
||||
double gramVariation{0.0};
|
||||
for (int inner = 0; inner < dimension; ++inner) {
|
||||
gram += jacobian(inner, row) * jacobian(inner, column);
|
||||
gramVariation += jacobian(inner, row) * jacobianVariation(inner, column) +
|
||||
jacobianVariation(inner, row) * jacobian(inner, column);
|
||||
}
|
||||
mass_tensor_variation(row, column) = inverseDeterminant * (gramVariation - determinantScale * gram);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace mean_field::mapping
|
||||
} // namespace mean_field::mapping
|
||||
|
||||
Reference in New Issue
Block a user