Hi all.
First of all, I speak french so you might see some french comments in my code, just don't pay attention to it.
I'm having some trouble with a program of mine I'm trying to create.
I have an array of struct having each some nested struct inside. Code of the structs definition (I really don't think there is any problem in this code yet):
Code:
//ncorps_definitions.h
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
#include <time.h>
#define square(a) ((a)*(a))
//#define min(a, b) ((a) < (b) ? (a) : (b))
//#define max(a, b) ((a) < (b) ? (b) : (a))
#define N 100 //nombres de particule dans la simulation
#define CONDINIT 1 //chois des conditions initial parmis les différents presets (1: sphere uniforme avec acc=0 et vit=0, 2: coquille etc..
#define TI 0 //temps initial
#define TF 100 //temps final
#define DELTA 10 //coefficient du pas de temps
#define EPSILON 0.06 //longueur d'adoucissement pour 10 000 particules (à calculer dans les conditions initiales éventuellement)
#define NOUT 1 //fréquence des ouputs
#define SIGMA 0.2
typedef struct
{
double x;
double y;
double z;
}Dimension;
typedef struct //décrit une particule
{
double m; //masse de la particule, pourra être négative ou positive
Dimension a; //accélération des particules
Dimension v; //vitesse des particules au début du pas de temps
Dimension vm; //vitesse des particules au milieu du pas de temps
Dimension r; //position des particules au début du pas de temps
Dimension rm; //position des particules au milieu du pas de temps
}Point;
typedef struct
{
Point aP[N];
}allPoint;
I have a main which declare this struct (it is called "sys") and then pass a pointer to this struct to various function:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "ncorps_fonctions.h"
int main(void)
{
//déclaration des variables ATENTION: remplacer potentiellement les valeurs par quelque chose de mieu et remplacer p-e les float par des double
allPoint sys; //un array de structure contenant tout les points du système ainsi que toute leur propriété
FILE * pOutput; // pointeur sur le fichier d'output
double t; //temps
double tOld; //temps précédent
long int istep; //nombre de cycle
double dt = 10; //pas de temps
long int i = 0;
//chargement des conditions initiales des particules
conditionsInitiales(&sys);
//ouverture du fichier d'output
pOutput = fopen("ncorps.output","w");
//évolution du système
t = TI;
istep = 0;
do {
//1: Calcul les accélérations
accelerationsCalcul(&(sys.aP->r), &(sys.aP->a), &(sys.aP->m));
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//PROBLEME INSIDE THIS FUNCTION HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.
.
.
My program crash when it tries to do the function. So here are details of the function.
header of the functions:
Code:
//ncorps_fonctions.h
#include "ncorps_definitions.h"
/*****************************************************************************
Description: cette fonction initialise les particules (via leur structure de type Point)
*****************************************************************************/
void conditionsInitiales(allPoint *pt);
/*****************************************************************************
Description: cette fonction calcul la nouvelle accélération de chaque particule selon leur position
*****************************************************************************/
void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N]);
/*****************************************************************************
Description: cette fonction calcul la valeur du nouveau pas de temps et la retourne
*****************************************************************************/
double pasDeTemps(Dimension (*v)[N], Dimension (*a)[N]);
The functions themself (You don't need to understand it all!!! see below where it crash exactly):
Code:
//ncorps_functions.c
#include "ncorps_fonctions.h"
/*****************************************************************************
Description: cette fonction initialise les particules (via leur structure de type Point)
*****************************************************************************/
void conditionsInitiales(allPoint* pt)
{
//variables
long int i = 0;
switch(CONDINIT)
{
case 1: //sphere uniforme avec acc=0, vit=0 et masses à moitier négative
{
srand ( time(NULL) ); //initialisation de rand
//ajouter éventuellement un paramètre scale dans cette fonction (le scale sera calculer dans le main au début et sera fonction de ce qui est dit dans les notes de cours)
for (i = 0; i < N; i++)
{
//accélérations
pt->aP[i].a.x = 0;
pt->aP[i].a.y = 0;
pt->aP[i].a.z = 0;
//vitesses
pt->aP[i].v.x = rand() / (float) RAND_MAX * 2 - 1;
pt->aP[i].v.y = rand() / (float) RAND_MAX * 2 - 1;
pt->aP[i].v.z = rand() / (float) RAND_MAX * 2 - 1;
//positions
pt->aP[i].r.x = rand() / (float) RAND_MAX * 2 - 1;
pt->aP[i].r.y = rand() / (float) RAND_MAX * 2 - 1;
pt->aP[i].r.z = rand() / (float) RAND_MAX * 2 - 1;
//masses
pt->aP[i].m = rand() / (float) RAND_MAX * 2 - 1;
}
}
break;
case 2: //coquille avec acc=0 et vit=0.. etc..
{
}
break;
}
}
/*****************************************************************************
Description: cette fonction calcul la nouvelle accélération de chaque particule selon leur position
*****************************************************************************/
void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N])
{
//déclaration des variables
long int i, j = 0;
double xi,yi,zi,xj,yj,zj,denom,cmi,cmj,dx,dy,dz,r2;
xi=yi=zi=xj=yj=zj=denom=cmi=cmj=dx=dy=dz=r2 = 0;
//initialise les accélérations à 0
for (i = 0; i < N; i++)
{
a[i]->x = 0;
a[i]->y = 0;
a[i]->z = 0;
}
//calcul la force entre toute les paires de particules
for (i =0; i < (N - 1); i++)
{
xi = r[i]->x;
yi = r[i]->y;
zi = r[i]->z;
for (j = (i + 1); j < N; j++)
{
xj = r[j]->x;
yj = r[j]->y;
zj = r[j]->z;
dx = xi - xj;
dy = yi - yj;
dz = zi - zj;
r2 = square(dx) + square(dy) + square(dz);
denom = pow((r2 + square(EPSILON)),(15.0 / 10.0));
cmj = *m[j] / denom;
cmi = *m[i] / denom;
a[i]->x = a[i]->x - cmj*dx;
a[i]->y = a[i]->y - cmj*dy;
a[i]->z = a[i]->z - cmj*dz;
a[j]->x = a[j]->x - cmi*dx;
a[j]->y = a[j]->y - cmi*dy;
a[j]->z = a[j]->z - cmi*dz;
}
}
}
The program crash exactly at this line into the function "accelerationsCalcul":
but my program seems to work fine when it calls the first function "conditionsInitiales"
so this tells me there is something wrong when I declared the function or when I tried to pass the struct as a pointer to the function.
so to kind of make it short, I think there is a prolem somewhere in those lines:
function header
Code:
void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N]);
or actual function code
Code:
void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N])
or function into main.c
Code:
accelerationsCalcul(&(sys.aP->r), &(sys.aP->a), &(sys.aP->m));
What did I do wrong in this process? I know how to usualy pass Struct as a function parameter, but I'm totaly lost when it comes to array of structs and even more when i have to pass only part of an array of struct ()
thank you very much (going to bed now o.O, I will answer anything tomorrow..)