29#ifndef OPTI_CASE_DUAL_H
30#define OPTI_CASE_DUAL_H
45template<
typename S,
unsigned dim>
46class GeometrySerializer;
50 template<
typename,SolverMode>
typename SOLVER
52class DistributedObjective;
66 template<
typename,SolverMode>
typename SOLVER,
67 concepts::Field CONTROLLED_FIELD,
68 template<
typename...>
typename PRIMAL_DYNAMICS,
69 typename C = std::vector<S>>
70class OptiCaseDual :
public OptiCase<S,C> {
73 mutable OstreamManager clout {std::cout,
"OptiCaseDual"};
74 using descriptor =
typename SOLVER<S,SolverMode::Reference>::AdjointLbSolver::DESCRIPTOR;
75 static constexpr unsigned dim = descriptor::d;
76 static constexpr unsigned fieldDim = CONTROLLED_FIELD::template size<descriptor>();
95 std::shared_ptr<DistributedObjective<S,SOLVER>>
_objective;
130 const C&
control, C& derivatives,
unsigned optiStep=0)
override;
143 void initializeFields();
145 void derivativesFromDualSolution(C& derivatives);
147 void derivativesFromDualSolutionPointwise(C& derivatives,
LatticeR<dim+1> latticeR);
Conversion between physical and lattice units, as well as discretization.
Objective in optimization with adjoint LBM.
std::size_t _dimCtrl
upper limit for the number of control variables (#voxels * field-dimension)
std::shared_ptr< projection::Base< S > > _projection
void setObjective(std::shared_ptr< DistributedObjective< S, SOLVER > > objective)
std::shared_ptr< SuperLatticeF< S, descriptor > > _dProjectionDcontrol
derivative of _projectionControl
S evaluateObjective(const C &control, unsigned optiStep=0) override
Solve primal problem and evaluate objective.
std::shared_ptr< SuperGeometry< S, dim > > _primalGeometry
std::shared_ptr< SuperIndicatorF< S, dim > > _controlIndicator
Marks, where there are active control variables.
std::string _projectionName
std::shared_ptr< SOLVER< S, SolverMode::Primal > > _primalSolver
std::shared_ptr< GeometrySerializer< S, dim > > _serializer
StartValueType _startValueType
void computeDerivatives(const C &control, C &derivatives, unsigned optiStep=0) override
Compute derivatives via adjoint problem.
std::shared_ptr< SuperLattice< S, descriptor > > _refLattice
std::shared_ptr< SuperLatticeF< S, descriptor > > _projectedControl
maps the control to a lattice functor
std::shared_ptr< DistributedObjective< S, SOLVER > > _objective
Controller< S > * _controller
Manages the array of control variables.
OptiCaseDual(XMLreader const &xml)
std::shared_ptr< SOLVER< S, SolverMode::Dual > > _dualSolver
UnitConverter< S, descriptor > * _converter
The description of a Controller – header file.
Top level namespace for all of OpenLB.
Input/Output in XML format – header file.