C-MEX codes face problem "MATLAB has attempted to use more stack space than is available"
Mostrar comentarios más antiguos
I used mex to convert one stiff.cpp (for example) file to stiff.mexw64 file. When I want to use this mex function stiff() in matlab, it says: Severe: MATLAB has attempted to use more stack space than is available. If a mex file was in use check for large local variables or infinite recursion.Unexpected MATLAB exception...
the code
#include <math.h>
#include <mex.h>
void stiff(double *X,double *I,double *J,double *K)
{
int c=20;
double La=0.06;
double EA[30]={2e7,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,2e7};
double EI[30]={80,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,1.35,80};
double Ka[2520][2520];
double Kb[2520][2520];
double kka[84][84];
double kkb[84][84];
double ka[84][84];
double kb[84][84];
double XX[84];
int i,j,k,m,n,q,u0,ue,u1,u2,u3,u4,u5,u6,u7,u8;
double ax,ay,bx,by,ex,ey,fx,fy,a,b,e,f,dx,dy,d,A,B,C,D,E,F,AA,BB,CC,DD,EE,FF;
double k1[8][8],eye[2][2];
eye[0][0]=1;
eye[0][1]=0;
eye[1][0]=0;
eye[1][1]=1;
double S1[8][8]={{12,0,0.54,0,-12,0,0.54,0},{0,12,0,0.54,0,-12,0,0.54},{0.54,0,0.0324,0,-0.54,0,0.0162,0},{0,0.54,0,0.0324,0,-0.54,0,0.0162}, {-12,0,-0.54,0,12,0,-0.54,0},{0,-12,0,-0.54,0,12,0,-0.54},{0.54,0,0.0162,0,-0.54,0,0.0324,0},{0,0.54,0,0.0162,0,-0.54,0,0.0324}};
double S2[8][8]={{12,0,0.36,0,-12,0,0.36,0},{0,12,0,0.36,0,-12,0,0.36},{0.36,0,0.0144,0,-0.36,0,0.0072,0}, {0,0.36,0,0.0144,0,-0.36,0,0.0072}, {-12,0,-0.36,0,12,0,-0.36,0},{0,-12,0,-0.36,0,12,0,-0.36},{0.36,0,0.0072,0,-0.36,0,0.0144,0},{0,0.36,0,0.0072,0,-0.36,0,0.0144}};
for(j=0;j<30;j++)
{
u0=0+j*4*(c+1);
ue=4*(c+1)-1+j*4*(c+1);
m=0;
for(i=u0;i<ue;i++)
{
XX[m]=X[i];
m++;
}
for(k=0;k<20;k++)
{
for(i=0;i<84;i++)
{
for(m=0;m<84;m++)
{
ka[i][m]=0;
kb[i][m]=0;
}
}
u1=0+k*4;
u2=1+k*4;
u3=2+k*4;
u4=3+k*4;
u5=4+k*4;
u6=5+k*4;
u7=6+k*4;
u8=7+k*4;
ax=La*XX[u3];
ay=La*XX[u4];
bx=La*XX[u7];
by=La*XX[u8];
ex=1.5*ax;
ey=1.5*ay;
fx=1.5*bx;
fy=1.5*by;
a=sqrt(ax*ax+ay*ay);
b=sqrt(bx*bx+by*by);
e=sqrt(ex*ex+ey*ey);
f=sqrt(fx*fx+fy*fy);
dx=XX[u5]-XX[u1];
dy=XX[u6]-XX[u2];
d=sqrt(dx*dx+dy*dy);
A=3/70/(La*La)*(a*a+b*b-14*La*La-6*ax*dx-6*bx*dx-6*ay*dy-6*by*dy+24*d*d);
B=1/280/La*(b*b-a*a+2*ax*bx+2*ay*by-14*La*La-24*ax*dx-24*ay*dy+36*d*d);
C=1/280/La*(a*a-b*b+2*ax*bx+2*ay*by-14*La*La-24*bx*dx-24*by*dy+36*d*d);
D=1/420*(12*a*a+b*b-3*ax*bx-3*ay*by-28*La*La+3*ax*dx-3*bx*dx+3*ay*dy-3*by*dy+18*d*d);
E=-1/840*(3*a*a+3*b*b-4*ax*bx-4*ay*by-14*La*La+6*ax*dx+6*bx*dx+6*ay*dy+6*by*dy);
F=1/420*(a*a+12*b*b-3*ax*bx-3*ay*by-28*La*La-3*ax*dx+3*bx*dx-3*ay*dy+3*by*dy+18*d*d);
AA=3/70/(1.5*La*1.5*La)*(a*a+b*b-14*(1.5*La*1.5*La)-6*ax*dx-6*bx*dx-6*ay*dy-6*by*dy+24*d*d);
BB=1/280/(1.5*La)*(b*b-a*a+2*ax*bx+2*ay*by-14*(1.5*La*1.5*La)-24*ax*dx-24*ay*dy+36*d*d);
CC=1/280/(1.5*La)*(a*a-b*b+2*ax*bx+2*ay*by-14*(1.5*La*1.5*La)-24*bx*dx-24*by*dy+36*d*d);
DD=1/420*(12*a*a+b*b-3*ax*bx-3*ay*by-28*(1.5*La*1.5*La)+3*ax*dx-3*bx*dx+3*ay*dy-3*by*dy+18*d*d);
EE=-1/840*(3*a*a+3*b*b-4*ax*bx-4*ay*by-14*(1.5*La*1.5*La)+6*ax*dx+6*bx*dx+6*ay*dy+6*by*dy);
FF=1/420*(a*a+12*b*b-3*ax*bx-3*ay*by-28*(1.5*La*1.5*La)-3*ax*dx+3*bx*dx-3*ay*dy+3*by*dy+18*d*d);
if(j==30)
{
k1[0][0]=AA*eye[0][0];
k1[0][1]=AA*eye[0][1];
k1[1][0]=AA*eye[1][0];
k1[1][1]=AA*eye[1][1];
k1[0][2]=BB*eye[0][0];
k1[0][3]=BB*eye[0][1];
k1[1][2]=BB*eye[1][0];
k1[1][3]=BB*eye[1][1];
k1[0][4]=-AA*eye[0][0];
k1[0][5]=-AA*eye[0][1];
k1[1][4]=-AA*eye[1][0];
k1[1][5]=-AA*eye[1][1];
k1[0][6]=CC*eye[0][0];
k1[0][7]=CC*eye[0][1];
k1[1][6]=CC*eye[1][0];
k1[1][7]=CC*eye[1][1];
k1[2][0]=BB*eye[0][0];
k1[2][1]=BB*eye[0][1];
k1[3][0]=BB*eye[1][0];
k1[3][1]=BB*eye[1][1];
k1[2][2]=DD*eye[0][0];
k1[2][3]=DD*eye[0][1];
k1[3][2]=DD*eye[1][0];
k1[3][3]=DD*eye[1][1];
k1[2][4]=-BB*eye[0][0];
k1[2][5]=-BB*eye[0][1];
k1[3][4]=-BB*eye[1][0];
k1[3][5]=-BB*eye[1][1];
k1[2][6]=EE*eye[0][0];
k1[2][7]=EE*eye[0][1];
k1[3][6]=EE*eye[1][0];
k1[3][7]=EE*eye[1][1];
k1[4][0]=-AA*eye[0][0];
k1[4][1]=-AA*eye[0][1];
k1[5][0]=-AA*eye[1][0];
k1[5][1]=-AA*eye[1][1];
k1[4][2]=-BB*eye[0][0];
k1[4][3]=-BB*eye[0][1];
k1[5][2]=-BB*eye[1][0];
k1[5][3]=-BB*eye[1][1];
k1[4][4]=AA*eye[0][0];
k1[4][5]=AA*eye[0][1];
k1[5][4]=AA*eye[1][0];
k1[5][5]=AA*eye[1][1];
k1[4][6]=-CC*eye[0][0];
k1[4][7]=-CC*eye[0][1];
k1[5][6]=-CC*eye[1][0];
k1[5][7]=-CC*eye[1][1];
k1[6][0]=CC*eye[0][0];
k1[6][1]=CC*eye[0][1];
k1[7][0]=CC*eye[1][0];
k1[7][1]=CC*eye[1][1];
k1[6][2]=EE*eye[0][0];
k1[6][3]=EE*eye[0][1];
k1[7][2]=EE*eye[1][0];
k1[7][3]=EE*eye[1][1];
k1[6][4]=-CC*eye[0][0];
k1[6][5]=-CC*eye[0][1];
k1[7][4]=-CC*eye[1][0];
k1[7][5]=-CC*eye[1][1];
k1[6][6]=FF*eye[0][0];
k1[6][7]=FF*eye[0][1];
k1[7][6]=FF*eye[1][0];
k1[7][7]=FF*eye[1][1];
n=0;
for(i=u1;i<u8;i++)
{
q=0;
for(m=u1;m<u8;m++)
{
ka[i][m]=EA[j]/(1.5*La)*k1[n][q];
kb[i][m]=EI[j]/(1.5*La*1.5*La*1.5*La)*S1[n][q];
q++;
}
n++;
}
}
else
{
k1[0][0]=A*eye[0][0];
k1[0][1]=A*eye[0][1];
k1[1][0]=A*eye[1][0];
k1[1][1]=A*eye[1][1];
k1[0][2]=B*eye[0][0];
k1[0][3]=B*eye[0][1];
k1[1][2]=B*eye[1][0];
k1[1][3]=B*eye[1][1];
k1[0][4]=-A*eye[0][0];
k1[0][5]=-A*eye[0][1];
k1[1][4]=-A*eye[1][0];
k1[1][5]=-A*eye[1][1];
k1[0][6]=C*eye[0][0];
k1[0][7]=C*eye[0][1];
k1[1][6]=C*eye[1][0];
k1[1][7]=C*eye[1][1];
k1[2][0]=B*eye[0][0];
k1[2][1]=B*eye[0][1];
k1[3][0]=B*eye[1][0];
k1[3][1]=B*eye[1][1];
k1[2][2]=D*eye[0][0];
k1[2][3]=D*eye[0][1];
k1[3][2]=D*eye[1][0];
k1[3][3]=D*eye[1][1];
k1[2][4]=-B*eye[0][0];
k1[2][5]=-B*eye[0][1];
k1[3][4]=-B*eye[1][0];
k1[3][5]=-B*eye[1][1];
k1[2][6]=E*eye[0][0];
k1[2][7]=E*eye[0][1];
k1[3][6]=E*eye[1][0];
k1[3][7]=E*eye[1][1];
k1[4][0]=-A*eye[0][0];
k1[4][1]=-A*eye[0][1];
k1[5][0]=-A*eye[1][0];
k1[5][1]=-A*eye[1][1];
k1[4][2]=-B*eye[0][0];
k1[4][3]=-B*eye[0][1];
k1[5][2]=-B*eye[1][0];
k1[5][3]=-B*eye[1][1];
k1[4][4]=A*eye[0][0];
k1[4][5]=A*eye[0][1];
k1[5][4]=A*eye[1][0];
k1[5][5]=A*eye[1][1];
k1[4][6]=-C*eye[0][0];
k1[4][7]=-C*eye[0][1];
k1[5][6]=-C*eye[1][0];
k1[5][7]=-C*eye[1][1];
k1[6][0]=C*eye[0][0];
k1[6][1]=C*eye[0][1];
k1[7][0]=C*eye[1][0];
k1[7][1]=C*eye[1][1];
k1[6][2]=E*eye[0][0];
k1[6][3]=E*eye[0][1];
k1[7][2]=E*eye[1][0];
k1[7][3]=E*eye[1][1];
k1[6][4]=-C*eye[0][0];
k1[6][5]=-C*eye[0][1];
k1[7][4]=-C*eye[1][0];
k1[7][5]=-C*eye[1][1];
k1[6][6]=F*eye[0][0];
k1[6][7]=F*eye[0][1];
k1[7][6]=F*eye[1][0];
k1[7][7]=F*eye[1][1];
n=0;
for(i=u1;i<u8;i++)
{
q=0;
for(m=u1;m<u8;m++)
{
ka[i][m]=EA[j]/La*k1[n][q];
kb[i][m]=EI[j]/(La*La*La)*S2[n][q];
q++;
}
n++;
}
}
if(k==1)
{
for(i=0;i<84;i++)
{
for(m=0;m<84;m++)
{
kka[i][m]=ka[i][m];
kkb[i][m]=kb[i][m];
}
}
}
else
{
for(i=0;i<84;i++)
{
for(m=0;m<84;m++)
{
kka[i][m]=ka[i][m]+kka[i][m];
kkb[i][m]=kb[i][m]+kkb[i][m];
}
}
}
}
n=0;
for(i=u0;i<ue;i++)
{
q=0;
for(m=u0;m<ue;m++)
{
Ka[m][i]=kka[q][n];
Kb[m][i]=kkb[q][n];
q++;
}
n++;
}
}
for(i=0;i<2520;i++)
{
for(j=0;j<2520;j++)
{
I[i*2520+j]=Ka[i][j]+Kb[i][j];
J[i*2520+j]=Ka[i][j]+Kb[i][j];
K[i*2520+j]=Ka[i][j]+Kb[i][j];
}
}
}
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *mX;
double *mI;
double *mJ;
double *mK;
plhs[0] = mxCreateDoubleMatrix(6350400,1, mxREAL);
plhs[1] = mxCreateDoubleMatrix(6350400,1, mxREAL);
plhs[2] = mxCreateDoubleMatrix(6350400,1, mxREAL);
mI= mxGetPr(plhs[0]);
mJ= mxGetPr(plhs[1]);
mK= mxGetPr(plhs[2]);
mX= mxGetPr(prhs[0]);
stiff(mX,mI,mJ,mK);
}
In the C++ code, the input is a one-dimensional array with size of 2520. And the outputs include three-one-dimensional array which each size is 6350400.Is this problem caused by the big size of input and output? or others? Could you please give me some advises? THX a lot!
I've update the code. Are Ka and Kb the large local variables?
1 comentario
Titus Edelhofer
el 1 de Sept. de 2015
Hi,
hmm, those variables are not large. We are talking of 50 MByte variables, that shouldn't be a problem ... What do you do inside stiff, is it recursive?
Titus
Respuesta aceptada
Más respuestas (0)
Categorías
Más información sobre Write C Functions Callable from MATLAB (MEX Files) en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!