MPI: added closed cylinder operator support

pull/1/head
Thorsten Liebig 2011-03-28 10:38:48 +02:00
parent 06eb82832e
commit 77cae6185e
3 changed files with 41 additions and 2 deletions

View File

@ -47,7 +47,7 @@ bool Operator_Ext_Cylinder::BuildExtension()
//if r=0 is not included -> obviously no special treatment for r=0
//if alpha direction is not closed, PEC-BC at r=0 necessary and already set...
if ((CC_R0_included==false) || (CC_closedAlpha==false))
if (CC_R0_included==false)
return true;
vv_R0 = new FDTD_FLOAT[m_Op->GetOriginalNumLines(2)];

View File

@ -209,6 +209,7 @@ bool Operator_Cylinder::SetupCSXGrid(CSRectGrid* grid)
CC_closedAlpha=false;
}
CC_R0_included = false;
if (grid->GetLine(0,0)<0)
{
cerr << "Operator_Cylinder::SetupCSXGrid: r<0 not allowed in Cylinder Coordinates!!!" << endl;
@ -218,9 +219,42 @@ bool Operator_Cylinder::SetupCSXGrid(CSRectGrid* grid)
else if (grid->GetLine(0,0)==0.0)
{
cout << "Operator_Cylinder::SetupCSXGrid: r=0 included..." << endl;
CC_R0_included= true; //also needed for correct ec-calculation
CC_R0_included = CC_closedAlpha; //needed for correct ec-calculation, deactivate if closed cylinder is false... --> E_r = 0 anyways
}
#ifdef MPI_SUPPORT
// Setup an MPI split in alpha direction for a closed cylinder
CC_MPI_Alpha = false;
if ((m_NeighborUp[1]>=0) || (m_NeighborDown[1]>=0)) //check for MPI split in alpha direction
{
double minmaxA = 2*PI;// fabs(m_OrigDiscLines[1][m_OrigNumLines[1]-1]-m_OrigDiscLines[1][0]);
if (fabs(minmaxA-2*PI) < OPERATOR_CYLINDER_CLOSED_ALPHA_THRESHOLD) //check for closed alpha MPI split
{
CC_MPI_Alpha = true;
if (m_OrigDiscLines[0][0]==0)
{
cerr << "Operator_Cylinder::SetupCSXGrid: Error: MPI split in alpha direction for closed cylinder including r==0 is currently not supported! Exit!" << endl;
exit(-2);
}
if (m_NeighborUp[1]<0) //check if this process is at the alpha-end
{
grid->SetLine(1,alphaNum-1,2*PI+m_OrigDiscLines[1][0]);
grid->AddDiscLine(1,2*PI+m_OrigDiscLines[1][1]);
SetNeighborUp(1,m_ProcTable[m_ProcTablePos[0]][0][m_ProcTablePos[2]]);
}
if (m_NeighborDown[1]<0) //check if this process is at the alpha-start
{
SetNeighborDown(1,m_ProcTable[m_ProcTablePos[0]][m_SplitNumber[1]-1][m_ProcTablePos[2]]);
}
//Note: the process table will not reflect this up/down neighbors necessary for a closed cylinder
}
}
#endif
if (Operator_Multithread::SetupCSXGrid(grid)==false)
return false;

View File

@ -30,6 +30,7 @@ all special cases e.g. a closed alpha mesh or an included r=0 case is treated by
class Operator_Cylinder : public Operator_Multithread
{
friend class Operator_CylinderMultiGrid;
friend class Operator_Ext_Cylinder;
public:
static Operator_Cylinder* New(unsigned int numThreads = 0);
virtual ~Operator_Cylinder();
@ -86,6 +87,10 @@ protected:
bool CC_closedAlpha;
bool CC_R0_included;
#ifdef MPI_SUPPORT
bool CC_MPI_Alpha;
#endif
};
#endif // OPERATOR_CYLINDER_H