Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

KM2016 / Parabolic / test_parab

.cpp
Скачиваний:
7
Добавлен:
14.03.2016
Размер:
9.94 Кб
Скачать
//	file test_parab.cpp:demonstration of fucntion dif6 
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
// #include "dif6.h"
#include "dif6.cpp"

FILE *prtex=0;
int COUNT=0;

  double funk(int i,double x[],int n,double t,double xi[],
               double hm[],double hp[],int multiindex[],double tminus,
	       double tplus);
  double funa(int i,double x[],int n,double t,double xi[],
	       double hm[],double hp[],int multiindex[],double tminus,
	       double tplus);
 double funb(int i,double x[],int n,double t,double xi[],
	       double hm[],double hp[],int multiindex[],double tminus,
	       double tplus);
 double fung(int i,double x[],int n,double t,double xi[],
               double hm[],double hp[],int multiindex[],double tminus,
	       double tplus);
 double funf(int i,double x[],int n,double t,double xi[],
               double hm[],double hp[],int multiindex[],double tminus,
	       double tplus);
 double funq(double x[],int n,double t);
 double funt(double x[],int n,double t);
 double dert(int i,double x[],int n,double t);
 double fune(int nbound,int i,double x[],int n,double t); 
 double fund(int nbound,int i,double x[],int n,double t);
double func(int nbound,int i,double x[],int n,double t);
 void out(int iter,int noftau,double t1,double *dt,
		 int n,int mi[],double solution[],double xmi[],int *iterm);
 void inform(int *ind,int ifunk[][6],int ifuna[][6],int ifunb[][6],
   int ifung[][6],int ifunf[][6]);
 double funu0(int i,double x[],int n,double t,double xi[],
               double hm[],double hp[],int multiindex[],double tminus,
	       double tplus);
 double funu(double x[],int n,double t);


///////////////////////////////////////////////////////////////
//Функции задаются пользователем для тестирования
#pragma argsused
 double funu(double x[],int n,double t)
{return 3*(x[0]*x[0]*x[0]+x[1]*x[1]*x[1]+t*t*t)/3.;}
///////////////////////////////////////////////////////////
#pragma argsused
 double funu_dert(double x[],int n,double t)
{return 3*t*t;}
///////////////////////////////////////////////////////////
#pragma argsused
 double funu_derx(int i,double x[],int n,double t)
{return 3*x[i]*x[i];}
///////////////////////////////////////////////////////////////
#pragma argsused
 double funu_der2x(int i,double x[],int n,double t)
{return 3*2*x[i];}
///////////////////////////////////////////////////////////
#pragma argsused
double funk(int i,double x[],int n,double t,double xi[],
	       double hm[],double hp[],int multiindex[],double tminus,
	       double tplus)
{return 1;}
#pragma argsused
double funa(int i,double x[],int n,double t,double xi[],
  double hm[],double hp[],int multiindex[],double tminus,double tplus)
{return 1;}

#pragma argsused
double funaderx(int i,double x[],int n,double t,double xi[],
  double hm[],double hp[],int multiindex[],double tminus,double tplus)
{return 0;}

#pragma argsused
 double funb(int i,double x[],int n,double t,double xi[],
 double hm[],double hp[],int multiindex[],double tminus,double tplus)
{return x[0]*x[1]*t;}

#pragma argsused
 double funbderx(int i,double x[],int n,double t,double xi[],
 double hm[],double hp[],int multiindex[],double tminus,double tplus)
{return 0.;}

#pragma argsused
 double fung(int i,double x[],int n,double t,double xi[],
	       double hm[],double hp[],int multiindex[],double tminus,
	       double tplus)
{return x[0]+x[1]+t;}

#pragma argsused
 double func(int nbound,int i,double x[],int n,double t)
{return 1.;}
#pragma argsused
 double fund(int nbound,int i,double x[],int n,double t)
{return 1.;}

/////////////////////////////////////
//Эти функции не трогать, автоматическое вычисление источника
//и граничных условий
#pragma argsused
double funf(int i,double x[],int n,double t,double xi[],
	       double hm[],double hp[],int multiindex[],double tminus,
	       double tplus)
{
double s=funk(i,x,n,t,xi,hm,hp,multiindex,tminus,tplus)*funu_dert(x,n,t)+
funu(x,n,t)*fung(i,x,n,t,xi,hm,hp,multiindex,tminus,tplus);
s-=funaderx(0,x,n,t,xi,hm,hp,multiindex,tminus,tplus)*funu_derx(0,x,n,t);
s-=funaderx(1,x,n,t,xi,hm,hp,multiindex,tminus,tplus)*funu_derx(1,x,n,t);
s-=funa(0,x,n,t,xi,hm,hp,multiindex,tminus,tplus)*funu_der2x(0,x,n,t);
s-=funa(1,x,n,t,xi,hm,hp,multiindex,tminus,tplus)*funu_der2x(1,x,n,t);
s-=funb(0,x,n,t,xi,hm,hp,multiindex,tminus,tplus)*funu_derx(0,x,n,t);
s-=funb(1,x,n,t,xi,hm,hp,multiindex,tminus,tplus)*funu_derx(1,x,n,t);
return s;
}

#pragma argsused
 double fune(int nbound,int i,double x[],int n,double t)
   {if(nbound==1)
return func(nbound,i,x,n,t)*funu(x,n,t)+
fund(nbound,i,x,n,t)*funu_derx(i,x,n,t);
    else
 return func(nbound,i,x,n,t)*funu(x,n,t)-
fund(nbound,i,x,n,t)*funu_derx(i,x,n,t);
}


#pragma argsused
 double funu0(int i,double x[],int n,double t,double xi[],
	       double hm[],double hp[],int multiindex[],double tminus,
	       double tplus)
{return funu(x,n,0.);}
#pragma argsused
 void inform(int *ind,int ifunk[][6],int ifuna[][6],int ifunb[][6],
        int ifung[][6],int ifunf[][6])
{*ind=0;}

///////////////////////////////////////
double amax1(double x,double y)
{if(x>y) return x;else return y;}
////////////////////////////////////////////////////

double ERROR(double xtochn,double x)
{if(xtochn==0.)return 0;double res=100*fabs((xtochn-x)/xtochn);
if(res<1.e-5)return 0;else return res;
}

#pragma argsused
 void out(int iter,int noftau,double t1,double *dt,
		 int n,int mi[],double solution[],double xmi[],int *iterm)
{double y[2];  int i,j,k,d0,d1;double maxerror=-1.e10,error;
	if(iter>=noftau) *iterm = 1; else *iterm=0;  
 d0=mi[1]*mi[2]*mi[3]*mi[4]*mi[5]; d1=mi[2]*mi[3]*mi[4]*mi[5];
//Записать в файл
prtex=fopen("test_parab.tex","a");

fprintf(prtex,"\n\n\\begin{table}\n");
fprintf(prtex,"\\caption{Момент времени $t=%g$}\n",t1);
fprintf(prtex,"\\begin{center}\n");
fprintf(prtex,"\\scriptsize\n");
fprintf(prtex,"\\begin{tabular}{|c");
for(j=0;j<mi[1];j++)fprintf(prtex,"|c");fprintf(prtex,"|}\n");
fprintf(prtex,"\\hline\n");

for(i=0;i<mi[0];i++){
fprintf(prtex,"\\multicolumn{%d}{|c|}{$t=%g,\\quad x_i=%g$}\\\\\n",
mi[1]+1,t1,xmi[i]);
fprintf(prtex,"\\hline\n");
fprintf(prtex,"$y_j$");for(j=0;j<mi[1];j++)fprintf(prtex,"&%g",xmi[mi[0]+j]);
fprintf(prtex,"\\\\\n\\hline\n");

fprintf(prtex,"$u_{ij}$");
for(j=0;j<mi[1];j++){y[0]=xmi[i];y[1] = xmi[mi[0]+j];
fprintf(prtex,"&%.4g",funu(y,n,t1));
                    }
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\tilde u_{ij}$");
for(j=0;j<mi[1];j++){
fprintf(prtex,"&%.4g",solution[i*d0+j*d1]);
                    }
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\delta_{ij}(\\%)$");
for(j=0;j<mi[1];j++){y[0]=xmi[i];y[1] = xmi[mi[0]+j];
fprintf(prtex,"&%.2g",ERROR(funu(y,n,t1),solution[i*d0+j*d1]));
                    }
fprintf(prtex,"\\\\\n\\hline\n");
		     }//i
fprintf(prtex,"\\end{tabular}\n");
fprintf(prtex,"\\end{center}\n");
fprintf(prtex,"\\label{%d}\n",COUNT++);
fprintf(prtex,"\\end{table}\n");
fclose(prtex);
  }

////////////////////////////////////////////////////
#pragma argsused
int main(void)/*  test of dif6tepl */
{
prtex=fopen("test_parab.tex","w");
  fprintf(prtex,"\\documentclass[a4paper,14pt]{disser}\n");
  fprintf(prtex,"\\usepackage[a4paper, mag=1000, includefoot,left=2.2cm, right=2.2cm,\n"); 
  fprintf(prtex,"top=2cm, bottom=2.5cm,headsep=1cm, footskip=1cm]{geometry}\n");
  fprintf(prtex,"\\usepackage[T2A]{fontenc}\n");
  fprintf(prtex,"\\usepackage[utf8x]{inputenc}\n");
  fprintf(prtex,"\\usepackage[english,russian]{babel}\n");
  fprintf(prtex,"\\usepackage{amssymb,amsfonts,amsmath,mathtext,enumerate,float} \n");
fprintf(prtex,"\\begin{document}\n");fprintf(prtex,"\\normalsize\n");
fprintf(prtex,"\\section*{Тестирование программы dif6}\n");
 int n,ind=0,nappr=1,mi[6],nspace[2],noftau,nspac,ntime,i,iterm;
double tau=0.01,xmi[150],
sig[2],si,t0,H=0.01,xmin=1.,ymin=1.;
si=1;//Чисто неяная схема, использовать только ее
noftau=4;ntime=3;nspac=3;n=2; 
 mi[0] = 11;mi[1] = 11;
double X[11]={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1};
double Y[11]={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1};
double ADD=1,MNOG=2.;
for(i=0;i<mi[0];i++)xmi[i] = ADD+MNOG*X[i];
for(i=0;i<mi[1];i++)xmi[i+mi[0]] = ADD+MNOG*Y[i];

fprintf(prtex,"Размерность пространства n=%d.\n",n);
fprintf(prtex,"Максимально допустимое число шагов по времени noftau=%d\n",noftau);
fprintf(prtex,"Вес разностной схемы sig=%g.\n",si);
fprintf(prtex,"Порядок квадратурной формулы Гаусса при интегрировании по времени ntime=%d.\n",ntime);
fprintf(prtex,"Порядок квадратурной формулы Гаусса при интегрировании по пространству nspace=%d.\n",nspac);
fprintf(prtex,"Начальный шаг по времени tau=%g.\n",tau);

 nspace[0] = nspace[1] = nspac;sig[0]=sig[1]=si;t0=0.;ind=0;

fprintf(prtex,"Поточечная оценка точности аппроксимации\n");
fprintf(prtex,"в узловых точках по пространству дается выражениямим\n");
fprintf(prtex,"\\[\\delta_{ij}=\\left|1-\\frac{\\tilde u_{ij}}{u_{ij}}\\right|,\\]\n");
fprintf(prtex,"где $u_{ij}=u(x_i,y_j,t)$, $\\tilde u_{ij}$ --\n");
fprintf(prtex,"результаты численной аппроксимации решения исходной задачи в точке $(x_i,y_j,t)$.\n");
fprintf(prtex,"\nРезультаты представлены в таблице.\n");
fclose(prtex);

 dif6(funk,funa,funb,fung,funf,func,fund,fune,funu0,out,inform,
	n,mi,xmi,t0,noftau,sig,ntime,nspace,nappr,ind,tau,&iterm);
prtex=fopen("test_parab.tex","a");
fprintf(prtex,"\\end{document}\n");fclose(prtex);
return 1;
 }

Соседние файлы в папке Parabolic