2010-03-11 15:47:40 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2010 Thorsten Liebig (Thorsten.Liebig@gmx.de)
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
#include "openems.h"
|
2010-03-15 19:50:49 +00:00
|
|
|
#include <iomanip>
|
2010-03-11 09:56:19 +00:00
|
|
|
#include "tools/array_ops.h"
|
|
|
|
#include "FDTD/engine.h"
|
2010-04-09 13:51:37 +00:00
|
|
|
#include "FDTD/engine_cylinder.h"
|
2010-03-26 11:57:52 +00:00
|
|
|
#include "FDTD/engine_multithread.h"
|
2010-04-21 09:18:22 +00:00
|
|
|
#include "FDTD/engine_sse.h"
|
2010-03-11 09:56:19 +00:00
|
|
|
#include "FDTD/processvoltage.h"
|
|
|
|
#include "FDTD/processcurrent.h"
|
|
|
|
#include "FDTD/processfields_td.h"
|
2010-03-25 14:08:54 +00:00
|
|
|
#include <sys/time.h>
|
|
|
|
#include <time.h>
|
2010-03-11 09:56:19 +00:00
|
|
|
|
|
|
|
//external libs
|
|
|
|
#include "tinyxml.h"
|
|
|
|
#include "ContinuousStructure.h"
|
|
|
|
|
2010-03-25 14:08:54 +00:00
|
|
|
double CalcDiffTime(timeval t1, timeval t2)
|
|
|
|
{
|
2010-03-27 14:54:44 +00:00
|
|
|
double s_diff = t1.tv_sec - t2.tv_sec;
|
|
|
|
s_diff += (t1.tv_usec-t2.tv_usec)*1e-6;
|
2010-03-25 14:08:54 +00:00
|
|
|
return s_diff;
|
|
|
|
}
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
openEMS::openEMS()
|
|
|
|
{
|
|
|
|
FDTD_Op=NULL;
|
|
|
|
FDTD_Eng=NULL;
|
|
|
|
PA=NULL;
|
2010-04-09 13:51:37 +00:00
|
|
|
CylinderCoords = false;
|
2010-03-11 14:48:55 +00:00
|
|
|
Enable_Dumps = true;
|
2010-03-12 19:39:04 +00:00
|
|
|
DebugMat = false;
|
2010-03-17 22:16:41 +00:00
|
|
|
DebugOp = false;
|
2010-04-19 14:09:41 +00:00
|
|
|
m_debugBox = false;
|
2010-03-15 15:59:37 +00:00
|
|
|
endCrit = 1e-6;
|
2010-04-04 17:48:36 +00:00
|
|
|
m_OverSampling = 4;
|
2010-03-30 11:13:00 +00:00
|
|
|
|
|
|
|
m_engine = EngineType_Standard;
|
|
|
|
m_engine_numThreads = 0;
|
2010-03-11 09:56:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
openEMS::~openEMS()
|
|
|
|
{
|
2010-04-01 14:11:25 +00:00
|
|
|
Reset();
|
2010-03-11 09:56:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void openEMS::Reset()
|
|
|
|
{
|
|
|
|
if (PA) PA->DeleteAll();
|
2010-04-01 14:11:25 +00:00
|
|
|
delete PA; PA=0;
|
|
|
|
delete FDTD_Eng; FDTD_Eng=0;
|
|
|
|
delete FDTD_Op; FDTD_Op=0;
|
2010-03-11 09:56:19 +00:00
|
|
|
}
|
|
|
|
|
2010-03-26 10:57:53 +00:00
|
|
|
//! \brief processes a command line argument
|
|
|
|
//! returns true if argument is known
|
|
|
|
//! returns false if argument is unknown
|
|
|
|
bool openEMS::parseCommandLineArgument( const char *argv )
|
|
|
|
{
|
|
|
|
if (!argv)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (strcmp(argv,"--disable-dumps")==0)
|
|
|
|
{
|
|
|
|
cout << "openEMS - disabling all field dumps" << endl;
|
|
|
|
SetEnableDumps(false);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else if (strcmp(argv,"--debug-material")==0)
|
|
|
|
{
|
|
|
|
cout << "openEMS - dumping material to 'material_dump.vtk'" << endl;
|
|
|
|
DebugMaterial();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else if (strcmp(argv,"--debug-operator")==0)
|
|
|
|
{
|
|
|
|
cout << "openEMS - dumping operator to 'operator_dump.vtk'" << endl;
|
|
|
|
DebugOperator();
|
|
|
|
return true;
|
|
|
|
}
|
2010-04-19 14:09:41 +00:00
|
|
|
else if (strcmp(argv,"--debug-boxes")==0)
|
|
|
|
{
|
|
|
|
cout << "openEMS - dumping boxes to 'box_dump*.vtk'" << endl;
|
|
|
|
DebugBox();
|
|
|
|
return true;
|
|
|
|
}
|
2010-03-26 11:57:52 +00:00
|
|
|
else if (strcmp(argv,"--engine=multithreaded")==0)
|
|
|
|
{
|
|
|
|
cout << "openEMS - enabled multithreading" << endl;
|
|
|
|
m_engine = EngineType_Multithreaded;
|
|
|
|
return true;
|
|
|
|
}
|
2010-03-30 11:13:00 +00:00
|
|
|
else if (strncmp(argv,"--numThreads=",13)==0)
|
|
|
|
{
|
|
|
|
m_engine_numThreads = atoi(argv+13);
|
|
|
|
cout << "openEMS - fixed number of threads: " << m_engine_numThreads << endl;
|
|
|
|
return true;
|
|
|
|
}
|
2010-04-21 09:18:22 +00:00
|
|
|
else if (strcmp(argv,"--engine=sse")==0)
|
|
|
|
{
|
|
|
|
cout << "openEMS - enabled sse engine" << endl;
|
|
|
|
m_engine = EngineType_SSE;
|
|
|
|
return true;
|
|
|
|
}
|
2010-03-26 10:57:53 +00:00
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2010-04-07 14:31:23 +00:00
|
|
|
void openEMS::SetupExcitation(TiXmlElement* Excite)
|
|
|
|
{
|
|
|
|
if (Excite==NULL)
|
|
|
|
{
|
|
|
|
cerr << "Can't read openEMS Excitation Settings... " << endl;
|
|
|
|
exit(-2);
|
|
|
|
}
|
|
|
|
|
|
|
|
int Excit_Type=0;
|
|
|
|
double f0=0;
|
|
|
|
double fc=0;
|
|
|
|
Excite->QueryIntAttribute("Type",&Excit_Type);
|
|
|
|
|
|
|
|
unsigned int Nyquist = 0;
|
|
|
|
switch (Excit_Type)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
Excite->QueryDoubleAttribute("f0",&f0);
|
|
|
|
Excite->QueryDoubleAttribute("fc",&fc);
|
|
|
|
Nyquist = FDTD_Op->CalcGaussianPulsExcitation(f0,fc);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
Excite->QueryDoubleAttribute("f0",&f0);
|
|
|
|
Nyquist = FDTD_Op->CalcSinusExcitation(f0,NrTS);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
Nyquist = FDTD_Op->CalcDiracPulsExcitation();
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
Nyquist = FDTD_Op->CalcStepExcitation();
|
|
|
|
break;
|
|
|
|
case 10:
|
|
|
|
Excite->QueryDoubleAttribute("f0",&f0);
|
|
|
|
Nyquist = FDTD_Op->CalcCustomExcitation(f0,NrTS,Excite->Attribute("Function"));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!Nyquist)
|
|
|
|
{
|
|
|
|
cerr << "openEMS: excitation setup failed!!" << endl;
|
|
|
|
exit(2);
|
|
|
|
}
|
|
|
|
FDTD_Op->SetNyquistNum(Nyquist);
|
|
|
|
}
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
int openEMS::SetupFDTD(const char* file)
|
|
|
|
{
|
|
|
|
if (file==NULL) return -1;
|
|
|
|
Reset();
|
|
|
|
int bounds[6];
|
|
|
|
|
|
|
|
time_t startTime=time(NULL);
|
|
|
|
|
|
|
|
TiXmlDocument doc(file);
|
|
|
|
if (!doc.LoadFile())
|
|
|
|
{
|
|
|
|
cerr << "openEMS: Error File-Loading failed!!! File: " << file << endl;
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
2010-03-12 19:39:04 +00:00
|
|
|
cout << "Read openEMS Settings..." << endl;
|
2010-03-12 20:14:17 +00:00
|
|
|
TiXmlElement* openEMSxml = doc.FirstChildElement("openEMS");
|
|
|
|
if (openEMSxml==NULL)
|
|
|
|
{
|
|
|
|
cerr << "Can't read openEMS ... " << endl;
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
TiXmlElement* FDTD_Opts = openEMSxml->FirstChildElement("FDTD");
|
2010-04-07 14:31:23 +00:00
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
if (FDTD_Opts==NULL)
|
|
|
|
{
|
2010-03-12 20:14:17 +00:00
|
|
|
cerr << "Can't read openEMS FDTD Settings... " << endl;
|
2010-03-11 09:56:19 +00:00
|
|
|
exit(-1);
|
|
|
|
}
|
2010-03-29 08:12:38 +00:00
|
|
|
int help=0;
|
|
|
|
FDTD_Opts->QueryIntAttribute("NumberOfTimesteps",&help);
|
|
|
|
if (help<0)
|
|
|
|
NrTS=0;
|
|
|
|
else
|
|
|
|
NrTS = help;
|
2010-04-07 14:31:23 +00:00
|
|
|
|
2010-04-16 11:13:01 +00:00
|
|
|
help = 0;
|
2010-04-09 13:51:37 +00:00
|
|
|
FDTD_Opts->QueryIntAttribute("CylinderCoords",&help);
|
|
|
|
if (help==1)
|
|
|
|
{
|
|
|
|
cout << "Using a cylinder coordinate FDTD..." << endl;
|
|
|
|
CylinderCoords = true;
|
|
|
|
}
|
|
|
|
|
2010-03-15 19:50:49 +00:00
|
|
|
FDTD_Opts->QueryDoubleAttribute("endCriteria",&endCrit);
|
|
|
|
if (endCrit==0)
|
|
|
|
endCrit=1e-6;
|
2010-03-11 09:56:19 +00:00
|
|
|
|
2010-04-04 17:48:36 +00:00
|
|
|
FDTD_Opts->QueryIntAttribute("OverSampling",&m_OverSampling);
|
|
|
|
if (m_OverSampling<2)
|
|
|
|
m_OverSampling=2;
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
TiXmlElement* BC = FDTD_Opts->FirstChildElement("BoundaryCond");
|
|
|
|
if (BC==NULL)
|
|
|
|
{
|
|
|
|
cerr << "Can't read openEMS boundary cond Settings... " << endl;
|
|
|
|
exit(-3);
|
|
|
|
}
|
|
|
|
BC->QueryIntAttribute("xmin",&bounds[0]);
|
|
|
|
BC->QueryIntAttribute("xmax",&bounds[1]);
|
|
|
|
BC->QueryIntAttribute("ymin",&bounds[2]);
|
|
|
|
BC->QueryIntAttribute("ymax",&bounds[3]);
|
|
|
|
BC->QueryIntAttribute("zmin",&bounds[4]);
|
|
|
|
BC->QueryIntAttribute("zmax",&bounds[5]);
|
|
|
|
|
2010-03-12 19:39:04 +00:00
|
|
|
cout << "Read Geometry..." << endl;
|
2010-03-11 09:56:19 +00:00
|
|
|
ContinuousStructure CSX;
|
2010-03-12 20:14:17 +00:00
|
|
|
string EC(CSX.ReadFromXML(openEMSxml));
|
2010-03-11 09:56:19 +00:00
|
|
|
if (EC.empty()==false)
|
|
|
|
{
|
|
|
|
cerr << EC << endl;
|
|
|
|
return(-2);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool PMC[6];
|
|
|
|
for (int n=0;n<6;++n)
|
|
|
|
PMC[n]=(bounds[n]==1);
|
|
|
|
|
|
|
|
//*************** setup operator ************//
|
2010-03-12 19:39:04 +00:00
|
|
|
cout << "Create Operator..." << endl;
|
2010-04-09 13:51:37 +00:00
|
|
|
if (CylinderCoords)
|
|
|
|
{
|
|
|
|
FDTD_Op = Operator_Cylinder::New();
|
2010-04-13 16:40:43 +00:00
|
|
|
CSX.SetCoordInputType(1); //tell CSX to use cylinder-coords
|
2010-04-09 13:51:37 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FDTD_Op = Operator::New();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FDTD_Op->SetGeometryCSX(&CSX)==false) return(2);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
|
|
|
FDTD_Op->CalcECOperator();
|
|
|
|
|
2010-04-07 14:31:23 +00:00
|
|
|
SetupExcitation(FDTD_Opts->FirstChildElement("Excitation"));
|
2010-04-02 15:20:18 +00:00
|
|
|
|
2010-03-27 22:05:45 +00:00
|
|
|
if (DebugMat)
|
|
|
|
{
|
|
|
|
FDTD_Op->DumpMaterial2File("material_dump.vtk");
|
|
|
|
}
|
|
|
|
if (DebugOp)
|
|
|
|
{
|
|
|
|
FDTD_Op->DumpOperator2File("operator_dump.vtk");
|
|
|
|
}
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
time_t OpDoneTime=time(NULL);
|
|
|
|
|
2010-03-29 20:11:24 +00:00
|
|
|
FDTD_Op->ShowStat();
|
2010-03-11 09:56:19 +00:00
|
|
|
|
|
|
|
FDTD_Op->ApplyMagneticBC(PMC);
|
|
|
|
|
2010-03-12 19:39:04 +00:00
|
|
|
cout << "Creation time for operator: " << difftime(OpDoneTime,startTime) << " s" << endl;
|
2010-03-11 09:56:19 +00:00
|
|
|
|
|
|
|
//create FDTD engine
|
2010-04-09 13:51:37 +00:00
|
|
|
if (CylinderCoords)
|
|
|
|
{
|
|
|
|
cerr << "openEMS: creating cylinder coordinate FDTD engine..." << endl;
|
|
|
|
FDTD_Eng = Engine_Cylinder::New((Operator_Cylinder*)FDTD_Op);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
switch (m_engine) {
|
|
|
|
case EngineType_Multithreaded:
|
|
|
|
FDTD_Eng = Engine_Multithread::New(FDTD_Op,m_engine_numThreads);
|
2010-04-21 12:29:02 +00:00
|
|
|
break;
|
|
|
|
case EngineType_SSE:
|
|
|
|
FDTD_Eng = Engine_sse::New(FDTD_Op);
|
2010-04-09 13:51:37 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
FDTD_Eng = Engine::New(FDTD_Op);
|
|
|
|
break;
|
|
|
|
}
|
2010-03-26 11:57:52 +00:00
|
|
|
}
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
//*************** setup processing ************//
|
2010-03-12 19:39:04 +00:00
|
|
|
cout << "Setting up processing..." << endl;
|
2010-04-07 14:31:23 +00:00
|
|
|
unsigned int Nyquist = FDTD_Op->GetNyquistNum();
|
2010-03-15 21:19:51 +00:00
|
|
|
PA = new ProcessingArray(Nyquist);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
|
|
|
double start[3];
|
|
|
|
double stop[3];
|
|
|
|
vector<CSProperties*> Probes = CSX.GetPropertyByType(CSProperties::PROBEBOX);
|
|
|
|
for (size_t i=0;i<Probes.size();++i)
|
|
|
|
{
|
|
|
|
//only looking for one prim atm
|
|
|
|
CSPrimitives* prim = Probes.at(i)->GetPrimitive(0);
|
|
|
|
if (prim!=NULL)
|
|
|
|
{
|
|
|
|
bool acc;
|
|
|
|
double* bnd = prim->GetBoundBox(acc,true);
|
|
|
|
start[0]= bnd[0];start[1]=bnd[2];start[2]=bnd[4];
|
|
|
|
stop[0] = bnd[1];stop[1] =bnd[3];stop[2] =bnd[5];
|
|
|
|
CSPropProbeBox* pb = Probes.at(i)->ToProbeBox();
|
|
|
|
Processing* proc = NULL;
|
|
|
|
if (pb)
|
|
|
|
{
|
|
|
|
if (pb->GetProbeType()==0)
|
|
|
|
{
|
|
|
|
ProcessVoltage* procVolt = new ProcessVoltage(FDTD_Op,FDTD_Eng);
|
|
|
|
procVolt->OpenFile(pb->GetName());
|
|
|
|
proc=procVolt;
|
|
|
|
}
|
|
|
|
if (pb->GetProbeType()==1)
|
|
|
|
{
|
|
|
|
ProcessCurrent* procCurr = new ProcessCurrent(FDTD_Op,FDTD_Eng);
|
|
|
|
procCurr->OpenFile(pb->GetName());
|
|
|
|
proc=procCurr;
|
|
|
|
}
|
2010-04-04 17:48:36 +00:00
|
|
|
proc->SetProcessInterval(Nyquist/m_OverSampling);
|
2010-03-11 09:56:19 +00:00
|
|
|
proc->DefineStartStopCoord(start,stop);
|
|
|
|
PA->AddProcessing(proc);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
delete proc;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
vector<CSProperties*> DumpProps = CSX.GetPropertyByType(CSProperties::DUMPBOX);
|
|
|
|
for (size_t i=0;i<DumpProps.size();++i)
|
|
|
|
{
|
|
|
|
ProcessFieldsTD* ProcTD = new ProcessFieldsTD(FDTD_Op,FDTD_Eng);
|
2010-03-11 14:48:55 +00:00
|
|
|
ProcTD->SetEnable(Enable_Dumps);
|
2010-04-04 17:48:36 +00:00
|
|
|
ProcTD->SetProcessInterval(Nyquist/m_OverSampling);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
|
|
|
//only looking for one prim atm
|
|
|
|
CSPrimitives* prim = DumpProps.at(i)->GetPrimitive(0);
|
|
|
|
if (prim==NULL)
|
|
|
|
delete ProcTD;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bool acc;
|
|
|
|
double* bnd = prim->GetBoundBox(acc);
|
|
|
|
start[0]= bnd[0];start[1]=bnd[2];start[2]=bnd[4];
|
|
|
|
stop[0] = bnd[1];stop[1] =bnd[3];stop[2] =bnd[5];
|
|
|
|
CSPropDumpBox* db = DumpProps.at(i)->ToDumpBox();
|
|
|
|
if (db)
|
|
|
|
{
|
2010-04-05 18:22:03 +00:00
|
|
|
ProcTD->SetDumpType((ProcessFields::DumpType)db->GetDumpType());
|
|
|
|
ProcTD->SetDumpMode((ProcessFields::DumpMode)db->GetDumpMode());
|
|
|
|
ProcTD->SetFileType((ProcessFields::FileType)db->GetFileType());
|
2010-04-07 10:57:45 +00:00
|
|
|
for (int n=0;n<3;++n)
|
|
|
|
ProcTD->SetSubSampling(db->GetSubSampling(n),n);
|
2010-03-11 09:56:19 +00:00
|
|
|
ProcTD->SetFilePattern(db->GetName());
|
2010-04-05 18:22:03 +00:00
|
|
|
ProcTD->SetFileName(db->GetName());
|
2010-03-11 09:56:19 +00:00
|
|
|
ProcTD->DefineStartStopCoord(start,stop);
|
2010-04-05 18:22:03 +00:00
|
|
|
ProcTD->InitProcess();
|
2010-03-11 09:56:19 +00:00
|
|
|
PA->AddProcessing(ProcTD);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
delete ProcTD;
|
|
|
|
}
|
|
|
|
}
|
2010-04-19 14:09:41 +00:00
|
|
|
|
|
|
|
// dump all boxes (voltage, current, fields, ...)
|
|
|
|
if (m_debugBox)
|
|
|
|
{
|
|
|
|
PA->DumpBoxes2File("box_dump_");
|
|
|
|
}
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void openEMS::RunFDTD()
|
|
|
|
{
|
2010-03-29 20:11:24 +00:00
|
|
|
cout << "Running FDTD engine... this may take a while... grab a cup of coffee?!?" << endl;
|
2010-03-25 14:08:54 +00:00
|
|
|
|
2010-04-03 15:36:50 +00:00
|
|
|
//special handling of a field processing, needed to realize the end criteria...
|
|
|
|
ProcessFields* ProcField = new ProcessFields(FDTD_Op,FDTD_Eng);
|
|
|
|
PA->AddProcessing(ProcField);
|
2010-03-15 15:59:37 +00:00
|
|
|
double maxE=0,currE=0;
|
2010-04-03 15:36:50 +00:00
|
|
|
|
|
|
|
//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);
|
|
|
|
|
2010-03-15 15:59:37 +00:00
|
|
|
double change=1;
|
|
|
|
int prevTS=0,currTS=0;
|
2010-03-27 14:54:44 +00:00
|
|
|
double speed = FDTD_Op->GetNumberCells()/1e6;
|
2010-03-15 15:59:37 +00:00
|
|
|
double t_diff;
|
2010-03-27 14:54:44 +00:00
|
|
|
|
|
|
|
timeval currTime;
|
|
|
|
gettimeofday(&currTime,NULL);
|
|
|
|
timeval startTime = currTime;
|
|
|
|
timeval prevTime= currTime;
|
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
//*************** simulate ************//
|
2010-03-27 14:54:44 +00:00
|
|
|
|
2010-03-11 09:56:19 +00:00
|
|
|
int step=PA->Process();
|
2010-03-29 08:12:38 +00:00
|
|
|
if ((step<0) || (step>(int)NrTS)) step=NrTS;
|
2010-03-15 15:59:37 +00:00
|
|
|
while ((FDTD_Eng->GetNumberOfTimesteps()<NrTS) && (change>endCrit))
|
2010-03-11 09:56:19 +00:00
|
|
|
{
|
|
|
|
FDTD_Eng->IterateTS(step);
|
|
|
|
step=PA->Process();
|
2010-04-03 15:36:50 +00:00
|
|
|
|
|
|
|
if (ProcField->CheckTimestep())
|
|
|
|
{
|
|
|
|
currE = ProcField->CalcTotalEnergy();
|
|
|
|
if (currE>maxE)
|
|
|
|
maxE=currE;
|
|
|
|
}
|
|
|
|
|
2010-03-12 19:39:04 +00:00
|
|
|
// cout << " do " << step << " steps; current: " << eng.GetNumberOfTimesteps() << endl;
|
2010-03-15 15:59:37 +00:00
|
|
|
currTS = FDTD_Eng->GetNumberOfTimesteps();
|
2010-03-29 08:12:38 +00:00
|
|
|
if ((step<0) || (step>(int)(NrTS - currTS))) step=NrTS - currTS;
|
2010-03-15 15:59:37 +00:00
|
|
|
|
2010-03-25 14:08:54 +00:00
|
|
|
gettimeofday(&currTime,NULL);
|
|
|
|
|
|
|
|
t_diff = CalcDiffTime(currTime,prevTime);
|
2010-03-15 15:59:37 +00:00
|
|
|
if (t_diff>4)
|
|
|
|
{
|
2010-04-03 15:36:50 +00:00
|
|
|
currE = ProcField->CalcTotalEnergy();
|
2010-03-15 21:19:51 +00:00
|
|
|
if (currE>maxE)
|
2010-03-15 15:59:37 +00:00
|
|
|
maxE=currE;
|
2010-03-25 14:08:54 +00:00
|
|
|
cout << "[@" << setw(8) << (int)CalcDiffTime(currTime,startTime) << "s] Timestep: " << setw(12) << currTS << " (" << setw(6) << setprecision(2) << std::fixed << (double)currTS/(double)NrTS*100.0 << "%)" ;
|
2010-03-27 14:54:44 +00:00
|
|
|
cout << " with currently " << setw(6) << setprecision(1) << std::fixed << speed*(currTS-prevTS)/t_diff << " MCells/s" ;
|
2010-03-15 21:19:51 +00:00
|
|
|
if (maxE)
|
|
|
|
change = currE/maxE;
|
|
|
|
cout << " --- Energy: ~" << setw(6) << setprecision(2) << std::scientific << currE << " (decrement: " << setw(6) << setprecision(2) << std::fixed << fabs(10.0*log10(change)) << "dB)" << endl;
|
2010-03-15 15:59:37 +00:00
|
|
|
prevTime=currTime;
|
|
|
|
prevTS=currTS;
|
|
|
|
}
|
2010-03-11 09:56:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//*************** postproc ************//
|
2010-03-15 15:59:37 +00:00
|
|
|
prevTime = currTime;
|
2010-03-25 14:08:54 +00:00
|
|
|
gettimeofday(&currTime,NULL);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
2010-03-25 14:08:54 +00:00
|
|
|
t_diff = CalcDiffTime(currTime,startTime);
|
2010-03-11 09:56:19 +00:00
|
|
|
|
2010-03-12 19:39:04 +00:00
|
|
|
cout << "Time for " << FDTD_Eng->GetNumberOfTimesteps() << " iterations with " << FDTD_Op->GetNumberCells() << " cells : " << t_diff << " sec" << endl;
|
2010-03-15 15:59:37 +00:00
|
|
|
cout << "Speed: " << speed*(double)FDTD_Eng->GetNumberOfTimesteps()/t_diff << " MCells/s " << endl;
|
2010-03-11 09:56:19 +00:00
|
|
|
}
|