message: using delegating constructors to allow construction with function pointers. This is needed because if one tried to construct a FunctionCoefficient with a function that was overloaded, it could not be implicitly converted to a std::function
diff: @@ -134,18 +134,28 @@ protected:
  std::function<double(const Vector &, double)> TDFunction;
  public:
  - /// Define a time-independent coefficient from a pointer to a std function
  + /// Define a time-independent coefficient from a std function
  FunctionCoefficient(std::function<double(const Vector &)> F)
  {
  Function = F;
  }
  - /// Define a time-dependent coefficient from a pointer to a std function
  + /// Define a time-independent coefficient from a pointer to a C-function
  + FunctionCoefficient(double (*F)(const Vector &))
  + : FunctionCoefficient((std::function<double(const Vector &)>)F)
  + { }
  +
  + /// Define a time-dependent coefficient from a std function
  FunctionCoefficient(std::function<double(const Vector &, double)> TDF)
  {
  TDFunction = TDF;
  }
  + /// Define a time-dependent coefficient from a pointer to a C-function
  + FunctionCoefficient(double (*TDF)(const Vector &, double))
  + : FunctionCoefficient((std::function<double(const Vector &, double)>)TDF)
  + { }
  +
  /// (DEPRECATED) Define a time-independent coefficient from a C-function
  /** @deprecated Use the method where the C-function, @a f, uses a const
  Vector argument instead of Vector. */
  @@ -423,6 +433,17 @@ public:
  Function = F;
  }
  + /// Construct a time-independent vector coefficient from a pointer to a
  + /// C-function
  + VectorFunctionCoefficient(int dim,
  + void(*F)(const Vector &, Vector &),
  + Coefficient *q = NULL)
  + : VectorFunctionCoefficient(dim,
  + (std::function<void(const Vector &,
  + Vector &)>) F,
  + q)
  + { }
  +
  /// Construct a time-dependent vector coefficient from a std function
  VectorFunctionCoefficient(int dim,
  std::function<void(const Vector &,
  @@ -434,6 +455,18 @@ public:
  TDFunction = TDF;
  }
  + /// Construct a time-dependent vector coefficient from a pointer to a
  + /// C-function
  + VectorFunctionCoefficient(int dim,
  + void(*TDF)(const Vector &, double, Vector &),
  + Coefficient *q = NULL)
  + : VectorFunctionCoefficient(dim,
  + (std::function<void(const Vector &,
  + double,
  + Vector &)>) TDF,
  + q)
  + { }
  +
  using VectorCoefficient::Eval;
  /// Evaluate the vector coefficient at @a ip.
  virtual void Eval(Vector &V, ElementTransformation &T,
  @@ -771,6 +804,17 @@ public:
  mat.SetSize(0);
  }
  + /// Construct a square matrix coefficient from a pointer to a C-function
  + /// without time dependence.
  + MatrixFunctionCoefficient(int dim,
  + void(*F)(const Vector &, DenseMatrix &),
  + Coefficient *q = NULL)
  + : MatrixFunctionCoefficient(dim,
  + (std::function<void(const Vector &,
  + DenseMatrix &)>) F,
  + q)
  + { }
  +
  /// Construct a constant matrix coefficient times a scalar Coefficient
  MatrixFunctionCoefficient(const DenseMatrix &m, Coefficient &q)
  : MatrixCoefficient(m.Height(), m.Width()), Q(&q)
  @@ -791,6 +835,18 @@ public:
  mat.SetSize(0);
  }
  + /// Construct a square matrix coefficient from a pointer to a C-function
  + /// with time dependence.
  + MatrixFunctionCoefficient(int dim,
  + void(*TDF)(const Vector &, double, DenseMatrix &),
  + Coefficient *q = NULL)
  + : MatrixFunctionCoefficient(dim,
  + (std::function<void(const Vector &,
  + double,
  + DenseMatrix &)>) TDF,
  + q)
  + { }
  +
  /// Evaluate the matrix coefficient at @a ip.
  virtual void Eval(DenseMatrix &K, ElementTransformation &T,
  const IntegrationPoint &ip);
  