44 size_t num_global_cells, struct
temp_cell * global_cells,
45 size_t num_global_vertices,
struct temp_corner * global_vertices,
46 size_t num_global_edges,
struct temp_edge * global_edges,
47 size_t num_local_cells,
size_t * local_cell_indices,
int with_halo) {
49 for (
size_t i = 0; i < num_global_cells; ++i) global_cells[i].
mask = 2;
50 for (
size_t i = 0; i < num_global_vertices; ++i) global_vertices[i].
mask = 2;
51 for (
size_t i = 0; i < num_global_edges; ++i) global_edges[i].
mask = 2;
53 for (
size_t i = 0; i < num_local_cells; ++i) {
54 struct temp_cell * curr_cell = global_cells + local_cell_indices[i];
56 for (
size_t j = 0; j < curr_cell->
num_corners; ++j) {
63 for (
size_t i = 0; i < num_global_cells; ++i) {
64 if (global_cells[i].
mask == 1)
continue;
66 for (
size_t j = 0; j < global_cells[i].num_corners; ++j)
67 if (global_vertices[global_cells[i].
data[j].corner_idx].
mask == 1)
70 global_cells[i].mask = 0;
71 for (
size_t j = 0; j < global_cells[i].num_corners; ++j) {
72 if (global_vertices[global_cells[i].
data[j].corner_idx].
mask == 2)
73 global_vertices[global_cells[i].data[j].corner_idx].
mask = 0;
74 if (global_edges[global_cells[i].
data[j].edge_idx].
mask == 2)
75 global_edges[global_cells[i].data[j].edge_idx].
mask = 0;
82 size_t num_vertices = 0;
84 size_t num_vertices_per_cell_sum = 0;
86 for (
size_t i = 0; i < num_global_cells; ++i) {
87 if (global_cells[i].
mask != 2) {
89 num_vertices_per_cell_sum += global_cells[i].num_corners;
92 for (
size_t i = 0; i < num_global_vertices; ++i)
93 if (global_vertices[i].
mask != 2) ++num_vertices;
94 for (
size_t i = 0; i < num_global_edges; ++i)
95 if (global_edges[i].
mask != 2) ++num_edges;
98 xmalloc(num_vertices *
sizeof(*vertex_coordinates));
100 yac_int * vertex_ids =
xmalloc(num_vertices *
sizeof(*vertex_ids));
103 int * core_vertex_mask =
xmalloc(num_vertices *
sizeof(*core_vertex_mask));
104 int * core_edge_mask =
xmalloc(num_edges *
sizeof(*core_edge_mask));
105 int * num_vertices_per_cell =
xmalloc(
num_cells *
sizeof(*num_vertices_per_cell));
106 int * num_cells_per_vertex =
xcalloc(num_vertices,
sizeof(*num_cells_per_vertex));
108 size_t * cell_to_vertex_offsets =
xmalloc(
num_cells *
sizeof(*cell_to_vertex_offsets));
109 size_t * cell_to_edge =
xmalloc(num_vertices_per_cell_sum *
sizeof(*cell_to_edge));;
110 size_t * cell_to_edge_offsets = cell_to_vertex_offsets;
111 size_t * vertex_to_cell =
xmalloc(num_vertices_per_cell_sum *
sizeof(*vertex_to_cell));
112 size_t * vertex_to_cell_offsets =
xmalloc((num_vertices+1) *
sizeof(*vertex_to_cell_offsets));
116 for (
size_t i = 0, j = 0; i < num_global_vertices; ++i) {
117 if (global_vertices[i].
mask != 2) {
118 global_vertices[i].
idx = j;
119 for (
int k = 0; k < 3; ++k)
120 vertex_coordinates[j][k] = global_vertices[i].coord[k];
121 vertex_ids[j] = global_vertices[i].
id;
122 core_vertex_mask[j] = global_vertices[i].
mask;
126 for (
size_t i = 0, j = 0; i < num_global_edges; ++i) {
127 if (global_edges[i].
mask != 2) {
128 global_edges[i].
idx = j;
129 edge_ids[j] = global_edges[i].
id;
130 core_edge_mask[j] = global_edges[i].
mask;
131 edge_type[j] = global_edges[i].
type;
132 edge_to_vertex[j][0] = global_vertices[global_edges[i].
vertex_idx[0]].
idx;
133 edge_to_vertex[j][1] = global_vertices[global_edges[i].
vertex_idx[1]].
idx;
137 for (
size_t i = 0, j = 0, l = 0; i < num_global_cells; ++i) {
138 if (global_cells[i].
mask != 2) {
139 cell_ids[j] = global_cells[i].id;
140 core_cell_mask[j] = global_cells[i].mask;
145 global_vertices[global_cells[i].data[k].corner_idx].
idx;
147 global_edges[global_cells[i].data[k].edge_idx].
idx;
153 for (
size_t i = 0, k = 0; i <
num_cells; ++i)
154 for (
int j = 0; j < num_vertices_per_cell[i]; ++j, ++k)
157 for (
size_t i = 0, accu = 0; i <
num_cells; ++i) {
158 cell_to_vertex_offsets[i] = accu;
159 accu += num_vertices_per_cell[i];
162 vertex_to_cell_offsets[0] = 0;
163 for (
size_t i = 0, accu = 0; i < num_vertices; ++i) {
164 vertex_to_cell_offsets[i+1] = accu;
165 accu += num_cells_per_vertex[i];
167 for (
size_t i = 0, k = 0; i <
num_cells; ++i)
168 for (
int j = 0; j < num_vertices_per_cell[i]; ++j, ++k)
169 vertex_to_cell[vertex_to_cell_offsets[
cell_to_vertex[k]+1]++] = i;
201 double const * global_coords_x,
double const * global_coords_y,
202 size_t const num_global_cells_[2],
size_t const local_start[2],
203 size_t const local_count[2],
int with_halo) {
205 size_t num_global_cells = num_global_cells_[0] * num_global_cells_[1];
206 size_t num_global_vertices =
207 (num_global_cells_[0] + 1) * (num_global_cells_[1] + 1);
208 size_t num_global_edges =
209 (num_global_cells_[0] + 1) * num_global_cells_[1] +
210 (num_global_cells_[1] + 1) * num_global_cells_[0];
213 xmalloc(4 * num_global_cells *
sizeof(*cell_data));
215 xmalloc(num_global_cells *
sizeof(*global_cells));
217 xmalloc(num_global_vertices *
sizeof(*global_corners));
219 xmalloc(num_global_edges *
sizeof(*global_edges));
221 for (
size_t i = 0; i < num_global_cells; ++i) {
223 struct temp_cell * curr_cell = global_cells + i;
226 curr_cell->
data = cell_data + 4 * i;
228 size_t y_index = i / num_global_cells_[0];
229 size_t x_index = i - y_index * num_global_cells_[0];
231 curr_cell->
data[0].
corner_idx = y_index * (num_global_cells_[0] + 1) + x_index;
232 curr_cell->
data[1].
corner_idx = y_index * (num_global_cells_[0] + 1) + x_index + 1;
233 curr_cell->
data[2].
corner_idx = (y_index + 1) * (num_global_cells_[0] + 1) + x_index + 1;
234 curr_cell->
data[3].
corner_idx = (y_index + 1) * (num_global_cells_[0] + 1) + x_index;
236 curr_cell->
data[0].
edge_idx = (2 * num_global_cells_[0] + 1) * y_index + 2 * x_index;
238 if (y_index+1 == num_global_cells_[1])
239 curr_cell->
data[2].
edge_idx = (2 * num_global_cells_[0] + 1) * (y_index + 1) + x_index;
244 for (
size_t i = 0; i < num_global_vertices; ++i) {
245 global_corners[i].
id = i;
246 size_t y_index = i / (num_global_cells_[0] + 1);
247 LLtoXYZ(global_coords_x[i - y_index * (num_global_cells_[0] + 1)],
248 global_coords_y[y_index], &(global_corners[i].coord[0]));
250 for (
size_t i = 0; i < num_global_edges; ++i) {
252 global_edges[i].
id = i;
254 size_t y_index = i / (2*num_global_cells_[0]+1);
255 size_t x_index = i - y_index * (2*num_global_cells_[0]+1);
256 if (y_index == num_global_cells_[1]) {
259 }
else if (x_index == 2*num_global_cells_[0]) {
264 x_index / 2 + y_index * (num_global_cells_[0] + 1);
266 global_edges[i].
vertex_idx[0] + 1 + ((x_index & 1)?num_global_cells_[0]:0);
269 size_t num_local_cells = local_count[0] * local_count[1];
270 size_t * local_cell_indices =
271 xmalloc(num_local_cells *
sizeof(*local_cell_indices));
272 for (
size_t i = 0, k = 0; i < local_count[1]; ++i)
273 for (
size_t j = 0; j < local_count[0]; ++j, ++k)
274 local_cell_indices[k] =
275 j + local_start[0] + (i + local_start[1]) * num_global_cells_[0];
279 num_global_cells, global_cells,
280 num_global_vertices, global_corners,
281 num_global_edges, global_edges,
282 num_local_cells, local_cell_indices,
with_halo);
284 free(local_cell_indices);
286 free(global_corners);
static struct yac_basic_grid_data generate_local_grid_data(size_t num_global_cells, struct temp_cell *global_cells, size_t num_global_vertices, struct temp_corner *global_vertices, size_t num_global_edges, struct temp_edge *global_edges, size_t num_local_cells, size_t *local_cell_indices, int with_halo)