#ifndef CEED_OCCA_OPERATOR_HEADER
#define CEED_OCCA_OPERATOR_HEADER
#include <vector>
#include "ceed-occa-ceed-object.hpp"
#include "ceed-occa-operator-args.hpp"
namespace ceed {
namespace occa {
typedef std::vector<ceed::occa::Vector *> VectorVector_t;
class QFunction;
class Operator : public CeedObject {
public:
CeedInt ceedQ;
CeedInt ceedElementCount;
QFunction *qfunction;
OperatorArgs args;
::occa::kernel applyAddKernel;
bool needsInitialSetup;
::occa::memory qFunctionContextData;
Operator();
virtual ~Operator();
static Operator *getOperator(CeedOperator op, const bool assertValid = true);
static Operator *from(CeedOperator op);
bool isApplyingIdentityFunction();
int applyAdd(Vector *in, Vector *out, CeedRequest *request);
virtual ::occa::kernel buildApplyAddKernel() = 0;
virtual void initialSetup();
virtual void applyAdd(Vector *in, Vector *out) = 0;
static int registerCeedFunction(Ceed ceed, CeedOperator op, const char *fname, ceed::occa::ceedFunction f);
static int ceedCreate(CeedOperator op);
static int ceedCreateComposite(CeedOperator op);
static int ceedLinearAssembleQFunction(CeedOperator op);
static int ceedLinearAssembleQFunctionUpdate(CeedOperator op);
static int ceedLinearAssembleAddDiagonal(CeedOperator op);
static int ceedLinearAssembleAddPointBlockDiagonal(CeedOperator op);
static int ceedCreateFDMElementInverse(CeedOperator op);
static int ceedApplyAdd(CeedOperator op, CeedVector invec, CeedVector outvec, CeedRequest *request);
static int ceedDestroy(CeedOperator op);
};
} }
#endif