diff --git a/FDTD/operator_cylindermultigrid.cpp b/FDTD/operator_cylindermultigrid.cpp index dc648aa..b02b106 100644 --- a/FDTD/operator_cylindermultigrid.cpp +++ b/FDTD/operator_cylindermultigrid.cpp @@ -187,26 +187,37 @@ void Operator_CylinderMultiGrid::Reset() void Operator_CylinderMultiGrid::SetBoundaryCondition(int* BCs) { Operator_Cylinder::SetBoundaryCondition(BCs); + int oldBC = BCs[1]; BCs[1] = 0; //always PEC in +r-direction m_InnerOp->SetBoundaryCondition(BCs); + BCs[1] = oldBC; } void Operator_CylinderMultiGrid::AddExtension(Operator_Extension* op_ext) { if (dynamic_cast(op_ext)) { + if (op_ext->IsCylindricalMultiGridSave(false)==false) + return; + else + cerr << "Operator_CylinderMultiGrid::AddExtension: Warning: Operator extension \"" << op_ext->GetExtensionName() << "\" is not compatible with cylindrical multi-grids!! skipping...!" << endl; Operator_Cylinder::AddExtension(op_ext); return; } - Operator_Extension* child_Ext = op_ext->Clone(m_InnerOp); - if (child_Ext==NULL) + + if (op_ext->IsCylindricalMultiGridSave(true)) { - cerr << "Operator_CylinderMultiGrid::AddExtension: Warning, extension: " << op_ext->GetExtensionName() << " can not be cloned for the child operator. Skipping Extension... " << endl; - return; + Operator_Extension* child_Ext = op_ext->Clone(m_InnerOp); + if (child_Ext==NULL) + { + cerr << "Operator_CylinderMultiGrid::AddExtension: Warning, extension: " << op_ext->GetExtensionName() << " can not be cloned for the child operator. Skipping Extension... " << endl; + return; + } + //give the copy to child + m_InnerOp->AddExtension(child_Ext); } + Operator_Cylinder::AddExtension(op_ext); - //give the copy to child - m_InnerOp->AddExtension(child_Ext); } void Operator_CylinderMultiGrid::ShowStat() const diff --git a/FDTD/operator_ext_cylinder.h b/FDTD/operator_ext_cylinder.h index b880d39..188e9b6 100644 --- a/FDTD/operator_ext_cylinder.h +++ b/FDTD/operator_ext_cylinder.h @@ -35,6 +35,7 @@ public: virtual Engine_Extension* CreateEngineExtention(); virtual bool IsCylinderCoordsSave() const {return true;} + virtual bool IsCylindricalMultiGridChildSave(bool child) const {UNUSED(child);return true;} virtual std::string GetExtensionName() const {return std::string("Extension for the Cylinder-Coords Operator");} diff --git a/FDTD/operator_ext_mur_abc.cpp b/FDTD/operator_ext_mur_abc.cpp index 327c587..3c4142a 100644 --- a/FDTD/operator_ext_mur_abc.cpp +++ b/FDTD/operator_ext_mur_abc.cpp @@ -47,6 +47,25 @@ Operator_Extension* Operator_Ext_Mur_ABC::Clone(Operator* op) return new Operator_Ext_Mur_ABC(op, this); } +bool Operator_Ext_Mur_ABC::IsCylinderCoordsSave() const +{ + if (m_ny==2) + return true; + if ((m_ny==0) && (m_top)) + return true; + return false; +} + +bool Operator_Ext_Mur_ABC::IsCylindricalMultiGridSave(bool child) const +{ + if (m_ny==2) //always allow in z-direction + return true; + if ((m_ny==0) && (m_top) && (!child)) //if top r-direction and is not a child grid allow Mur... + return true; + //in all other cases this ABC is not save to use in CylindricalMultiGrid + return false; +} + void Operator_Ext_Mur_ABC::Initialize() { m_ny = -1; diff --git a/FDTD/operator_ext_mur_abc.h b/FDTD/operator_ext_mur_abc.h index 798886c..0ece933 100644 --- a/FDTD/operator_ext_mur_abc.h +++ b/FDTD/operator_ext_mur_abc.h @@ -41,7 +41,8 @@ public: virtual Engine_Extension* CreateEngineExtention(); - virtual bool IsCylinderCoordsSave() const {if (m_ny==2) return true; else return false;} + virtual bool IsCylinderCoordsSave() const; + virtual bool IsCylindricalMultiGridSave(bool child) const; virtual string GetExtensionName() const {return string("Mur ABC Extension");} diff --git a/FDTD/operator_extension.h b/FDTD/operator_extension.h index 54d24d9..6e6950c 100644 --- a/FDTD/operator_extension.h +++ b/FDTD/operator_extension.h @@ -26,7 +26,6 @@ using namespace std; - class Operator; class Engine_Extension; @@ -46,8 +45,12 @@ public: virtual Engine_Extension* CreateEngineExtention() {return 0;} + //! The cylindrical operator will check whether the extension is save to use. Default is false. Derive this method to override. virtual bool IsCylinderCoordsSave() const {return false;} + //! The cylindrical multi grid operator will check whether the extension is save to use. Default is false. Derive this method to override. + virtual bool IsCylindricalMultiGridSave(bool /*child*/) const {return false;} + virtual std::string GetExtensionName() const {return std::string("Abstract Operator Extension Base Class");} virtual void ShowStat(ostream &ostr) const;