diff --git a/examples/FDTD_examples.cpp b/examples/FDTD_examples.cpp new file mode 100644 index 0000000..994d401 --- /dev/null +++ b/examples/FDTD_examples.cpp @@ -0,0 +1,172 @@ +#include "FDTD_examples.h" +#include "../tools/constants.h" + +void BuildDipol(ContinuousStructure &CSX) +{ + CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet()); + mat->SetKappa(0.001); + CSX.AddProperty(mat); + + CSPrimBox* matbox = new CSPrimBox(CSX.GetParameterSet(),mat); + matbox->SetCoord(0,-1000.0);matbox->SetCoord(1,1000.0); + matbox->SetCoord(2,-1000.0);matbox->SetCoord(3,1000.0); + matbox->SetCoord(4,-1000.0);matbox->SetCoord(5,1000.0); + CSX.AddPrimitive(matbox); + + CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet()); + elec->SetExcitation(1,1); + elec->SetExcitType(1); + elec->SetActiveDir(0,0);//disable x + elec->SetActiveDir(0,2);//disable z +// elec->SetDelay(2.0e-9); + CSX.AddProperty(elec); + + CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),elec); + box->SetCoord(0,-10.0);box->SetCoord(1,10.0); + box->SetCoord(2,-75.0);box->SetCoord(3,75.0); + box->SetCoord(4,-10.0);box->SetCoord(5,10.0); + CSX.AddPrimitive(box); + + CSRectGrid* grid = CSX.GetGrid(); + + for (int n=-990;n<=990;n+=20) + grid->AddDiscLine(2,(double)n); + for (int n=-990;n<=990;n+=20) + grid->AddDiscLine(0,(double)n); + for (int n=-990;n<=990;n+=20) + grid->AddDiscLine(1,(double)n); + + grid->SetDeltaUnit(1e-3); + + CSX.Write2XML("tmp/Dipol.xml"); +} + +void BuildPlaneWave(ContinuousStructure &CSX) +{ +// CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet()); +//// mat->SetKappa(0.001); +// CSX.AddProperty(mat); +// +// CSPrimBox* matbox = new CSPrimBox(CSX.GetParameterSet(),mat); +// matbox->SetCoord(0,-1000.0);matbox->SetCoord(1,1000.0); +// matbox->SetCoord(2,-1000.0);matbox->SetCoord(3,1000.0); +// matbox->SetCoord(4,-4000.0);matbox->SetCoord(5,4000.0); +// CSX.AddPrimitive(matbox); + + CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet()); + elec->SetExcitation(1,1); + elec->SetExcitType(0); + elec->SetActiveDir(0,0);//disable x + elec->SetActiveDir(0,2);//disable z +// elec->SetDelay(2.0e-9); + CSX.AddProperty(elec); + + CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),elec); + box->SetCoord(0,-500.0);box->SetCoord(1,500.0); + box->SetCoord(2,-500.0);box->SetCoord(3,500.0); + box->SetCoord(4,-4000.0);box->SetCoord(5,-4000.0); + CSX.AddPrimitive(box); + + CSPropMetal* metal = new CSPropMetal(CSX.GetParameterSet()); + CSX.AddProperty(metal); + CSPrimCylinder* cyl = new CSPrimCylinder(CSX.GetParameterSet(),metal); + cyl->SetRadius(100); + cyl->SetCoord(0,0.0);cyl->SetCoord(1,0.0); + cyl->SetCoord(2,-250.0);cyl->SetCoord(3,250.0); + cyl->SetCoord(4,-0000.0);cyl->SetCoord(5,-0000.0); + CSX.AddPrimitive(cyl); + + CSRectGrid* grid = CSX.GetGrid(); + + for (int n=-500;n<=500;n+=20) + grid->AddDiscLine(0,(double)n); + for (int n=-500;n<=500;n+=20) + grid->AddDiscLine(1,(double)n); + for (int n=-4000;n<=4000;n+=20) + grid->AddDiscLine(2,(double)n); + + grid->SetDeltaUnit(1e-3); + + CSX.Write2XML("tmp/PlaneWave.xml"); +} + +void BuildMSL(ContinuousStructure &CSX) +{ + double width = 1000; + double hight = 500; + double length = 2000; + double abs_l = 200; + + //substrate.... + CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet()); +// mat->SetEpsilon(3.6); + double finalKappa = 3.0/pow(abs_l,4); + mat->SetKappa(finalKappa); + std::ostringstream fct; + fct << "pow(abs(z)-" << length/2.0-abs_l << ",4)"; + mat->SetKappaWeightFunction(fct.str(),0); + mat->SetKappaWeightFunction(fct.str(),1); + mat->SetKappaWeightFunction(fct.str(),2); + mat->SetSigma(finalKappa*__MUE0__/__EPS0__); + mat->SetSigmaWeightFunction(fct.str(),0); + mat->SetSigmaWeightFunction(fct.str(),1); + mat->SetSigmaWeightFunction(fct.str(),2); + CSX.AddProperty(mat); + CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),mat); + box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0); + box->SetCoord(2,0.0);box->SetCoord(3,hight); + box->SetCoord(4,length/2.0-abs_l); box->SetCoord(5,length/2.0); + CSX.AddPrimitive(box); +// box = new CSPrimBox(CSX.GetParameterSet(),mat); +// box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0); +// box->SetCoord(2,0.0);box->SetCoord(3,hight); +// box->SetCoord(4,length/-2.0+abs_l); box->SetCoord(5,length/-2.0); +// CSX.AddPrimitive(box); + + //MSL + CSPropMetal* MSL = new CSPropMetal(CSX.GetParameterSet()); + CSX.AddProperty(MSL); + box = new CSPrimBox(CSX.GetParameterSet(),MSL); + box->SetCoord(0,-40.0);box->SetCoord(1,40.0); + box->SetCoord(2,50.0);box->SetCoord(3,50.0); + box->SetCoord(4,length/-2);box->SetCoord(5,length/2.0); + box->SetPriority(100); + CSX.AddPrimitive(box); + + //MSL excite... + CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet()); + elec->SetExcitation(-1,1); + elec->SetExcitType(0); +// elec->SetDelay(2.0e-9); + CSX.AddProperty(elec); + box = new CSPrimBox(CSX.GetParameterSet(),elec); + box->SetCoord(0,-40.0);box->SetCoord(1,40.0); + box->SetCoord(2,0.0);box->SetCoord(3,50.0); + box->SetCoord(4,length/-2.0);box->SetCoord(5,length/-2.0); + CSX.AddPrimitive(box); + + //E-field dump + CSPropDumpBox* Edump = new CSPropDumpBox(CSX.GetParameterSet()); + Edump->SetEFieldDump(true); + CSX.AddProperty(Edump); + box = new CSPrimBox(CSX.GetParameterSet(),Edump); + box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0); + box->SetCoord(2,25.0);box->SetCoord(3,25.); + box->SetCoord(4,length/-2.0);box->SetCoord(5,length/2.0); + CSX.AddPrimitive(box); + + CSRectGrid* grid = CSX.GetGrid(); + + for (double n=width/-2.0;n<=width/2;n+=20) + grid->AddDiscLine(0,n); + for (double n=0;n<=500;n+=10) + grid->AddDiscLine(1,n); + for (double n=length/-2.0;n<=length/2.0;n+=20) + grid->AddDiscLine(2,n); + + grid->SetDeltaUnit(1e-3); + + CSX.Write2XML("tmp/MSL.xml"); +} + + diff --git a/examples/FDTD_examples.h b/examples/FDTD_examples.h new file mode 100644 index 0000000..e4737ff --- /dev/null +++ b/examples/FDTD_examples.h @@ -0,0 +1,12 @@ +#ifndef FDTD_EXAMPLES_H +#define FDTD_EXAMPLES_H + +#include "ContinuousStructure.h" + +void BuildDipol(ContinuousStructure &CSX); + +void BuildPlaneWave(ContinuousStructure &CSX); + +void BuildMSL(ContinuousStructure &CSX); + +#endif // FDTD_EXAMPLES_H diff --git a/main.cpp b/main.cpp index bdc61f6..681dfe7 100644 --- a/main.cpp +++ b/main.cpp @@ -11,11 +11,9 @@ #include "ContinuousStructure.h" -using namespace std; +#include "examples/FDTD_examples.h" -void BuildMSL(ContinuousStructure &CSX); -void BuildDipol(ContinuousStructure &CSX); -void BuildPlaneWave(ContinuousStructure &CSX); +using namespace std; int main(int argc, char *argv[]) { @@ -69,29 +67,37 @@ int main(int argc, char *argv[]) unsigned int maxIter = 1800; + vector DumpProps = CSX.GetPropertyByType(CSProperties::DUMPBOX); + vector TD_Dump; ProcessFieldsTD PETD(&cop,&eng); - start[0]=-500;start[1]=25;start[2]=-800; - stop[0] = 500;stop[1] =24;stop[2] = 800; -// start[0]=-300;start[1]=0;start[2]=-4000; -// stop[0]=300;stop[1]=300;stop[2]=-4000; - PETD.SetDumpType(0); - PETD.SetFilePattern("tmp/Et_"); - PETD.DefineStartStopCoord(start,stop); - - ProcessFieldsTD PHTD(&cop,&eng); - start[0]=-1000;start[2]=0;start[1]=-1000; - stop[0]=1000;stop[2]=0;stop[1]=1000; - PHTD.SetDumpType(1); - PHTD.SetFilePattern("tmp/Ht_"); - PHTD.DefineStartStopCoord(start,stop); + if (DumpProps.size()>0) + { + CSPrimitives* prim = DumpProps.at(0)->GetPrimitive(0); + 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(0)->ToDumpBox(); + if (db) + { + if (db->GetEFieldDump()) + { + PETD.SetDumpType(0); + PETD.SetFilePattern("tmp/Et_"); + } + else + PETD.SetEnable(false); + } + else + PETD.SetEnable(false); + PETD.DefineStartStopCoord(start,stop); + } PETD.SetEnable(true); - PHTD.SetEnable(false); PV.Process(); PCurr.Process(); PETD.Process(); - PHTD.Process(); //*************** simulate ************// for (unsigned int i=0;iSetKappa(0.001); - CSX.AddProperty(mat); - - CSPrimBox* matbox = new CSPrimBox(CSX.GetParameterSet(),mat); - matbox->SetCoord(0,-1000.0);matbox->SetCoord(1,1000.0); - matbox->SetCoord(2,-1000.0);matbox->SetCoord(3,1000.0); - matbox->SetCoord(4,-1000.0);matbox->SetCoord(5,1000.0); - CSX.AddPrimitive(matbox); - - CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet()); - elec->SetExcitation(1,1); - elec->SetExcitType(1); - elec->SetActiveDir(0,0);//disable x - elec->SetActiveDir(0,2);//disable z -// elec->SetDelay(2.0e-9); - CSX.AddProperty(elec); - - CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),elec); - box->SetCoord(0,-10.0);box->SetCoord(1,10.0); - box->SetCoord(2,-75.0);box->SetCoord(3,75.0); - box->SetCoord(4,-10.0);box->SetCoord(5,10.0); - CSX.AddPrimitive(box); - - CSRectGrid* grid = CSX.GetGrid(); - - for (int n=-990;n<=990;n+=20) - grid->AddDiscLine(2,(double)n); - for (int n=-990;n<=990;n+=20) - grid->AddDiscLine(0,(double)n); - for (int n=-990;n<=990;n+=20) - grid->AddDiscLine(1,(double)n); - - grid->SetDeltaUnit(1e-3); - - CSX.Write2XML("tmp/Dipol.xml"); -} - -void BuildPlaneWave(ContinuousStructure &CSX) -{ -// CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet()); -//// mat->SetKappa(0.001); -// CSX.AddProperty(mat); -// -// CSPrimBox* matbox = new CSPrimBox(CSX.GetParameterSet(),mat); -// matbox->SetCoord(0,-1000.0);matbox->SetCoord(1,1000.0); -// matbox->SetCoord(2,-1000.0);matbox->SetCoord(3,1000.0); -// matbox->SetCoord(4,-4000.0);matbox->SetCoord(5,4000.0); -// CSX.AddPrimitive(matbox); - - CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet()); - elec->SetExcitation(1,1); - elec->SetExcitType(0); - elec->SetActiveDir(0,0);//disable x - elec->SetActiveDir(0,2);//disable z -// elec->SetDelay(2.0e-9); - CSX.AddProperty(elec); - - CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),elec); - box->SetCoord(0,-500.0);box->SetCoord(1,500.0); - box->SetCoord(2,-500.0);box->SetCoord(3,500.0); - box->SetCoord(4,-4000.0);box->SetCoord(5,-4000.0); - CSX.AddPrimitive(box); - - CSPropMetal* metal = new CSPropMetal(CSX.GetParameterSet()); - CSX.AddProperty(metal); - CSPrimCylinder* cyl = new CSPrimCylinder(CSX.GetParameterSet(),metal); - cyl->SetRadius(100); - cyl->SetCoord(0,0.0);cyl->SetCoord(1,0.0); - cyl->SetCoord(2,-250.0);cyl->SetCoord(3,250.0); - cyl->SetCoord(4,-0000.0);cyl->SetCoord(5,-0000.0); - CSX.AddPrimitive(cyl); - - CSRectGrid* grid = CSX.GetGrid(); - - for (int n=-500;n<=500;n+=20) - grid->AddDiscLine(0,(double)n); - for (int n=-500;n<=500;n+=20) - grid->AddDiscLine(1,(double)n); - for (int n=-4000;n<=4000;n+=20) - grid->AddDiscLine(2,(double)n); - - grid->SetDeltaUnit(1e-3); - - CSX.Write2XML("tmp/PlaneWave.xml"); -} - -void BuildMSL(ContinuousStructure &CSX) -{ - double width = 1000; - double hight = 500; - double length = 2000; - double abs_l = 200; - - //substrate.... - CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet()); -// mat->SetEpsilon(3.6); - double finalKappa = 3/pow(abs_l,4); - mat->SetKappa(finalKappa); - std::ostringstream fct; - fct << "pow(abs(z)-" << length/2.0-abs_l << ",4)"; - mat->SetKappaWeightFunction(fct.str(),0); - mat->SetKappaWeightFunction(fct.str(),1); - mat->SetKappaWeightFunction(fct.str(),2); - mat->SetSigma(finalKappa*__MUE0__/__EPS0__); - mat->SetSigmaWeightFunction(fct.str(),0); - mat->SetSigmaWeightFunction(fct.str(),1); - mat->SetSigmaWeightFunction(fct.str(),2); - CSX.AddProperty(mat); - CSPrimBox* box = new CSPrimBox(CSX.GetParameterSet(),mat); - box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0); - box->SetCoord(2,0.0);box->SetCoord(3,hight); - box->SetCoord(4,length/2.0-abs_l); box->SetCoord(5,length/2.0); - CSX.AddPrimitive(box); - box = new CSPrimBox(CSX.GetParameterSet(),mat); - box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0); - box->SetCoord(2,0.0);box->SetCoord(3,hight); - box->SetCoord(4,length/-2.0+abs_l); box->SetCoord(5,length/-2.0); - CSX.AddPrimitive(box); - -// double coords[]={0,0,length/2}; -// cerr << fct.str() << endl; -// cerr << finalKappa*pow(abs_l,4) << endl; -// cerr << mat->GetKappaWeighted(0,coords) << endl; -// exit(0); - - //MSL - CSPropMetal* MSL = new CSPropMetal(CSX.GetParameterSet()); -// MSL->SetKappa(56e6); - CSX.AddProperty(MSL); - box = new CSPrimBox(CSX.GetParameterSet(),MSL); - box->SetCoord(0,-40.0);box->SetCoord(1,40.0); - box->SetCoord(2,50.0);box->SetCoord(3,50.0); - box->SetCoord(4,length/-2);box->SetCoord(5,length/2.0); - CSX.AddPrimitive(box); - - //MSL excite... - CSPropElectrode* elec = new CSPropElectrode(CSX.GetParameterSet()); - elec->SetExcitation(-1,1); - elec->SetExcitType(1); -// elec->SetDelay(2.0e-9); - CSX.AddProperty(elec); - box = new CSPrimBox(CSX.GetParameterSet(),elec); - box->SetCoord(0,-40.0);box->SetCoord(1,40.0); - box->SetCoord(2,0.0);box->SetCoord(3,50.0); - box->SetCoord(4,length/-2.0);box->SetCoord(5,length/-2.0); - CSX.AddPrimitive(box); - - CSRectGrid* grid = CSX.GetGrid(); - - for (double n=width/-2.0;n<=width/2;n+=20) - grid->AddDiscLine(0,n); - for (double n=0;n<=500;n+=10) - grid->AddDiscLine(1,n); - for (double n=length/-2.0;n<=length/2.0;n+=20) - grid->AddDiscLine(2,n); - - grid->SetDeltaUnit(1e-3); - - CSX.Write2XML("tmp/MSL.xml"); -} diff --git a/openEMS.pro b/openEMS.pro index 7b857bd..5e1cb52 100644 --- a/openEMS.pro +++ b/openEMS.pro @@ -25,7 +25,8 @@ SOURCES += main.cpp \ FDTD/processing.cpp \ FDTD/processfields.cpp \ FDTD/processfields_td.cpp \ - FDTD/processcurrent.cpp + FDTD/processcurrent.cpp \ + examples/FDTD_examples.cpp HEADERS += tools/ErrorMsg.h \ tools/AdrOp.h \ tools/constants.h \ @@ -36,4 +37,5 @@ HEADERS += tools/ErrorMsg.h \ FDTD/processing.h \ FDTD/processfields.h \ FDTD/processfields_td.h \ - FDTD/processcurrent.h + FDTD/processcurrent.h \ + examples/FDTD_examples.h