using namespace std;
#include <iostream>
#include <assert.h>
#include<math.h>
#include <fstream>
#include "Resolution_numerique.h"
#include "Algo_Thomas.h"


void startNumerique(double pasX, double pasT, double T, double L){
    //nombre d'itération du pas delta x
    int n;
    //nombre d'itération du pas delta t
    int m;
    //calcul du nombre d'itération
    m=T/pasT;
    n=(L/(pasX));

    //calcul de A
    float a1 = (-pasT/(2*pow(pasX,2)))+(-pasT/(4*pasX));

    //calcul de B
    float b1 = (-pasT/(2*pow(pasX,2)))+ (pasT/(4*pasX));

    //calcul de D
    float d1 = 1+(pasT/pow(pasX,2));

    //taleau de U
    double U[n+1][m+1];

    //calcul des U initiaux
    U[0][0]=0;
    U[n][0]=0;
    for (int i=1; i<n; i++){
        U[i][0]= (exp(-0.5*i*pasX))*i*pasX*(i*pasX-1);
    }

    //tableau de D,A,B
    float *D=NULL;
    D = new float[n-1];

    float *A=NULL;
    A = new float[n-1];

    float *B=NULL;
    B = new float[n-1];

    //Remplissage A, B, D
    for (int i=0; i<n-1; i++){
        D[i]=d1;
    }

    B[0]=0;
    for (int i=1; i<n-1; i++){
        B[i]=b1;
    }

    A[n-2]=0;
    for (int i=0; i<n-2; i++){
        A[i]=a1;
    }

    //tableau de K
    float *K=NULL;
    K = new float[n-1];

    ofstream file ("numerique.dat");

    float *V=NULL;
    V = new float[n+1];

    for (int i=0; i<n+1; i++){
        V[i]=U[i][0];
    }

    for(int j =1; j<m+1; j++){
        for(int k = 0; k<n-1; k++){
            K[k] = V[k+2]*((pasT/(2*pow(pasX,2)))+(pasT/(4*pasX)))+V[k+1]*(1-(pasT/pow(pasX,2)))+V[k]*((pasT/(2*pow(pasX,2)))-(pasT/(4*pasX)));

        }
        //Algo de Thomas
        V = AlgoThomas(A,B,D,K,n);
        for (int i=0; i<n+1; i++){
            U[i][j]=V[i];
        }
    }

    for (int j=0; j<n+1; j++){
        for(int k=0; k<m+1;k++){
            //affichage dans le fichier
            file << j*pasX << "\t" << k*pasT << "\t" << U[j][k] << " \n";
            file << "\n";
        }
    }
    //fermeture
    file.close();
    cout << "Resultat cree dans le fichier numerique.dat" << endl;
}
