Commit df8dd61a by COULAUD Olivier

### Taylor : Correction du P2M, amélioration du M2L, Bug dans la formule pour calculer PSI

parent 86ca0e6c
 ... @@ -301,7 +301,7 @@ public: ... @@ -301,7 +301,7 @@ public: * * * Formula : * Formula : * \f[ * \f[ * M_{k} = \sum_{j=0}^{nb_{particule}}{ q_j * \frac{|k|!}{k! k!} (x_j-x_c)^{k}} * M_{k} = \sum_{j=0}^{nb_{particule}}{ q_j * \frac{|k|!}{k! k!} (x_c-x_j)^{k}} * \f] * \f] * where \f$x_c\f$ is the centre of the cell and \f$x_j\f$ the \f$j^{th}\f$ particles and \f$q_j\f$ its charge. * where \f$x_c\f$ is the centre of the cell and \f$x_j\f$ the \f$j^{th}\f$ particles and \f$q_j\f$ its charge. */ */ ... @@ -332,9 +332,9 @@ public: ... @@ -332,9 +332,9 @@ public: // // for(int idPart=0 ; idPartgetMultipole(); const FReal * multipole = distantNeighbors[idxNeigh]->getMultipole(); FReal psi, tmp = 0.0 ; //Iterating over multipole array : k //Iterating over multipole array : k for(int j = 0 ; j < SizeVector ; j++){ //corresponding powers am,bm,cm // Loc(al,bl,cl) = sum_ Psi* M[am,bm,cm] * N(al,bl,cl)/(al,bl,cl)! FReal psi = computeDerivative(al+am,bl+bm,cl+cm,curDistCenter,locCenter,yetComputed); //psi is the derivative of 1/R. for(int j = 0 ; j < SizeVector ; ++j){ //corresponding powers am,bm,cm psi *= multipole[j]*coeffN; //Psi = M[am,bm,cm] * N(al,bl,cl)/(al,bl,cl)! //psi is the derivative of 1/R,al+am,bl+bm,cl+cm. iterLocal[i]+=psi; psi = computeDerivative(al+am,bl+bm,cl+cm,curDistCenter,locCenter,yetComputed); count++; tmp += psi*multipole[j]; ++count; //printf("count : %d, al+am = %d, bl+bm=%d, cl+cm=%d\n",count,al+am,bl+bm,cl+cm); //printf("count : %d, al+am = %d, bl+bm=%d, cl+cm=%d\n",count,al+am,bl+bm,cl+cm); //updating a,b,c //updating a,b,c incPowers(&am,&bm,&cm); incPowers(&am,&bm,&cm); } } am=0; iterLocal[i] = tmp*coeffL ; bm=0; cm=0; incPowers(&al,&bl,&cl); incPowers(&al,&bl,&cl); } } // For Debugging .......................................................... // For Debugging .......................................................... ... @@ -637,10 +638,6 @@ public: ... @@ -637,10 +638,6 @@ public: FReal dz = posZ[i] - locCenter.getZ(); FReal dz = posZ[i] - locCenter.getZ(); printf("dx = %f, dy = %f, dz = %f\n",dx,dy,dz); printf("dx = %f, dy = %f, dz = %f\n",dx,dy,dz); int a=0,b=0,c=0; int a=0,b=0,c=0; forceX[i] = 0.0 ; forceY[i] = 0.0 ; forceZ[i] = 0.0 ; // // // Precompute an arrays of Array[i] = dx^(i-1) // Precompute an arrays of Array[i] = dx^(i-1) arrayDX[0] = 0.0 ; arrayDX[0] = 0.0 ; ... @@ -655,8 +652,9 @@ public: ... @@ -655,8 +652,9 @@ public: arrayDY[d] = dy * arrayDY[d-1] ; arrayDY[d] = dy * arrayDY[d-1] ; arrayDZ[d] = dz * arrayDZ[d-1] ; arrayDZ[d] = dz * arrayDZ[d-1] ; } } // //Iteration over Local array //Iteration over Local array // const FReal * iterLocal = local->getLocal(); const FReal * iterLocal = local->getLocal(); FReal partPhyValue = phyValues[i]; FReal partPhyValue = phyValues[i]; // // ... ...
 ... @@ -89,7 +89,8 @@ int main(int argc,char* argv[]){ ... @@ -89,7 +89,8 @@ int main(int argc,char* argv[]){ FReal dz = part1Pos.getZ() - part2Pos.getZ(); FReal dz = part1Pos.getZ() - part2Pos.getZ(); // // FReal potTheo = physVal2*physVal1*FMath::Sqrt(1.0 / (dx*dx + dy*dy + dz*dz)); FReal potTheo = physVal2*physVal1*FMath::Sqrt(1.0 / (dx*dx + dy*dy + dz*dz)); printf("Exact potential : %f Computed potential : %f Error: %f \n",potTheo, potential,potTheo- potential); potential *=0.5 ; printf("Exact potential : %f Computed potential : %f Error: %f \n",potTheo, potential,std::abs(potTheo- potential)); } } ... ...
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment