/* * Copyright (C) 2010 Thorsten Liebig (Thorsten.Liebig@gmx.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef OPERATOR_CYLINDERMULTIGRID_H #define OPERATOR_CYLINDERMULTIGRID_H #include "operator_cylinder.h" //! This is a cylindrical FDTD operator using a simple multi-grid approach. /*! This cylindrical multi-grid operator itself is not calculating any real operator, instead it is hosting two separate "child" operators of type "Operator_Cylinder". This operator class (or the corresponding engine) will perform the interpolation and connection between these two child-operator/engines. One of the child operators itself may be another multi-grid operator to allow for a cascaded multi-grid approach. */ class Operator_CylinderMultiGrid : public Operator_Cylinder { friend class Engine_CylinderMultiGrid; public: static Operator_CylinderMultiGrid* New(vector Split_Radii, unsigned int numThreads = 0); virtual ~Operator_CylinderMultiGrid(); virtual double GetNumberCells() const; virtual Engine* CreateEngine() const; virtual bool SetGeometryCSX(ContinuousStructure* geo); virtual unsigned int GetSplitPos() const {return m_Split_Pos;} virtual int CalcECOperator(); virtual bool SetupExcitation(TiXmlElement* Excite, unsigned int maxTS); virtual void SetBoundaryCondition(int* BCs); virtual void AddExtension(Operator_Extension* op_ext); Operator_Cylinder* GetInnerOperator() const {return m_InnerOp;} virtual void ShowStat() const; protected: Operator_CylinderMultiGrid(vector Split_Radii); virtual void Init(); // virtual void InitOperator(); virtual void Reset(); double m_Split_Rad; vector m_Split_Radii; unsigned int m_Split_Pos; Operator_Cylinder* m_InnerOp; virtual void CalcStartStopLines(unsigned int &numThreads, vector &start, vector &stop) const; }; #endif // OPERATOR_CYLINDERMULTIGRID_H