/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 4.0.2
 *
 * This file is not intended to be easily readable and contains a number of
 * coding conventions designed to improve portability and efficiency. Do not make
 * changes to this file unless you know what you are doing--modify the SWIG
 * interface file instead.
 * ----------------------------------------------------------------------------- */

#ifndef SWIG_operators_WRAP_H_
#define SWIG_operators_WRAP_H_

#include <map>
#include <string>


class SwigDirector_Operator : public mfem::Operator, public Swig::Director {

public:
    SwigDirector_Operator(PyObject *self, int s = 0);
    SwigDirector_Operator(PyObject *self, int h, int w);
    virtual mfem::MemoryClass GetMemoryClass() const;
    virtual void Mult(mfem::Vector const &x, mfem::Vector &y) const;
    virtual void MultTranspose(mfem::Vector const &x, mfem::Vector &y) const;
    virtual mfem::Operator &GetGradient(mfem::Vector const &x) const;
    virtual mfem::Operator const *GetProlongation() const;
    virtual mfem::Operator const *GetRestriction() const;
    virtual mfem::Operator const *GetOutputProlongation() const;
    virtual mfem::Operator const *GetOutputRestriction() const;
    virtual void RecoverFEMSolution(mfem::Vector const &X, mfem::Vector const &b, mfem::Vector &x);
    virtual ~SwigDirector_Operator();

/* Internal director utilities */
public:
    bool swig_get_inner(const char *swig_protected_method_name) const {
      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
      return (iv != swig_inner.end() ? iv->second : false);
    }
    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
      swig_inner[swig_protected_method_name] = swig_val;
    }
private:
    mutable std::map<std::string, bool> swig_inner;

#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
/* VTable implementation */
    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
      PyObject *method = vtable[method_index];
      if (!method) {
        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
        method = PyObject_GetAttr(swig_get_self(), name);
        if (!method) {
          std::string msg = "Method in class Operator doesn't exist, undefined ";
          msg += method_name;
          Swig::DirectorMethodException::raise(msg.c_str());
        }
        vtable[method_index] = method;
      }
      return method;
    }
private:
    mutable swig::SwigVar_PyObject vtable[9];
#endif

};


class SwigDirector_TimeDependentOperator : public mfem::TimeDependentOperator, public Swig::Director {

public:
    SwigDirector_TimeDependentOperator(PyObject *self, int n = 0, double t_ = 0.0, mfem::TimeDependentOperator::Type type_ = mfem::TimeDependentOperator::EXPLICIT);
    SwigDirector_TimeDependentOperator(PyObject *self, int h, int w, double t_ = 0.0, mfem::TimeDependentOperator::Type type_ = mfem::TimeDependentOperator::EXPLICIT);
    virtual mfem::MemoryClass GetMemoryClass() const;
    virtual void Mult(mfem::Vector const &x, mfem::Vector &y) const;
    virtual void MultTranspose(mfem::Vector const &x, mfem::Vector &y) const;
    virtual mfem::Operator &GetGradient(mfem::Vector const &x) const;
    virtual mfem::Operator const *GetProlongation() const;
    virtual mfem::Operator const *GetRestriction() const;
    virtual mfem::Operator const *GetOutputProlongation() const;
    virtual mfem::Operator const *GetOutputRestriction() const;
    virtual void RecoverFEMSolution(mfem::Vector const &X, mfem::Vector const &b, mfem::Vector &x);
    virtual ~SwigDirector_TimeDependentOperator();
    virtual double GetTime() const;
    virtual void SetTime(double const _t);
    virtual void SetEvalMode(mfem::TimeDependentOperator::EvalMode const new_eval_mode);
    virtual void ExplicitMult(mfem::Vector const &x, mfem::Vector &y) const;
    virtual void ImplicitMult(mfem::Vector const &x, mfem::Vector const &k, mfem::Vector &y) const;
    virtual void ImplicitSolve(double const dt, mfem::Vector const &x, mfem::Vector &k);
    virtual mfem::Operator &GetImplicitGradient(mfem::Vector const &x, mfem::Vector const &k, double shift) const;
    virtual mfem::Operator &GetExplicitGradient(mfem::Vector const &x) const;
    virtual int SUNImplicitSetup(mfem::Vector const &x, mfem::Vector const &fx, int jok, int *jcur, double gamma);
    virtual int SUNImplicitSolve(mfem::Vector const &b, mfem::Vector &x, double tol);
    virtual int SUNMassSetup();
    virtual int SUNMassSolve(mfem::Vector const &b, mfem::Vector &x, double tol);
    virtual int SUNMassMult(mfem::Vector const &x, mfem::Vector &v);

/* Internal director utilities */
public:
    bool swig_get_inner(const char *swig_protected_method_name) const {
      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
      return (iv != swig_inner.end() ? iv->second : false);
    }
    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
      swig_inner[swig_protected_method_name] = swig_val;
    }
private:
    mutable std::map<std::string, bool> swig_inner;

#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
/* VTable implementation */
    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
      PyObject *method = vtable[method_index];
      if (!method) {
        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
        method = PyObject_GetAttr(swig_get_self(), name);
        if (!method) {
          std::string msg = "Method in class TimeDependentOperator doesn't exist, undefined ";
          msg += method_name;
          Swig::DirectorMethodException::raise(msg.c_str());
        }
        vtable[method_index] = method;
      }
      return method;
    }
private:
    mutable swig::SwigVar_PyObject vtable[22];
#endif

};


class SwigDirector_Solver : public mfem::Solver, public Swig::Director {

public:
    SwigDirector_Solver(PyObject *self, int s = 0, bool iter_mode = false);
    SwigDirector_Solver(PyObject *self, int h, int w, bool iter_mode = false);
    virtual mfem::MemoryClass GetMemoryClass() const;
    virtual void Mult(mfem::Vector const &x, mfem::Vector &y) const;
    virtual void MultTranspose(mfem::Vector const &x, mfem::Vector &y) const;
    virtual mfem::Operator &GetGradient(mfem::Vector const &x) const;
    virtual mfem::Operator const *GetProlongation() const;
    virtual mfem::Operator const *GetRestriction() const;
    virtual mfem::Operator const *GetOutputProlongation() const;
    virtual mfem::Operator const *GetOutputRestriction() const;
    virtual void RecoverFEMSolution(mfem::Vector const &X, mfem::Vector const &b, mfem::Vector &x);
    virtual ~SwigDirector_Solver();
    virtual void SetOperator(mfem::Operator const &op);

/* Internal director utilities */
public:
    bool swig_get_inner(const char *swig_protected_method_name) const {
      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
      return (iv != swig_inner.end() ? iv->second : false);
    }
    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
      swig_inner[swig_protected_method_name] = swig_val;
    }
private:
    mutable std::map<std::string, bool> swig_inner;

#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
/* VTable implementation */
    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
      PyObject *method = vtable[method_index];
      if (!method) {
        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
        method = PyObject_GetAttr(swig_get_self(), name);
        if (!method) {
          std::string msg = "Method in class Solver doesn't exist, undefined ";
          msg += method_name;
          Swig::DirectorMethodException::raise(msg.c_str());
        }
        vtable[method_index] = method;
      }
      return method;
    }
private:
    mutable swig::SwigVar_PyObject vtable[10];
#endif

};


class SwigDirector_PyOperatorBase : public mfem::PyOperatorBase, public Swig::Director {

public:
    SwigDirector_PyOperatorBase(PyObject *self, int s = 0);
    SwigDirector_PyOperatorBase(PyObject *self, int h, int w);
    virtual mfem::MemoryClass GetMemoryClass() const;
    virtual void Mult(mfem::Vector const &x, mfem::Vector &y) const;
    virtual void MultTranspose(mfem::Vector const &x, mfem::Vector &y) const;
    virtual mfem::Operator &GetGradient(mfem::Vector const &x) const;
    virtual mfem::Operator const *GetProlongation() const;
    virtual mfem::Operator const *GetRestriction() const;
    virtual mfem::Operator const *GetOutputProlongation() const;
    virtual mfem::Operator const *GetOutputRestriction() const;
    virtual void RecoverFEMSolution(mfem::Vector const &X, mfem::Vector const &b, mfem::Vector &x);
    virtual ~SwigDirector_PyOperatorBase();
    virtual mfem::Vector &_EvalMult(mfem::Vector const &arg0) const;

/* Internal director utilities */
public:
    bool swig_get_inner(const char *swig_protected_method_name) const {
      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
      return (iv != swig_inner.end() ? iv->second : false);
    }
    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
      swig_inner[swig_protected_method_name] = swig_val;
    }
private:
    mutable std::map<std::string, bool> swig_inner;

#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
/* VTable implementation */
    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
      PyObject *method = vtable[method_index];
      if (!method) {
        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
        method = PyObject_GetAttr(swig_get_self(), name);
        if (!method) {
          std::string msg = "Method in class PyOperatorBase doesn't exist, undefined ";
          msg += method_name;
          Swig::DirectorMethodException::raise(msg.c_str());
        }
        vtable[method_index] = method;
      }
      return method;
    }
private:
    mutable swig::SwigVar_PyObject vtable[10];
#endif

};


class SwigDirector_PyTimeDependentOperatorBase : public mfem::PyTimeDependentOperatorBase, public Swig::Director {

public:
    SwigDirector_PyTimeDependentOperatorBase(PyObject *self, int n = 0, double _t = 0.0);
    SwigDirector_PyTimeDependentOperatorBase(PyObject *self, int h, int w, double _t = 0.0);
    virtual mfem::MemoryClass GetMemoryClass() const;
    virtual void Mult(mfem::Vector const &x, mfem::Vector &y) const;
    virtual void MultTranspose(mfem::Vector const &x, mfem::Vector &y) const;
    virtual mfem::Operator &GetGradient(mfem::Vector const &x) const;
    virtual mfem::Operator const *GetProlongation() const;
    virtual mfem::Operator const *GetRestriction() const;
    virtual mfem::Operator const *GetOutputProlongation() const;
    virtual mfem::Operator const *GetOutputRestriction() const;
    virtual void RecoverFEMSolution(mfem::Vector const &X, mfem::Vector const &b, mfem::Vector &x);
    virtual ~SwigDirector_PyTimeDependentOperatorBase();
    virtual double GetTime() const;
    virtual void SetTime(double const _t);
    virtual void SetEvalMode(mfem::TimeDependentOperator::EvalMode const new_eval_mode);
    virtual void ExplicitMult(mfem::Vector const &x, mfem::Vector &y) const;
    virtual void ImplicitMult(mfem::Vector const &x, mfem::Vector const &k, mfem::Vector &y) const;
    virtual void ImplicitSolve(double const dt, mfem::Vector const &x, mfem::Vector &k);
    virtual mfem::Operator &GetImplicitGradient(mfem::Vector const &x, mfem::Vector const &k, double shift) const;
    virtual mfem::Operator &GetExplicitGradient(mfem::Vector const &x) const;
    virtual int SUNImplicitSetup(mfem::Vector const &x, mfem::Vector const &fx, int jok, int *jcur, double gamma);
    virtual int SUNImplicitSolve(mfem::Vector const &b, mfem::Vector &x, double tol);
    virtual int SUNMassSetup();
    virtual int SUNMassSolve(mfem::Vector const &b, mfem::Vector &x, double tol);
    virtual int SUNMassMult(mfem::Vector const &x, mfem::Vector &v);
    virtual mfem::Vector &_EvalMult(mfem::Vector const &arg0) const;

/* Internal director utilities */
public:
    bool swig_get_inner(const char *swig_protected_method_name) const {
      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
      return (iv != swig_inner.end() ? iv->second : false);
    }
    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
      swig_inner[swig_protected_method_name] = swig_val;
    }
private:
    mutable std::map<std::string, bool> swig_inner;

#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
/* VTable implementation */
    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
      PyObject *method = vtable[method_index];
      if (!method) {
        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
        method = PyObject_GetAttr(swig_get_self(), name);
        if (!method) {
          std::string msg = "Method in class PyTimeDependentOperatorBase doesn't exist, undefined ";
          msg += method_name;
          Swig::DirectorMethodException::raise(msg.c_str());
        }
        vtable[method_index] = method;
      }
      return method;
    }
private:
    mutable swig::SwigVar_PyObject vtable[23];
#endif

};


#endif
