added support for Lorentz dispersive material
Signed-off-by: Thorsten Liebig <Thorsten.Liebig@gmx.de>
This commit is contained in:
parent
130f07aef2
commit
57dfd64c9b
@ -23,11 +23,57 @@ Engine_Ext_LorentzMaterial::Engine_Ext_LorentzMaterial(Operator_Ext_LorentzMater
|
||||
{
|
||||
m_Op_Ext_Lor = op_ext_lorentz;
|
||||
m_Order = m_Op_Ext_Lor->GetDispersionOrder();
|
||||
int order = m_Op_Ext_Lor->m_Order;
|
||||
|
||||
curr_Lor_ADE = new FDTD_FLOAT**[order];
|
||||
volt_Lor_ADE = new FDTD_FLOAT**[order];
|
||||
for (int o=0;o<order;++o)
|
||||
{
|
||||
curr_Lor_ADE[o] = new FDTD_FLOAT*[3];
|
||||
volt_Lor_ADE[o] = new FDTD_FLOAT*[3];
|
||||
for (int n=0; n<3; ++n)
|
||||
{
|
||||
if (m_Op_Ext_Lor->m_curr_Lor_ADE_On[o]==true)
|
||||
{
|
||||
curr_Lor_ADE[o][n] = new FDTD_FLOAT[m_Op_Ext_Lor->m_LM_Count[o]];
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count[o]; ++i)
|
||||
curr_Lor_ADE[o][n][i]=0.0;
|
||||
}
|
||||
else
|
||||
curr_Lor_ADE[o][n] = NULL;
|
||||
|
||||
if (m_Op_Ext_Lor->m_volt_Lor_ADE_On[o]==true)
|
||||
{
|
||||
volt_Lor_ADE[o][n] = new FDTD_FLOAT[m_Op_Ext_Lor->m_LM_Count[o]];
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count[o]; ++i)
|
||||
volt_Lor_ADE[o][n][i]=0.0;
|
||||
}
|
||||
else
|
||||
volt_Lor_ADE[o][n] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Engine_Ext_LorentzMaterial::~Engine_Ext_LorentzMaterial()
|
||||
{
|
||||
if (curr_Lor_ADE==NULL && volt_Lor_ADE==NULL)
|
||||
return;
|
||||
|
||||
for (int o=0;o<m_Op_Ext_Lor->m_Order;++o)
|
||||
{
|
||||
for (int n=0; n<3; ++n)
|
||||
{
|
||||
delete[] curr_Lor_ADE[o][n];
|
||||
delete[] volt_Lor_ADE[o][n];
|
||||
}
|
||||
delete[] curr_Lor_ADE[o];
|
||||
delete[] volt_Lor_ADE[o];
|
||||
}
|
||||
delete[] curr_Lor_ADE;
|
||||
curr_Lor_ADE=NULL;
|
||||
|
||||
delete[] volt_Lor_ADE;
|
||||
volt_Lor_ADE=NULL;
|
||||
}
|
||||
|
||||
void Engine_Ext_LorentzMaterial::DoPreVoltageUpdates()
|
||||
@ -38,53 +84,116 @@ void Engine_Ext_LorentzMaterial::DoPreVoltageUpdates()
|
||||
|
||||
unsigned int **pos = m_Op_Ext_Lor->m_LM_pos[o];
|
||||
|
||||
//switch for different engine types to access faster inline engine functions
|
||||
switch (m_Eng->GetType())
|
||||
if (m_Op_Ext_Lor->m_volt_Lor_ADE_On[o])
|
||||
{
|
||||
case Engine::BASIC:
|
||||
{
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
//switch for different engine types to access faster inline engine functions
|
||||
switch (m_Eng->GetType())
|
||||
{
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * m_Eng->Engine::GetVolt(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
case Engine::BASIC:
|
||||
{
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
volt_Lor_ADE[o][0][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][0][i]*volt_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * (m_Eng->Engine::GetVolt(0,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][0][i]);
|
||||
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * m_Eng->Engine::GetVolt(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
volt_Lor_ADE[o][1][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][1][i]*volt_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * (m_Eng->Engine::GetVolt(1,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][2][i]);
|
||||
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * m_Eng->Engine::GetVolt(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
volt_Lor_ADE[o][2][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][2][i]*volt_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * (m_Eng->Engine::GetVolt(2,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Engine::SSE:
|
||||
{
|
||||
Engine_sse* eng_sse = (Engine_sse*)m_Eng;
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
volt_Lor_ADE[o][0][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][0][i]*volt_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * (eng_sse->Engine_sse::GetVolt(0,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][0][i]);
|
||||
|
||||
volt_Lor_ADE[o][1][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][1][i]*volt_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * (eng_sse->Engine_sse::GetVolt(1,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][1][i]);
|
||||
|
||||
volt_Lor_ADE[o][2][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][2][i]*volt_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * (eng_sse->Engine_sse::GetVolt(2,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
volt_Lor_ADE[o][0][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][0][i]*volt_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * (m_Eng->GetVolt(0,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][0][i]);
|
||||
|
||||
volt_Lor_ADE[o][1][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][1][i]*volt_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * (m_Eng->GetVolt(1,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][1][i]);
|
||||
|
||||
volt_Lor_ADE[o][2][i]+=m_Op_Ext_Lor->v_Lor_ADE[o][2][i]*volt_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * (m_Eng->GetVolt(2,pos[0][i],pos[1][i],pos[2][i])-volt_Lor_ADE[o][2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Engine::SSE:
|
||||
else
|
||||
{
|
||||
Engine_sse* eng_sse = (Engine_sse*)m_Eng;
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
//switch for different engine types to access faster inline engine functions
|
||||
switch (m_Eng->GetType())
|
||||
{
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * eng_sse->Engine_sse::GetVolt(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * eng_sse->Engine_sse::GetVolt(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * eng_sse->Engine_sse::GetVolt(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
case Engine::BASIC:
|
||||
{
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * m_Eng->GetVolt(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * m_Eng->Engine::GetVolt(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * m_Eng->GetVolt(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * m_Eng->Engine::GetVolt(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * m_Eng->GetVolt(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * m_Eng->Engine::GetVolt(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Engine::SSE:
|
||||
{
|
||||
Engine_sse* eng_sse = (Engine_sse*)m_Eng;
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * eng_sse->Engine_sse::GetVolt(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * eng_sse->Engine_sse::GetVolt(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * eng_sse->Engine_sse::GetVolt(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
volt_ADE[o][0][i] *= m_Op_Ext_Lor->v_int_ADE[o][0][i];
|
||||
volt_ADE[o][0][i] += m_Op_Ext_Lor->v_ext_ADE[o][0][i] * m_Eng->GetVolt(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][1][i] *= m_Op_Ext_Lor->v_int_ADE[o][1][i];
|
||||
volt_ADE[o][1][i] += m_Op_Ext_Lor->v_ext_ADE[o][1][i] * m_Eng->GetVolt(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
volt_ADE[o][2][i] *= m_Op_Ext_Lor->v_int_ADE[o][2][i];
|
||||
volt_ADE[o][2][i] += m_Op_Ext_Lor->v_ext_ADE[o][2][i] * m_Eng->GetVolt(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -97,53 +206,116 @@ void Engine_Ext_LorentzMaterial::DoPreCurrentUpdates()
|
||||
|
||||
unsigned int **pos = m_Op_Ext_Lor->m_LM_pos[o];
|
||||
|
||||
//switch for different engine types to access faster inline engine functions
|
||||
switch (m_Eng->GetType())
|
||||
if (m_Op_Ext_Lor->m_curr_Lor_ADE_On[o])
|
||||
{
|
||||
case Engine::BASIC:
|
||||
{
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
//switch for different engine types to access faster inline engine functions
|
||||
switch (m_Eng->GetType())
|
||||
{
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * m_Eng->Engine::GetCurr(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
case Engine::BASIC:
|
||||
{
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
curr_Lor_ADE[o][0][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][0][i]*curr_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * (m_Eng->Engine::GetCurr(0,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][0][i]);
|
||||
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * m_Eng->Engine::GetCurr(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
curr_Lor_ADE[o][1][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][1][i]*curr_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * (m_Eng->Engine::GetCurr(1,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][1][i]);
|
||||
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * m_Eng->Engine::GetCurr(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
curr_Lor_ADE[o][2][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][2][i]*curr_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * (m_Eng->Engine::GetCurr(2,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Engine::SSE:
|
||||
{
|
||||
Engine_sse* eng_sse = (Engine_sse*)m_Eng;
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
curr_Lor_ADE[o][0][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][0][i]*curr_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * (eng_sse->Engine_sse::GetCurr(0,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][0][i]);
|
||||
|
||||
curr_Lor_ADE[o][1][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][1][i]*curr_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * (eng_sse->Engine_sse::GetCurr(1,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][1][i]);
|
||||
|
||||
curr_Lor_ADE[o][2][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][2][i]*curr_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * (eng_sse->Engine_sse::GetCurr(2,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
curr_Lor_ADE[o][0][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][0][i]*curr_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * (m_Eng->GetCurr(0,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][0][i]);
|
||||
|
||||
curr_Lor_ADE[o][1][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][1][i]*curr_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * (m_Eng->GetCurr(1,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][1][i]);
|
||||
|
||||
curr_Lor_ADE[o][2][i]+=m_Op_Ext_Lor->i_Lor_ADE[o][2][i]*curr_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * (m_Eng->GetCurr(2,pos[0][i],pos[1][i],pos[2][i])-curr_Lor_ADE[o][2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Engine::SSE:
|
||||
else
|
||||
{
|
||||
Engine_sse* eng_sse = (Engine_sse*)m_Eng;
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
//switch for different engine types to access faster inline engine functions
|
||||
switch (m_Eng->GetType())
|
||||
{
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * eng_sse->Engine_sse::GetCurr(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * eng_sse->Engine_sse::GetCurr(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * eng_sse->Engine_sse::GetCurr(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
case Engine::BASIC:
|
||||
{
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * m_Eng->GetCurr(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * m_Eng->Engine::GetCurr(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * m_Eng->GetCurr(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * m_Eng->Engine::GetCurr(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * m_Eng->GetCurr(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * m_Eng->Engine::GetCurr(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Engine::SSE:
|
||||
{
|
||||
Engine_sse* eng_sse = (Engine_sse*)m_Eng;
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * eng_sse->Engine_sse::GetCurr(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * eng_sse->Engine_sse::GetCurr(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * eng_sse->Engine_sse::GetCurr(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
for (unsigned int i=0; i<m_Op_Ext_Lor->m_LM_Count.at(o); ++i)
|
||||
{
|
||||
curr_ADE[o][0][i] *= m_Op_Ext_Lor->i_int_ADE[o][0][i];
|
||||
curr_ADE[o][0][i] += m_Op_Ext_Lor->i_ext_ADE[o][0][i] * m_Eng->GetCurr(0,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][1][i] *= m_Op_Ext_Lor->i_int_ADE[o][1][i];
|
||||
curr_ADE[o][1][i] += m_Op_Ext_Lor->i_ext_ADE[o][1][i] * m_Eng->GetCurr(1,pos[0][i],pos[1][i],pos[2][i]);
|
||||
|
||||
curr_ADE[o][2][i] *= m_Op_Ext_Lor->i_int_ADE[o][2][i];
|
||||
curr_ADE[o][2][i] += m_Op_Ext_Lor->i_ext_ADE[o][2][i] * m_Eng->GetCurr(2,pos[0][i],pos[1][i],pos[2][i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,6 +34,15 @@ public:
|
||||
|
||||
protected:
|
||||
Operator_Ext_LorentzMaterial* m_Op_Ext_Lor;
|
||||
|
||||
//! ADE Lorentz voltages
|
||||
// Array setup: volt_Lor_ADE[N_order][direction][mesh_pos]
|
||||
FDTD_FLOAT ***volt_Lor_ADE;
|
||||
|
||||
//! ADE Lorentz currents
|
||||
// Array setup: curr_Lor_ADE[N_order][direction][mesh_pos]
|
||||
FDTD_FLOAT ***curr_Lor_ADE;
|
||||
|
||||
};
|
||||
|
||||
#endif // ENGINE_EXT_LORENTZMATERIAL_H
|
||||
|
@ -28,6 +28,12 @@ Operator_Ext_LorentzMaterial::Operator_Ext_LorentzMaterial(Operator* op) : Opera
|
||||
v_ext_ADE = NULL;
|
||||
i_int_ADE = NULL;
|
||||
i_ext_ADE = NULL;
|
||||
|
||||
v_Lor_ADE = NULL;
|
||||
i_Lor_ADE = NULL;
|
||||
|
||||
m_curr_Lor_ADE_On = NULL;
|
||||
m_curr_Lor_ADE_On = NULL;
|
||||
}
|
||||
|
||||
Operator_Ext_LorentzMaterial::Operator_Ext_LorentzMaterial(Operator* op, Operator_Ext_LorentzMaterial* op_ext) : Operator_Ext_Dispersive(op,op_ext)
|
||||
@ -36,6 +42,12 @@ Operator_Ext_LorentzMaterial::Operator_Ext_LorentzMaterial(Operator* op, Operato
|
||||
v_ext_ADE = NULL;
|
||||
i_int_ADE = NULL;
|
||||
i_ext_ADE = NULL;
|
||||
|
||||
v_Lor_ADE = NULL;
|
||||
i_Lor_ADE = NULL;
|
||||
|
||||
m_curr_Lor_ADE_On = NULL;
|
||||
m_curr_Lor_ADE_On = NULL;
|
||||
}
|
||||
|
||||
Operator_Ext_LorentzMaterial::~Operator_Ext_LorentzMaterial()
|
||||
@ -54,6 +66,10 @@ Operator_Ext_LorentzMaterial::~Operator_Ext_LorentzMaterial()
|
||||
delete[] i_int_ADE[i][n];
|
||||
delete[] i_ext_ADE[i][n];
|
||||
}
|
||||
if (m_volt_Lor_ADE_On[i])
|
||||
delete[] v_Lor_ADE[i][n];
|
||||
if (m_curr_Lor_ADE_On[i])
|
||||
delete[] i_Lor_ADE[i][n];
|
||||
}
|
||||
if (m_volt_ADE_On[i])
|
||||
{
|
||||
@ -65,6 +81,10 @@ Operator_Ext_LorentzMaterial::~Operator_Ext_LorentzMaterial()
|
||||
delete[] i_int_ADE[i];
|
||||
delete[] i_ext_ADE[i];
|
||||
}
|
||||
if (m_volt_Lor_ADE_On[i])
|
||||
delete[] v_Lor_ADE[i];
|
||||
if (m_curr_Lor_ADE_On[i])
|
||||
delete[] i_Lor_ADE[i];
|
||||
}
|
||||
delete[] v_int_ADE;
|
||||
delete[] v_ext_ADE;
|
||||
@ -74,6 +94,16 @@ Operator_Ext_LorentzMaterial::~Operator_Ext_LorentzMaterial()
|
||||
v_ext_ADE = NULL;
|
||||
i_int_ADE = NULL;
|
||||
i_ext_ADE = NULL;
|
||||
|
||||
delete[] v_Lor_ADE;
|
||||
delete[] i_Lor_ADE;
|
||||
v_Lor_ADE = NULL;
|
||||
i_Lor_ADE = NULL;
|
||||
|
||||
delete[] m_curr_Lor_ADE_On;
|
||||
delete[] m_volt_Lor_ADE_On;
|
||||
m_curr_Lor_ADE_On = NULL;
|
||||
m_curr_Lor_ADE_On = NULL;
|
||||
}
|
||||
|
||||
Operator_Extension* Operator_Ext_LorentzMaterial::Clone(Operator* op)
|
||||
@ -91,15 +121,24 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
unsigned int numLines[3] = {m_Op->GetNumberOfLines(0,true),m_Op->GetNumberOfLines(1,true),m_Op->GetNumberOfLines(2,true)};
|
||||
CSPropLorentzMaterial* mat = NULL;
|
||||
|
||||
double w_plasma,t_relax;
|
||||
bool b_pos_on;
|
||||
vector<unsigned int> v_pos[3];
|
||||
|
||||
// drude material parameter
|
||||
double w_plasma,t_relax;
|
||||
double L_D[3], C_D[3];
|
||||
double R_D[3], G_D[3];
|
||||
vector<double> v_int[3];
|
||||
vector<double> v_ext[3];
|
||||
vector<double> i_int[3];
|
||||
vector<double> i_ext[3];
|
||||
vector<unsigned int> v_pos[3];
|
||||
|
||||
//additional Dorentz material parameter
|
||||
double w_Lor_Pol;
|
||||
double C_L[3];
|
||||
double L_L[3];
|
||||
vector<double> v_Lor[3];
|
||||
vector<double> i_Lor[3];
|
||||
|
||||
m_Order = 0;
|
||||
vector<CSProperties*> LD_props = m_Op->CSX->GetPropertyByType(CSProperties::LORENTZMATERIAL);
|
||||
@ -112,27 +151,40 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
m_Order=LorMat->GetDispersionOrder();
|
||||
}
|
||||
|
||||
m_LM_pos = new unsigned int**[m_Order];
|
||||
|
||||
m_volt_ADE_On = new bool[m_Order];
|
||||
m_curr_ADE_On = new bool[m_Order];
|
||||
m_LM_pos = new unsigned int**[m_Order];
|
||||
m_volt_Lor_ADE_On = new bool[m_Order];
|
||||
m_curr_Lor_ADE_On = new bool[m_Order];
|
||||
|
||||
v_int_ADE = new FDTD_FLOAT**[m_Order];
|
||||
v_ext_ADE = new FDTD_FLOAT**[m_Order];
|
||||
i_int_ADE = new FDTD_FLOAT**[m_Order];
|
||||
i_ext_ADE = new FDTD_FLOAT**[m_Order];
|
||||
|
||||
v_Lor_ADE = new FDTD_FLOAT**[m_Order];
|
||||
i_Lor_ADE = new FDTD_FLOAT**[m_Order];
|
||||
|
||||
for (int order=0;order<m_Order;++order)
|
||||
{
|
||||
m_volt_ADE_On[order]=false;
|
||||
m_curr_ADE_On[order]=false;
|
||||
|
||||
m_volt_Lor_ADE_On[order]=false;
|
||||
m_curr_Lor_ADE_On[order]=false;
|
||||
|
||||
for (int n=0;n<3;++n)
|
||||
{
|
||||
v_pos[n].clear();
|
||||
|
||||
v_int[n].clear();
|
||||
v_ext[n].clear();
|
||||
i_int[n].clear();
|
||||
i_ext[n].clear();
|
||||
v_pos[n].clear();
|
||||
|
||||
v_Lor[n].clear();
|
||||
i_Lor[n].clear();
|
||||
}
|
||||
|
||||
for (pos[0]=0; pos[0]<numLines[0]; ++pos[0])
|
||||
@ -148,11 +200,15 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
{
|
||||
L_D[n]=0;
|
||||
R_D[n]=0;
|
||||
C_L[n]=0;
|
||||
if (m_Op->GetYeeCoords(n,pos,coord,false)==false)
|
||||
continue;
|
||||
if (m_CC_R0_included && (n==2) && (pos[0]==0))
|
||||
coord[1] = m_Op->GetDiscLine(1,0);
|
||||
|
||||
if (m_Op->GetVI(n,pos[0],pos[1],pos[2])==0)
|
||||
continue;
|
||||
|
||||
CSProperties* prop = m_Op->GetGeometryCSX()->GetPropertyByCoordPriority(coord,(CSProperties::PropertyType)(CSProperties::METAL | CSProperties::MATERIAL), true);
|
||||
if ((mat = prop->ToLorentzMaterial()))
|
||||
{
|
||||
@ -168,6 +224,12 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
{
|
||||
R_D[n] = L_D[n]/t_relax;
|
||||
}
|
||||
w_Lor_Pol = mat->GetEpsLorPoleFreqWeighted(order,n,coord) * 2 * PI;
|
||||
if ((w_Lor_Pol>0) && (L_D[n]>0))
|
||||
{
|
||||
m_volt_Lor_ADE_On[order] = true;
|
||||
C_L[n] = 1/(w_Lor_Pol*w_Lor_Pol*L_D[n]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,8 +237,11 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
{
|
||||
C_D[n]=0;
|
||||
G_D[n]=0;
|
||||
L_L[n]=0;
|
||||
if (m_Op->GetYeeCoords(n,pos,coord,true)==false)
|
||||
continue;
|
||||
if (m_Op->GetIV(n,pos[0],pos[1],pos[2])==0)
|
||||
continue;
|
||||
|
||||
CSProperties* prop = m_Op->GetGeometryCSX()->GetPropertyByCoordPriority(coord,(CSProperties::PropertyType)(CSProperties::METAL | CSProperties::MATERIAL), true);
|
||||
if ((mat = prop->ToLorentzMaterial()))
|
||||
@ -193,10 +258,16 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
{
|
||||
G_D[n] = C_D[n]/t_relax;
|
||||
}
|
||||
w_Lor_Pol = mat->GetMueLorPoleFreqWeighted(order,n,coord) * 2 * PI;
|
||||
if ((w_Lor_Pol>0) && (C_D[n]>0))
|
||||
{
|
||||
m_curr_Lor_ADE_On[order] = true;
|
||||
L_L[n] = 1/(w_Lor_Pol*w_Lor_Pol*C_D[n]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (b_pos_on) //this position has active lorentz material
|
||||
if (b_pos_on) //this position has active drude material
|
||||
{
|
||||
for (unsigned int n=0; n<3; ++n)
|
||||
{
|
||||
@ -225,7 +296,14 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
i_int[n].push_back(1);
|
||||
i_ext[n].push_back(0);
|
||||
}
|
||||
// cerr << v_int[n].back() << " " << v_ext[n].back() << " " << i_int[n].back() << " " << i_ext[n].back() << endl;
|
||||
if (C_L[n]>0)
|
||||
v_Lor[n].push_back(dT/C_L[n]/m_Op->GetVI(n,pos[0],pos[1],pos[2]));
|
||||
else
|
||||
v_Lor[n].push_back(0);
|
||||
if (L_L[n]>0)
|
||||
i_Lor[n].push_back(dT/L_L[n]/m_Op->GetIV(n,pos[0],pos[1],pos[2]));
|
||||
else
|
||||
i_Lor[n].push_back(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -259,6 +337,16 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
i_ext_ADE[order] = NULL;
|
||||
}
|
||||
|
||||
if (m_volt_Lor_ADE_On[order])
|
||||
v_Lor_ADE[order] = new FDTD_FLOAT*[3];
|
||||
else
|
||||
v_Lor_ADE[order] = NULL;
|
||||
|
||||
if (m_curr_Lor_ADE_On[order])
|
||||
i_Lor_ADE[order] = new FDTD_FLOAT*[3];
|
||||
else
|
||||
i_Lor_ADE[order] = NULL;
|
||||
|
||||
for (int n=0; n<3; ++n)
|
||||
{
|
||||
m_LM_pos[order][n] = new unsigned int[m_LM_Count.at(order)];
|
||||
@ -286,6 +374,19 @@ bool Operator_Ext_LorentzMaterial::BuildExtension()
|
||||
i_ext_ADE[order][n][i] = i_ext[n].at(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_volt_Lor_ADE_On[order])
|
||||
{
|
||||
v_Lor_ADE[order][n] = new FDTD_FLOAT[m_LM_Count.at(order)];
|
||||
for (unsigned int i=0; i<m_LM_Count.at(order); ++i)
|
||||
v_Lor_ADE[order][n][i] = v_Lor[n].at(i);
|
||||
}
|
||||
if (m_curr_Lor_ADE_On[order])
|
||||
{
|
||||
i_Lor_ADE[order][n] = new FDTD_FLOAT[m_LM_Count.at(order)];
|
||||
for (unsigned int i=0; i<m_LM_Count.at(order); ++i)
|
||||
i_Lor_ADE[order][n][i] = i_Lor[n].at(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -300,5 +401,15 @@ Engine_Extension* Operator_Ext_LorentzMaterial::CreateEngineExtention()
|
||||
|
||||
void Operator_Ext_LorentzMaterial::ShowStat(ostream &ostr) const
|
||||
{
|
||||
Operator_Ext_Dispersive::ShowStat(ostr);
|
||||
Operator_Extension::ShowStat(ostr);
|
||||
string On_Off[2] = {"Off", "On"};
|
||||
ostr << " Max. Dispersion Order N = " << m_Order << endl;
|
||||
for (int i=0;i<m_Order;++i)
|
||||
{
|
||||
ostr << " N=" << i << ":\t Active cells\t\t: " << m_LM_Count.at(i) << endl;
|
||||
ostr << " N=" << i << ":\t Voltage ADE is \t: " << On_Off[m_volt_ADE_On[i]] << endl;
|
||||
ostr << " N=" << i << ":\t Voltage Lor-ADE is \t: " << On_Off[m_volt_Lor_ADE_On[i]] << endl;
|
||||
ostr << " N=" << i << ":\t Current ADE is \t: " << On_Off[m_curr_ADE_On[i]] << endl;
|
||||
ostr << " N=" << i << ":\t Current Lor-ADE is \t: " << On_Off[m_curr_Lor_ADE_On[i]] << endl;
|
||||
}
|
||||
}
|
||||
|
@ -51,6 +51,12 @@ protected:
|
||||
FDTD_FLOAT ***v_ext_ADE;
|
||||
FDTD_FLOAT ***i_int_ADE;
|
||||
FDTD_FLOAT ***i_ext_ADE;
|
||||
|
||||
bool *m_curr_Lor_ADE_On;
|
||||
bool *m_volt_Lor_ADE_On;
|
||||
|
||||
FDTD_FLOAT ***v_Lor_ADE;
|
||||
FDTD_FLOAT ***i_Lor_ADE;
|
||||
};
|
||||
|
||||
#endif // OPERATOR_EXT_LORENTZMATERIAL_H
|
||||
|
Loading…
Reference in New Issue
Block a user