added processing steps and fix in end criteria check, now checking max excite TS
parent
f73d6f80f8
commit
8cc42b911c
|
@ -230,6 +230,21 @@ void Operator::ShowStat() const
|
||||||
cout << "-----------------------------------" << endl;
|
cout << "-----------------------------------" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int Operator::GetMaxExcitationTimestep() const
|
||||||
|
{
|
||||||
|
FDTD_FLOAT maxAmp=0;
|
||||||
|
unsigned int maxStep=0;
|
||||||
|
for (unsigned int n=1;n<ExciteLength+1;++n)
|
||||||
|
{
|
||||||
|
if (fabs(ExciteSignal[n])>maxAmp)
|
||||||
|
{
|
||||||
|
maxAmp = fabs(ExciteSignal[n]);
|
||||||
|
maxStep = n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxStep;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int Operator::CalcGaussianPulsExcitation(double f0, double fc)
|
unsigned int Operator::CalcGaussianPulsExcitation(double f0, double fc)
|
||||||
{
|
{
|
||||||
if (dT==0) return 0;
|
if (dT==0) return 0;
|
||||||
|
|
|
@ -44,6 +44,9 @@ public:
|
||||||
//! Calculate a step excitation \return number of Nyquist timesteps
|
//! Calculate a step excitation \return number of Nyquist timesteps
|
||||||
virtual unsigned int CalcStepExcitation();
|
virtual unsigned int CalcStepExcitation();
|
||||||
|
|
||||||
|
//! Get the excitation timestep with the (first) max amplitude
|
||||||
|
virtual unsigned int GetMaxExcitationTimestep() const;
|
||||||
|
|
||||||
virtual void ApplyElectricBC(bool* dirs); //applied by default to all boundaries
|
virtual void ApplyElectricBC(bool* dirs); //applied by default to all boundaries
|
||||||
virtual void ApplyMagneticBC(bool* dirs);
|
virtual void ApplyMagneticBC(bool* dirs);
|
||||||
|
|
||||||
|
|
|
@ -22,22 +22,65 @@ Processing::Processing(Operator* op, Engine* eng)
|
||||||
Op=op;
|
Op=op;
|
||||||
Eng=eng;
|
Eng=eng;
|
||||||
Enabled = true;
|
Enabled = true;
|
||||||
|
m_PS_pos = 0;
|
||||||
|
ProcessInterval=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Processing::~Processing()
|
Processing::~Processing()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Processing::Reset()
|
||||||
|
{
|
||||||
|
m_PS_pos=0;
|
||||||
|
}
|
||||||
|
|
||||||
bool Processing::CheckTimestep()
|
bool Processing::CheckTimestep()
|
||||||
|
{
|
||||||
|
if (m_ProcessSteps.size()>m_PS_pos)
|
||||||
|
{
|
||||||
|
if (m_ProcessSteps.at(m_PS_pos)==Eng->GetNumberOfTimesteps())
|
||||||
|
{
|
||||||
|
++m_PS_pos;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ProcessInterval)
|
||||||
{
|
{
|
||||||
if (Eng->GetNumberOfTimesteps()%ProcessInterval==0) return true;
|
if (Eng->GetNumberOfTimesteps()%ProcessInterval==0) return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Processing::GetNextInterval()
|
int Processing::GetNextInterval() const
|
||||||
{
|
{
|
||||||
if (Enabled==false) return -1;
|
if (Enabled==false) return -1;
|
||||||
return ProcessInterval - Eng->GetNumberOfTimesteps()%ProcessInterval;
|
unsigned int next=-1;
|
||||||
|
if (m_ProcessSteps.size()>m_PS_pos)
|
||||||
|
{
|
||||||
|
next = m_ProcessSteps.at(m_PS_pos)-Eng->GetNumberOfTimesteps();
|
||||||
|
}
|
||||||
|
if (ProcessInterval==0) return next;
|
||||||
|
unsigned int next_Interval = ProcessInterval - Eng->GetNumberOfTimesteps()%ProcessInterval;
|
||||||
|
if (next_Interval<next)
|
||||||
|
next = next_Interval;
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Processing::AddStep(unsigned int step)
|
||||||
|
{
|
||||||
|
if (m_ProcessSteps.size()==0)
|
||||||
|
m_ProcessSteps.push_back(step);
|
||||||
|
else if (find(m_ProcessSteps.begin(), m_ProcessSteps.end(),step)==m_ProcessSteps.end())
|
||||||
|
m_ProcessSteps.push_back(step);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Processing::AddSteps(vector<unsigned int> steps)
|
||||||
|
{
|
||||||
|
for (size_t n=0;n<steps.size();++n)
|
||||||
|
{
|
||||||
|
AddStep(steps.at(n));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Processing::DefineStartStopCoord(double* dstart, double* dstop)
|
void Processing::DefineStartStopCoord(double* dstart, double* dstop)
|
||||||
|
@ -84,6 +127,14 @@ void ProcessingArray::AddProcessing(Processing* proc)
|
||||||
ProcessArray.push_back(proc);
|
ProcessArray.push_back(proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProcessingArray::Reset()
|
||||||
|
{
|
||||||
|
for (size_t i=0;i<ProcessArray.size();++i)
|
||||||
|
{
|
||||||
|
ProcessArray.at(i)->Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ProcessingArray::DeleteAll()
|
void ProcessingArray::DeleteAll()
|
||||||
{
|
{
|
||||||
for (size_t i=0;i<ProcessArray.size();++i)
|
for (size_t i=0;i<ProcessArray.size();++i)
|
||||||
|
|
|
@ -29,15 +29,22 @@ public:
|
||||||
Processing(Operator* op, Engine* eng);
|
Processing(Operator* op, Engine* eng);
|
||||||
virtual ~Processing();
|
virtual ~Processing();
|
||||||
|
|
||||||
|
virtual void Reset();
|
||||||
|
|
||||||
virtual void DefineStartStopCoord(double* dstart, double* dstop);
|
virtual void DefineStartStopCoord(double* dstart, double* dstop);
|
||||||
|
|
||||||
void SetProcessInterval(unsigned int interval) {ProcessInterval=max((unsigned int)1,interval);}
|
void SetProcessInterval(unsigned int interval) {ProcessInterval=max((unsigned int)1,interval);}
|
||||||
|
|
||||||
|
void AddStep(unsigned int step);
|
||||||
|
void AddSteps(vector<unsigned int> steps);
|
||||||
|
|
||||||
|
bool CheckTimestep();
|
||||||
virtual int Process() {return GetNextInterval();}
|
virtual int Process() {return GetNextInterval();}
|
||||||
|
|
||||||
//! If Disabled Process() will do nothing...
|
//! If Disabled Process() will do nothing...
|
||||||
virtual void SetEnable(bool val) {Enabled=val;}
|
virtual void SetEnable(bool val) {Enabled=val;}
|
||||||
//! If Disabled Process() will do nothing...
|
//! If Disabled Process() will do nothing...
|
||||||
virtual bool GetEnable() {return Enabled;}
|
virtual bool GetEnable() const {return Enabled;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Operator* Op;
|
Operator* Op;
|
||||||
|
@ -45,10 +52,12 @@ protected:
|
||||||
|
|
||||||
bool Enabled;
|
bool Enabled;
|
||||||
|
|
||||||
bool CheckTimestep();
|
int GetNextInterval() const;
|
||||||
int GetNextInterval();
|
|
||||||
unsigned int ProcessInterval;
|
unsigned int ProcessInterval;
|
||||||
|
|
||||||
|
size_t m_PS_pos; //! current position in list of processing steps
|
||||||
|
vector<unsigned int> m_ProcessSteps; //! list of processing steps
|
||||||
|
|
||||||
unsigned int start[3];
|
unsigned int start[3];
|
||||||
unsigned int stop[3];
|
unsigned int stop[3];
|
||||||
|
|
||||||
|
@ -63,6 +72,8 @@ public:
|
||||||
|
|
||||||
void AddProcessing(Processing* proc);
|
void AddProcessing(Processing* proc);
|
||||||
|
|
||||||
|
void Reset();
|
||||||
|
|
||||||
//! Deletes all given processing's, can be helpful, but use carefull!!!
|
//! Deletes all given processing's, can be helpful, but use carefull!!!
|
||||||
void DeleteAll();
|
void DeleteAll();
|
||||||
|
|
||||||
|
|
20
openems.cpp
20
openems.cpp
|
@ -358,8 +358,16 @@ void openEMS::RunFDTD()
|
||||||
{
|
{
|
||||||
cout << "Running FDTD engine... this may take a while... grab a cup of coffee?!?" << endl;
|
cout << "Running FDTD engine... this may take a while... grab a cup of coffee?!?" << endl;
|
||||||
|
|
||||||
ProcessFields ProcField(FDTD_Op,FDTD_Eng);
|
//special handling of a field processing, needed to realize the end criteria...
|
||||||
|
ProcessFields* ProcField = new ProcessFields(FDTD_Op,FDTD_Eng);
|
||||||
|
PA->AddProcessing(ProcField);
|
||||||
double maxE=0,currE=0;
|
double maxE=0,currE=0;
|
||||||
|
|
||||||
|
//add all timesteps to end-crit field processing with max excite amplitude
|
||||||
|
unsigned int maxExcite = FDTD_Op->GetMaxExcitationTimestep();
|
||||||
|
for (unsigned int n=0;n<FDTD_Op->E_Exc_Count;++n)
|
||||||
|
ProcField->AddStep(FDTD_Op->E_Exc_delay[n]+maxExcite);
|
||||||
|
|
||||||
double change=1;
|
double change=1;
|
||||||
int prevTS=0,currTS=0;
|
int prevTS=0,currTS=0;
|
||||||
double speed = FDTD_Op->GetNumberCells()/1e6;
|
double speed = FDTD_Op->GetNumberCells()/1e6;
|
||||||
|
@ -378,6 +386,14 @@ void openEMS::RunFDTD()
|
||||||
{
|
{
|
||||||
FDTD_Eng->IterateTS(step);
|
FDTD_Eng->IterateTS(step);
|
||||||
step=PA->Process();
|
step=PA->Process();
|
||||||
|
|
||||||
|
if (ProcField->CheckTimestep())
|
||||||
|
{
|
||||||
|
currE = ProcField->CalcTotalEnergy();
|
||||||
|
if (currE>maxE)
|
||||||
|
maxE=currE;
|
||||||
|
}
|
||||||
|
|
||||||
// cout << " do " << step << " steps; current: " << eng.GetNumberOfTimesteps() << endl;
|
// cout << " do " << step << " steps; current: " << eng.GetNumberOfTimesteps() << endl;
|
||||||
currTS = FDTD_Eng->GetNumberOfTimesteps();
|
currTS = FDTD_Eng->GetNumberOfTimesteps();
|
||||||
if ((step<0) || (step>(int)(NrTS - currTS))) step=NrTS - currTS;
|
if ((step<0) || (step>(int)(NrTS - currTS))) step=NrTS - currTS;
|
||||||
|
@ -387,7 +403,7 @@ void openEMS::RunFDTD()
|
||||||
t_diff = CalcDiffTime(currTime,prevTime);
|
t_diff = CalcDiffTime(currTime,prevTime);
|
||||||
if (t_diff>4)
|
if (t_diff>4)
|
||||||
{
|
{
|
||||||
currE = ProcField.CalcTotalEnergy();
|
currE = ProcField->CalcTotalEnergy();
|
||||||
if (currE>maxE)
|
if (currE>maxE)
|
||||||
maxE=currE;
|
maxE=currE;
|
||||||
cout << "[@" << setw(8) << (int)CalcDiffTime(currTime,startTime) << "s] Timestep: " << setw(12) << currTS << " (" << setw(6) << setprecision(2) << std::fixed << (double)currTS/(double)NrTS*100.0 << "%)" ;
|
cout << "[@" << setw(8) << (int)CalcDiffTime(currTime,startTime) << "s] Timestep: " << setw(12) << currTS << " (" << setw(6) << setprecision(2) << std::fixed << (double)currTS/(double)NrTS*100.0 << "%)" ;
|
||||||
|
|
Loading…
Reference in New Issue