These is the code with the changes I made(basically in the malloc definition)
Code:
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
/* ----- Data for Grid ----- */
#define xmax 100
#define ymax 100
#define Nmax 30
#define Mmax 30
#define Length 0.8 /*In mts*/
#define Height 0.05 /*In mts*/
#define CFL 0.1
#define k 1.380650*pow(10.0,-23)
#define eo 8.854*pow(10.0,-12)
#define e 1.602*pow(10.0,-19)
#define me 9.10938215*pow(10.0,-31)
#define Pi 3.14159265358979
#define Tei 8000.0
/* --- Velocity Vector for Electrons --- */
void Vel(double* Vx, double* Vy, double Vtermax, double DVx, double DVy)
{
int i,j;
for (j=1;j<=2*Nmax;j++){
Vx[j]=DVx*(j-1)-Vtermax;
Vx[0]=0.0;
Vx[2*Nmax+1]=0.0;
}
for (j=1;j<=2*Mmax;j++){
Vy[j]=DVy*(j-1)-Vtermax;
Vy[0]=0.0;
Vy[2*Mmax+1]=0.0;
}
}
/* --- Initial Condition for the Distribution Function --- */
void Init(double**** Fd, double**** gxFd, double****gyFd, double**** gvxFd, double**** gvyFd, double* Vx, double* Vy)
{
int i, j, p, q;
for(i=0; i<=xmax+1; i++){
for(j=0; j<=ymax+1; j++){
for(p=0; p<=2*Nmax+1; p++){
for(q=0; q<=2*Mmax+1; q++){
Fd[i][j][p][q]= (1.0/sqrt(2.0*Pi))*exp(-(me*((Vx[p]*Vx[p])+(Vy[q]*Vy[q]))/2.0));
gxFd[i][j][p][q]= 0.0;
gyFd[i][j][p][q]= 0.0;
gvxFd[i][j][p][q]= -(Vx[p]*(1.0/sqrt(2.0*Pi))*exp(-((Vx[p]*Vx[p])+(Vy[q]*Vy[q]))/2.0));
gvyFd[i][j][p][q]= -(Vy[q]*(1.0/sqrt(2.0*Pi))*exp(-((Vx[p]*Vx[p])+(Vy[q]*Vy[q]))/2.0));
}
}
}
}
/*Boundary conditions*/
for(i=0;i<=xmax+1;i++){
for(j=0;j<=ymax+1;j++){
for(q=0;q<=2*Mmax+1;q++){
Fd[i][j][0][q]= 0.0;
gxFd[i][j][0][q]= 0.0;
gyFd[i][j][0][q]= 0.0;
gvxFd[i][j][0][q]= 0.0;
gvyFd[i][j][0][q]= 0.0;
Fd[i][j][2*Nmax+1][q]= 0.0;
gxFd[i][j][2*Nmax+1][q]= 0.0;
gyFd[i][j][2*Nmax+1][q]= 0.0;
gvxFd[i][j][2*Nmax+1][q]= 0.0;
gvyFd[i][j][2*Nmax+1][q]= 0.0;
}
}
}
/*Boundary Conditions*/
for(i=0;i<=xmax+1;i++){
for(j=0;j<=ymax+1;j++){
for(p=0;p<=2*Nmax+1;p++){
Fd[i][j][p][0]= 0.0;
gxFd[i][j][p][0]= 0.0;
gyFd[i][j][p][0]= 0.0;
gvxFd[i][j][p][0]= 0.0;
gvyFd[i][j][p][0]= 0.0;
Fd[i][j][p][2*Mmax+1]= 0.0;
gxFd[i][j][p][2*Mmax+1]= 0.0;
gyFd[i][j][p][2*Mmax+1]= 0.0;
gvxFd[i][j][p][2*Mmax+1]= 0.0;
gvyFd[i][j][p][2*Mmax+1]= 0.0;
}
}
}
/*Boundary Condition*/
for(i=0;i<=xmax+1;i++){ //Aqui puede haber un error
for(p=0;p<=2*Nmax+1;p++){
for(q=0;q<=2*Mmax+1;q++){
Fd[i][0][p][q]= Fd[i][1][p][2*Mmax+1-q];
gxFd[i][0][p][q]= gxFd[i][1][p][2*Mmax+1-q];
gyFd[i][0][p][q]= gyFd[i][1][p][2*Mmax+1-q];
gvxFd[i][0][p][q]= gvxFd[i][1][p][2*Mmax+1-q];
gvyFd[i][0][p][q]= gvyFd[i][1][p][2*Mmax+1-q];
Fd[i][ymax+1][p][q]= Fd[i][ymax][p][2*Mmax+1-q];
gxFd[i][ymax+1][p][q]= gxFd[i][ymax][p][2*Mmax+1-q];
gyFd[i][ymax+1][p][q]= gyFd[i][ymax][p][2*Mmax+1-q];
gvxFd[i][ymax+1][p][q]= gvxFd[i][ymax][p][2*Mmax+1-q];
gvyFd[i][ymax+1][p][q]= gvyFd[i][ymax][p][2*Mmax+1-q];
}
}
}
}
int main (void)
{
int i,j,p,q;
/* ----- Data Velocity ----- */
double Vx[2*Nmax+2], Vy[2*Mmax+2];
double Vter=sqrt(2.0*k*Tei/(me));
double Vtermax=4.0*Vter;
double DVx=2.0*Vtermax/(2*Nmax-1);
double DVy=2.0*Vtermax/(2*Mmax-1);
int xmall, ymall, Nmall, Mmall;
xmall=xmax+2;
ymall=ymax+2;
Nmall=(2*Nmax)+2;
Mmall=(2*Mmax)+2;
/* --- Malloc definition for Distribution Function and Variables higher than 3D ---*/
double ****Fd;
double ****gxFd;
double ****gyFd;
double ****gvxFd;
double ****gvyFd;
Fd = (double****)malloc(sizeof(double***)*(xmax+2));
gxFd = (double****)malloc(sizeof(double***)*(xmax+2));
gyFd = (double****)malloc(sizeof(double***)*(xmax+2));
gvxFd = (double****)malloc(sizeof(double***)*(xmax+2));
gvyFd = (double****)malloc(sizeof(double***)*(xmax+2));
for(i=0;i<xmax+2;i++){
Fd[i] = (double***)malloc(sizeof(double**)*(ymax+2));
gxFd[i] = (double***)malloc(sizeof(double**)*(ymax+2));
gyFd[i] = (double***)malloc(sizeof(double**)*(ymax+2));
gvxFd[i] = (double***)malloc(sizeof(double**)*(ymax+2));
gvyFd[i] = (double***)malloc(sizeof(double**)*(ymax+2));
for(j=0;j<ymax+2;j++){
Fd[i][j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
gxFd[i][j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
gyFd[i][j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
gvxFd[i][j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
gvyFd[i][j] = (double**)malloc(sizeof(double*)*(2*Nmax+2));
for(p=0;p<2*Nmax+2;p++){
Fd[i][j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
gxFd[i][j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
gyFd[i][j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
gvxFd[i][j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
gvyFd[i][j][p] = (double*)malloc(sizeof(double)*(2*Mmax+2));
for(q=0;q<2*Mmax+2;q++){
Fd[i][j][p][q] = 0.0;
gxFd[i][j][p][q] = 0.0;
gyFd[i][j][p][q] = 0.0;
gvxFd[i][j][p][q] = 0.0;
gvyFd[i][j][p][q] = 0.0;
}
}
}
}
printf("malloc definition\n");
Vel(Vx, Vy, Vtermax, DVx, DVy);
Init(Fd, gxFd, gyFd, gvxFd, gvyFd, Vx, Vy);
printf("Lleno las matrices\n");
system("PAUSE");
return 0;
}
Its working for the current values of xmax, ymax, Nmax and Mmax. Now, I increase the value of one of those, say xmax=150 (or any other) I get segmentation fault.
I will give a read to the FAQ, thank you