NeoN
A framework for CFD software
Loading...
Searching...
No Matches
optimizer.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 NeoN authors
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
7#include "NeoN/core/error.hpp"
10
12
13namespace NeoN::dsl
14{
15
16
26template<typename ExpressionType>
28{
29public:
30
31 virtual ~Optimizer() = default;
32
38 virtual ExpressionType optimize(const ExpressionType& expr) const = 0;
39};
40
41
54template<typename ExpressionType>
55class DivLapOptimizer : public Optimizer<ExpressionType>
56{
57public:
58
60
61 ExpressionType optimize(const ExpressionType& expr) const override
62 {
63 ExpressionType out(expr);
64
65 // early return if not both operators are present
66 if (!(expr.template hasOperator<Operator::Type::Implicit>("DivOperator")
67 && expr.template hasOperator<Operator::Type::Implicit>("LaplacianOperator")))
68 {
69 return out;
70 }
71
72 using ValueType = typename ExpressionType::ExpressionValueType;
73 auto divOperator =
74 out.template getOperator<SpatialOperator<ValueType>, Operator::Type::Implicit>(
75 "DivOperator"
76 )
77 .getConfig();
78 auto lapOperator =
79 out.template getOperator<SpatialOperator<ValueType>, Operator::Type::Implicit>(
80 "LaplacianOperator"
81 )
82 .getConfig();
83
84 dsl::SpatialOperator<ValueType> divLapOperator =
86 expr.exec(), divOperator, lapOperator
87 );
88 out.addOperator(divLapOperator);
89
90 out.template dropOperator<Operator::Type::Implicit>("DivOperator");
91 out.template dropOperator<Operator::Type::Implicit>("LaplacianOperator");
92
93 return out;
94 }
95};
96
97
109template<typename ExpressionType>
110ExpressionType optimize(const ExpressionType& in)
111{
112 auto optimizer = std::vector<std::shared_ptr<Optimizer<ExpressionType>>> {
113 std::make_shared<DivLapOptimizer<ExpressionType>>()
114 };
115
116 return optimize(in, optimizer);
117}
118
130template<typename ExpressionType>
131ExpressionType optimize(
132 const ExpressionType& in, const std::vector<std::shared_ptr<Optimizer<ExpressionType>>>& opts
133)
134{
135 ExpressionType out(in);
136
137 for (const auto& opt : opts)
138 {
139 out = opt->optimize(out);
140 }
141
142 return out;
143}
144
145
146} // namespace dsl
Fuses separate implicit divergence and Laplacian operators into a single GaussGreenDivLaplacian kerne...
Definition optimizer.hpp:56
ExpressionType optimize(const ExpressionType &expr) const override
Return an optimized copy of expr.
Definition optimizer.hpp:61
Abstract base for DSL expression optimizers.
Definition optimizer.hpp:28
virtual ExpressionType optimize(const ExpressionType &expr) const =0
Return an optimized copy of expr.
virtual ~Optimizer()=default
ExpressionType optimize(const ExpressionType &in)
Apply the default optimizer pipeline to an expression.