diff --git a/FDTD/operator_ext_upml.cpp b/FDTD/operator_ext_upml.cpp index 9ab34cb..82a643f 100644 --- a/FDTD/operator_ext_upml.cpp +++ b/FDTD/operator_ext_upml.cpp @@ -16,7 +16,7 @@ */ #include "operator_ext_upml.h" -#include "operator_cylinder.h" +#include "operator_cylindermultigrid.h" #include "engine_ext_upml.h" #include "tools/array_ops.h" #include "fparser.hh" @@ -53,7 +53,7 @@ Operator_Ext_UPML::~Operator_Ext_UPML() DeleteOp(); } -void Operator_Ext_UPML::SetBoundaryCondition(int* BCs, unsigned int size[6]) +void Operator_Ext_UPML::SetBoundaryCondition(const int* BCs, const unsigned int size[6]) { for (int n=0;n<6;++n) { @@ -71,8 +71,11 @@ void Operator_Ext_UPML::SetRange(const unsigned int start[3], const unsigned int } } -bool Operator_Ext_UPML::Create_UPML(Operator* op, int BC[6], unsigned int size[6], string gradFunc) +bool Operator_Ext_UPML::Create_UPML(Operator* op, const int ui_BC[6], const unsigned int ui_size[6], string gradFunc) { + int BC[6]={ui_BC[0],ui_BC[1],ui_BC[2],ui_BC[3],ui_BC[4],ui_BC[5]}; + unsigned int size[6]={ui_size[0],ui_size[1],ui_size[2],ui_size[3],ui_size[4],ui_size[5]}; + //check if mesh is large enough to support the pml for (int n=0;n<3;++n) if ( (size[2*n]*(BC[2*n]==3)+size[2*n+1]*(BC[2*n+1]==3)) >= op->GetOriginalNumLines(n) ) @@ -163,6 +166,11 @@ bool Operator_Ext_UPML::Create_UPML(Operator* op, int BC[6], unsigned int size[6 start[1]=(size[2]+1)*(BC[2]==3); stop[1] =op->GetOriginalNumLines(1)-1-(size[3]+1)*(BC[3]==3); + //exclude x-lines that does not belong to the base multi-grid operator; + Operator_CylinderMultiGrid* op_cyl_MG = dynamic_cast(op); + if (op_cyl_MG) + start[0] = op_cyl_MG->GetSplitPos()-1; + if (BC[4]==3) { op_ext_upml = new Operator_Ext_UPML(op); @@ -184,6 +192,44 @@ bool Operator_Ext_UPML::Create_UPML(Operator* op, int BC[6], unsigned int size[6 op->AddExtension(op_ext_upml); } + BC[1]=0; + size[1]=0; + //create pml extensions (in z-direction only) for child operators in cylindrical multigrid operators + while (op_cyl_MG) + { + Operator_Cylinder* op_child = op_cyl_MG->GetInnerOperator(); + op_cyl_MG = dynamic_cast(op_child); + for (int n=0;n<2;++n) + { + start[n]=0; + stop[n]=op_child->GetOriginalNumLines(n)-1; + } + + if (op_cyl_MG) + start[0] = op_cyl_MG->GetSplitPos()-1; + + if (BC[4]==3) + { + op_ext_upml = new Operator_Ext_UPML(op_child); + op_ext_upml->SetGradingFunction(gradFunc); + start[2]=0; + stop[2] =size[4]; + op_ext_upml->SetBoundaryCondition(BC, size); + op_ext_upml->SetRange(start,stop); + op_child->AddExtension(op_ext_upml); + } + if (BC[5]==3) + { + op_ext_upml = new Operator_Ext_UPML(op_child); + op_ext_upml->SetGradingFunction(gradFunc); + start[2]=op->GetOriginalNumLines(2)-1-size[5]; + stop[2] =op->GetOriginalNumLines(2)-1; + op_ext_upml->SetBoundaryCondition(BC, size); + op_ext_upml->SetRange(start,stop); + op_child->AddExtension(op_ext_upml); + } + } + return true; } diff --git a/FDTD/operator_ext_upml.h b/FDTD/operator_ext_upml.h index 210b8bb..a0e7db1 100644 --- a/FDTD/operator_ext_upml.h +++ b/FDTD/operator_ext_upml.h @@ -38,7 +38,10 @@ public: //! Returns always true, Create_UPML method will take care of creating a valid pml for the cylindrical fdtd virtual bool IsCylinderCoordsSave() const {return true;} - void SetBoundaryCondition(int* BCs, unsigned int size[6]); + //! Returns always true if base grid, Create_UPML will create proper child pml extensions. + virtual bool IsCylindricalMultiGridSave(bool child) const {if (child) return false; return true;} + + void SetBoundaryCondition(const int* BCs, const unsigned int size[6]); void SetRange(const unsigned int start[3], const unsigned int stop[3]); @@ -66,7 +69,7 @@ public: virtual void ShowStat(ostream &ostr) const; //! Create the UPML - static bool Create_UPML(Operator* op, int BC[6], unsigned int size[6], string gradFunc); + static bool Create_UPML(Operator* op, const int ui_BC[6], const unsigned int ui_size[6], const string gradFunc); protected: Operator_Ext_UPML(Operator* op);