fixed multigrid interpolation, added closed_cylinder support

This commit is contained in:
Thorsten Liebig 2010-09-24 12:01:38 +02:00
parent 8870a20787
commit 832792eb8e

View File

@ -123,8 +123,8 @@ void Engine_CylinderMultiGrid::InterpolVoltChild2Base(unsigned int rzPlane)
{ {
//interpolate voltages from child engine to the base engine... //interpolate voltages from child engine to the base engine...
unsigned int pos[3]; unsigned int pos[3];
unsigned int pos1_rz1, pos1_rz2; int pos1_rz1, pos1_rz2;
unsigned int pos1_a1, pos1_a2; int pos1_a1, pos1_a2;
pos[0] = rzPlane; pos[0] = rzPlane;
bool isOdd, isEven; bool isOdd, isEven;
f4vector half, one_eighth, three_eighth; f4vector half, one_eighth, three_eighth;
@ -134,21 +134,21 @@ void Engine_CylinderMultiGrid::InterpolVoltChild2Base(unsigned int rzPlane)
one_eighth.f[n] = 1.0/8.0; one_eighth.f[n] = 1.0/8.0;
three_eighth.f[n] = 3.0/8.0; three_eighth.f[n] = 3.0/8.0;
} }
for (pos[1]=0; pos[1]<numLines[1]; ++pos[1]) for (pos[1]=0; pos[1]<numLines[1] - !Op_CMG->CC_closedAlpha; ++pos[1])
{ {
isOdd = (pos[1]%2); isOdd = (pos[1]%2);
isEven = !isOdd * (pos[1]>0); isEven = !isOdd;
pos1_rz1 = pos[1]/2; pos1_rz1 = pos[1]/2;
pos1_rz2 = pos[1]/2 + isOdd; pos1_rz2 = pos[1]/2 + isOdd;
pos1_rz1 += pos[1]==1;
pos1_rz2 -= pos[1]==(numLines[1]-2);
pos1_a1 = pos[1]/2; pos1_a1 = pos[1]/2;
pos1_a2 = pos[1]/2 + isOdd - isEven; pos1_a2 = pos[1]/2 + isOdd - isEven;
pos1_a2 += pos[1]==(numLines[1]-1);
pos1_a2 -= pos[1]==(numLines[1]-2); if ((pos1_a2<0) && (Op_CMG->CC_closedAlpha))
pos1_a2 += m_InnerEngine->numLines[1]-1;
else if (pos1_a2<0)
pos1_a2 = 0;
for (pos[2]=0; pos[2]<numVectors; ++pos[2]) for (pos[2]=0; pos[2]<numVectors; ++pos[2])
{ {
@ -164,18 +164,22 @@ void Engine_CylinderMultiGrid::InterpolVoltChild2Base(unsigned int rzPlane)
} }
} }
//r,z - interpolation correction... if (!Op_CMG->CC_closedAlpha)
{
// boundary interpolation correction...
pos[1]=1; pos[1]=1;
for (pos[2]=0; pos[2]<numVectors; ++pos[2]) for (pos[2]=0; pos[2]<numVectors; ++pos[2])
{ {
f4_volt[0][pos[0]][pos[1]][pos[2]].v += half.v * (m_InnerEngine->f4_volt[0][pos[0]][1][pos[2]].v - m_InnerEngine->f4_volt[0][pos[0]][2][pos[2]].v); f4_volt[0][pos[0]][pos[1]][pos[2]].v = m_InnerEngine->f4_volt[0][pos[0]][1][pos[2]].v + half.v * m_InnerEngine->f4_volt[0][pos[0]][1][pos[2]].v - half.v * m_InnerEngine->f4_volt[0][pos[0]][2][pos[2]].v;
f4_volt[2][pos[0]][pos[1]][pos[2]].v += half.v * (m_InnerEngine->f4_volt[2][pos[0]][1][pos[2]].v - m_InnerEngine->f4_volt[2][pos[0]][2][pos[2]].v); f4_volt[2][pos[0]][pos[1]][pos[2]].v = m_InnerEngine->f4_volt[2][pos[0]][1][pos[2]].v + half.v * m_InnerEngine->f4_volt[2][pos[0]][1][pos[2]].v - half.v * m_InnerEngine->f4_volt[2][pos[0]][2][pos[2]].v;
} }
pos[1]=numLines[1]-2; pos[1]=numLines[1]-2;
for (pos[2]=0; pos[2]<numVectors; ++pos[2]) for (pos[2]=0; pos[2]<numVectors; ++pos[2])
{ {
f4_volt[0][pos[0]][pos[1]][pos[2]].v += half.v * (m_InnerEngine->f4_volt[0][pos[0]][pos[1]/2][pos[2]].v - m_InnerEngine->f4_volt[0][pos[0]][pos[1]/2-1][pos[2]].v); f4_volt[1][pos[0]][pos[1]][pos[2]].v = half.v * m_InnerEngine->f4_volt[1][pos[0]][pos[1]/2][pos[2]].v + one_eighth.v * m_InnerEngine->f4_volt[1][pos[0]][pos[1]/2][pos[2]].v - one_eighth.v * m_InnerEngine->f4_volt[1][pos[0]][pos[1]/2-1][pos[2]].v;
f4_volt[2][pos[0]][pos[1]][pos[2]].v += half.v * (m_InnerEngine->f4_volt[2][pos[0]][pos[1]/2][pos[2]].v - m_InnerEngine->f4_volt[2][pos[0]][pos[1]/2-1][pos[2]].v); f4_volt[0][pos[0]][pos[1]][pos[2]].v = m_InnerEngine->f4_volt[0][pos[0]][pos[1]/2][pos[2]].v + half.v * m_InnerEngine->f4_volt[0][pos[0]][pos[1]/2][pos[2]].v - half.v * m_InnerEngine->f4_volt[0][pos[0]][pos[1]/2-1][pos[2]].v;
f4_volt[2][pos[0]][pos[1]][pos[2]].v = m_InnerEngine->f4_volt[2][pos[0]][pos[1]/2][pos[2]].v + half.v * m_InnerEngine->f4_volt[2][pos[0]][pos[1]/2][pos[2]].v - half.v * m_InnerEngine->f4_volt[2][pos[0]][pos[1]/2-1][pos[2]].v;
}
} }
} }
@ -183,32 +187,31 @@ void Engine_CylinderMultiGrid::InterpolCurrChild2Base(unsigned int rzPlane)
{ {
//interpolate voltages from child engine to the base engine... //interpolate voltages from child engine to the base engine...
unsigned int pos[3]; unsigned int pos[3];
unsigned int pos1_rz1, pos1_rz2; int pos1_rz1, pos1_rz2;
unsigned int pos1_a1, pos1_a2; int pos1_a1, pos1_a2;
pos[0] = rzPlane; pos[0] = rzPlane;
bool isOdd, isEven; bool isOdd, isEven;
f4vector quarter, one_fourth, three_fourth; f4vector one_fourth, three_fourth;
for (int n=0;n<4;++n) for (int n=0;n<4;++n)
{ {
quarter.f[n]=0.25;
one_fourth.f[n] = 1.0/4.0; one_fourth.f[n] = 1.0/4.0;
three_fourth.f[n] = 3.0/4.0; three_fourth.f[n] = 3.0/4.0;
} }
for (pos[1]=0; pos[1]<numLines[1]; ++pos[1]) for (pos[1]=0; pos[1]<numLines[1] - !Op_CMG->CC_closedAlpha; ++pos[1])
{ {
isOdd = (pos[1]%2); isOdd = (pos[1]%2);
isEven = !isOdd * (pos[1]>0); isEven = !isOdd; //* (pos[1]>0);
pos1_a1 = pos[1]/2; pos1_a1 = pos[1]/2;
pos1_a2 = pos[1]/2 + isOdd; pos1_a2 = pos[1]/2 + isOdd;
pos1_a1 += pos[1]==1;
pos1_a2 -= pos[1]==(numLines[1]-2);
pos1_rz1 = pos[1]/2; pos1_rz1 = pos[1]/2;
pos1_rz2 = pos[1]/2 + isOdd - isEven; pos1_rz2 = pos[1]/2 + isOdd - isEven;
pos1_rz2 += pos[1]==(numLines[1]-1);
pos1_rz2 -= pos[1]==(numLines[1]-2); if ((pos1_rz2<0) && (Op_CMG->CC_closedAlpha))
pos1_rz2 += m_InnerEngine->numLines[1]-1;
else if (pos1_rz2<0)
pos1_rz2 = 0;
for (pos[2]=0; pos[2]<numVectors; ++pos[2]) for (pos[2]=0; pos[2]<numVectors; ++pos[2])
{ {
@ -221,17 +224,26 @@ void Engine_CylinderMultiGrid::InterpolCurrChild2Base(unsigned int rzPlane)
f4_curr[2][pos[0]][pos[1]][pos[2]].v += one_fourth.v * m_InnerEngine->f4_curr[2][pos[0]][pos1_rz2][pos[2]].v; f4_curr[2][pos[0]][pos[1]][pos[2]].v += one_fourth.v * m_InnerEngine->f4_curr[2][pos[0]][pos1_rz2][pos[2]].v;
//alpha - direction //alpha - direction
f4_curr[1][pos[0]][pos[1]][pos[2]].v = quarter.v * (m_InnerEngine->f4_curr[1][pos[0]][pos1_a1][pos[2]].v + m_InnerEngine->f4_curr[1][pos[0]][pos1_a2][pos[2]].v); f4_curr[1][pos[0]][pos[1]][pos[2]].v = one_fourth.v * (m_InnerEngine->f4_curr[1][pos[0]][pos1_a1][pos[2]].v + m_InnerEngine->f4_curr[1][pos[0]][pos1_a2][pos[2]].v);
} }
} }
//alpha - interpolation correction...
if (!Op_CMG->CC_closedAlpha)
{
// boundary interpolation correction...
pos[1]=1; pos[1]=1;
for (pos[2]=0; pos[2]<numVectors; ++pos[2]) for (pos[2]=0; pos[2]<numVectors; ++pos[2])
f4_curr[1][pos[0]][pos[1]][pos[2]].v += quarter.v * (m_InnerEngine->f4_curr[1][pos[0]][1][pos[2]].v - m_InnerEngine->f4_curr[1][pos[0]][2][pos[2]].v); f4_curr[1][pos[0]][pos[1]][pos[2]].v = three_fourth.v * m_InnerEngine->f4_curr[1][pos[0]][1][pos[2]].v - one_fourth.v * m_InnerEngine->f4_curr[1][pos[0]][2][pos[2]].v;
pos[1]=numLines[1]-2; pos[1]=numLines[1]-2;
for (pos[2]=0; pos[2]<numVectors; ++pos[2]) for (pos[2]=0; pos[2]<numVectors; ++pos[2])
f4_curr[1][pos[0]][pos[1]][pos[2]].v += quarter.v * (m_InnerEngine->f4_curr[1][pos[0]][pos[1]/2][pos[2]].v - m_InnerEngine->f4_curr[1][pos[0]][pos[1]/2-1][pos[2]].v); {
f4_curr[1][pos[0]][pos[1]][pos[2]].v = three_fourth.v * m_InnerEngine->f4_curr[1][pos[0]][pos[1]/2][pos[2]].v - one_fourth.v * m_InnerEngine->f4_curr[1][pos[0]][pos[1]/2-1][pos[2]].v;
f4_curr[0][pos[0]][pos[1]][pos[2]].v = m_InnerEngine->f4_curr[0][pos[0]][pos[1]/2][pos[2]].v + one_fourth.v * m_InnerEngine->f4_curr[0][pos[0]][pos[1]/2][pos[2]].v - one_fourth.v * m_InnerEngine->f4_curr[0][pos[0]][pos[1]/2-1][pos[2]].v;
f4_curr[2][pos[0]][pos[1]][pos[2]].v = m_InnerEngine->f4_curr[2][pos[0]][pos[1]/2][pos[2]].v + one_fourth.v * m_InnerEngine->f4_curr[2][pos[0]][pos[1]/2][pos[2]].v - one_fourth.v * m_InnerEngine->f4_curr[2][pos[0]][pos[1]/2-1][pos[2]].v;
}
}
} }
/****************************************************************************************/ /****************************************************************************************/