C ++ Metodo Implícito Núcleo Multicuadrático
Rutina principal y auxiliares (comprimido)

 

 

*
Source:    cd_imp_mq.cpp
                  Conveccion - Difusion en 2-d 
                  Metodo implicito 
                  Nucleo Multicuadrico
Compile:
                   c++ -o cdimq cd_imp_mq.cpp -lm 

Example:
                    ./cdimq 30 1 0.1 10 1  0.2 0.001 0.1

Output:
-----------------------------------------------------
Convection-Difussion - Implicit - MQ
n           = 30 , total(nxn) =900
a           = 1.000000
b           = 0.100000
convectivo  = 10.000000
difusivo    = 1.000000
c           = 0.200000
stept       = 0.001000
tmax        = 0.100000

t=0.100000, e_rms       = 0.000314
t=0.100000, e_inf       = 0.001146
-----------------------------------------------------

Los siguientes archivos de datos que
se pueden ver con GNUPLOT
          
            splot  'real'
            splot  'numerica'
            splot  'realnumerica'
            splot  'realt'
            splot  'numericat'
            splot  'realnumericat'

real   -> corresponde a la solucion analitica de la EDP en t=0
realt  -> corresponde a la solucion analitica de la EDP en t=tmax
numerica   -> corresponde a la solucion numerica de la EDP en t=0
numericat   -> corresponde a la solucion numerica de la EDP en t=tmax
realnumerica ->     analitica - numerica  en t=0
realnumericat ->     analitica - numerica  en t=tmax

Autor: Jose Antonio Muñoz Gómez
Supervisión: Pedro González Casanova


*/

#include
#include
#include

#define INTERIOR       0
#define FRONTERA_REAL  1

#include "../libs/jag_mem.cpp"
#include "../libs/jag_phi.cpp"
#include "../libs/jag_vector.cpp"
#include "../libs/jag_cond.cpp"
#include "../libs/qSort.cpp"
#include "../libs/jag_file.cpp"


#include "cd_edp_ut.cpp"

#include "../libs/varios1.cpp"


//--------------------------------------------------------------------
void reconstruye(double *x,double *y, double *lambda,double c,int N, double *sol_numerica)
{
int     i,j;
double xc,yc;
double s;

 for(i=0;i       \n\n");
   exit(1);     
 }
 
    n = atoi(argv[1]);
a_cd = atof(argv[2]);  
b_cd = atof(argv[3]);  
Convectivo = atof(argv[4]);  
Difusivo       = atof(argv[5]);  
c  = atof(argv[6]);  
stept = atof(argv[7]);  
tmax  = atof(argv[8]);  

 tini = 0.0;
 printf("-----------------------------------------------------\n");
 printf("n           = %d , total(nxn) =%d\n",n,n*n);
 printf("a           = %f\n",a_cd);   
 printf("b           = %f\n",b_cd);   
 printf("convectivo  = %f\n",Convectivo);   
 printf("difusivo    = %f\n",Difusivo);   
 printf("c           = %f\n",c);      
 printf("stept       = %f\n",stept);   
 printf("tmax        = %f\n",tmax);    



//Creo el grid cartesiano
 xmin =  0;
 ymin =  0;
 xmax =  1;
 ymax =  1;

  malla  = make_mesh(xmin,xmax,ymin,ymax,n);
  
  N = malla.N;
  x = malla.x;
  y = malla.y;
tipo= malla.tipo;  
 ni = malla.ni; 
 
 
//Reservo la memoria dinamica
  A           = make_dmatrix(N,N);
  M           = make_dmatrix(N,N);
  P           = make_dmatrix(N,N);
  f           = make_dvector(N);
  lambda      = make_dvector(N);
  pivot_index = make_ivector(N);
  
  sol_analitica = make_dvector(malla.N);
  sol_numerica  = make_dvector(malla.N);
  sol_analitica_numerica = make_dvector(malla.N);   
   
  
//Creo la matriz de interpolacion:  condicion inicial
for(int i=0;i=ni){ //frontera
       M[i][j] = u;
     }     
   } 
    
//Creo la matriz-P  
  for(int i=0;i