This commit uses global pre allocated work space to dramatically reduce memory usage and allocation time
57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
module;
|
|
#include <mfem.hpp>
|
|
export module mean_field:mapping.compactification;
|
|
export import :mapping.types;
|
|
|
|
export namespace mean_field::mapping::compactification {
|
|
struct ExteriorMapInput {
|
|
const mfem::Vector &reference_position;
|
|
const mfem::Vector &displaced_position;
|
|
const mfem::DenseMatrix &displacement_jacobian;
|
|
double compactification_coordinate;
|
|
const mfem::Vector &compactification_coordinate_gradient;
|
|
};
|
|
|
|
struct ExteriorMapResult {
|
|
mfem::Vector physical_position;
|
|
mfem::DenseMatrix mapping_jacobian;
|
|
};
|
|
|
|
struct ExteriorMapDirection {
|
|
const mfem::Vector &displaced_position_variation;
|
|
const mfem::DenseMatrix &displacement_jacobian_variation;
|
|
};
|
|
|
|
struct ExteriorMapVariation {
|
|
mfem::Vector physical_position_variation;
|
|
mfem::DenseMatrix mapping_jacobian_variation;
|
|
};
|
|
|
|
class ExteriorDomainMap {
|
|
public:
|
|
virtual ~ExteriorDomainMap() = default;
|
|
|
|
/*
|
|
* Return true when, with the reference and compactification data held
|
|
* fixed, both outputs of Evaluate are affine functions of the
|
|
* displaced position and displacement Jacobian. This is the contract
|
|
* required by the exact determinant-polynomial geometry preflight.
|
|
*/
|
|
[[nodiscard]] virtual bool IsAffineInDisplacement() const noexcept {
|
|
return false;
|
|
}
|
|
|
|
[[nodiscard]] virtual MappingStatus Evaluate(
|
|
const ExteriorMapInput &input,
|
|
ExteriorMapResult &result
|
|
) const = 0;
|
|
[[nodiscard]] virtual MappingStatus EvaluateVariation(
|
|
const ExteriorMapInput &input,
|
|
const ExteriorMapResult &result,
|
|
const ExteriorMapDirection &direction,
|
|
ExteriorMapVariation &variation
|
|
) const = 0;
|
|
[[nodiscard]] virtual std::string_view GetName() const noexcept = 0;
|
|
};
|
|
} // namespace mean_field::mapping::compactification
|