1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
// File : equationDifPartiel.h
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "tools.h"
#ifndef _EQUATIONS_TOOLS_H
#define _EQUATIONS_TOOLS_H
//#define N_MAX = 1000;
#ifdef __cplusplus
//#error This source file is not C++ but rather C. Please use a C-compiler
extern "C"{
#endif
/* Macros */
/* Types */
/* Structure */
/* Constantes */
const int N_MAX = 1000;
const float OMEGA = 20;
const float SIGMA = 1;
const float t_MAX = 1;
/* Fonctions */
void equation_chaleur();
//void equation_poisson();
//void equation_convdiff();
#ifdef __cplusplus
}
#endif
#endif /* _EQUATIONS_TOOLS_H */
/*
--------------------------------------------------------------------------------------------------------------------------------------------------
Autre fichier
---------------------------------------------------------------------------------------------------------------------------------------------------
*/
// File : equationDifPartiel.c
#include "equationsDiffPartiel.h"
void equation_chaleur()
/*
* On resolution Equation de la chaleur
*/
{
int N, ktmax, nb_points, i0, i, kt;
double delta_t, h, xi, lambda;
float v[N_MAX]; // U(n)
float u[N_MAX]; // U(n+1)
//Pre-process - Saisie des input
printf("Donnez le nombre de points de maille : \n");
scanf("%d", &nb_points);
//printf("\n%d\n",nb_points);
printf("Donnez le pas de temps : \n");
scanf("%le", &delta_t);// /!\ à la précision %le = double, %f = flottant
//printf("\n%le\n",delta_t);
/*
* N = nb de points internes; les points xi sont numerotes de 0 à N + 1
*x0 = 0, x1 = h, x2 = 2*h, ..., xi = ih, ..., xN + 1 ou h est le pas
*d'espace defini par h = 1 / (N+1)
*/
N = nb_points - 2;
h = 1./(N+1);
// Nb max d'itérations en temps pour atteindre tmax
ktmax = (int) (t_MAX /delta_t);
// Critere de stabilite de Von Neumann lambda < 1/2
lambda = delta_t * SIGMA / h*h;
// Initialisation de la solution en chaque point
for ( i = 0; i < N+1; i++){
v[i] = 0;
}
/*
*Indice i0 represente le point milieu (si Nbpoints est impair) dont on
*ecrira la solution U(xi,t) dans le fichier `output pour les temps
*discrets t = t0, t1, t2, ..., tktmax ( i0 pourrait eter bien sur l'indice
*correspondant a n'importe quel autre point du maillage
*/
i0 = ((N + 1)/2);
ecrireResultat("file_result", "w+", 1, v[i0]) ;
//Process - Boucle de calcul - Partie critique de la simulation
for( kt = 0 ; kt < ktmax ; kt++){ // intération en temps
for( i = 1 ; i <= N ; i++){ // itération sur le nbr de points interne
xi = i*h; // coordonnée du i-ème point de discrétisation
/*
* Schema aux difference finies discretisant l'EDP consideree
* Notation : u(i) = solution au tn+1
* et v(i) = solution au tn
*/
u[i] = v[i] * (1 - 2 * delta_t*SIGMA / h*h) +
v[i - 1]* delta_t * SIGMA/h*h +
v[i + 1]* delta_t * SIGMA/h*h +
delta_t * xi * cos(OMEGA * (kt - 1) * delta_t);
/*
* Ecriture du U(xi0, t) dans le fichier `output' pour les temps de
* discretisation t = t1, t2, ..., ktmax
*/
if ( i0 == i){ // c'est le point milieu
//fprintf(file_out, "%f %le\n", kt * delta_t, u[i]);
ecrireResultat("file_result", "a", kt*delta_t, u[i]);
}
} // fin de la boucle en espace, sur les points intérieurs
u[0] = 0; // condition aux limites en 0
u[N + 1] = sin(OMEGA*kt*delta_t)/ OMEGA; // condition aux limites en 1
// On switch la solution au temps tn+1 avec celle au temps tn
for(i = 0 ; i <= N + 1; i++){
v[i] = u[i];
}
}// fin boucle iteration en temps
// Message de fin de programme
printf("\n****Ok, FIN!****\n");
} // fin du programme
/*
----------------------------------------------------------------------------------------------------------------------------------------------------
Autre fichier
-----------------------------------------------------------------------------------------------------------------------------------------------------
*/
/*
* FILE : pgm.c
* INFO :
* TODO :
* FIXME :
* AUTHOR :
* PURPOSE :
* CREATED : on 27 février 2008, 23:13
*/
#include "equationsDiffPartiel.h"
/*
* Application de resolution d'equation en 1D
*/
int main(int argc, char** argv) {
equation_chaleur();
return (EXIT_SUCCESS);
}
// |
Partager