MPI: synchronize time step + new MPI_Enabled flag

pull/1/head
Thorsten Liebig 2011-02-11 14:42:14 +01:00
parent e2628740fc
commit 27a4b9f482
3 changed files with 42 additions and 4 deletions

View File

@ -46,7 +46,7 @@ void Engine_MPI::Init()
m_BufferSize[i]=0; m_BufferSize[i]=0;
} }
if (m_Op_MPI->m_NumProc>1) if (m_Op_MPI->GetMPIEnabled())
{ {
// init buffers, nx*ny*2 for the tangential electric or magnetic fields at the interface // init buffers, nx*ny*2 for the tangential electric or magnetic fields at the interface
m_BufferSize[2] = m_Op_MPI->numLines[0]*m_Op_MPI->numLines[1]*2; m_BufferSize[2] = m_Op_MPI->numLines[0]*m_Op_MPI->numLines[1]*2;
@ -178,6 +178,11 @@ void Engine_MPI::SendReceiveCurrents()
bool Engine_MPI::IterateTS(unsigned int iterTS) bool Engine_MPI::IterateTS(unsigned int iterTS)
{ {
if (!m_Op_MPI->GetMPIEnabled())
{
return Engine_SSE_Compressed::IterateTS(iterTS);
}
for (unsigned int iter=0; iter<iterTS; ++iter) for (unsigned int iter=0; iter<iterTS; ++iter)
{ {
//voltage updates with extensions //voltage updates with extensions

View File

@ -33,6 +33,10 @@ Operator_MPI* Operator_MPI::New()
Operator_MPI::Operator_MPI() : Operator_SSE_Compressed() Operator_MPI::Operator_MPI() : Operator_SSE_Compressed()
{ {
m_NumProc = MPI::COMM_WORLD.Get_size();
//enabled only if more than one process is active
m_MPI_Enabled = m_NumProc>0;
} }
Operator_MPI::~Operator_MPI() Operator_MPI::~Operator_MPI()
@ -44,7 +48,7 @@ bool Operator_MPI::SetGeometryCSX(ContinuousStructure* geo)
{ {
//manipulate geometry for this part... //manipulate geometry for this part...
if (m_NumProc>1) if (m_MPI_Enabled)
{ {
CSRectGrid* grid = geo->GetGrid(); CSRectGrid* grid = geo->GetGrid();
int nz = grid->GetQtyLines(2); int nz = grid->GetQtyLines(2);
@ -71,8 +75,28 @@ bool Operator_MPI::SetGeometryCSX(ContinuousStructure* geo)
return Operator_SSE_Compressed::SetGeometryCSX(geo); return Operator_SSE_Compressed::SetGeometryCSX(geo);
} }
double Operator_MPI::CalcTimestep()
{
double ret = Operator::CalcTimestep();
if (!m_MPI_Enabled)
return ret;
double local_dT = dT;
//find the smallest time-step requestes by all processings
MPI_Reduce(&local_dT, &dT, 1, MPI_DOUBLE, MPI_MIN, 0, MPI_COMM_WORLD);
//send the smallest time-step to all
MPI_Bcast(&dT, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
return ret;
}
void Operator_MPI::SetBoundaryCondition(int* BCs) void Operator_MPI::SetBoundaryCondition(int* BCs)
{ {
if (!m_MPI_Enabled)
return Operator_SSE_Compressed::SetBoundaryCondition(BCs);
//set boundary conditions on MPI interfaces to PEC, ApplyElectricBC will handle proper interface handling... //set boundary conditions on MPI interfaces to PEC, ApplyElectricBC will handle proper interface handling...
for (int n=0;n<3;++n) for (int n=0;n<3;++n)
{ {
@ -86,6 +110,9 @@ void Operator_MPI::SetBoundaryCondition(int* BCs)
void Operator_MPI::ApplyElectricBC(bool* dirs) void Operator_MPI::ApplyElectricBC(bool* dirs)
{ {
if (!m_MPI_Enabled)
return Operator_SSE_Compressed::ApplyElectricBC(dirs);
for (int n=0;n<3;++n) for (int n=0;n<3;++n)
{ {
//do not delete operator at upper inteface //do not delete operator at upper inteface
@ -97,7 +124,7 @@ void Operator_MPI::ApplyElectricBC(bool* dirs)
Engine* Operator_MPI::CreateEngine() const Engine* Operator_MPI::CreateEngine() const
{ {
if (m_NumProc>1) if (m_MPI_Enabled)
return Engine_MPI::New(this); return Engine_MPI::New(this);
else else
return Engine_SSE_Compressed::New(this); return Engine_SSE_Compressed::New(this);
@ -122,6 +149,7 @@ void Operator_MPI::Init()
m_Processor_Name = new char[MPI_MAX_PROCESSOR_NAME]; m_Processor_Name = new char[MPI_MAX_PROCESSOR_NAME];
MPI::Get_processor_name(m_Processor_Name,namelen); MPI::Get_processor_name(m_Processor_Name,namelen);
if (m_MPI_Enabled)
cerr << "Operator_MPI::Init(): Running on " << m_Processor_Name << endl; cerr << "Operator_MPI::Init(): Running on " << m_Processor_Name << endl;
} }

View File

@ -28,6 +28,8 @@ public:
static Operator_MPI* New(); static Operator_MPI* New();
virtual ~Operator_MPI(); virtual ~Operator_MPI();
bool GetMPIEnabled() const {return m_MPI_Enabled;}
virtual bool SetGeometryCSX(ContinuousStructure* geo); virtual bool SetGeometryCSX(ContinuousStructure* geo);
virtual void SetBoundaryCondition(int* BCs); virtual void SetBoundaryCondition(int* BCs);
@ -37,10 +39,13 @@ public:
protected: protected:
Operator_MPI(); Operator_MPI();
bool m_MPI_Enabled;
virtual void Init(); virtual void Init();
void Delete(); void Delete();
virtual void Reset(); virtual void Reset();
virtual double CalcTimestep();
int m_MyID; int m_MyID;
int m_NumProc; int m_NumProc;
int m_MyTag; int m_MyTag;