new dump type: total current density (rotH) field dump
parent
c5a689b67c
commit
c0c66518c1
|
@ -52,6 +52,8 @@ public:
|
||||||
virtual double* GetHField(const unsigned int* pos, double* out) const =0;
|
virtual double* GetHField(const unsigned int* pos, double* out) const =0;
|
||||||
//! Get the (interpolated) electric current density field at \p pos. \sa SetInterpolationType
|
//! Get the (interpolated) electric current density field at \p pos. \sa SetInterpolationType
|
||||||
virtual double* GetJField(const unsigned int* pos, double* out) const =0;
|
virtual double* GetJField(const unsigned int* pos, double* out) const =0;
|
||||||
|
//! Get the total current density field by rot(H) at \p pos. \sa SetInterpolationType
|
||||||
|
virtual double* GetRotHField(const unsigned int* pos, double* out) const =0;
|
||||||
|
|
||||||
//! Calculate the electric field integral along a given line
|
//! Calculate the electric field integral along a given line
|
||||||
virtual double CalcVoltageIntegral(const unsigned int* start, const unsigned int* stop) const =0;
|
virtual double CalcVoltageIntegral(const unsigned int* start, const unsigned int* stop) const =0;
|
||||||
|
|
|
@ -65,6 +65,8 @@ string ProcessFields::GetFieldNameByType(DumpType type)
|
||||||
return "H-Field";
|
return "H-Field";
|
||||||
case J_FIELD_DUMP:
|
case J_FIELD_DUMP:
|
||||||
return "J-Field";
|
return "J-Field";
|
||||||
|
case ROTH_FIELD_DUMP:
|
||||||
|
return "RotH-Field";
|
||||||
}
|
}
|
||||||
return "unknown field";
|
return "unknown field";
|
||||||
}
|
}
|
||||||
|
@ -600,8 +602,26 @@ FDTD_FLOAT**** ProcessFields::CalcField()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return field;
|
return field;
|
||||||
}
|
case ROTH_FIELD_DUMP:
|
||||||
|
for (unsigned int i=0; i<numLines[0]; ++i)
|
||||||
|
{
|
||||||
|
pos[0]=posLines[0][i];
|
||||||
|
for (unsigned int j=0; j<numLines[1]; ++j)
|
||||||
|
{
|
||||||
|
pos[1]=posLines[1][j];
|
||||||
|
for (unsigned int k=0; k<numLines[2]; ++k)
|
||||||
|
{
|
||||||
|
pos[2]=posLines[2][k];
|
||||||
|
|
||||||
|
m_Eng_Interface->GetRotHField(pos,out);
|
||||||
|
field[0][i][j][k] = out[0];
|
||||||
|
field[1][i][j][k] = out[1];
|
||||||
|
field[2][i][j][k] = out[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return field;
|
||||||
|
}
|
||||||
cerr << "ProcessFields::CalcField(): Error, unknown dump type..." << endl;
|
cerr << "ProcessFields::CalcField(): Error, unknown dump type..." << endl;
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,9 +34,10 @@ public:
|
||||||
|
|
||||||
//! Dump type definitions.
|
//! Dump type definitions.
|
||||||
/*!
|
/*!
|
||||||
Current dump types are electric field (E_FIELD_DUMP), magnetic field (H_FIELD_DUMP) and (conduction) electric current density (kappa*E) (J_FIELD_DUMP).
|
Current dump types are electric field (E_FIELD_DUMP), magnetic field (H_FIELD_DUMP),
|
||||||
|
(conduction) electric current density (kappa*E) (J_FIELD_DUMP) and total current density (rotH)
|
||||||
*/
|
*/
|
||||||
enum DumpType { E_FIELD_DUMP, H_FIELD_DUMP, J_FIELD_DUMP};
|
enum DumpType { E_FIELD_DUMP, H_FIELD_DUMP, J_FIELD_DUMP, ROTH_FIELD_DUMP};
|
||||||
|
|
||||||
virtual void InitProcess();
|
virtual void InitProcess();
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,11 @@ double* Engine_Interface_FDTD::GetJField(const unsigned int* pos, double* out) c
|
||||||
return GetRawInterpolatedField(pos, out, 1);
|
return GetRawInterpolatedField(pos, out, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double* Engine_Interface_FDTD::GetRotHField(const unsigned int* pos, double* out) const
|
||||||
|
{
|
||||||
|
return GetRawInterpolatedField(pos, out, 2);
|
||||||
|
}
|
||||||
|
|
||||||
double* Engine_Interface_FDTD::GetRawInterpolatedField(const unsigned int* pos, double* out, int type) const
|
double* Engine_Interface_FDTD::GetRawInterpolatedField(const unsigned int* pos, double* out, int type) const
|
||||||
{
|
{
|
||||||
unsigned int iPos[] = {pos[0],pos[1],pos[2]};
|
unsigned int iPos[] = {pos[0],pos[1],pos[2]};
|
||||||
|
@ -182,6 +187,27 @@ double Engine_Interface_FDTD::GetRawField(unsigned int n, const unsigned int* po
|
||||||
return value/delta;
|
return value/delta;
|
||||||
if ((type==1) && (m_Op->m_kappa) && (delta))
|
if ((type==1) && (m_Op->m_kappa) && (delta))
|
||||||
return value*m_Op->m_kappa[n][pos[0]][pos[1]][pos[2]]/delta;
|
return value*m_Op->m_kappa[n][pos[0]][pos[1]][pos[2]]/delta;
|
||||||
|
if (type==2) //calc rot(H)
|
||||||
|
{
|
||||||
|
int nP = (n+1)%3;
|
||||||
|
int nPP = (n+2)%3;
|
||||||
|
unsigned int locPos[] = {pos[0],pos[1],pos[2]};
|
||||||
|
double area = m_Op->GetEdgeArea(n,pos);
|
||||||
|
value = m_Eng->GetCurr(nPP,pos);
|
||||||
|
value -= m_Eng->GetCurr(nP,pos);
|
||||||
|
if (pos[nPP]>0)
|
||||||
|
{
|
||||||
|
--locPos[nPP];
|
||||||
|
value += m_Eng->GetCurr(nP,locPos);
|
||||||
|
++locPos[nPP];
|
||||||
|
}
|
||||||
|
if (pos[nP]>0)
|
||||||
|
{
|
||||||
|
--locPos[nP];
|
||||||
|
value -= m_Eng->GetCurr(nPP,locPos);
|
||||||
|
}
|
||||||
|
return value/area;
|
||||||
|
}
|
||||||
|
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ public:
|
||||||
virtual double* GetEField(const unsigned int* pos, double* out) const;
|
virtual double* GetEField(const unsigned int* pos, double* out) const;
|
||||||
virtual double* GetHField(const unsigned int* pos, double* out) const;
|
virtual double* GetHField(const unsigned int* pos, double* out) const;
|
||||||
virtual double* GetJField(const unsigned int* pos, double* out) const;
|
virtual double* GetJField(const unsigned int* pos, double* out) const;
|
||||||
|
virtual double* GetRotHField(const unsigned int* pos, double* out) const;
|
||||||
|
|
||||||
virtual double CalcVoltageIntegral(const unsigned int* start, const unsigned int* stop) const;
|
virtual double CalcVoltageIntegral(const unsigned int* start, const unsigned int* stop) const;
|
||||||
|
|
||||||
|
|
|
@ -372,9 +372,9 @@ bool openEMS::SetupProcessing(ContinuousStructure& CSX)
|
||||||
CSPropDumpBox* db = DumpProps.at(i)->ToDumpBox();
|
CSPropDumpBox* db = DumpProps.at(i)->ToDumpBox();
|
||||||
if (db)
|
if (db)
|
||||||
{
|
{
|
||||||
if ((db->GetDumpType()>=0) && (db->GetDumpType()<=2))
|
if ((db->GetDumpType()>=0) && (db->GetDumpType()<=3))
|
||||||
ProcField = new ProcessFieldsTD(new Engine_Interface_FDTD(FDTD_Op,FDTD_Eng));
|
ProcField = new ProcessFieldsTD(new Engine_Interface_FDTD(FDTD_Op,FDTD_Eng));
|
||||||
else if ((db->GetDumpType()>=10) && (db->GetDumpType()<=12))
|
else if ((db->GetDumpType()>=10) && (db->GetDumpType()<=13))
|
||||||
ProcField = new ProcessFieldsFD(new Engine_Interface_FDTD(FDTD_Op,FDTD_Eng));
|
ProcField = new ProcessFieldsFD(new Engine_Interface_FDTD(FDTD_Op,FDTD_Eng));
|
||||||
else
|
else
|
||||||
cerr << "openEMS::SetupFDTD: unknown dump box type... skipping!" << endl;
|
cerr << "openEMS::SetupFDTD: unknown dump box type... skipping!" << endl;
|
||||||
|
|
Loading…
Reference in New Issue