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; }
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; }
__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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }