Beispiel #1
0
inline static double analytical_solution_circle(double t, double x, double y) {
    double x0 = get_center_x() + t * func_u(t, x, y);
    double y0 = get_center_y() + t * func_v(t, x, y);
    double value = (x - x0) * (x - x0) + (y - y0) * (y - y0);
    if (value <= R_SQ) return INN_DENSITY;
    return OUT_DENSITY;
}
Beispiel #2
0
inline void print_data_to_files(double *phi, double *density, double *residual, int tl) {
    double x0 = get_center_x() + tl*TAU * func_u(tl*TAU, get_center_x(), get_center_y());
    double y0 = get_center_y() + tl*TAU* func_v(tl*TAU, get_center_x(), get_center_y());
    print_surface("phi", NX, NY, HX, HY, tl, A, C, x0, y0, TAU, U, V, phi);
    print_surface("rho", NX, NY, HX, HY, tl, A, C, x0, y0, TAU, U, V, density);
//    print_surface("res", NX, NY, HX, HY, tl, A, C, get_center_x_2(), get_center_y_2(), TAU,
//                  U, V, residual);
    double *err_lock = calc_error_2(HX, HY, tl * TAU, density);
    print_surface("err-l", NX, NY, HX, HY, tl, A, C, x0, y0, TAU, U, V, err_lock);
    delete[] err_lock;
}
Beispiel #3
0
__pure inline static double func_f(double b, double time, double ub, double bb, double lb, double rb, double x, double y)
{
	double arg_v = 0.1 * (x - lb) * (x - rb) * (1 + time) * (y - ub) * (y - bb);
	double rho = analytical_solution(time, x, y);
	double drho_dt = x * y * cos(time * x * y);
	double drho_dx = time * y * cos(time * x * y);
	double dtho_dy = time * x * cos(time * x * y);
	double u = func_u(b, x, y);
	double v = func_v(ub, bb, lb, rb, time, x, y);
	double du_dx = -b * y * (1 - y) / (1 + sqr(x));
	double dv_dx = 0.1 * (x - lb) * (x - rb) * (1 + time) * (y - bb + y - ub);
	dv_dx /= (1 + arg_v * arg_v);
	return drho_dt + rho * du_dx + u * drho_dx + rho * dv_dx + v * dtho_dy;
}
Beispiel #4
0
static double integrate(int i, int j)
{
	dp_t left(OX[i-1], OY[j]);
	dp_t right(OX[i+1], OY[j]);
	dp_t up(OX[i], OY[j+1]);
	dp_t bottom(OX[i], OY[j-1]);
	
	dp_t center(OX[i], OY[j]);
	double u = func_u(B, center.x, center.y);
	double v = func_v(UB, BB, LB, RB, TIME, center.x, center.y);
	center.x = center.x - TAU * u;
	center.y = center.y - TAU * v;

	// проверим случай вылета точки за левую границу
	if (center.x <= 0) // вылет за левую границу
	{
		dp_t center_tk(OX[i], OY[j]);
		// найдем точку (t, y) пересечения траектории и оси ординат
		double y_ = 0;
		double t_ = 0;
		if ( center_tk.x - center.x < FLT_MIN )
		{
			y_ = 0.5 * (center_tk.y + center_tk.y);
		}
		else
		{
			y_ = center_tk.y - center.x 
			* ((center_tk.y - center.y) / (center_tk.x - center.x));
		}

		// найдем время t* в точке перечесения
		// уравнение прямой для точки (y, t)
		// t - t1 / t2-t1 = y-y1/y2-y1
		// => t = t1 + (y-y1)*(t2-t1)/y2-y1
		// здесь center_tk = первая точка 
		// center = вторая
		// TAU = t2 - t1
		// TIME = время на K слое по времени
		t_ = TIME - TAU * ((y_-center_tk.y)/(center.y - center_tk.y));

		// посчитаем TAU*
		double tau_ = TIME - t_;

		double u = func_u(B, left.x, left.y);
		double v = func_v(UB, BB, LB, RB, t_, left.x, left.y);
		left.x = left.x - tau_ * u;
		left.y = left.y - tau_ * v;
		u = func_u(B, right.x, right.y);
		v = func_v(UB, BB, LB, RB, t_, right.x, right.y);
		right.x = right.x - tau_ * u;
		right.y = right.y - tau_ * v;
		u = func_u(B, up.x, up.y);
		v = func_v(UB, BB, LB, RB, t_, up.x, up.y);
		up.x = up.x - tau_ * u;
		up.y = up.y - tau_ * v;
		u = func_u(B, bottom.x, bottom.y);
		v = func_v(UB, BB, LB, RB, t_, bottom.x, bottom.y);
		bottom.x = bottom.x - tau_ * u;
		bottom.y = bottom.y - tau_ * v;
		u = func_u(B, center.x, center.y);
		v = func_v(UB, BB, LB, RB, t_, center.x, center.y);
		center.x = center_tk.x - tau_ * u;
		center.y = center_tk.y - tau_ * v;

		double w_x_ksi = 0.5 * ((right.x-center.x)/HX + (center.x - left.x)/HX);
		double w_y_ksi = 0.5 * ((right.y-center.y)/HX + (center.y - left.y)/HX);
		double w_x_the = 0.5 * ((up.x-center.x)/HY + (center.x - bottom.x)/HY);
		double w_y_the = 0.5 * ((up.y-center.y)/HY + (center.y - bottom.y)/HY);
		double det = w_x_ksi*w_y_the - w_x_the *w_y_ksi;
		double rho =  analytical_solution(t_, 0, y_);
		//printf("%s\n", "WALL COLLISION");
		//return det * rho * INVERTED_HX_HY;
		return det * rho;
	}

	u = func_u(B, left.x, left.y);
	v = func_v(UB, BB, LB, RB, TIME, left.x, left.y);
	left.x = left.x - TAU * u;
	left.y = left.y - TAU * v;
	u = func_u(B, right.x, right.y);
	v = func_v(UB, BB, LB, RB, TIME, right.x, right.y);
	right.x = right.x - TAU * u;
	right.y = right.y - TAU * v;
	u = func_u(B, up.x, up.y);
	v = func_v(UB, BB, LB, RB, TIME, up.x, up.y);
	up.x = up.x - TAU * u;
	up.y = up.y - TAU * v;
	u = func_u(B, bottom.x, bottom.y);
	v = func_v(UB, BB, LB, RB, TIME, bottom.x, bottom.y);
	bottom.x = bottom.x - TAU * u;
	bottom.y = bottom.y - TAU * v;

	double w_x_ksi = 0.5 * ((right.x-center.x)/HX + (center.x - left.x)/HX);
	double w_y_ksi = 0.5 * ((right.y-center.y)/HX + (center.y - left.y)/HX);
	double w_x_the = 0.5 * ((up.x-center.x)/HY + (center.x - bottom.x)/HY);
	double w_y_the = 0.5 * ((up.y-center.y)/HY + (center.y - bottom.y)/HY);
	double det = w_x_ksi*w_y_the - w_x_the *w_y_ksi;

	int x = floor(center.x / HX);
	int y = floor(center.y / HY);
	double rho = PREV_DENSITY[y * OX_LEN_1 + x] * (center.x - OX[x + 1]) * (center.y - OY[y + 1]);
	rho -= PREV_DENSITY[y * OX_LEN_1 + x + 1] * (center.x - OX[x]) * (center.y - OY[y + 1]);
	rho += PREV_DENSITY[(y + 1) * OX_LEN_1 + x + 1] * (center.x - OX[x]) * (center.y - OY[y]);
	rho -= PREV_DENSITY[(y + 1) * OX_LEN_1 + x] * (center.x - OX[x + 1]) * (center.y - OY[y]);
	return det * rho * INVERTED_HX_HY;
}
Beispiel #5
0
static double get_phi(int i, int j)
{
	dp_t u_left(OX[i-1], OY[j+1]); // left upper
	dp_t u_right(OX[i+1], OY[j+1]); // right upper
	dp_t b_left(OX[i-1], OY[j-1]); // left bottom
	dp_t b_right(OX[i+1], OY[j-1]); // right bottom
	dp_t center(OX[i], OY[j]);

	double u = func_u();
	double v = func_v();
	center.x = center.x - TAU * u;
	center.y = center.y - TAU * v;
	u = func_u();
	v = func_v();
	u_left.x = u_left.x - TAU * u;
	u_left.y = u_left.y - TAU * v;
	u = func_u();
	v = func_v();
	u_right.x = u_right.x - TAU * u;
	u_right.y = u_right.y - TAU * v;
	u = func_u();
	v = func_v();
	b_left.x = b_left.x - TAU * u;
	b_left.y = b_left.y - TAU * v;
	u = func_u();
	v = func_v();
	b_right.x = b_right.x - TAU * u;
	b_right.y = b_right.y - TAU * v;

	int nx = 10;
	int ny = 10;
	double x_step = 1.0/nx;
	double y_step = 1.0/ny;
	double* x_mesh = create_mesh_vector(nx);
	double* y_mesh = create_mesh_vector(ny);

	if (i == 1 && j == 1 && f == 0)
	{
		// __print_vector(x_mesh, nx);
		// __print_vector(y_mesh, ny);
		f = 1;
	}

	// get right part for jakoby
	double phi = 0;
	for(int i = 0; i < nx; ++i)
	{
		for(int j = 0; j < ny; ++j)
		{
			dp_t ideal;
			ideal.x = x_mesh[i] + x_step/2.;
			ideal.y = y_mesh[j] + y_step/2.;
			dp_t real = get_point_real_pt_by_ideal_pt(b_left, b_right, u_right, u_left, 
				ideal);
			double dens = get_density_in_real_pt(b_left, b_right, u_right, u_left, 
				real);
			double jakob = jakobian(b_left, b_right, u_right, u_left, ideal);
			phi += dens * jakob;
		}
	}
	phi = (16*phi/9*x_step*y_step);
	delete[] x_mesh;
	delete[] y_mesh;
	return phi;
}
Beispiel #6
0
double *solve_2(double &tme) {

    fflush(stdout);

    int ic = 0;
    double *phi = new double[XY];
    double *prev_density = new double[XY];
    double *density = new double[XY];
    double *residual = new double[XY];

    //<editor-fold desc="Fill initial data">

    for (int i = 0; i < NX_1; ++i) {
        for (int j = 0; j < NY_1; ++j) {
            density[NY_1 * i + j] = 0.;
            prev_density[NY_1 * i + j] = 0.;
            residual[NY_1 * i + j] = 0.;
            phi[NY_1 * i + j] = 0.;
        }
    }

    // G1 -- (x_i, 0=C) -- bottom boundary
    for (int i = 0; i < NX_1; ++i) {
        prev_density[NY_1 * i] = analytical_solution_circle(0., A + HX * i, C);
        if (fabs(prev_density[NY_1 * i]) < fabs(DBL_MIN_TRIM)) prev_density[NY_1 * i] = 0;
    }

    // G2 -- (NX=B, y_j) -- right boundary
    for (int j = 1; j < NY; ++j) {
        prev_density[NY_1 * NX + j] = analytical_solution_circle(0., A + HX * NX, C + HY * j);
        if (fabs(prev_density[NY_1 * NX + j]) < fabs(DBL_MIN_TRIM)) prev_density[NY_1 * NX + j] = 0;
    }

    // G3 -- (x_i, NY=D) -- top boundary
    for (int i = 0; i < NX_1; ++i) {
        prev_density[NY_1 * i + NY] = analytical_solution_circle(0., A + HX * i, C + HY * NY);
        if (fabs(prev_density[NY_1 * i + NY]) < fabs(DBL_MIN_TRIM)) prev_density[NY_1 * i + NY] = 0;
    }

    // G4 -- (0=A, y_j) -- left boundary
    for (int j = 1; j < NY; ++j) {
        prev_density[j] = analytical_solution_circle(0., A, C + HY * j);
        if (fabs(prev_density[j]) < fabs(DBL_MIN_TRIM)) prev_density[j] = 0;
    }

    memcpy(density, prev_density, XY * sizeof(double));

    // inner points
    for (int i = 1; i < NX; ++i) {
        for (int j = 1; j < NY; ++j) {
            prev_density[NY_1 * i + j] = analytical_solution_circle(0., A + HX * i, C + HY * j);
            //if (fabs(prev_density[NY_1 * i + j]) < fabs(DBL_MIN_TRIM)) prev_density[NY_1 * i + j] = 0;
        }
    }

    //</editor-fold>

    double sum_rho = calc_array_sum(prev_density, NX_1, NY_1, 0);
    double sum_abs_rho = calc_array_sum(prev_density, NX_1, NY_1, 1);
    printf("SUM RHO INIT = %le\n", sum_rho);
    printf("SUM ABS RHO INIT= %le\n", sum_abs_rho);
    fflush(stdout);

    double maxRes = FLT_MAX;
    double *extrems = new double[2];
    double *extrems_err = new double[2];

    for (int tl = 1; tl <= TIME_STEP_CNT; tl++) {

        //<editor-fold desc="Calculate phi">

        // with usage of prev_density we calculate phi function values

        // G3 -- (x_i, NY=D) -- top boundary
        for (int i = 1; i < NX; ++i) {
            double integ = 0.;
            if (INTEGR_TYPE == 1) {
                integ = get_phi_integ_midpoint(i, NY, prev_density, TAU * tl);
            }
            else if (INTEGR_TYPE == 2) {
                integ = get_phi_integ_trapezium(i, NY, prev_density, TAU * tl);
            }
            else if (INTEGR_TYPE == 3) {
                integ = get_phi_integ_exact(i, NY, prev_density, TAU * tl);
            }
            else if (INTEGR_TYPE == 4) {
                integ = get_phi_integ_b_control_midpoint(i, NY, prev_density, TAU * tl);
            }
            phi[NY_1 * i + NY] = integ;
        }

        // G2 -- (NX=B, y_j) -- right boundary
        for (int j = 1; j < NY; ++j) {
            double integ = 0.;
            if (INTEGR_TYPE == 1) {
                integ = get_phi_integ_midpoint(NX, j, prev_density, TAU * tl);
            }
            else if (INTEGR_TYPE == 2) {
                integ = get_phi_integ_trapezium(NX, j, prev_density, TAU * tl);
            }
            else if (INTEGR_TYPE == 3) {
                integ = get_phi_integ_exact(NX, j, prev_density, TAU * tl);
            }
            else if (INTEGR_TYPE == 4) {
                integ = get_phi_integ_b_control_midpoint(NX, j, prev_density, TAU * tl);
            }
            phi[NY_1 * NX + j] = integ;
        }

        double integ = 0.;
        if (INTEGR_TYPE == 1) {
            integ = get_phi_integ_midpoint(NX, NY, prev_density, TAU * tl);
        }
        else if (INTEGR_TYPE == 2) {
            integ = get_phi_integ_trapezium(NX, NY, prev_density, TAU * tl);
        }
        else if (INTEGR_TYPE == 3) {
            integ = get_phi_integ_exact(NX, NY, prev_density, TAU * tl);
        }
        else if (INTEGR_TYPE == 4) {
            integ = get_phi_integ_b_control_midpoint(NX, NY, prev_density, TAU * tl);
        }
        // point (1,1)
        phi[NY_1 * NX + NY] = integ;

        // inner points
        for (int i = 1; i < NX; ++i)
            for (int j = 1; j < NY; ++j) {
                double integ = 0.;
                if (INTEGR_TYPE == 1) {
                    integ = get_phi_integ_midpoint(i, j, prev_density, TAU * tl);
                }
                else if (INTEGR_TYPE == 2) {
                    integ = get_phi_integ_trapezium(i, j, prev_density, TAU * tl);
                }
                else if (INTEGR_TYPE == 3) {
                    integ = get_phi_integ_exact(i, j, prev_density, TAU * tl);
                }
                else if (INTEGR_TYPE == 4) {
                    integ = get_phi_integ_b_control_midpoint(i, j, prev_density, TAU * tl);
                }
                phi[NY_1 * i + j] = integ;
            }

        //</editor-fold>

        ic = 0;
        double maxErr = FLT_MAX;
        while (((maxErr > EPS) || (maxRes > RES_EPS)) && (ic < NX_1 * NY_1)) {

            //<editor-fold desc="Calculate density">
            // point 1,1
            double rpCoef = 64. / (9. * HX * HY);
            density[NY_1 * NX + NY] = -1. / 3. * (prev_density[NY_1 * NX + NY - 1]
                                                  + prev_density[NY_1 * (NX - 1) + NY])
                                      - 1. / 9. * prev_density[NY_1 * (NX - 1) + NY - 1]
                                      + rpCoef * phi[NY_1 * NX + NY];
            if (fabs(density[NY_1 * NX + NY]) < fabs(DBL_MIN_TRIM)) density[NY_1 * NX + NY] = 0;

            // G3 -- (x_i, NY=D) -- top boundary
            rpCoef = 32. / (9. * HX * HY);
            for (int i = 1; i < NX; ++i) {
                density[NY_1 * i + NY] = -1. / 3. * prev_density[NY_1 * i + NY - 1]
                                         - 1. / 6. * (prev_density[NY_1 * (i + 1) + NY] +
                                                      prev_density[NY_1 * (i - 1) + NY])
                                         - 1. / 18. * (prev_density[NY_1 * (i + 1) + NY - 1] +
                                                       prev_density[NY_1 * (i - 1) + NY - 1])
                                         + rpCoef * phi[NY_1 * i + NY];
                if (fabs(density[NY_1 * i + NY]) < fabs(DBL_MIN_TRIM)) density[NY_1 * i + NY] = 0;
            }

            // G2 -- (NX=B, y_j) -- right boundary
            rpCoef = 32. / (9. * HX * HY);
            for (int j = 1; j < NY; ++j) {
                density[NY_1 * NX + j] = -1. / 3. * prev_density[NY_1 * (NX - 1) + j]
                                         - 1. / 6. * (prev_density[NY_1 * NX + j - 1] +
                                                      prev_density[NY_1 * NX + j + 1])
                                         - 1. / 18. * (prev_density[NY_1 * (NX - 1) + j - 1] +
                                                       prev_density[NY_1 * (NX - 1) + j + 1])
                                         + rpCoef * phi[NY_1 * NX + j];
                if (fabs(density[NY_1 * NX + j]) < fabs(DBL_MIN_TRIM)) density[NY_1 * NX + j] = 0;
            }

            rpCoef = 16. / (9. * HX * HY);
            for (int i = 1; i < NX; ++i) {
                for (int j = 1; j < NY; ++j) {
                    density[NY_1 * i + j] = -1. / 6. * (
                            prev_density[NY_1 * i + j - 1] + // left
                            prev_density[NY_1 * (i - 1) + j] + // upper
                            prev_density[NY_1 * i + j + 1] + // right
                            prev_density[NY_1 * (i + 1) + j] // bottom
                    ) - 1. / 36. * (
                            prev_density[NY_1 * (i + 1) + j + 1] + // bottom right
                            prev_density[NY_1 * (i + 1) + j - 1] + // bottom left
                            prev_density[NY_1 * (i - 1) + j + 1] + // upper right
                            prev_density[NY_1 * (i - 1) + j - 1]  // upper left
                    ) + rpCoef * phi[NY_1 * i + j];
                    if (fabs(density[NY_1 * i + j]) < fabs(DBL_MIN_TRIM)) density[NY_1 * i + j] = 0;
                }
            }
            ++ic;

            maxErr = FLT_MIN;
            for (int i = 0; i < NX_1; ++i)
                for (int j = 0; j < NY_1; ++j) {
                    double val = fabs(density[i * NY_1 + j] - prev_density[i * NY_1 + j]);
                    if (val > maxErr) maxErr = val;
                }

            //</editor-fold>

            //<editor-fold desc="Calculate residual">

            // point 1,1
            rpCoef = HX * HY / 64.;
            residual[NY_1 * NX + NY] = rpCoef * (
                    9. * density[NY_1 * NX + NY] +
                    3. * (
                            density[NY_1 * NX + NY - 1] +
                            density[NY_1 * (NX - 1) + NY]
                    ) +
                    density[NY_1 * (NX - 1) + NY - 1]
            ) - phi[NY_1 * NX + NY];

            // G3 -- (x_i, NY=D) -- top boundary
            for (int i = 1; i < NX; ++i)
                residual[NY_1 * i + NY] = rpCoef * (
                        18. * density[NY_1 * i + NY] +
                        6. * density[NY_1 * i + NY - 1] +
                        3. * (
                                density[NY_1 * (i + 1) + NY] +
                                density[NY_1 * (i - 1) + NY]
                        ) +
                        density[NY_1 * (i + 1) + NY - 1] +
                        density[NY_1 * (i - 1) + NY - 1]
                ) - phi[NY_1 * i + NY];


            // G2 -- (NX=B, y_j) -- right boundary
            for (int j = 1; j < NY; ++j)
                residual[NY_1 * NX + j] = rpCoef * (
                        18. * density[NY_1 * NX + j] +
                        6. * density[NY_1 * (NX - 1) + j] +
                        3. * (
                                density[NY_1 * NX + j - 1] +
                                density[NY_1 * NX + j + 1]
                        ) +
                        density[NY_1 * (NX - 1) + j - 1] +
                        density[NY_1 * (NX - 1) + j + 1]
                ) - phi[NY_1 * NX + j];

            // inner points
            for (int i = 1; i < NX; ++i) {
                for (int j = 1; j < NY; ++j) {
                    residual[NY_1 * i + j] = rpCoef * (
                            36. * density[NY_1 * i + j] +
                            6. * (
                                    density[NY_1 * i + j - 1] + // left
                                    density[NY_1 * (i - 1) + j] + // upper
                                    density[NY_1 * i + j + 1] + // right
                                    density[NY_1 * (i + 1) + j] // bottom
                            ) +
                            prev_density[NY_1 * (i + 1) + j + 1] + // bottom right
                            prev_density[NY_1 * (i + 1) + j - 1] + // bottom left
                            prev_density[NY_1 * (i - 1) + j + 1] + // upper right
                            prev_density[NY_1 * (i - 1) + j - 1]  // upper left
                    ) - phi[NY_1 * i + j];
                }
            }

            maxRes = FLT_MIN;
            for (int i = 0; i < NX_1; ++i) {
                for (int j = 0; j < NY_1; ++j) {
                    double val = fabs(residual[i * NY_1 + j]);
                    if (val > maxRes) maxRes = val;
                }
            }

            //</editor-fold>

            memcpy(prev_density, density, XY * sizeof(double));
        }

        sum_rho = calc_array_sum(density, NX_1, NY_1, 0);
        sum_abs_rho = calc_array_sum(density, NX_1, NY_1, 1);
        extrems = calc_array_extrems(density, NX_1, NY_1);

        printf("tl = %d IterCount = %d Max(Residual) = %le Sum(Rho) = %le Sum(absRho) = %le "
                       "Min(Rho) = %le Max(Rho) = %le\n",
               tl, ic, maxRes, sum_rho, sum_abs_rho, extrems[0], extrems[1]);
        fflush(stdout);

        if (tl % 1 == 0) {
            print_data_to_files(phi, density, residual, tl);
            double x_0 = get_center_x() + tl * TAU * func_u(0, 0, 0);
            double y_0 = get_center_y() + tl * TAU * func_v(0, 0, 0);
            int fixed_x = (int) (x_0 / HX);
            int fixed_y = (int) (y_0 / HY);

            print_line_along_x("rho", NX, NY, HX, HY, tl, A, C, x_0, y_0, TAU,
                               U, V, density, fixed_y);
            print_line_along_y("rho", NX, NY, HX, HY, tl, A, C, x_0, y_0, TAU,
                               U, V, density, fixed_x);
        }
    }

    double x_0 = get_center_x() + TIME_STEP_CNT * TAU * func_u(0, 0, 0);
    double y_0 = get_center_y() + TIME_STEP_CNT * TAU * func_v(0, 0, 0);
    int fixed_x = (int) (x_0 / HX);
    int fixed_y = (int) (y_0 / HY);

/*    print_line_along_x("rho", NX, NY, HX, HY, TIME_STEP_CNT, A, C, x_0, y_0, TAU,
                       U, V, density, fixed_y);
    print_line_along_y("rho", NX, NY, HX, HY, TIME_STEP_CNT, A, C, x_0, y_0, TAU,
                       U, V, density, fixed_x);
*/
    double *err = calc_error_22(HX, HY, TAU * TIME_STEP_CNT, density);
    print_line_along_x("err", NX, NY, HX, HY, TIME_STEP_CNT, A, C, x_0, y_0, TAU,
                       U, V, err, fixed_y);
    print_line_along_y("err", NX, NY, HX, HY, TIME_STEP_CNT, A, C, x_0, y_0, TAU,
                       U, V, err, fixed_x);
    extrems_err = calc_array_extrems(err, NX_1, NY_1);

    err = calc_error_2(HX, HY, TAU * TIME_STEP_CNT, density);
    double l1_err_vec = get_l1_norm_vec(NX_1, NY_1, err);
    double l1_err_tr = get_l1_norm_int_trapezoidal(HX, HY, NX, NY, err); // note! a loop boundary
    extrems = calc_array_extrems(density, NX_1, NY_1);
    append_statistics(NX_1, NY_1, TAU, ic, l1_err_vec, l1_err_tr, maxRes, extrems, extrems_err, TIME_STEP_CNT);

    delete[] prev_density;
    delete[] phi;
    delete[] err;
    delete[] residual;
    delete[] extrems;
    delete[] extrems_err;
    return density;
}
Beispiel #7
0
static double get_phi_integ_exact(int ii, int jj, double *density, double time_value) {
    double x1 = 0.;
    double y1 = 0.;
    double x2 = 0.;
    double y2 = 0.;
    double x3 = 0.;
    double y3 = 0.;
    double x4 = 0.;
    double y4 = 0.;

    if (ii > 0 && ii < NX && jj > 0 && jj < NY) {
        // p1 (x_{i-1/2}, y_{j-1/2})
        x1 = A + ii * HX - HX / 2.;
        y1 = C + jj * HY - HY / 2.;
        // p2 (x_{i+1/2}, y_{j-1/2})
        x2 = A + ii * HX + HX / 2.;
        y2 = C + jj * HY - HY / 2.;
        // p3 (x_{i+1/2}, y_{j+1/2})
        x3 = A + ii * HX + HX / 2.;
        y3 = C + jj * HY + HY / 2.;
        // p4 (x_{i-1/2}, y_{j+1/2})
        x4 = A + ii * HX - HX / 2.;
        y4 = C + jj * HY + HY / 2.;
        if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
            || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (ii == NX && jj == NY) { // point (1,1)  omega_{i-1,j-1}
        // p1 (x_{NX-1/2}, y_{NY-1/2})
        x1 = B - HX / 2.;
        y1 = D - HY / 2.;
        // p2 (B, y_{NY-1/2})
        x2 = B;
        y2 = D - HY / 2.;
        // p3 (B, D)
        x3 = B;
        y3 = D;
        // p4 (x_{NX-1/2}, D)
        x4 = B - HX / 2.;
        y4 = D;
        if (x1 <= A || x1 > B || x2 <= A || x2 > B || x3 <= A || x3 > B || x4 <= A || x4 > B
            || y1 <= C || y1 > D || y2 <= C || y2 > D || y3 <= C || y3 > D || y4 <= C || y4 > D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (jj == NY && ii > 0 && ii < NX) { // G3 -- top boundary
        // p1 (x_{i-1/2}, y_{NY-1/2})
        x1 = A + ii * HX - HX / 2.;
        y1 = D - HY / 2.;
        // p2 (x_{i+1/2}, y_{NY-1/2})
        x2 = A + ii * HX + HX / 2.;
        y2 = D - HY / 2.;
        //p3 (x_{i+1/2}, D)
        x3 = A + ii * HX + HX / 2.;
        y3 = D;
        //p4 (x_{i-1/2}, D)
        x4 = A + ii * HX - HX / 2.;
        y4 = D;
        if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
            || y1 <= C || y1 > D || y2 <= C || y2 > D || y3 <= C || y3 > D || y4 <= C || y4 > D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (ii == NX && jj > 0 && jj < NY) { // G2 -- right boundary
        // p1 (x_{NX-1/2}, y_{j-1/2})
        x1 = B - HX / 2.;
        y1 = C + jj * HY - HY / 2.;
        // p2 (B, y_{j-1/2})
        x2 = B;
        y2 = C + jj * HY - HY / 2.;
        // p3 (B, y_{j+1/2})
        x3 = B;
        y3 = C + jj * HY + HY / 2.;
        // p4 (x_{NX-1/2}, y_{j+1/2})
        x4 = B - HX / 2.;
        y4 = C + jj * HY + HY / 2.;
        if (x1 <= A || x1 > B || x2 <= A || x2 > B || x3 <= A || x3 > B || x4 <= A || x4 > B
            || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else printf("ERROR! INDEX (K LEVEL) i=%d j=%d ", ii, jj);

    double u = func_u(time_value, x1, y1);
    double v = func_v(time_value, x1, y1);
    x1 = x1 - TAU * u;
    y1 = y1 - TAU * v;
    u = func_u(time_value, x2, y2);
    v = func_v(time_value, x2, y2);
    x2 = x2 - TAU * u;
    y2 = y2 - TAU * v;
    u = func_u(time_value, x3, y3);
    v = func_v(time_value, x3, y3);
    x3 = x3 - TAU * u;
    y3 = y3 - TAU * v;
    u = func_u(time_value, x4, y4);
    v = func_v(time_value, x4, y4);
    x4 = x4 - TAU * u;
    y4 = y4 - TAU * v;
    if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
        || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D) {
        printf("Time level %.8le! ERROR INDEX (K-1 LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                       "x4=%.8le * y4=%.8le\n ", time_value, ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);

        return 0.;// на всякий случай
    }

    int sq_i = (int) ((x1 - A) / HX);
    int sq_j = (int) ((y1 - C) / HY);


    // get right part for jakoby
    int ip = ii - 1;
    int jp = jj - 1;

//    if (ip != sq_i || jp != sq_j) {
//        printf("ALARM! (%d %d) != (%d %d)\n", ip, jp, sq_i, sq_j);
//    }

    double mes = HX * HY;
    double dens = density[ip * NY_1 + jp]
                  + density[(ip + 1) * NY_1 + jp]
                  + density[(ip + 1) * NY_1 + jp + 1]
                  + density[ip * NY_1 + jp + 1];
    dens = dens / 4.;
    double phi = dens * mes;

    if (fabs(phi) < fabs(DBL_MIN_TRIM)) phi = 0;
    return phi;
}
Beispiel #8
0
static double get_phi_integ_b_control_midpoint(int ii, int jj, double *density, double time_value) {
    double x1 = 0.;
    double y1 = 0.;
    double x2 = 0.;
    double y2 = 0.;
    double x3 = 0.;
    double y3 = 0.;
    double x4 = 0.;
    double y4 = 0.;
    double phi = 0.;

    if (ii > 0 && ii < NX && jj > 0 && jj < NY) {
        // p1 (x_{i-1/2}, y_{j-1/2})
        x1 = A + ii * HX - HX / 2.;
        y1 = C + jj * HY - HY / 2.;
        // p2 (x_{i+1/2}, y_{j-1/2})
        x2 = A + ii * HX + HX / 2.;
        y2 = C + jj * HY - HY / 2.;
        // p3 (x_{i+1/2}, y_{j+1/2})
        x3 = A + ii * HX + HX / 2.;
        y3 = C + jj * HY + HY / 2.;
        // p4 (x_{i-1/2}, y_{j+1/2})
        x4 = A + ii * HX - HX / 2.;
        y4 = C + jj * HY + HY / 2.;
        if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
            || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (ii == NX && jj == NY) { // point (1,1)  omega_{i-1,j-1}
        // p1 (x_{NX-1/2}, y_{NY-1/2})
        x1 = B - HX / 2.;
        y1 = D - HY / 2.;
        // p2 (B, y_{NY-1/2})
        x2 = B;
        y2 = D - HY / 2.;
        // p3 (B, D)
        x3 = B;
        y3 = D;
        // p4 (x_{NX-1/2}, D)
        x4 = B - HX / 2.;
        y4 = D;
        if (x1 <= A || x1 > B || x2 <= A || x2 > B || x3 <= A || x3 > B || x4 <= A || x4 > B
            || y1 <= C || y1 > D || y2 <= C || y2 > D || y3 <= C || y3 > D || y4 <= C || y4 > D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (jj == NY && ii > 0 && ii < NX) { // G3 -- top boundary
        // p1 (x_{i-1/2}, y_{NY-1/2})
        x1 = A + ii * HX - HX / 2.;
        y1 = D - HY / 2.;
        // p2 (x_{i+1/2}, y_{NY-1/2})
        x2 = A + ii * HX + HX / 2.;
        y2 = D - HY / 2.;
        //p3 (x_{i+1/2}, D)
        x3 = A + ii * HX + HX / 2.;
        y3 = D;
        //p4 (x_{i-1/2}, D)
        x4 = A + ii * HX - HX / 2.;
        y4 = D;
        if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
            || y1 <= C || y1 > D || y2 <= C || y2 > D || y3 <= C || y3 > D || y4 <= C || y4 > D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (ii == NX && jj > 0 && jj < NY) { // G2 -- right boundary
        // p1 (x_{NX-1/2}, y_{j-1/2})
        x1 = B - HX / 2.;
        y1 = C + jj * HY - HY / 2.;
        // p2 (B, y_{j-1/2})
        x2 = B;
        y2 = C + jj * HY - HY / 2.;
        // p3 (B, y_{j+1/2})
        x3 = B;
        y3 = C + jj * HY + HY / 2.;
        // p4 (x_{NX-1/2}, y_{j+1/2})
        x4 = B - HX / 2.;
        y4 = C + jj * HY + HY / 2.;
        if (x1 <= A || x1 > B || x2 <= A || x2 > B || x3 <= A || x3 > B || x4 <= A || x4 > B
            || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D)
            printf("ERROR INDEX (K LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else printf("ERROR! INDEX (K LEVEL) i=%d j=%d ", ii, jj);

    double u = func_u(time_value, x1, y1);
    double v = func_v(time_value, x1, y1);
    x1 = x1 - TAU * u;
    y1 = y1 - TAU * v;
    u = func_u(time_value, x2, y2);
    v = func_v(time_value, x2, y2);
    x2 = x2 - TAU * u;
    y2 = y2 - TAU * v;
    u = func_u(time_value, x3, y3);
    v = func_v(time_value, x3, y3);
    x3 = x3 - TAU * u;
    y3 = y3 - TAU * v;
    u = func_u(time_value, x4, y4);
    v = func_v(time_value, x4, y4);
    x4 = x4 - TAU * u;
    y4 = y4 - TAU * v;
    if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
        || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D) {
        //printf("Time level %.8le! ERROR INDEX (K-1 LEVEL) i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
        //               "x4=%.8le * y4=%.8le\n ", time_value, ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
        phi = OUT_DENSITY;
        return phi; //!!!!
    }

    int nx = IDEAL_SQ_SIZE_X;
    int ny = IDEAL_SQ_SIZE_Y;

    double x_step = 1. / nx;
    double y_step = 1. / ny;

    // get right part for jakoby
    double mes = x_step * y_step;
    for (int i = 0; i < nx; ++i) {
        for (int j = 0; j < ny; ++j) {

            double ideal_x = i * x_step + x_step / 2.;
            double ideal_y = j * y_step + y_step / 2.;

            double real_x = x1 + (x2 - x1) * ideal_x + (x4 - x1) * ideal_y
                            + (x1 + x3 - x2 - x4) * ideal_x * ideal_y;
            double real_y = y1 + (y2 - y1) * ideal_x + (y4 - y1) * ideal_y
                            + (y1 + y3 - y2 - y4) * ideal_x * ideal_y;

            // find out in which square real point was placed
            int sq_i = (int) ((real_x - A) / HX);
            int sq_j = (int) ((real_y - C) / HY);
            double x = A + sq_i * HX;
            double y = C + sq_j * HY;

            double a11 = (x2 - x1) + (x1 + x3 - x2 - x4) * ideal_y;
            double a12 = (x4 - x1) + (x1 + x3 - x2 - x4) * ideal_x;
            double a21 = (y2 - y1) + (y1 + y3 - y2 - y4) * ideal_y;
            double a22 = (y4 - y1) + (y1 + y3 - y2 - y4) * ideal_x;
            double jakob = a11 * a22 - a21 * a12;

            // formula 4
            double dens = density[sq_i * NY_1 + sq_j] * (1 - (real_x - x) / HX) * (1 - (real_y - y) / HY)
                          + density[(sq_i + 1) * NY_1 + sq_j] * ((real_x - x) / HX) * (1 - (real_y - y) / HY)
                          + density[(sq_i + 1) * NY_1 + sq_j + 1] * ((real_x - x) / HX) * ((real_y - y) / HY)
                          + density[sq_i * NY_1 + sq_j + 1] * (1 - (real_x - x) / HX) * ((real_y - y) / HY);

            phi += mes * dens * jakob;
        }
    }

    if (fabs(phi) < fabs(DBL_MIN_TRIM)) phi = 0;
    return phi;
}
Beispiel #9
0
static double get_phi_integ_trapezium(int ii, int jj, double *density, double time_value) {
    double x1 = 0.;
    double y1 = 0.;
    double x2 = 0.;
    double y2 = 0.;
    double x3 = 0.;
    double y3 = 0.;
    double x4 = 0.;
    double y4 = 0.;

    if (ii > 0 && ii < NX && jj > 0 && jj < NY) {
        // p1 (x_{i-1/2}, y_{j-1/2})
        x1 = A + ii * HX - HX / 2.;
        y1 = C + jj * HY - HY / 2.;
        // p2 (x_{i+1/2}, y_{j-1/2})
        x2 = A + ii * HX + HX / 2.;
        y2 = C + jj * HY - HY / 2.;
        // p3 (x_{i+1/2}, y_{j+1/2})
        x3 = A + ii * HX + HX / 2.;
        y3 = C + jj * HY + HY / 2.;
        // p4 (x_{i-1/2}, y_{j+1/2})
        x4 = A + ii * HX - HX / 2.;
        y4 = C + jj * HY + HY / 2.;
        if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
            || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D)
            printf("ERROR INDEX i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (ii == NX && jj == NY) { // point (1,1)  omega_{i-1,j-1}
        // p1 (x_{NX-1/2}, y_{NY-1/2})
        x1 = B - HX / 2.;
        y1 = D - HY / 2.;
        // p2 (B, y_{NY-1/2})
        x2 = B;
        y2 = D - HY / 2.;
        // p3 (B, D)
        x3 = B;
        y3 = D;
        // p4 (x_{NX-1/2}, D)
        x4 = B - HX / 2.;
        y4 = D;
        if (x1 <= A || x1 > B || x2 <= A || x2 > B || x3 <= A || x3 > B || x4 <= A || x4 > B
            || y1 <= C || y1 > D || y2 <= C || y2 > D || y3 <= C || y3 > D || y4 <= C || y4 > D)
            printf("ERROR INDEX i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (jj == NY && ii > 0 && ii < NX) { // G3 -- top boundary
        // p1 (x_{i-1/2}, y_{NY-1/2})
        x1 = A + ii * HX - HX / 2.;
        y1 = D - HY / 2.;
        // p2 (x_{i+1/2}, y_{NY-1/2})
        x2 = A + ii * HX + HX / 2.;
        y2 = D - HY / 2.;
        //p3 (x_{i+1/2}, D)
        x3 = A + ii * HX + HX / 2.;
        y3 = D;
        //p4 (x_{i-1/2}, D)
        x4 = A + ii * HX - HX / 2.;
        y4 = D;
        if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
            || y1 <= C || y1 > D || y2 <= C || y2 > D || y3 <= C || y3 > D || y4 <= C || y4 > D)
            printf("ERROR INDEX i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else if (ii == NX && jj > 0 && jj < NY) { // G2 -- right boundary
        // p1 (x_{NX-1/2}, y_{j-1/2})
        x1 = B - HX / 2.;
        y1 = C + jj * HY - HY / 2.;
        // p2 (B, y_{j-1/2})
        x2 = B;
        y2 = C + jj * HY - HY / 2.;
        // p3 (B, y_{j+1/2})
        x3 = B;
        y3 = C + jj * HY + HY / 2.;
        // p4 (x_{NX-1/2}, y_{j+1/2})
        x4 = B - HX / 2.;
        y4 = C + jj * HY + HY / 2.;
        if (x1 <= A || x1 > B || x2 <= A || x2 > B || x3 <= A || x3 > B || x4 <= A || x4 > B
            || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D)
            printf("ERROR INDEX i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                           "x4=%.8le * y4%.8le\n ", ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);
    }
    else
        printf("ERROR! INDEX i=%d j=%d ", ii, jj);

    double u = func_u(time_value, x1, y1);
    double v = func_v(time_value, x1, y1);
    x1 = x1 - TAU * u;
    y1 = y1 - TAU * v;
    u = func_u(time_value, x2, y2);
    v = func_v(time_value, x2, y2);
    x2 = x2 - TAU * u;
    y2 = y2 - TAU * v;
    u = func_u(time_value, x3, y3);
    v = func_v(time_value, x3, y3);
    x3 = x3 - TAU * u;
    y3 = y3 - TAU * v;
    u = func_u(time_value, x4, y4);
    v = func_v(time_value, x4, y4);
    x4 = x4 - TAU * u;
    y4 = y4 - TAU * v;
    if (x1 <= A || x1 >= B || x2 <= A || x2 >= B || x3 <= A || x3 >= B || x4 <= A || x4 >= B
        || y1 <= C || y1 >= D || y2 <= C || y2 >= D || y3 <= C || y3 >= D || y4 <= C || y4 >= D)
        printf("Time level %.8le! ERROR INDEX i=%d j=%d : x1=%.8le * y1=%.8le ** x2=%.8le * y2=%.8le ** x3=%.8le * y3=%.8le ** "
                       "x4=%.8le * y4=%.8le\n ", time_value, ii, jj, x1, y1, x2, y2, x3, y3, x4, y4);

    int nx = IDEAL_SQ_SIZE_X;
    int ny = IDEAL_SQ_SIZE_Y;

    double x_step = 1. / nx;
    double y_step = 1. / ny;

    // get right part for jakoby
    double phi = 0.;
    double mes = x_step * y_step;
    for (int i = 0; i < nx; ++i) {
        for (int j = 0; j < ny; ++j) {

            double ideal_x = i * x_step + x_step / 2.;
            double ideal_y = j * y_step + y_step / 2.;

            double a11 = (x2 - x1) + (x1 + x3 - x2 - x4) * ideal_y;
            double a12 = (x4 - x1) + (x1 + x3 - x2 - x4) * ideal_x;
            double a21 = (y2 - y1) + (y1 + y3 - y2 - y4) * ideal_y;
            double a22 = (y4 - y1) + (y1 + y3 - y2 - y4) * ideal_x;
            double jakob = a11 * a22 - a21 * a12;

            // point (x_i,y_j)
            ideal_x = i * x_step;
            ideal_y = j * y_step;

            double real_x = x1 + (x2 - x1) * ideal_x + (x4 - x1) * ideal_y
                            + (x1 + x3 - x2 - x4) * ideal_x * ideal_y;
            double real_y = y1 + (y2 - y1) * ideal_x + (y4 - y1) * ideal_y
                            + (y1 + y3 - y2 - y4) * ideal_x * ideal_y;

            if (real_x < A || real_y < C || real_x > B || real_y > D) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : REAL x=%.8le * y=%.8le ** IDEAL x=%.8le * y=%.8le \n",
                       time_value, ii, jj, real_x, real_y, ideal_x, ideal_y);
                printf("1: %.8le * %.8le ** 2: %.8le * %.8le ** 3: %.8le * %.8le ** 4: %.8le * %.8le\n",
                       x1, y1, x2, y2, x3, y3, x4, y4);
            }

            // find out in which square real point was placed
            int sq_i = (int) ((real_x - A) / HX);
            int sq_j = (int) ((real_y - C) / HY);
            if (sq_i < 0 || sq_j < 0 || sq_i > NX - 1 || sq_j > NY - 1) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : i*=%d j*=%d\n", time_value,
                       ii, jj, sq_i, sq_j);
            }
            double x = A + sq_i * HX;
            double y = C + sq_j * HY;

            // formula 4
            double dens_1 = density[sq_i * NY_1 + sq_j] * (1 - (real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j] * ((real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j + 1] * ((real_x - x) / HX) * ((real_y - y) / HY)
                            + density[sq_i * NY_1 + sq_j + 1] * (1 - (real_x - x) / HX) * ((real_y - y) / HY);


            // point (x_{i+1},y_j)
            ideal_x = (i + 1) * x_step;
            ideal_y = j * y_step;
            real_x = x1 + (x2 - x1) * ideal_x + (x4 - x1) * ideal_y
                     + (x1 + x3 - x2 - x4) * ideal_x * ideal_y;
            real_y = y1 + (y2 - y1) * ideal_x + (y4 - y1) * ideal_y
                     + (y1 + y3 - y2 - y4) * ideal_x * ideal_y;
            if (real_x < A || real_y < C || real_x > B || real_y > D) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : REAL x=%.8le * y=%.8le ** IDEAL x=%.8le * y=%.8le \n",
                       time_value, ii, jj, real_x, real_y, ideal_x, ideal_y);
                printf("1: %.8le * %.8le ** 2: %.8le * %.8le ** 3: %.8le * %.8le ** 4: %.8le * %.8le\n",
                       x1, y1, x2, y2, x3, y3, x4, y4);
            }

            // find out in which square real point was placed
            sq_i = (int) ((real_x - A) / HX);
            sq_j = (int) ((real_y - C) / HY);
            if (sq_i < 0 || sq_j < 0 || sq_i > NX - 1 || sq_j > NY - 1) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : i*=%d j*=%d\n", time_value,
                       ii, jj, sq_i, sq_j);
            }
            x = A + sq_i * HX;
            y = C + sq_j * HY;

            // formula 4
            double dens_2 = density[sq_i * NY_1 + sq_j] * (1 - (real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j] * ((real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j + 1] * ((real_x - x) / HX) * ((real_y - y) / HY)
                            + density[sq_i * NY_1 + sq_j + 1] * (1 - (real_x - x) / HX) * ((real_y - y) / HY);


            // point (x_{i+1},y_{j+1})
            ideal_x = (i + 1) * x_step;
            ideal_y = (j + 1) * y_step;
            real_x = x1 + (x2 - x1) * ideal_x + (x4 - x1) * ideal_y
                     + (x1 + x3 - x2 - x4) * ideal_x * ideal_y;
            real_y = y1 + (y2 - y1) * ideal_x + (y4 - y1) * ideal_y
                     + (y1 + y3 - y2 - y4) * ideal_x * ideal_y;
            if (real_x < A || real_y < C || real_x > B || real_y > D) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : REAL x=%.8le * y=%.8le ** IDEAL x=%.8le * y=%.8le \n",
                       time_value, ii, jj, real_x, real_y, ideal_x, ideal_y);
                printf("1: %.8le * %.8le ** 2: %.8le * %.8le ** 3: %.8le * %.8le ** 4: %.8le * %.8le\n",
                       x1, y1, x2, y2, x3, y3, x4, y4);
            }

            // find out in which square real point was placed
            sq_i = (int) ((real_x - A) / HX);
            sq_j = (int) ((real_y - C) / HY);
            if (sq_i < 0 || sq_j < 0 || sq_i > NX - 1 || sq_j > NY - 1) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : i*=%d j*=%d\n", time_value,
                       ii, jj, sq_i, sq_j);
            }
            x = A + sq_i * HX;
            y = C + sq_j * HY;

            // formula 4
            double dens_3 = density[sq_i * NY_1 + sq_j] * (1 - (real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j] * ((real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j + 1] * ((real_x - x) / HX) * ((real_y - y) / HY)
                            + density[sq_i * NY_1 + sq_j + 1] * (1 - (real_x - x) / HX) * ((real_y - y) / HY);


            // point (x_i,y_{j+1})
            ideal_x = i * x_step;
            ideal_y = (j + 1) * y_step;
            real_x = x1 + (x2 - x1) * ideal_x + (x4 - x1) * ideal_y
                     + (x1 + x3 - x2 - x4) * ideal_x * ideal_y;
            real_y = y1 + (y2 - y1) * ideal_x + (y4 - y1) * ideal_y
                     + (y1 + y3 - y2 - y4) * ideal_x * ideal_y;
            if (real_x < A || real_y < C || real_x > B || real_y > D) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : REAL x=%.8le * y=%.8le ** IDEAL x=%.8le * y=%.8le \n",
                       time_value, ii, jj, real_x, real_y, ideal_x, ideal_y);
                printf("1: %.8le * %.8le ** 2: %.8le * %.8le ** 3: %.8le * %.8le ** 4: %.8le * %.8le\n",
                       x1, y1, x2, y2, x3, y3, x4, y4);
            }

            // find out in which square real point was placed
            sq_i = (int) ((real_x - A) / HX);
            sq_j = (int) ((real_y - C) / HY);
            if (sq_i < 0 || sq_j < 0 || sq_i > NX - 1 || sq_j > NY - 1) {
                printf("Time level %.8le! ERROR INDEX i=%d j=%d : i*=%d j*=%d\n", time_value,
                       ii, jj, sq_i, sq_j);
            }
            x = A + sq_i * HX;
            y = C + sq_j * HY;

            // formula 4
            double dens_4 = density[sq_i * NY_1 + sq_j] * (1 - (real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j] * ((real_x - x) / HX) * (1 - (real_y - y) / HY)
                            + density[(sq_i + 1) * NY_1 + sq_j + 1] * ((real_x - x) / HX) * ((real_y - y) / HY)
                            + density[sq_i * NY_1 + sq_j + 1] * (1 - (real_x - x) / HX) * ((real_y - y) / HY);

            phi += (dens_1 + dens_2 + dens_3 + dens_4) * jakob;
        }
    }

    phi = 0.25 * phi * mes;
    if (fabs(phi) < fabs(DBL_MIN_TRIM)) phi = 0;

    return phi;
}
Beispiel #10
0
static void
func_f(FLOAT x, FLOAT y, FLOAT z, FLOAT *value)
{
    func_u(x, y, z, value);
    *value = 12. * M_PI * M_PI * *value + a * *value;
}