void jacobi(field solution, int stencil, int Nx, int Ny, double eps, int max_iter, int *iterations, double *diff) { int x, y, niter; field v = field_alloc(Ny, Nx); // kann nicht parallelisiert werden, weil // - spätere Schleifeniterationen von Daten abhängen, die bei früheren // Iterationen erst berechnet werden müssen // - das if break eine parallelisierung nicht erlaubt // - jacobi(...) ohnehin schon parallelisiert ist und eine weitere // Verzweigung nicht möglich ist. for (niter = 1; niter <= max_iter; niter++) { // omp ist eigentlich ein overkill, wenn memcpy(...) es auch getan hätte. #pragma omp parallel for private(x) for (y = 0; y <= Ny + 1; y++) { for (x = 0; x <= Nx + 1; x++) { v[y][x] = solution[y][x]; } } switch (stencil) { case 5: jacobi5(solution, v, Nx, Ny, diff); break; case 9: jacobi9(solution, v, Nx, Ny, diff); break; default: die("unknown stencil"); break; } if (*diff < eps) break; } *iterations = niter; field_free(v); }
void check_exported_data(const char * exported_file, const char * init_file, field_file_format_type file_type, const field_config_type * field_config, const field_type * field, int nx, int ny, int nz) { FILE * original_stream = NULL; ecl_kw_type * kw_original = NULL; FILE * exported_stream = NULL; ecl_kw_type * kw_exported = NULL; field_type * exported_field = NULL; field_config_type * exported_field_config = NULL; { if (init_file) { original_stream = util_fopen( init_file , "r"); kw_original = ecl_kw_fscanf_alloc_grdecl_dynamic( original_stream , field_config_get_key(field_config) , ECL_DOUBLE_TYPE ); } if (ECL_GRDECL_FILE == file_type) { exported_stream = util_fopen( exported_file , "r"); kw_exported = ecl_kw_fscanf_alloc_grdecl_dynamic( exported_stream , field_config_get_key(field_config) , ECL_DOUBLE_TYPE ); } else if (RMS_ROFF_FILE == file_type) { ecl_grid_type * grid = field_config_get_grid(field_config); exported_field_config = field_config_alloc_empty(field_config_get_key(field_config), grid, NULL, true); exported_field = field_alloc(exported_field_config); bool keep_inactive = true; field_fload_rms(exported_field, exported_file, keep_inactive); } } { int k, j, i = 0; for (k=0; k < nz; k++) { for (j=0; j < ny; j++) { for (i=0; i < nx; i++) { bool active = field_config_active_cell(field_config, i, j, k); double field_value = active ? field_ijk_get_double(field, i, j, k) : 0.0; int global_index = field_config_global_index(field_config , i , j , k); double exported_value = 0.0; if (ECL_GRDECL_FILE == file_type) exported_value = ecl_kw_iget_as_double(kw_exported, global_index); else if (RMS_ROFF_FILE == file_type) { exported_value = field_ijk_get_double(exported_field, i, j, k); } double initial_value = init_file ? ecl_kw_iget_as_double(kw_original, global_index) : 0.0; if (active) test_assert_double_equal(field_value, exported_value); else if (init_file) test_assert_double_equal(initial_value, exported_value); else if (file_type == RMS_ROFF_FILE) test_assert_double_equal(RMS_INACTIVE_DOUBLE, exported_value); else test_assert_double_equal(0.0, exported_value); } } } } if (init_file) { util_fclose(original_stream); ecl_kw_free(kw_original); } if (ECL_GRDECL_FILE == file_type) { util_fclose(exported_stream); ecl_kw_free(kw_exported); } else field_free(exported_field); }