コード例 #1
0
ファイル: advection_28_04.c プロジェクト: AndreyZn/ex-1
        int main () {


                int N, M = 10;
                N = 10;
                double h, Cx = 1.0, k = 0.6;
                h = 2.0/N; //Piece size

                double tau;
                tau = k*h/Cx;

                int i;


                double x[11];
                for (i = 0; i < (N+1); i++) {
                x[i] =i*h - 1;
                }


                double U[11];
                for (i = 0; i < (N+1); i++) {
                U[i] = 0;
                if ((x[i]>=(-0.5))&&(x[i]<=0.5)) {
                U[i] = 1;
                }
                }



                double a;
                for (i = 0; M > 0; i++) {

                if (i == 0) {
                         a = (U[i] - U[N])/(x[i]-x[N]);
                         }      else {
                         a = (U[i] - U[i-1])/(x[i]-x[i-1]);
                         }
                        //      y=ax+b; U[i-1]
                         U[i]=(x[i] - Cx*tau)*a + U[i-1]-a*x[i-1];
                                DM_plot_1d(x, U, N, "Test 1", 1);
 M--;
                         printf("%f ", U[i]);
                         if (i == N) {
                         //M--;
                         i = 0;
                         //DM_plot_1d(x, U, N, "Test 1", 1);
                         //DM_plot_1d(x, U, N, "Test 1", 0);
                         printf("\n");
                         }
                         }


                         return 0;
                         }
コード例 #2
0
ファイル: advection_3.c プロジェクト: kostyukai/kostyuk
int main(){

const double Cx = 1;
const double k = 0.5;

int N, M;
double x[100] = {0};
double y[100] = {0};
double previous_y[100] = {0};
double previous_der[100] = {0};
double der[100] = {0};
double h, t;

scanf("%d", &N);
h = 2.0 / N;    
t = (k * h) / Cx;

M = 2.0 / (Cx * t)+1; // amount of steps

int i;


for (i = 0; i < N; i++) {
  x[i] = (i * h) - 1;
y[i] = previous_y[i] = init (x[i]);
        };


double A, B, C, D, tg, b;

int j = 0;

while (j < M) {

for (i = 1; i < N; i++) {
D = y[i];
C = der[i];
A = (((previous_der[i-1] - C)/h) + 2 * (previous_y[i-1] - D + C * h)/(h*h))/h;
B = (previous_y[i-1] - D + C * h)/(h*h) + A*h;

y[i] = A * (-Cx*t) * (-Cx*t) * (-Cx*t) + B * (-Cx*t) * (-Cx*t) + C * (-Cx*t) + D;
der[i] = 3 * A * (-Cx*t) * (-Cx*t) + 2 * B * (-Cx*t) + C; 
};


    
                D = y[0];
                C = der[0];
                A = (((previous_der[N - 1] - C)/h) + 2 * (previous_y[N-1] - D + C * h)/(h*h))/h;
                B = (previous_y[N-1] - D + C * h)/(h*h) + A*h;

                y[0] = A * (-Cx*t) * (-Cx*t) * (-Cx*t) + B * (-Cx*t) * (-Cx*t) + C * (-Cx*t) + D;
                der[0] = 3 * A * (-Cx*t) * (-Cx*t) + 2 * B * (-Cx*t) + C;


        for (i = 0; i < N; i++){
                previous_y[i] = y[i];
previous_der[i] = der[i];
        }
j++;
}
//build plot

        DM_plot_1d(x, y, N, "Test 1", 0);
        DM_plot_1d(x, y, N, "Test 1", 1);

return 0;
}
コード例 #3
0
int main()
{
	int i;
	int N = 100;//N is the number of nodes
	double cx = 1.0;
	double k = 0.6;
	double *current = (double *)malloc(N*sizeof(double));
	double *next = (double *)malloc(N*sizeof(double));
	double *current_der = (double *)malloc(N*sizeof(double));
	double *next_der = (double *)malloc(N*sizeof(double));
	double *x = (double *)malloc(N*sizeof(double));
//initialization
	double tau, h;
	h = 2.0/N;
	tau = k*h/cx;
	float eps = 0.0000001;
	for (i = 0; i < N; i++)
		{
		if ( ((-1.0 + i*h) >= -0.5 ) && ((-1.0 + i*h) <= 0.5 ) )
			current[i] = 1.0;
		else
			current[i] = 0.0;
		next[i] = 0.0;
		current_der[i] = 0.0;
		next_der[i] = 0.0;
		x[i] = -1.0 + i*h;
    		}
  	DM_plot_1d(x, current, N, "Text", 1);
//	print(N, current);
//main loop
	int j;
	double a, b, c, d, A, B, C, D, E, F, x0;
	double xm, xm_1, um, um_1, dum, dum_1;
//here um stands for a u(xm), dum for derivative of u in xm
//extrapolation as a polinom ax^3+bx^2+cx+d
	i = 0;
	while (i < 2/(cx*tau)) //1 period		{
		for (j = 0; j < N-1; j++)
			{
//description of new values
			um = current[j+1];
			um_1 = current[j];
			dum = current_der[j+1];
			dum_1 = current_der[j];
			xm_1 = -1.0 + j*h;
			xm = -1.0 + (j+1)*h;
			x0 = xm - cx*tau;
			if ( (fabs(xm-0.0) > eps) && (fabs(xm_1-0.0) > eps) )
				{
//calculation of coefficients
				A = -0.5*(xm_1*xm_1*xm_1 - xm*xm*xm);
				B = 0.5*(xm_1 - xm);
				C = um_1 - um +0.5*(xm*dum - xm_1*dum_1);
				D = -3.0*xm_1*xm*(xm - xm_1);
				E = xm - xm_1;
				F = dum_1*xm - dum*xm_1;
				a = (C*E - F*B)/(A*E - D*B);
				c = (A*F - D*C)/(A*E - D*B);
				b = (dum - 3.0*a*xm*xm - c)/(2.0*xm);
				d = um - c*xm - b*xm*xm - a*xm*xm*xm;
				}
			if (fabs(xm_1-0.0) < eps)
				{
				d = um_1;
				c = dum_1;
				A = um-c*xm-d;
				B = dum-c;
				a = -(A*2.0-B*xm)/(xm*xm*xm);
				b = -(xm*B-3.0*A)/(xm*xm);
				}
			if (fabs(xm-0.0) < eps)
				{
				d = um;
				c = dum;
				A = um_1-c*xm_1-d;
				B = dum_1-c;
				a = -(A*2.0-B*xm_1)/(xm_1*xm_1*xm_1);
				b = -(xm_1*B-3.0*A)/(xm_1*xm_1);
				}
//recalculation of function and its derivative
			next[j+1] = a*x0*x0*x0 + b*x0*x0 + c*x0 + d;
			next_der[j+1] = 3.0*a*x0*x0 + 2.0*b*x0 + c;
			}
//the same for the border layer
		um = current[0];
		um_1 = current[N-1];
		dum = current_der[0];
		dum_1 = current_der[N-1];
		xm_1 = -1.0 + (N-1)*h;
		xm = -1.0 + N*h;
		x0 = xm - cx*tau;
		A = -0.5*(xm_1*xm_1*xm_1 - xm*xm*xm);
		B = 0.5*(xm_1 - xm);
		C = um_1 - um +0.5*(xm*dum - xm_1*dum_1);
		D = -3.0*xm_1*xm*(xm - xm_1);
		E = xm - xm_1;
		F = dum_1*xm - dum*xm_1;
		a = (C*E - F*B)/(A*E - D*B);
		c = (A*F - D*C)/(A*E - D*B);
		b = (dum - 3.0*a*xm*xm - c)/(2.0*xm);
		d = um - c*xm - b*xm*xm - a*xm*xm*xm;
		next[0] = a*x0*x0*x0 + b*x0*x0 + c*x0 + d;
		next_der[0] = 3.0*a*x0*x0 + 2.0*b*x0 + c;
//current arrays update
		for (j = 0; j < N; j++)
			{
			current[j] = next[j];
			current_der[j] = next_der[j];
			}
		DM_plot_1d(x, current, N, "Text", 1);
		i++;
		}