[英]Why does the following code run out of memory?
以下代码描述了2个谐波振荡器。 它们最初是不耦合且独立的,仅关注其中之一,即机械振荡器。 其他振荡器的变量已声明并强制为0。我首先进行300,000次迭代,然后对80种不同频率的wdm(机械驱动w)进行此操作。
//find frequency response
int index_A;
double wdm_1;
wdm_1=wm-2*3.142*2e5;
double wdm_2;
wdm_2=wm+2*3.142*2e5;
double wdm_prec=2*3.142*5e3;
index_A=(wdm_2-wdm_1)/wdm_prec;
printf("%d \n", index_A);
奇怪的是,如果我分别以40个频率的2个部分运行代码并将文件附加在一起,那么效果很好。
另外,当我将v0的大小减小到3时,代码可以正常工作 。 但是,稍后我将需要其他变量。
int j=0;
for (j=0; j<= index_A ; j++){
wdm=wdm_1+j*wdm_prec;
printf("%d \n",j);
v0[0] = 0;
v0[1] = 0;
v0[2] = 0;
v0[3] = 0;
v0[4] = 0;
v0[5] = 0;
v0[6]= wdm;
for (i=0; i< n ; i++){
if (cabs(xa)>=1){
printf("Breaking Loop \n");
break;
}
v1 = rk4vec_ameya_complex_1 ( tau, 7, v0, dtau, rk4vec_f_ameya_complex_1 );
memcpy(v0, v1, 4 * sizeof ( double complex ) );
tau=tau+dtau;
}
fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2]) );
}
printf("Completed");
fclose(f1);
在时间迭代结束时,我将频率wdm的值和位移的最后一个值x = v1 [2]保存在文件中,然后继续进行另一个频率的时间迭代。 因此,我的文件包含频率响应。
fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2]) );
我使用了来自people.sc.fsu.edu/~jburkardt/c_src/rk4/rk4.html的runge kutta(rk4.c),并使用以下方法将其修改为复杂的数据类型
#include <complex.h>
以下是runge-kutta-4必须解决的功能:
/******************************************************************************/
double complex *rk4vec_f_ameya_complex_1 ( double t, int n, double complex u[] )
/******************************************************************************/
{
double complex drive_m;
double complex drive_c;
double x;
double xrf0_1;
double complex *uprime;
uprime = ( double * ) malloc ( 7 * sizeof ( double complex ) );
//Check if memory unavailable
if(uprime==NULL){
printf("No memory available \n");
return 0;
}
///////////////////Second Order////////////////////////
xrf0_1=xrf0*(1-exp(-0.2*t));
drive_m=(xrf0*cexp(I*((u[6]-wm)/gammac)*t)/(2*wm*gammac));
uprime[2]=u[3];
uprime[3]=(wm/gammac)*(drive_m-u[3]*(2*I+2*gammam/wm)-u[2]*(2*I*gammam/gammac));
return uprime;
free(uprime);
}
如果我使用malloc()导致内存不足,请提出任何解决方案。
一个明显的问题-你免费uprime
你从返回后rk4vec_f_ameya_complex_1
,我希望你能得到一个无法访问的代码警告。 另外,因为uprime
总是相同的大小,所以为什么要完全使用malloc
? 如果仅将其设置为大小为7的数组,则malloc不会有问题,并且代码可能会运行得更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.