Пример #1
0
/* *************************************************************** */
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;
}
Пример #2
0
/* *************************************************************** */
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;
}
Пример #3
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;
}