upml extension: operator get functions and disabled pml in non-pml regions
parent
043ef6ec4c
commit
672f2a436a
|
@ -370,6 +370,8 @@ bool Operator_Ext_UPML::BuildExtension()
|
||||||
CalcGradingKappa(n, pos,__Z0__ ,kappa_v ,kappa_i);
|
CalcGradingKappa(n, pos,__Z0__ ,kappa_v ,kappa_i);
|
||||||
nP = (n+1)%3;
|
nP = (n+1)%3;
|
||||||
nPP = (n+2)%3;
|
nPP = (n+2)%3;
|
||||||
|
if ((kappa_v[0]+kappa_v[1]+kappa_v[2])!=0)
|
||||||
|
{
|
||||||
//check if pos is on PEC
|
//check if pos is on PEC
|
||||||
if ( (m_Op->GetVV(n,pos[0],pos[1],pos[2]) + m_Op->GetVI(n,pos[0],pos[1],pos[2])) != 0 )
|
if ( (m_Op->GetVV(n,pos[0],pos[1],pos[2]) + m_Op->GetVI(n,pos[0],pos[1],pos[2])) != 0 )
|
||||||
{
|
{
|
||||||
|
@ -381,11 +383,22 @@ bool Operator_Ext_UPML::BuildExtension()
|
||||||
|
|
||||||
|
|
||||||
//operators needed by eq. (7.88) to calculate new voltages from old voltages and old and new "voltage fluxes"
|
//operators needed by eq. (7.88) to calculate new voltages from old voltages and old and new "voltage fluxes"
|
||||||
vv [n][loc_pos[0]][loc_pos[1]][loc_pos[2]] = (2*__EPS0__ - kappa_v[nPP]*dT) / (2*__EPS0__ + kappa_v[nPP]*dT);
|
GetVV(n,loc_pos) = (2*__EPS0__ - kappa_v[nPP]*dT) / (2*__EPS0__ + kappa_v[nPP]*dT);
|
||||||
vvfn[n][loc_pos[0]][loc_pos[1]][loc_pos[2]] = (2*__EPS0__ + kappa_v[n]*dT) / (2*__EPS0__ + kappa_v[nPP]*dT)/eff_Mat[0];
|
GetVVFN(n,loc_pos) = (2*__EPS0__ + kappa_v[n]*dT) / (2*__EPS0__ + kappa_v[nPP]*dT)/eff_Mat[0];
|
||||||
vvfo[n][loc_pos[0]][loc_pos[1]][loc_pos[2]] = (2*__EPS0__ - kappa_v[n]*dT) / (2*__EPS0__ + kappa_v[nPP]*dT)/eff_Mat[0];
|
GetVVFO(n,loc_pos) = (2*__EPS0__ - kappa_v[n]*dT) / (2*__EPS0__ + kappa_v[nPP]*dT)/eff_Mat[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//disable upml
|
||||||
|
GetVV(n,loc_pos) = m_Op->GetVV(n,pos[0],pos[1],pos[2]);
|
||||||
|
m_Op->GetVV(n,pos[0],pos[1],pos[2]) = 0;
|
||||||
|
GetVVFO(n,loc_pos) = 0;
|
||||||
|
GetVVFN(n,loc_pos) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((kappa_i[0]+kappa_i[1]+kappa_i[2])!=0)
|
||||||
|
{
|
||||||
//check if pos is on PMC
|
//check if pos is on PMC
|
||||||
if ( (m_Op->GetII(n,pos[0],pos[1],pos[2]) + m_Op->GetIV(n,pos[0],pos[1],pos[2])) != 0 )
|
if ( (m_Op->GetII(n,pos[0],pos[1],pos[2]) + m_Op->GetIV(n,pos[0],pos[1],pos[2])) != 0 )
|
||||||
{
|
{
|
||||||
|
@ -396,9 +409,18 @@ bool Operator_Ext_UPML::BuildExtension()
|
||||||
m_Op->GetIV(n,pos[0],pos[1],pos[2]) = (2*__EPS0__*dT) / (2*__EPS0__ + kappa_i[nP]*dT) * m_Op->GetEdgeLength(n,pos,true) / m_Op->GetEdgeArea(n,pos,true);
|
m_Op->GetIV(n,pos[0],pos[1],pos[2]) = (2*__EPS0__*dT) / (2*__EPS0__ + kappa_i[nP]*dT) * m_Op->GetEdgeLength(n,pos,true) / m_Op->GetEdgeArea(n,pos,true);
|
||||||
|
|
||||||
//operators needed by eq. (7.90) to calculate new currents from old currents and old and new "current fluxes"
|
//operators needed by eq. (7.90) to calculate new currents from old currents and old and new "current fluxes"
|
||||||
ii [n][loc_pos[0]][loc_pos[1]][loc_pos[2]] = (2*__EPS0__ - kappa_i[nPP]*dT) / (2*__EPS0__ + kappa_i[nPP]*dT);
|
GetII(n,loc_pos) = (2*__EPS0__ - kappa_i[nPP]*dT) / (2*__EPS0__ + kappa_i[nPP]*dT);
|
||||||
iifn[n][loc_pos[0]][loc_pos[1]][loc_pos[2]] = (2*__EPS0__ + kappa_i[n]*dT) / (2*__EPS0__ + kappa_i[nPP]*dT)/eff_Mat[2];
|
GetIIFN(n,loc_pos) = (2*__EPS0__ + kappa_i[n]*dT) / (2*__EPS0__ + kappa_i[nPP]*dT)/eff_Mat[2];
|
||||||
iifo[n][loc_pos[0]][loc_pos[1]][loc_pos[2]] = (2*__EPS0__ - kappa_i[n]*dT) / (2*__EPS0__ + kappa_i[nPP]*dT)/eff_Mat[2];
|
GetIIFO(n,loc_pos) = (2*__EPS0__ - kappa_i[n]*dT) / (2*__EPS0__ + kappa_i[nPP]*dT)/eff_Mat[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//disable upml
|
||||||
|
GetII(n,loc_pos) = m_Op->GetII(n,pos[0],pos[1],pos[2]);
|
||||||
|
m_Op->GetII(n,pos[0],pos[1],pos[2]) = 0;
|
||||||
|
GetIIFO(n,loc_pos) = 0;
|
||||||
|
GetIIFN(n,loc_pos) = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,14 @@ protected:
|
||||||
void CalcGradingKappa(int ny, unsigned int pos[3], double Zm, double kappa_v[3], double kappa_i[3]);
|
void CalcGradingKappa(int ny, unsigned int pos[3], double Zm, double kappa_v[3], double kappa_i[3]);
|
||||||
|
|
||||||
void DeleteOp();
|
void DeleteOp();
|
||||||
|
|
||||||
|
virtual FDTD_FLOAT& GetVV(int ny, unsigned int pos[3]) {return vv[ny][pos[0]][pos[1]][pos[2]];}
|
||||||
|
virtual FDTD_FLOAT& GetVVFO(int ny, unsigned int pos[3]) {return vvfo[ny][pos[0]][pos[1]][pos[2]];}
|
||||||
|
virtual FDTD_FLOAT& GetVVFN(int ny, unsigned int pos[3]) {return vvfn[ny][pos[0]][pos[1]][pos[2]];}
|
||||||
|
virtual FDTD_FLOAT& GetII(int ny, unsigned int pos[3]) {return ii[ny][pos[0]][pos[1]][pos[2]];}
|
||||||
|
virtual FDTD_FLOAT& GetIIFO(int ny, unsigned int pos[3]) {return iifo[ny][pos[0]][pos[1]][pos[2]];}
|
||||||
|
virtual FDTD_FLOAT& GetIIFN(int ny, unsigned int pos[3]) {return iifn[ny][pos[0]][pos[1]][pos[2]];}
|
||||||
|
|
||||||
FDTD_FLOAT**** vv; //calc new voltage from old voltage
|
FDTD_FLOAT**** vv; //calc new voltage from old voltage
|
||||||
FDTD_FLOAT**** vvfo; //calc new voltage from old voltage flux
|
FDTD_FLOAT**** vvfo; //calc new voltage from old voltage flux
|
||||||
FDTD_FLOAT**** vvfn; //calc new voltage from new voltage flux
|
FDTD_FLOAT**** vvfn; //calc new voltage from new voltage flux
|
||||||
|
|
Loading…
Reference in New Issue