bonjour a vous,
j'ai touché pour la premiere fois au langage C il ya 7 jours environ, pour un projet numerique dans le cadre de mes études. J'ai fais ce qu'il y avait a faire: ok. J'aurai aimé aller un tout petit peu plus loin, et c'est la que la galere commence. Il s'agit d'un probleme de detente avec l'equation de bürgers. J'ai utilisé le schéma numérique de Law-Wendroff et la solution presente des oscillations, que je voudrais corriger avec un limiteur.
Avant le limiteur, tout marchait bien. Apres, la compilation se fait bien, mais quand je lance mon executable:
(0) handle exception: exception : STATUS_ACCESS VIOLATION
[main]scaalire 1253 (0) handle_exception: Dumping stack trace to scalaire.exe.core
voici la partie concernant le limiteur:
#include <math.h>
#include <stdio.h>
#define MAX(a,b) ((a) > (b) ? (a) : (b))
/* On rappelle les variables globales utiles */
extern double cfl;
extern double * a;
extern long int imax;
extern double * rho;
extern double * fphy;
extern double * fnum;
extern double aroe;
extern double rhom;
extern double um;
extern double eps;
extern double * delta;
extern double delta1;
extern double delta2;
void flux_numerique(void)
{
long int i;
/* Schema decentre p19
for (i = 0 ; i <= imax-1 ; i++)
{
aroe =(a[i]+a[i+1])/2;
eps=MAX(aroe-a[i],MAX(0,a[i+1]-aroe));
if (fabs(aroe)>eps)
{
fnum[i] = 0.5*(fphy[i] + fphy[i+1]) - 0.5*(fabs(aroe))*(rho[i+1]-rho[i]);
}
else {
fnum[i] = 0.5*(fphy[i] + fphy[i+1]) - 0.5*0.5*((fabs(aroe)*fabs(aroe))/eps+eps)*(rho[i+1]-rho[i]);
}
}*/
/*Schema de Lax-Wendroff p24*/
for (i = 0 ; i <= imax-1 ; i++)
{
aroe =(a[i]+a[i+1])/2;
delta1=rho[i]-rho[i-1];
delta2=rho[i+1]-rho[i];
if (delta1+delta2==0)
{ delta[i]=0; }
else
{delta[i]=(delta1*delta2*delta2+delta2*delta1*delta1)/(delta1*delta1+delta2*delta2)
;}
fnum[i] = 0.5*(fphy[i] + fphy[i+1]) - 0.5*cfl*fabs(aroe)*((rho[i+1]-0.5*delta[i+1])-(rho[i]+0.5*delta[i]));
}
}
toute aide sera la bienvenue!
eric