/* *************************************************************** */ N_les *create_solve_les(N_geom_data * geom, N_solute_transport_data2d * data, N_les_callback_2d * call, const char *solver, int maxit, double error, double sor) { N_les *les; /*assemble the linear equation system */ if (param.full_les->answer) les = N_assemble_les_2d(N_NORMAL_LES, geom, data->status, data->c, (void *)data, call); else les = N_assemble_les_2d(N_SPARSE_LES, geom, data->status, data->c, (void *)data, call); /*solve the equation system */ if (strcmp(solver, G_MATH_SOLVER_ITERATIVE_JACOBI) == 0) { if (!param.full_les->answer) G_math_solver_sparse_jacobi(les->Asp, les->x, les->b, les->rows, maxit, sor, error); else G_math_solver_jacobi(les->A, les->x, les->b, les->rows, maxit, sor, error); } if (strcmp(solver, G_MATH_SOLVER_ITERATIVE_SOR) == 0) { if (!param.full_les->answer) G_math_solver_sparse_gs(les->Asp, les->x, les->b, les->rows, maxit, sor, error); else G_math_solver_gs(les->A, les->x, les->b, les->rows, maxit, sor, error); } if (strcmp(solver, G_MATH_SOLVER_ITERATIVE_BICGSTAB) == 0) { if (!param.full_les->answer) G_math_solver_sparse_bicgstab(les->Asp, les->x, les->b, les->rows, maxit, error); else G_math_solver_bicgstab(les->A, les->x, les->b, les->rows, maxit, error); } if (strcmp(solver, G_MATH_SOLVER_DIRECT_LU) == 0) G_math_solver_lu(les->A, les->x, les->b, les->rows); if (strcmp(solver, G_MATH_SOLVER_DIRECT_GAUSS) == 0) G_math_solver_gauss(les->A, les->x, les->b, les->rows); if (les == NULL) G_fatal_error(_("Could not create and solve the linear equation system")); return les; }
/* *************************************************************** */ int test_matrix_assemble_2d(void) { N_geom_data *geom; N_les *les; N_les_callback_2d *call; N_array_2d *status; N_array_2d *start_val; /*set the callback to default */ call = N_alloc_les_callback_2d(); status = create_status_array_2d(); start_val = create_value_array_2d(); geom = N_alloc_geom_data(); geom->dx = 1; geom->dy = 1; geom->Az = 1; geom->rows = TEST_N_NUM_ROWS; geom->cols = TEST_N_NUM_COLS; /*Assemble the matrix */ les = N_assemble_les_2d(N_SPARSE_LES, geom, status, start_val, NULL, call); N_free_les(les); les = N_assemble_les_2d_active(N_SPARSE_LES, geom, status, start_val, NULL, call); N_free_les(les); les = N_assemble_les_2d_dirichlet(N_SPARSE_LES, geom, status, start_val, NULL, call); N_les_integrate_dirichlet_2d(les, geom, status, start_val); N_free_les(les); les = N_assemble_les_2d(N_NORMAL_LES, geom, status, start_val, NULL, call); N_free_les(les); les = N_assemble_les_2d_active(N_NORMAL_LES, geom, status, start_val, NULL, call); N_free_les(les); les = N_assemble_les_2d_dirichlet(N_NORMAL_LES, geom, status, start_val, NULL, call); N_les_integrate_dirichlet_2d(les, geom, status, start_val); N_free_les(les); G_free(geom); G_free(call); return 0; }
/* *************************************************************** */ int test_solute_transport_2d(void) { N_solute_transport_data2d *data = NULL; N_geom_data *geom = NULL; N_les *les = NULL; N_les_callback_2d *call = NULL; N_array_2d *pot, *relax = NULL; N_gradient_field_2d *field = NULL; int i, j; /*set the callback */ call = N_alloc_les_callback_2d(); N_set_les_callback_2d_func(call, (*N_callback_solute_transport_2d)); pot = N_alloc_array_2d(TEST_N_NUM_COLS_LOCAL, TEST_N_NUM_ROWS_LOCAL, 1, DCELL_TYPE); relax = N_alloc_array_2d(TEST_N_NUM_COLS_LOCAL, TEST_N_NUM_ROWS_LOCAL, 1, DCELL_TYPE); data = create_solute_transport_data_2d(); data->dt = 600; geom = N_alloc_geom_data(); geom->dx = 10; geom->dy = 15; geom->Az = 150; geom->rows = TEST_N_NUM_ROWS_LOCAL; geom->cols = TEST_N_NUM_COLS_LOCAL; for (j = 0; j < TEST_N_NUM_ROWS_LOCAL; j++) { for (i = 0; i < TEST_N_NUM_COLS_LOCAL; i++) { N_put_array_2d_d_value(pot, i, j, j); N_put_array_2d_d_value(relax, i, j, 1); } } field = N_compute_gradient_field_2d(pot, relax, relax, geom, NULL); N_copy_gradient_field_2d(field, data->grad); N_free_gradient_field_2d(field); N_compute_gradient_field_2d(pot, relax, relax, geom, data->grad); /*The dispersivity tensor */ N_calc_solute_transport_disptensor_2d(data); /*Assemble the matrix */ /* */ /*Jacobi */ les = N_assemble_les_2d(N_SPARSE_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_jacobi(les, 100, 1, 0.1e-8); N_print_les(les); N_free_les(les); /*jacobi */ les = N_assemble_les_2d(N_NORMAL_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_jacobi(les, 100, 1, 0.1e-8); N_print_les(les); N_free_les(les); /*SOR*/ les = N_assemble_les_2d(N_SPARSE_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_SOR(les, 100, 1, 0.1e-8); N_print_les(les); N_free_les(les); /*SOR*/ les = N_assemble_les_2d(N_NORMAL_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_SOR(les, 100, 1, 0.1e-8); N_print_les(les); N_free_les(les); /*BICG*/ les = N_assemble_les_2d(N_SPARSE_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_bicgstab(les, 100, 0.1e-8); N_print_les(les); N_free_les(les); /*BICG*/ les = N_assemble_les_2d(N_NORMAL_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_bicgstab(les, 100, 0.1e-8); N_print_les(les); N_free_les(les); /*GAUSS*/ les = N_assemble_les_2d(N_NORMAL_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_gauss(les); N_print_les(les); N_free_les(les); /*LU*/ les = N_assemble_les_2d(N_NORMAL_LES, geom, data->status, data->c_start, (void *)data, call); N_solver_lu(les); N_print_les(les); N_free_les(les); N_free_solute_transport_data2d(data); G_free(geom); G_free(call); return 0; }