Program Listing for File evaluation_request.h
↰ Return to documentation for file (src/pcms/field/evaluation_request.h)
#ifndef PCMS_EVALUATION_REQUEST_H
#define PCMS_EVALUATION_REQUEST_H
#include "pcms/field/coordinate_view.hpp"
#include "field_layout.h"
#include "out_of_bounds_policy.h"
#include "pcms/utility/arrays.h"
#include "pcms/utility/memory_spaces.h"
#include <memory>
namespace pcms
{
class FunctionSpace;
struct EvaluationRequest
{
// Query coordinates to evaluate at. These are always consumed at evaluator
// construction time.
CoordinateView<DeviceMemorySpace> coords;
// Optional provenance for the query sites. When present, construction-time
// logic may use the layout and its discretization to select optimized
// localization paths. Concrete PointEvaluator implementations are not
// required to retain this layout after construction.
std::shared_ptr<const FieldLayout> query_layout;
// Construction-time policy that is baked into the created PointEvaluator.
OutOfBoundsPolicy policy = {};
static EvaluationRequest FromCoordinates(
CoordinateView<DeviceMemorySpace> coords, OutOfBoundsPolicy policy = {});
static EvaluationRequest FromLayout(std::shared_ptr<const FieldLayout> layout,
OutOfBoundsPolicy policy = {});
static EvaluationRequest FromFunctionSpace(
const FunctionSpace& function_space, OutOfBoundsPolicy policy = {});
[[nodiscard]] const FieldLayout* GetQueryLayout() const noexcept
{
return query_layout.get();
}
[[nodiscard]] const Discretization* GetQueryDiscretization() const noexcept
{
auto* layout = GetQueryLayout();
if (layout == nullptr) {
return nullptr;
}
auto disc = layout->GetDiscretization();
return disc.get();
}
private:
explicit EvaluationRequest(CoordinateView<DeviceMemorySpace> coords_in,
std::shared_ptr<const FieldLayout> query_layout_in,
OutOfBoundsPolicy policy_in = {}) noexcept
: coords(coords_in),
query_layout(std::move(query_layout_in)),
policy(policy_in)
{
}
};
} // namespace pcms
#endif // PCMS_EVALUATION_REQUEST_H