21 MFEM_ASSERT(parameters.size() ==
p.size(),
22 "number of parameters doesn't match descriptors");
23 for (
size_t i = 0; i < parameters.size(); i++)
26 parameters_l[i] = *
p[i];
31 const std::vector<FieldDescriptor> &solutions,
32 const std::vector<FieldDescriptor> ¶meters,
36 parameters(parameters)
38 fields.resize(solutions.size() + parameters.size());
39 fields_e.resize(fields.size());
40 solutions_l.resize(solutions.size());
41 parameters_l.resize(parameters.size());
43 for (
size_t i = 0; i < solutions.size(); i++)
45 fields[i] = solutions[i];
48 for (
size_t i = 0; i < parameters.size(); i++)
50 fields[i + solutions.size()] = parameters[i];
74 eps = lambda * (lambda + xnorm / vnorm);
79 const auto d_v = v.
Read();
80 const auto d_x = x.
Read();
81 auto d_xpev = xpev.
Write();
84 d_xpev[i] = d_x[i] + eps * d_v[i];
93 const auto d_f = f.
Read();
97 d_y[i] = (d_y[i] - d_f[i]) / eps;
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
Class for parallel meshes.
virtual const real_t * Read(bool on_dev=true) const
Shortcut for mfem::Read(vec.GetMemory(), vec.Size(), on_dev).
virtual real_t * ReadWrite(bool on_dev=true)
Shortcut for mfem::ReadWrite(vec.GetMemory(), vec.Size(), on_dev).
real_t Norml2() const
Returns the l2 norm of the vector.
int Size() const
Returns the size of the vector.
virtual real_t * Write(bool on_dev=true)
Shortcut for mfem::Write(vec.GetMemory(), vec.Size(), on_dev).
DifferentiableOperator(const std::vector< FieldDescriptor > &solutions, const std::vector< FieldDescriptor > ¶meters, const ParMesh &mesh)
void SetParameters(std::vector< Vector * > p) const
Set the parameters for the operator.
void Mult(const Vector &v, Vector &y) const override
Operator application: y=A(x).
void forall(int N, lambda &&body)
real_t p(const Vector &x, real_t t)
Helper struct to convert a C++ type to an MPI type.