I am trying to run a code that contains this function and I am getting the "*** stack smashing detected ***: terminated".
void Lapenta_Markidis( long double v[3], long double E[3], long double B[3], long double c2, long double upart[3] ){
long double upartk[3], vbar[3];
long double tmp[3], Fk[3], C1[3], C2[3] ;
long double dupartk[3];
long double gL = gamma_v(v, c2);
for(int i=0;i<3;i ){
upart[i] = v[i]*gL; // momentum at start of time step
upartk[i] = upart[i];
}
/* Start of the nonlinear cycle */
long double abserr = 1.0;
long double tol=1e-14;
int nkmax=10;
int nk = 0; //
do{
long double J11, J12, J13,J21, J22, J23, J31, J32, J33, Det;
long double iJ11, iJ12, iJ13,iJ21, iJ22, iJ23, iJ31, iJ32, iJ33;
long double gL_new;
nk = nk 1;
gL_new = gamma_u(upartk, c2);
for(int i=0;i<3;i ){
vbar[i] = (upart[i] upartk[i])/(gL_new gL);
}
crossP(vbar,B,tmp);
// Compute residual vector
for(int i=0;i<3;i ){
Fk[i] = upartk[i] - upart[i] - q*dt/mp * (E[i] tmp[i]);
}
// Compute auxiliary coefficients
for(int i=0;i<3;i ){
C1[i] = (gL_new gL - (upartk[i]*(upartk[i] upart[i])) / (gL_new*c2) )/ pow((gL gL_new),2) ;
C2[i] = -( upartk[i] / (gL_new*c2) )/ ((gL_new gL),2) ;
}
// Compute Jacobian
J11 = 1. - (q*dt/mp) * (C2[1] * (upartk[2] upart[2]) * B[3] - C2[1] * (upartk[3] upart[3]) * B[2]) ;
J12 = - (q*dt/mp)*(C1[2] * B[3] - C2[2] * (upartk[3] upart[3]) * B[2]) ;
J13 = - (q*dt/mp) * (C2[3] * (upartk[2] upart[2]) * B[3] - C1[3] * B[2]) ;
J21 = - q*dt/mp * (- C1[1] * B[3] C2[1] * (upartk[3] upart[3]) * B[1]) ;
J22 = 1. - q*dt/mp * (- C2[2] * (upartk[1] upart[1]) * B[3] C2[2] * (upartk[3] upart[3]) * B[1]) ;
J23 = - q*dt/mp * (- C2[3] * (upartk[1] upart[1]) * B[3] C1[3] * B[1]) ;
J31 = - q*dt/mp * (C1[1] * B[2] - C2[1] * (upartk[2] upart[2]) * B[1]) ;
J32 = - q*dt/mp * (C2[2] * (upartk[1] upart[1]) * B[2] - C1[2] * B[1]) ;
J33 = 1. - q*dt/mp * (C2[3] * (upartk[1] upart[1]) * B[2] - C2[3] * (upartk[2] upart[2]) * B[1]) ;
// Compute inverse Jacobian
Det = J11*J22*J33 J21*J32*J13 J31*J12*J23 - J11*J32*J23 - J31*J22*J13 - J21*J12*J33;
iJ11 = (J22*J33 - J23*J32) / Det ;
iJ12 = (J13*J32 - J12*J33) / Det ;
iJ13 = (J12*J23 - J13*J22) / Det ;
iJ21 = (J23*J31 - J21*J33) / Det ;
iJ22 = (J11*J33 - J13*J31) / Det ;
iJ23 = (J13*J21 - J11*J23) / Det ;
iJ31 = (J21*J32 - J22*J31) / Det ;
iJ32 = (J12*J31 - J11*J32) / Det ;
iJ33 = (J11*J22 - J12*J21) / Det ;
// Compute new upartk = upartk - J^(-1) * F(upartk)
dupartk[1] = - (iJ11 * Fk[1] iJ12 * Fk[2] iJ13 * Fk[3]);
dupartk[2] = - (iJ21 * Fk[1] iJ22 * Fk[2] iJ23 * Fk[3]);
dupartk[3] = - (iJ31 * Fk[1] iJ32 * Fk[2] iJ33 * Fk[3]);
// Check convergence
for(int i=0;i<3;i ){
upartk[i] = dupartk[i] ;
}
abserr = sqrt(dotP(dupartk, dupartk));
} while(abserr > tol && nk < nkmax); // End of while -> end of cycle
// Update velocity
for(int i=0;i<3;i ){
upart[i] = upartk[i];
}
}
I am trying to run a code that contains this function and I am getting the "*** stack smashing detected ***: terminated".
Any suggestions of what I am doing wrong? I am not that familiar with the C syntax, have I declared a variable, matrix in the wrong way?
CodePudding user response:
You mix 1-based indexing and 0-based indexing. But C arrays use 0-based indexing.
At several positions you use variable[3]
, where only variable[2]
is allowed:
dupartk[3] = - (iJ31 * Fk[1] iJ32 * Fk[2] iJ33 * Fk[3]);
// ^ ^
Move all those indices by one and those accesses there be fine:
dupartk[0] = - (iJ11 * Fk[0] iJ12 * Fk[1] iJ13 * Fk[2]);
dupartk[1] = - (iJ21 * Fk[0] iJ22 * Fk[1] iJ23 * Fk[2]);
dupartk[2] = - (iJ31 * Fk[0] iJ32 * Fk[1] iJ33 * Fk[2]);
But keep in mind that there are several other wrong indices, e.g. B[3]
and C[3]
. Check each index.
CodePudding user response:
The array indexes are from zero
not one
.
You write and read outside the bounds all of your arrays in your code.
You simply need to decrease all the indexes by 1
.