openEMS/examples/FDTD_examples.cpp
Thorsten Liebig f73bf210ed new ProcessingArray; Processing returns next interval for process()
Processing now uses a timestep interval in which Process() will do it's work
and returns the next interval it doesn't need another Process() call

all Processing routines can be put into these array
and it will take care of calling Process() at the right time
2010-03-10 12:15:14 +01:00

227 lines
7.3 KiB
C++

#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)
{
double width = 1000;
double hight = 1000;
double length = 4000;
double abs_l = 200;
CSPrimBox* box = NULL;
//fake pml....
CSPropMaterial* mat = new CSPropMaterial(CSX.GetParameterSet());
// mat->SetEpsilon(3.6);
double finalKappa = 0.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);
box = new CSPrimBox(CSX.GetParameterSet(),mat);
box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
box->SetCoord(2,hight/-2.0);box->SetCoord(3,hight/2.0);
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,hight/-2.0);box->SetCoord(3,hight/2.0);
box->SetCoord(4,length/-2.0+abs_l); box->SetCoord(5,length/-2.0);
CSX.AddPrimitive(box);
CSPropMaterial* mat2 = new CSPropMaterial(CSX.GetParameterSet());
mat2->SetEpsilon(2);
CSX.AddProperty(mat2);
box = new CSPrimBox(CSX.GetParameterSet(),mat2);
box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
box->SetCoord(2,hight/-2.0);box->SetCoord(3,hight/2.0);
box->SetCoord(4,length/-4.0);box->SetCoord(5,length/4.0);
CSX.AddPrimitive(box);
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);
box = new CSPrimBox(CSX.GetParameterSet(),elec);
box->SetCoord(0,width/-2.0);box->SetCoord(1,width/2.0);
box->SetCoord(2,hight/-2.0);box->SetCoord(3,hight/2.0);
box->SetCoord(4,0.0);box->SetCoord(5,0.0);
CSX.AddPrimitive(box);
//E-field dump
CSPropDumpBox* Edump = new CSPropDumpBox(CSX.GetParameterSet());
Edump->SetDumpType(0);
Edump->SetName("tmp/Et_");
CSX.AddProperty(Edump);
box = new CSPrimBox(CSX.GetParameterSet(),Edump);
box->SetCoord(0,width/-3.0);box->SetCoord(1,width/3.0);
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
box->SetCoord(4,length/-2.0+abs_l);box->SetCoord(5,length/2.0-abs_l);
CSX.AddPrimitive(box);
//H-field dump
CSPropDumpBox* Hdump = new CSPropDumpBox(CSX.GetParameterSet());
Hdump->SetDumpType(1);
Hdump->SetName("tmp/Ht_");
CSX.AddProperty(Hdump);
box = new CSPrimBox(CSX.GetParameterSet(),Hdump);
box->SetCoord(0,width/-3.0);box->SetCoord(1,width/3.0);
box->SetCoord(2,0.0);box->SetCoord(3,0.0);
box->SetCoord(4,length/-2.0+abs_l);box->SetCoord(5,length/2.0-abs_l);
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=width/-2.0;n<=width/2;n+=20)
grid->AddDiscLine(0,(double)n);
for (int n=hight/-2.0;n<=hight/2.0;n+=20)
grid->AddDiscLine(1,(double)n);
for (int n=length/-2.0;n<=length/2.0;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 = 0.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);
//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->SetDumpType(0);
Edump->SetName("tmp/Et_");
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");
}