update & fixes to sf_pml to support z-direction pml in clyindrical coords
parent
8316b1c2bd
commit
3d1c7f22b9
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "operator_ext_pml_sf.h"
|
#include "operator_ext_pml_sf.h"
|
||||||
#include "engine_ext_pml_sf.h"
|
#include "engine_ext_pml_sf.h"
|
||||||
|
#include "operator_cylinder.h"
|
||||||
|
|
||||||
#include "tools/array_ops.h"
|
#include "tools/array_ops.h"
|
||||||
|
|
||||||
|
@ -126,18 +127,32 @@ bool Operator_Ext_PML_SF::BuildExtension()
|
||||||
for (pos[2]=0;pos[2]<m_numLines[2];++pos[2])
|
for (pos[2]=0;pos[2]<m_numLines[2];++pos[2])
|
||||||
{
|
{
|
||||||
Calc_ECPos(0,n,pos,inEC);
|
Calc_ECPos(0,n,pos,inEC);
|
||||||
GetVV(0,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[1]/2/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
if (inEC[0]>0)
|
||||||
GetII(0,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[3]/2/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
GetVV(0,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[1]/2/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
||||||
|
if (inEC[2]>0)
|
||||||
|
GetII(0,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[3]/2/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
||||||
|
|
||||||
GetVI(0,n,pos[0],pos[1],pos[2]) = (dT/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
if (inEC[0]>0)
|
||||||
GetIV(0,n,pos[0],pos[1],pos[2]) = (dT/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
GetVI(0,n,pos[0],pos[1],pos[2]) = (dT/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
||||||
|
if (inEC[2]>0)
|
||||||
|
GetIV(0,n,pos[0],pos[1],pos[2]) = (dT/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
||||||
|
|
||||||
|
// if (n==0)
|
||||||
|
// cerr << pos[0] << " " << pos[1] << " " << pos[2] << " " << inEC[1] << endl;
|
||||||
|
|
||||||
Calc_ECPos(1,n,pos,inEC);
|
Calc_ECPos(1,n,pos,inEC);
|
||||||
GetVV(1,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[1]/2/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
if (inEC[0]>0)
|
||||||
GetII(1,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[3]/2/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
GetVV(1,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[1]/2/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
||||||
|
if (inEC[2]>0)
|
||||||
|
GetII(1,n,pos[0],pos[1],pos[2]) = (1-dT*inEC[3]/2/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
||||||
|
|
||||||
GetVI(1,n,pos[0],pos[1],pos[2]) = (dT/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
if (inEC[0]>0)
|
||||||
GetIV(1,n,pos[0],pos[1],pos[2]) = (dT/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
GetVI(1,n,pos[0],pos[1],pos[2]) = (dT/inEC[0])/(1+dT*inEC[1]/2/inEC[0]);
|
||||||
|
if (inEC[2]>0)
|
||||||
|
GetIV(1,n,pos[0],pos[1],pos[2]) = (dT/inEC[2])/(1+dT*inEC[3]/2/inEC[2]);
|
||||||
|
|
||||||
|
// if (n==0)
|
||||||
|
// cerr << pos[0] << " " << pos[1] << " " << pos[2] << " " << inEC[1] << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,13 +221,8 @@ double Operator_Ext_PML_SF_Plane::GetNodeArea(int ny, unsigned int pos[3], bool
|
||||||
{
|
{
|
||||||
unsigned int l_pos[] = {pos[0],pos[1],pos[2]};
|
unsigned int l_pos[] = {pos[0],pos[1],pos[2]};
|
||||||
l_pos[m_ny] = m_LineNr;
|
l_pos[m_ny] = m_LineNr;
|
||||||
if (ny==m_ny)
|
|
||||||
return m_Op->GetMeshDelta(m_nyP,l_pos,dualMesh)*m_Op->GetMeshDelta(m_nyPP,l_pos,dualMesh);
|
return m_Op->GetNodeArea(ny,l_pos,dualMesh);
|
||||||
if (ny==m_nyP)
|
|
||||||
return m_Op->GetMeshDelta(m_ny,l_pos,dualMesh)*m_Op->GetMeshDelta(m_nyPP,l_pos,dualMesh);
|
|
||||||
if (ny==m_nyPP)
|
|
||||||
return m_Op->GetMeshDelta(m_nyP,l_pos,dualMesh)*m_Op->GetMeshDelta(m_ny,l_pos,dualMesh);
|
|
||||||
return 0.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double Operator_Ext_PML_SF_Plane::GetNodeLength(int ny, unsigned int pos[3], bool dualMesh) const
|
double Operator_Ext_PML_SF_Plane::GetNodeLength(int ny, unsigned int pos[3], bool dualMesh) const
|
||||||
|
@ -245,8 +255,6 @@ bool Operator_Ext_PML_SF_Plane::Calc_ECPos(int nP, int n, unsigned int* pos, dou
|
||||||
double inMat[4];
|
double inMat[4];
|
||||||
m_Op->Calc_EffMatPos(n,l_pos,inMat);
|
m_Op->Calc_EffMatPos(n,l_pos,inMat);
|
||||||
|
|
||||||
UNUSED(nP);
|
|
||||||
|
|
||||||
double Zm = sqrt(inMat[2] / inMat[0]); // Zm = sqrt(mue/eps)
|
double Zm = sqrt(inMat[2] / inMat[0]); // Zm = sqrt(mue/eps)
|
||||||
double kappa = 0;
|
double kappa = 0;
|
||||||
double sigma = 0;
|
double sigma = 0;
|
||||||
|
@ -265,15 +273,23 @@ bool Operator_Ext_PML_SF_Plane::Calc_ECPos(int nP, int n, unsigned int* pos, dou
|
||||||
kappa = GetKappaGraded(depth) / Zm ;
|
kappa = GetKappaGraded(depth) / Zm ;
|
||||||
sigma = GetKappaGraded(depth-0.5*m_pml_delta) * Zm;
|
sigma = GetKappaGraded(depth-0.5*m_pml_delta) * Zm;
|
||||||
}
|
}
|
||||||
// if ((pos[0]==0) && (pos[1]==0))
|
if ((inMat[0]<=0) || (inMat[2]<=0)) //check if material properties are valid (necessary for cylindrical coords)
|
||||||
// cerr << n << "\t" << pos[m_ny] << "\t"<< depth << "\t" << kappa << "\t" << sigma << endl;
|
{
|
||||||
|
kappa = sigma = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inEC[0] = inMat[0] * GetNodeArea(n,pos) / GetNodeLength(n,pos);
|
double geomFactor = GetNodeArea(n,pos) / GetNodeLength(n,pos);
|
||||||
inEC[1] = (inMat[1]+kappa) * GetNodeArea(n,pos) / GetNodeLength(n,pos);
|
if (geomFactor<=0 || isnan(geomFactor) || isinf(geomFactor)) //check if geomFactor is positive, not zero and a valid number (necessary for cylindrical coords)
|
||||||
|
geomFactor = 0;
|
||||||
|
inEC[0] = inMat[0] * geomFactor;
|
||||||
|
inEC[1] = (inMat[1]+kappa) * geomFactor;
|
||||||
|
|
||||||
inEC[2] = inMat[2] * GetNodeArea(n,pos,true) / GetNodeLength(n,pos,true);
|
geomFactor = GetNodeArea(n,pos) / GetNodeLength(n,pos);
|
||||||
inEC[3] = (inMat[3]+sigma) * GetNodeArea(n,pos,true) / GetNodeLength(n,pos,true);
|
if (geomFactor<=0 || isnan(geomFactor) || isinf(geomFactor)) //check if geomFactor is positive, not zero and a valid number (necessary for cylindrical coords)
|
||||||
|
geomFactor = 0;
|
||||||
|
inEC[2] = inMat[2] * geomFactor;
|
||||||
|
inEC[3] = (inMat[3]+sigma) * geomFactor;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -344,11 +360,31 @@ Engine_Extension* Operator_Ext_PML_SF_Plane::CreateEngineExtention()
|
||||||
return eng_ext;
|
return eng_ext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Operator_Ext_PML_SF_Plane::IsCylinderCoordsSave() const
|
||||||
|
{
|
||||||
|
if (m_ny==2)
|
||||||
|
{
|
||||||
|
Operator_Cylinder* op_cyl = dynamic_cast<Operator_Cylinder*>(m_Op);
|
||||||
|
if (op_cyl==NULL)
|
||||||
|
{
|
||||||
|
cerr << "Operator_Ext_PML_SF_Plane::IsCylinderCoordsSave(): Error!!! Sanity check failed!!! ==> Developer is not sane.... this should never have happend.. exit..." << endl;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (op_cyl->GetClosedAlpha())
|
||||||
|
{
|
||||||
|
cerr << "Operator_Ext_PML_SF_Plane::IsCylinderCoordsSave(): Warning... this extension can not handle a closed alpha cylinder operator... " << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void Operator_Ext_PML_SF_Plane::ShowStat(ostream &ostr) const
|
void Operator_Ext_PML_SF_Plane::ShowStat(ostream &ostr) const
|
||||||
{
|
{
|
||||||
Operator_Extension::ShowStat(ostr);
|
Operator_Extension::ShowStat(ostr);
|
||||||
string XYZ[3] = {"x","y","z"};
|
string XYZ[3] = {"x","y","z"};
|
||||||
string top_bot[2] = {"top", "bottom"};
|
string top_bot[2] = {"bottom", "top"};
|
||||||
ostr << " Active direction\t: " << XYZ[m_ny] << " (" << top_bot[m_top] << ")" << endl;
|
ostr << " Active direction\t: " << XYZ[m_ny] << " (" << top_bot[m_top] << ")" << endl;
|
||||||
ostr << " PML width (cells)\t: " << m_numLines[m_ny] << endl;
|
ostr << " PML width (cells)\t: " << m_numLines[m_ny] << endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ public:
|
||||||
|
|
||||||
virtual Engine_Extension* CreateEngineExtention();
|
virtual Engine_Extension* CreateEngineExtention();
|
||||||
|
|
||||||
virtual bool IsCylinderCoordsSave() const {return false;}
|
virtual bool IsCylinderCoordsSave() const;
|
||||||
|
|
||||||
virtual string GetExtensionName() const {return string("Split Field PML Plane Extension");}
|
virtual string GetExtensionName() const {return string("Split Field PML Plane Extension");}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue