C-MEX codes face problem "MATLAB has attempted to use more stack space than is available"
1 view (last 30 days)
Show older comments
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 Comment
Titus Edelhofer
on 1 Sep 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
Accepted Answer
James Tursa
on 1 Sep 2015
The memory for plhs[0], plhs[1], and plhs[2] should be coming off of the heap, not the stack. So those variables should not be causing any stack problems. What else is in your code that you are not showing us (e.g., large local variables)?
7 Comments
James Tursa
on 23 Sep 2015
Sparse matrices are stored in a completely different manner than full matrices. You would have to completely re-write nearly every line of your code. Plus, inserting a value at an arbitrary location is not trivial. If you really want to explore this option let me know and I can work up an example, but be forewarned it will be a LOT of work for you.
More Answers (0)
See Also
Categories
Find more on Write C Functions Callable from MATLAB (MEX Files) in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!