main: more flexible FDTD setup

Signed-off-by: Thorsten Liebig <Thorsten.Liebig@gmx.de>
pull/14/head
Thorsten Liebig 2015-12-13 22:33:26 +01:00
parent 1eca3dd23a
commit 6140b07c47
5 changed files with 294 additions and 160 deletions

View File

@ -20,7 +20,6 @@
#include <iostream>
#include <fstream>
#include "fparser.hh"
#include "tinyxml.h"
#include "excitation.h"
using namespace std;
@ -32,8 +31,7 @@ Excitation::Excitation()
this->Reset(0);
m_Excite_Elem = NULL;
m_Excit_Type = -1;
m_Excit_Type = Excitation::UNDEFINED;
m_SignalPeriod = 0;
}
@ -55,27 +53,44 @@ void Excitation::Reset( double timestep )
m_foi = 0;
}
bool Excitation::setupExcitation( TiXmlElement* Excite)
bool Excitation::SetupGaussianPulse(double f0, double fc)
{
if (!Excite)
{
cerr << "Excitation::setupExcitation: Error, can't read openEMS excitation settings... " << endl;
return false;
}
m_Excite_Elem = Excite;
double f0=0;
m_Excite_Elem->QueryIntAttribute("Type",&m_Excit_Type);
m_Excit_Type = Excitation::GaissianPulse;
m_f0 = f0;
m_fc = fc;
m_f_max = f0+fc;
m_SignalPeriod = 0;
switch (m_Excit_Type)
{
case 1: // sinusoidal excite
m_Excite_Elem->QueryDoubleAttribute("f0",&f0);
m_SignalPeriod = 1/f0;
break;
}
return true;
}
bool Excitation::SetupSinusoidal(double f0)
{
m_Excit_Type = Excitation::Sinusoidal;
m_f0 = f0;
m_f_max = f0;
m_SignalPeriod = 1/f0;
}
bool Excitation::SetupDiracPulse(double fmax)
{
m_Excit_Type = Excitation::DiracPulse;
m_SignalPeriod = 0;
m_f_max = fmax;
}
bool Excitation::SetupStepExcite(double fmax)
{
m_Excit_Type = Excitation::Step;
m_SignalPeriod = 0;
m_f_max = fmax;
}
bool Excitation::SetupCustomExcite(string str, double f0, double fmax)
{
m_Excit_Type = Excitation::CustomExcite;
m_CustomExc_Str = str;
m_f0 = f0;
m_SignalPeriod = 0;
m_f_max = fmax;
}
bool Excitation::buildExcitationSignal(unsigned int maxTS)
@ -86,32 +101,26 @@ bool Excitation::buildExcitationSignal(unsigned int maxTS)
return false;
}
double f0=0;
double fc=0;
switch (m_Excit_Type)
{
case 0:
m_Excite_Elem->QueryDoubleAttribute("f0",&f0);
m_Excite_Elem->QueryDoubleAttribute("fc",&fc);
CalcGaussianPulsExcitation(f0,fc,maxTS);
case Excitation::GaissianPulse:
CalcGaussianPulsExcitation(m_f0,m_fc,maxTS);
break;
case 1:
m_Excite_Elem->QueryDoubleAttribute("f0",&f0);
CalcSinusExcitation(f0,maxTS);
case Excitation::Sinusoidal:
CalcSinusExcitation(m_f0,maxTS);
break;
case 2:
case Excitation::DiracPulse:
CalcDiracPulsExcitation();
break;
case 3:
case Excitation::Step:
CalcStepExcitation();
break;
case 10:
m_Excite_Elem->QueryDoubleAttribute("f0",&f0);
CalcCustomExcitation(f0,maxTS,m_Excite_Elem->Attribute("Function"));
case Excitation::CustomExcite:
CalcCustomExcitation(m_f0,maxTS,m_CustomExc_Str);
break;
default:
cerr << "Excitation::buildExcitationSignal: Unknown excitation type: \"" << m_Excit_Type<< "\" !!" << endl;
m_Excit_Type = -1;
m_Excit_Type = Excitation::UNDEFINED;
return false;
}

View File

@ -22,17 +22,25 @@
#include <string>
#include "tools/constants.h"
class TiXmlElement;
class Excitation
{
public:
enum ExciteTypes {UNDEFINED=-1, GaissianPulse=0, Sinusoidal=1, DiracPulse=2, Step=3, CustomExcite=10};
Excitation();
virtual ~Excitation();
virtual void Reset( double timestep );
bool setupExcitation(TiXmlElement* Excite);
bool SetupGaussianPulse(double f0, double fc);
bool SetupSinusoidal(double f0);
bool SetupDiracPulse(double fmax);
bool SetupStepExcite(double fmax);
bool SetupCustomExcite(std::string str, double f0, double fmax);
double GetCenterFreq() {return m_f0;}
double GetCutOffFreq() {return m_fc;}
double GetMaxFreq() {return m_f_max;}
bool buildExcitationSignal(unsigned int maxTS);
//! Get the excitation timestep with the (first) max amplitude
@ -72,15 +80,21 @@ protected:
double dT;
unsigned int m_nyquistTS;
double m_SignalPeriod;
int m_Excit_Type;
TiXmlElement* m_Excite_Elem;
ExciteTypes m_Excit_Type;
//Excitation time-signal
unsigned int Length;
FDTD_FLOAT* Signal_volt;
FDTD_FLOAT* Signal_curr;
// center frequency
double m_f0;
// cutoff-frequency (Gaussian pulse only)
double m_fc;
std::string m_CustomExc_Str;
// max frequency
double m_f_max;
// frequency of interest

View File

@ -101,7 +101,8 @@ int main(int argc, char *argv[])
}
}
int EC = FDTD.SetupFDTD(argv[1]);
int EC = FDTD.ParseFDTDSetup(argv[1]);
EC = FDTD.SetupFDTD();
if (EC) return EC;
FDTD.RunFDTD();

View File

@ -84,6 +84,18 @@ openEMS::openEMS()
m_Abort = false;
m_Exc = 0;
m_TS_method=3;
m_TS=0;
m_TS_fac=1.0;
m_maxTime=0.0;
for (int n=0;n<6;++n)
{
m_BC_type[n] = 0;
m_PML_size[n] = 8;
m_Mur_v_ph[n] = 0;
}
}
openEMS::~openEMS()
@ -233,78 +245,28 @@ string openEMS::GetExtLibsInfo()
return str.str();
}
bool openEMS::SetupBoundaryConditions(TiXmlElement* BC)
bool openEMS::SetupBoundaryConditions()
{
int EC; //error code of tinyxml
int bounds[6] = {0,0,0,0,0,0}; //default boundary cond. (PEC)
unsigned int pml_size[6] = {8,8,8,8,8,8}; //default pml size
string s_bc;
const char* tmp = BC->Attribute("PML_Grading");
string pml_gradFunc;
if (tmp)
pml_gradFunc = string(tmp);
string bound_names[] = {"xmin","xmax","ymin","ymax","zmin","zmax"};
for (int n=0; n<6; ++n)
{
EC = BC->QueryIntAttribute(bound_names[n].c_str(),&bounds[n]);
if (EC==TIXML_SUCCESS)
continue;
if (EC==TIXML_WRONG_TYPE)
{
tmp = BC->Attribute(bound_names[n].c_str());
if (tmp)
s_bc = string(tmp);
if (s_bc=="PEC")
bounds[n] = 0;
else if (s_bc=="PMC")
bounds[n] = 1;
else if (s_bc=="MUR")
bounds[n] = 2;
else if (strncmp(s_bc.c_str(),"PML_=",4)==0)
{
bounds[n] = 3;
pml_size[n] = atoi(s_bc.c_str()+4);
}
else
cerr << "openEMS::SetupBoundaryConditions: Warning, boundary condition for \"" << bound_names[n] << "\" unknown... set to PEC " << endl;
}
else
cerr << "openEMS::SetupBoundaryConditions: Warning, boundary condition for \"" << bound_names[n] << "\" not found... set to PEC " << endl;
}
FDTD_Op->SetBoundaryCondition(bounds); //operator only knows about PEC and PMC, everything else is defined by extensions (see below)
FDTD_Op->SetBoundaryCondition(m_BC_type); //operator only knows about PEC and PMC, everything else is defined by extensions (see below)
/**************************** create all operator/engine extensions here !!!! **********************************/
//Mur-ABC, defined as extension to the operator
double mur_v_ph = 0;
//read general mur phase velocity
if (BC->QueryDoubleAttribute("MUR_PhaseVelocity",&mur_v_ph) != TIXML_SUCCESS)
mur_v_ph = -1;
string mur_v_ph_names[6] = {"MUR_PhaseVelocity_xmin", "MUR_PhaseVelocity_xmax", "MUR_PhaseVelocity_ymin", "MUR_PhaseVelocity_ymax", "MUR_PhaseVelocity_zmin", "MUR_PhaseVelocity_zmax"};
for (int n=0; n<6; ++n)
{
FDTD_Op->SetBCSize(n, 0);
if (bounds[n]==2) //Mur-ABC
if (m_BC_type[n]==2) //Mur-ABC
{
FDTD_Op->SetBCSize(n, 1);
Operator_Ext_Mur_ABC* op_ext_mur = new Operator_Ext_Mur_ABC(FDTD_Op);
op_ext_mur->SetDirection(n/2,n%2);
double v_ph = 0;
//read special mur phase velocity or assign general phase velocity
if (BC->QueryDoubleAttribute(mur_v_ph_names[n].c_str(),&v_ph) == TIXML_SUCCESS)
op_ext_mur->SetPhaseVelocity(v_ph);
else if (mur_v_ph>0)
op_ext_mur->SetPhaseVelocity(mur_v_ph);
op_ext_mur->SetPhaseVelocity(m_Mur_v_ph[n]);
FDTD_Op->AddExtension(op_ext_mur);
}
if (bounds[n]==3)
FDTD_Op->SetBCSize(n, pml_size[n]);
if (m_BC_type[n]==3)
FDTD_Op->SetBCSize(n, m_PML_size[n]);
}
//create the upml
Operator_Ext_UPML::Create_UPML(FDTD_Op,bounds,pml_size,pml_gradFunc);
Operator_Ext_UPML::Create_UPML(FDTD_Op, m_BC_type, m_PML_size, string());
return true;
}
@ -556,15 +518,19 @@ bool openEMS::SetupMaterialStorages()
return true;
}
bool openEMS::SetupOperator(TiXmlElement* FDTD_Opts)
void openEMS::SetupCylinderMultiGrid(std::string val)
{
m_CC_MultiGrid.clear();
m_CC_MultiGrid = SplitString2Double(val,',');
}
bool openEMS::SetupOperator()
{
if (CylinderCoords)
{
const char* radii = FDTD_Opts->Attribute("MultiGrid");
if (radii)
if (m_CC_MultiGrid.size()>0)
{
string rad(radii);
FDTD_Op = Operator_CylinderMultiGrid::New(SplitString2Double(rad,','),m_engine_numThreads);
FDTD_Op = Operator_CylinderMultiGrid::New(m_CC_MultiGrid, m_engine_numThreads);
if (FDTD_Op==NULL)
FDTD_Op = Operator_Cylinder::New(m_engine_numThreads);
}
@ -590,19 +556,35 @@ bool openEMS::SetupOperator(TiXmlElement* FDTD_Opts)
return true;
}
int openEMS::SetupFDTD(const char* file)
void openEMS::Set_BC_Type(int idx, int type)
{
if ((idx<0) || (idx>5))
return;
m_BC_type[idx] = type;
}
void openEMS::Set_BC_PML(int idx, unsigned int size)
{
if ((idx<0) || (idx>5))
return;
m_BC_type[idx] = 3;
m_PML_size[idx] = size;
}
void openEMS::Set_Mur_PhaseVel(int idx, double val)
{
if ((idx<0) || (idx>5))
return;
m_Mur_v_ph[idx] = val;
}
bool openEMS::ParseFDTDSetup(std::string file)
{
if (file==NULL) return -1;
Reset();
if (g_settings.GetVerboseLevel()>0)
cout << "Read openEMS xml file: " << file << " ..." << endl;
timeval startTime;
gettimeofday(&startTime,NULL);
TiXmlDocument doc(file);
if (!doc.LoadFile())
{
@ -629,22 +611,35 @@ int openEMS::SetupFDTD(const char* file)
double dhelp=0;
FDTD_Opts->QueryDoubleAttribute("NumberOfTimesteps",&dhelp);
if (dhelp<0)
NrTS=0;
this->SetNumberOfTimeSteps(0);
else
NrTS = (unsigned int)dhelp;
this->SetNumberOfTimeSteps((unsigned int)dhelp);
int ihelp = 0;
FDTD_Opts->QueryIntAttribute("CylinderCoords",&ihelp);
if (ihelp==1)
CylinderCoords = true;
this->SetCylinderCoords(true);
const char* cchelp = FDTD_Opts->Attribute("MultiGrid");
if (cchelp!=NULL)
this->SetupCylinderMultiGrid(string(cchelp));
FDTD_Opts->QueryDoubleAttribute("endCriteria",&endCrit);
if (endCrit==0)
endCrit=1e-6;
dhelp = 0;
FDTD_Opts->QueryDoubleAttribute("endCriteria",&dhelp);
if (dhelp==0)
this->SetEndCriteria(1e-6);
else
this->SetEndCriteria(dhelp);
FDTD_Opts->QueryIntAttribute("OverSampling",&m_OverSampling);
if (m_OverSampling<2)
m_OverSampling=2;
ihelp = 0;
FDTD_Opts->QueryIntAttribute("OverSampling",&ihelp);
if (ihelp<2)
this->SetOverSampling(2);
else
this->SetOverSampling(ihelp);
// check for cell constant material averaging
if (FDTD_Opts->QueryIntAttribute("CellConstantMaterial",&ihelp)==TIXML_SUCCESS)
this->SetCellConstantMaterial(ihelp==1);
TiXmlElement* BC = FDTD_Opts->FirstChildElement("BoundaryCond");
if (BC==NULL)
@ -653,16 +648,122 @@ int openEMS::SetupFDTD(const char* file)
exit(-3);
}
// const char* tmp = BC->Attribute("PML_Grading");
// string pml_gradFunc;
// if (tmp)
// pml_gradFunc = string(tmp);
string bound_names[] = {"xmin","xmax","ymin","ymax","zmin","zmax"};
for (int n=0; n<6; ++n)
{
int EC = BC->QueryIntAttribute(bound_names[n].c_str(),&ihelp);
if (EC==TIXML_SUCCESS)
this->Set_BC_Type(n, ihelp);
continue;
if (EC==TIXML_WRONG_TYPE)
{
string s_bc;
const char* tmp = BC->Attribute(bound_names[n].c_str());
if (tmp)
s_bc = string(tmp);
if (s_bc=="PEC")
this->Set_BC_Type(n, 0);
else if (s_bc=="PMC")
this->Set_BC_Type(n, 1);
else if (s_bc=="MUR")
this->Set_BC_Type(n, 2);
else if (strncmp(s_bc.c_str(),"PML_=",4)==0)
this->Set_BC_PML(n, atoi(s_bc.c_str()+4));
else
cerr << "openEMS::SetupBoundaryConditions: Warning, boundary condition for \"" << bound_names[n] << "\" unknown... set to PEC " << endl;
}
else
cerr << "openEMS::SetupBoundaryConditions: Warning, boundary condition for \"" << bound_names[n] << "\" not found... set to PEC " << endl;
}
//read general mur phase velocity
if (BC->QueryDoubleAttribute("MUR_PhaseVelocity",&dhelp) != TIXML_SUCCESS)
for (int n=0;n<6;++n)
this->Set_Mur_PhaseVel(n, dhelp);
string mur_v_ph_names[6] = {"MUR_PhaseVelocity_xmin", "MUR_PhaseVelocity_xmax", "MUR_PhaseVelocity_ymin", "MUR_PhaseVelocity_ymax", "MUR_PhaseVelocity_zmin", "MUR_PhaseVelocity_zmax"};
for (int n=0; n<6; ++n)
if (BC->QueryDoubleAttribute(mur_v_ph_names[n].c_str(),&dhelp) == TIXML_SUCCESS)
this->Set_Mur_PhaseVel(n, dhelp);
if (g_settings.GetVerboseLevel()>0)
cout << "Read Geometry..." << endl;
m_CSX = new ContinuousStructure();
string EC(m_CSX->ReadFromXML(openEMSxml));
ContinuousStructure* csx = new ContinuousStructure();
string EC(csx->ReadFromXML(openEMSxml));
if (EC.empty()==false)
{
cerr << EC << endl;
// return(-2);
this->SetCSX(csx);
TiXmlElement* m_Excite_Elem = FDTD_Opts->FirstChildElement("Excitation");
if (!m_Excite_Elem)
{
cerr << "Excitation::setupExcitation: Error, can't read openEMS excitation settings... " << endl;
return false;
}
Excitation* exc = this->InitExcitation();
double f0=0, fc=0, f_max=0;
ihelp = -1;
m_Excite_Elem->QueryIntAttribute("Type",&ihelp);
switch (ihelp)
{
case Excitation::GaissianPulse:
m_Excite_Elem->QueryDoubleAttribute("f0",&f0);
m_Excite_Elem->QueryDoubleAttribute("fc",&fc);
exc->SetupGaussianPulse(f0, fc);
break;
case Excitation::Sinusoidal: // sinusoidal excite
m_Excite_Elem->QueryDoubleAttribute("f0",&f0);
exc->SetupSinusoidal(f0);
break;
case Excitation::DiracPulse:
FDTD_Opts->QueryDoubleAttribute("f_max",&f_max);
exc->SetupDiracPulse(f_max);
break;
case Excitation::Step:
FDTD_Opts->QueryDoubleAttribute("f_max",&f_max);
exc->SetupStepExcite(f_max);
break;
case Excitation::CustomExcite:
m_Excite_Elem->QueryDoubleAttribute("f0",&f0);
FDTD_Opts->QueryDoubleAttribute("f_max",&f_max);
exc->SetupCustomExcite(m_Excite_Elem->Attribute("Function"), f0, f_max);
break;
}
if (FDTD_Opts->QueryIntAttribute("TimeStepMethod",&ihelp)==TIXML_SUCCESS)
this->SetTimeStepMethod(ihelp);
if (FDTD_Opts->QueryDoubleAttribute("TimeStep",&dhelp)==TIXML_SUCCESS)
this->SetTimeStep(dhelp);
if (FDTD_Opts->QueryDoubleAttribute("TimeStepFactor",&dhelp)==TIXML_SUCCESS)
this->SetTimeStepFactor(dhelp);
}
Excitation* openEMS::InitExcitation()
{
delete m_Exc;
m_Exc = new Excitation();
return m_Exc;
}
void openEMS::SetCSX(ContinuousStructure* csx)
{
delete m_CSX;
m_CSX = csx;
}
int openEMS::SetupFDTD()
{
timeval startTime;
gettimeofday(&startTime,NULL);
if (g_settings.GetVerboseLevel()>2)
m_CSX->ShowPropertyStatus(cerr);
@ -677,15 +778,12 @@ int openEMS::SetupFDTD(const char* file)
m_CSX->Write2XML("debugCSX.xml");
//*************** setup operator ************//
if (SetupOperator(FDTD_Opts)==false)
if (SetupOperator()==false)
return 2;
// default material averaging is quarter cell averaging
FDTD_Op->SetQuarterCellMaterialAvg();
// check for cell constant material averaging
if (FDTD_Opts->QueryIntAttribute("CellConstantMaterial",&ihelp)==TIXML_SUCCESS)
m_CellConstantMaterial=(ihelp==1);
if (m_CellConstantMaterial)
{
FDTD_Op->SetCellConstantMaterial();
@ -693,9 +791,6 @@ int openEMS::SetupFDTD(const char* file)
cout << "Enabling constant cell material assumption." << endl;
}
m_Exc = new Excitation();
if (!m_Exc->setupExcitation(FDTD_Opts->FirstChildElement("Excitation")))
exit(2);
FDTD_Op->SetExcitationSignal(m_Exc);
FDTD_Op->AddExtension(new Operator_Ext_Excitation(FDTD_Op));
if (!CylinderCoords)
@ -703,19 +798,14 @@ int openEMS::SetupFDTD(const char* file)
if (FDTD_Op->SetGeometryCSX(m_CSX)==false) return(2);
SetupBoundaryConditions(BC);
SetupBoundaryConditions();
int TS_method=0;
if (FDTD_Opts->QueryIntAttribute("TimeStepMethod",&TS_method)==TIXML_SUCCESS)
FDTD_Op->SetTimeStepMethod(TS_method);
FDTD_Op->SetTimeStepMethod(m_TS_method);
double timestep=0;
FDTD_Opts->QueryDoubleAttribute("TimeStep",&timestep);
if (timestep)
FDTD_Op->SetTimestep(timestep);
double timestepfactor=0;
if (FDTD_Opts->QueryDoubleAttribute("TimeStepFactor",&timestepfactor)==TIXML_SUCCESS)
FDTD_Op->SetTimestepFactor(timestepfactor);
if (m_TS>0)
FDTD_Op->SetTimestep(m_TS);
if (m_TS_fac<1)
FDTD_Op->SetTimestepFactor(m_TS_fac);
// Is a steady state detection requested
Operator_Ext_SteadyState* Op_Ext_SSD = NULL;
@ -751,14 +841,7 @@ int openEMS::SetupFDTD(const char* file)
if ((m_CSX->GetQtyPropertyType(CSProperties::LORENTZMATERIAL)>0) || (m_CSX->GetQtyPropertyType(CSProperties::DEBYEMATERIAL)>0))
FDTD_Op->AddExtension(new Operator_Ext_LorentzMaterial(FDTD_Op));
if (m_CSX->GetQtyPropertyType(CSProperties::CONDUCTINGSHEET)>0)
{
double f_max=0;
FDTD_Opts->QueryDoubleAttribute("f_max",&f_max);
if (f_max>0)
FDTD_Op->AddExtension(new Operator_Ext_ConductingSheet(FDTD_Op,f_max));
else
cerr << __func__ << ": Error, max. frequency is <=0, disabling conducting sheet material..." << endl;
}
FDTD_Op->AddExtension(new Operator_Ext_ConductingSheet(FDTD_Op, m_Exc->GetMaxFreq()));
//check all properties to request material storage during operator creation...
SetupMaterialStorages();
@ -781,10 +864,8 @@ int openEMS::SetupFDTD(const char* file)
FDTD_Op->SetMaterialStoreFlags(2,false);
FDTD_Op->SetMaterialStoreFlags(3,false);
double maxTime=0;
FDTD_Opts->QueryDoubleAttribute("MaxTime",&maxTime);
unsigned int maxTime_TS = (unsigned int)(maxTime/FDTD_Op->GetTimestep());
if ((maxTime_TS>0) && (maxTime_TS<NrTS))
unsigned int maxTime_TS = (unsigned int)(m_maxTime/FDTD_Op->GetTimestep());
if ((m_maxTime>0) && (maxTime_TS<NrTS))
NrTS = maxTime_TS;
if (!m_Exc->buildExcitationSignal(NrTS))

View File

@ -21,6 +21,7 @@
#include <sstream>
#include <sys/time.h>
#include <time.h>
#include <vector>
#define __OPENEMS_STAT_FILE__ "openEMS_stats.txt"
#define __OPENEMS_RUN_STAT_FILE__ "openEMS_run_stats.txt"
@ -46,19 +47,35 @@ public:
virtual bool parseCommandLineArgument( const char *argv );
int SetupFDTD(const char* file);
bool ParseFDTDSetup(std::string file);
int SetupFDTD();
virtual void RunFDTD();
void Reset();
void SetNumberOfTimeSteps(unsigned int val) {NrTS=val;}
void SetEnableDumps(bool val) {Enable_Dumps=val;}
void SetEndCriteria(double val) {endCrit=val;}
void SetOverSampling(int val) {m_OverSampling=val;}
void SetCellConstantMaterial(bool val) {m_CellConstantMaterial=val;}
void SetCylinderCoords(bool val) {CylinderCoords=val;}
void SetupCylinderMultiGrid(std::vector<double> val) {m_CC_MultiGrid=val;}
void SetupCylinderMultiGrid(std::string val);
void SetTimeStepMethod(int val) {m_TS_method=val;}
void SetTimeStep(double val) {m_TS=val;}
void SetTimeStepFactor(double val) {m_TS_fac=val;}
void SetMaxTime(double val) {m_maxTime=val;}
void DebugMaterial() {DebugMat=true;}
void DebugOperator() {DebugOp=true;}
void DebugBox() {m_debugBox=true;}
void Set_BC_Type(int idx, int type);
void Set_BC_PML(int idx, unsigned int size);
void Set_Mur_PhaseVel(int idx, double val);
//! Get informations about external libs used by openEMS
static std::string GetExtLibsInfo();
@ -67,15 +84,24 @@ public:
//! Check for abort conditions
bool CheckAbortCond();
Excitation* InitExcitation();
void SetCSX(ContinuousStructure* csx);
Engine_Interface_FDTD* NewEngineInterface(int multigridlevel = 0);
protected:
bool CylinderCoords;
std::vector<double> m_CC_MultiGrid;
ContinuousStructure* m_CSX;
//! Number of Timesteps
unsigned int NrTS;
int m_TS_method;
double m_TS;
double m_TS_fac;
double m_maxTime;
// some command line flags
bool Enable_Dumps;
@ -106,10 +132,13 @@ protected:
unsigned int m_engine_numThreads;
//! Setup an operator matching the requested engine
virtual bool SetupOperator(TiXmlElement* FDTD_Opts);
virtual bool SetupOperator();
//! Read boundary conditions from xml element and apply to FDTD operator
bool SetupBoundaryConditions(TiXmlElement* BC);
bool SetupBoundaryConditions();
int m_BC_type[6];
unsigned int m_PML_size[6];
double m_Mur_v_ph[6];
//! Check whether or not the FDTD-Operator has to store material data.
bool SetupMaterialStorages();