core: fix probe handling

Signed-off-by: Thorsten Liebig <Thorsten.Liebig@gmx.de>
This commit is contained in:
Thorsten Liebig 2021-08-25 19:05:38 +02:00
parent bad842a710
commit 0e54fbf7ac

View File

@ -50,6 +50,7 @@
#include "tinyxml.h" #include "tinyxml.h"
#include "ContinuousStructure.h" #include "ContinuousStructure.h"
#include "CSPropProbeBox.h" #include "CSPropProbeBox.h"
#include "CSPrimBox.h"
#include "CSPropDumpBox.h" #include "CSPropDumpBox.h"
using namespace std; using namespace std;
@ -368,12 +369,15 @@ bool openEMS::SetupProcessing()
vector<CSProperties*> Probes = m_CSX->GetPropertyByType(CSProperties::PROBEBOX); vector<CSProperties*> Probes = m_CSX->GetPropertyByType(CSProperties::PROBEBOX);
for (size_t i=0; i<Probes.size(); ++i) for (size_t i=0; i<Probes.size(); ++i)
{ {
CSPropProbeBox* pb = Probes.at(i)->ToProbeBox();
if (!pb)
continue;
//check whether one or more probe boxes are defined //check whether one or more probe boxes are defined
l_MultiBox = (Probes.at(i)->GetQtyPrimitives()>1); l_MultiBox = (pb->GetQtyPrimitives()>1);
for (size_t nb=0; nb<Probes.at(i)->GetQtyPrimitives(); ++nb) for (size_t nb=0; nb<pb->GetQtyPrimitives(); ++nb)
{ {
CSPrimitives* prim = Probes.at(i)->GetPrimitive(nb); CSPrimitives* prim = pb->GetPrimitive(nb);
if (prim!=NULL) if (prim!=NULL)
{ {
double bnd[6] = {0,0,0,0,0,0}; double bnd[6] = {0,0,0,0,0,0};
@ -384,65 +388,72 @@ bool openEMS::SetupProcessing()
stop[0] = bnd[1]; stop[0] = bnd[1];
stop[1] =bnd[3]; stop[1] =bnd[3];
stop[2] =bnd[5]; stop[2] =bnd[5];
CSPropProbeBox* pb = Probes.at(i)->ToProbeBox();
ProcessIntegral* proc = NULL; ProcessIntegral* proc = NULL;
if (pb) if (pb->GetProbeType()==0)
{ {
if (pb->GetProbeType()==0) CSPrimBox* box = prim->ToBox();
if (!(box) or box->GetDimension()!=1)
{ {
ProcessVoltage* procVolt = new ProcessVoltage(NewEngineInterface()); cerr << "openEMS::SetupProcessing: Error: Probe primitive type or dimension not suitable ... skipping probe " << pb->GetName() << endl;
proc=procVolt;
}
else if (pb->GetProbeType()==1)
{
ProcessCurrent* procCurr = new ProcessCurrent(NewEngineInterface());
proc=procCurr;
}
else if (pb->GetProbeType()==2)
proc = new ProcessFieldProbe(NewEngineInterface(),0);
else if (pb->GetProbeType()==3)
proc = new ProcessFieldProbe(NewEngineInterface(),1);
else if ((pb->GetProbeType()==10) || (pb->GetProbeType()==11))
{
ProcessModeMatch* pmm = new ProcessModeMatch(NewEngineInterface());
pmm->SetFieldType(pb->GetProbeType()-10);
pmm->SetModeFunction(0,pb->GetAttributeValue("ModeFunctionX"));
pmm->SetModeFunction(1,pb->GetAttributeValue("ModeFunctionY"));
pmm->SetModeFunction(2,pb->GetAttributeValue("ModeFunctionZ"));
proc = pmm;
}
else
{
cerr << "openEMS::SetupFDTD: Warning: Probe type " << pb->GetProbeType() << " of property '" << pb->GetName() << "' is unknown..." << endl;
continue; continue;
} }
if (CylinderCoords) // use the direction and coordinates of the box
proc->SetMeshType(Processing::CYLINDRICAL_MESH); for (int n=0;n<3;++n)
if ((pb->GetProbeType()==1) || (pb->GetProbeType()==3))
{ {
proc->SetDualTime(true); start[n] = box->GetCoord(2*n);
proc->SetDualMesh(true); stop[n] = box->GetCoord(2*n+1);
} }
if (pb->GetProbeType()==11) ProcessVoltage* procVolt = new ProcessVoltage(NewEngineInterface());
proc->SetDualTime(true); proc=procVolt;
proc->SetProcessInterval(Nyquist/m_OverSampling); }
if (pb->GetStartTime()>0 || pb->GetStopTime()>0) else if (pb->GetProbeType()==1)
proc->SetProcessStartStopTime(pb->GetStartTime(), pb->GetStopTime()); {
proc->AddFrequency(pb->GetFDSamples()); ProcessCurrent* procCurr = new ProcessCurrent(NewEngineInterface());
proc->GetNormalDir(pb->GetNormalDir()); proc=procCurr;
if (l_MultiBox==false) }
proc->SetName(pb->GetName()); else if (pb->GetProbeType()==2)
else proc = new ProcessFieldProbe(NewEngineInterface(),0);
proc->SetName(pb->GetName(),nb); else if (pb->GetProbeType()==3)
proc->DefineStartStopCoord(start,stop); proc = new ProcessFieldProbe(NewEngineInterface(),1);
if (g_settings.showProbeDiscretization()) else if ((pb->GetProbeType()==10) || (pb->GetProbeType()==11))
proc->ShowSnappedCoords(); {
proc->SetWeight(pb->GetWeighting()); ProcessModeMatch* pmm = new ProcessModeMatch(NewEngineInterface());
PA->AddProcessing(proc); pmm->SetFieldType(pb->GetProbeType()-10);
prim->SetPrimitiveUsed(true); pmm->SetModeFunction(0,pb->GetAttributeValue("ModeFunctionX"));
pmm->SetModeFunction(1,pb->GetAttributeValue("ModeFunctionY"));
pmm->SetModeFunction(2,pb->GetAttributeValue("ModeFunctionZ"));
proc = pmm;
} }
else else
delete proc; {
cerr << "openEMS::SetupFDTD: Warning: Probe type " << pb->GetProbeType() << " of property '" << pb->GetName() << "' is unknown..." << endl;
continue;
}
if (CylinderCoords)
proc->SetMeshType(Processing::CYLINDRICAL_MESH);
if ((pb->GetProbeType()==1) || (pb->GetProbeType()==3))
{
proc->SetDualTime(true);
proc->SetDualMesh(true);
}
if (pb->GetProbeType()==11)
proc->SetDualTime(true);
proc->SetProcessInterval(Nyquist/m_OverSampling);
if (pb->GetStartTime()>0 || pb->GetStopTime()>0)
proc->SetProcessStartStopTime(pb->GetStartTime(), pb->GetStopTime());
proc->AddFrequency(pb->GetFDSamples());
proc->GetNormalDir(pb->GetNormalDir());
if (l_MultiBox==false)
proc->SetName(pb->GetName());
else
proc->SetName(pb->GetName(),nb);
proc->DefineStartStopCoord(start,stop);
if (g_settings.showProbeDiscretization())
proc->ShowSnappedCoords();
proc->SetWeight(pb->GetWeighting());
PA->AddProcessing(proc);
prim->SetPrimitiveUsed(true);
} }
} }
} }