YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
grid_reg2d_common.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include "grid_reg2d_common.h"
6#include "utils_common.h"
7
9 size_t nbr_vertices[2], int cyclic[2]) {
10
12 !cyclic[1],
13 "ERROR(yac_generate_basic_grid_data_reg2d_common): "
14 "grids that are cyclic in the y direction are not yet supported")
15
16 size_t num_cells_2d[2] =
17 {nbr_vertices[0] - ((cyclic[0])?0:1), nbr_vertices[1] - 1};
18 size_t num_vertices_2d[2] = {num_cells_2d[0] + ((cyclic[0])?0:1),
19 num_cells_2d[1] + 1};
20 size_t num_cells = num_cells_2d[0] * num_cells_2d[1];
21 size_t num_vertices = num_vertices_2d[0] * num_vertices_2d[1];
22 size_t num_edges =
23 (num_cells_2d[1] + 1) * num_cells_2d[0] +
24 (num_cells_2d[0] + ((cyclic[0])?0:1)) * num_cells_2d[1];
25
28 for (size_t i = 0; i < num_cells; ++i) num_vertices_per_cell[i] = 4;
29
32 for (size_t i = 0; i < num_vertices; ++i) num_cells_per_vertex[i] = 4;
33 if (!cyclic[0]) {
34 for (size_t i = 0, j = num_vertices - num_vertices_2d[0];
35 i < num_vertices_2d[0]; ++i, ++j) {
38 }
39 for (size_t i = 0, j = num_vertices_2d[0] - 1;
40 i < num_vertices; i+=num_vertices_2d[0], j+=num_vertices_2d[0]) {
43 }
45 num_cells_per_vertex[num_vertices_2d[0] - 1] = 1;
46 num_cells_per_vertex[num_vertices - num_vertices_2d[0]] = 1;
48 } else {
49 for (size_t i = 0, j = num_vertices - num_vertices_2d[0];
50 i < num_vertices_2d[0]; ++i, ++j) {
53 }
54 }
55
56 size_t * cell_to_vertex = xmalloc(4 * num_cells * sizeof(*cell_to_vertex));
57 size_t * cell_to_vertex_offsets =
59 if (!cyclic[0]) {
60 for (size_t i = 0, k = 0; i < num_cells_2d[1]; ++i) {
61 size_t temp_cell_to_vertex[4] =
62 {i * num_vertices_2d[0],
63 i * num_vertices_2d[0] + 1,
64 (i + 1) * num_vertices_2d[0] + 1,
65 (i + 1) * num_vertices_2d[0]};
66 for (size_t j = 0; j < num_cells_2d[0]; ++j)
67 for (size_t l = 0; l < 4; ++l, ++k)
68 cell_to_vertex[k] = temp_cell_to_vertex[l] + j;
69 }
70 } else {
71 size_t temp_cell_to_vertex[4] =
72 {0, 1, num_vertices_2d[0] + 1, num_vertices_2d[0]};
73 for (size_t i = 0, k = 0, m = 0; i < num_cells_2d[1]; ++i)
74 for (size_t j = 0; j < num_cells_2d[0]; ++j, ++m)
75 for (int l = 0; l < 4; ++l, ++k)
76 cell_to_vertex[k] = temp_cell_to_vertex[l] + m;
77 for (size_t i = 0; i < num_cells_2d[1]; ++i) {
78 cell_to_vertex[4*((i+1)*num_cells_2d[0]-1)+1] = i * num_cells_2d[0];
79 cell_to_vertex[4*((i+1)*num_cells_2d[0]-1)+2] = (i + 1) * num_cells_2d[0];
80 }
81 }
82
83 for (size_t i = 0; i < num_cells; ++i) cell_to_vertex_offsets[i] = 4 * i;
84
85 size_t * cell_to_edge = xmalloc(4 * num_cells * sizeof(*cell_to_edge));
86 if (!cyclic[0]) {
87 for (size_t i = 0, k = 0; i < num_cells_2d[1]; ++i) {
88 size_t edge_id_offset = (2 * num_cells_2d[0] + 1);
89 size_t edge_id = i * edge_id_offset;
90 for (size_t j = 0; j < num_cells_2d[0]; ++j, k += 4, edge_id += 2) {
91
92 cell_to_edge[k+0] = edge_id;
93 cell_to_edge[k+1] = edge_id + 3;
94 cell_to_edge[k+2] = edge_id + edge_id_offset;
95 cell_to_edge[k+3] = edge_id + 1;
96 }
97 }
98 for (size_t i = num_edges - num_cells_2d[0],
99 j = 4 * num_cells_2d[0] * (num_cells_2d[1] - 1) + 2;
100 i < num_edges; ++i, j += 4) cell_to_edge[j] = i;
101 for (size_t i = 0, j = 4 * (num_cells_2d[0] - 1) + 1;
102 i < num_cells_2d[1]; ++i, j += 4 * num_cells_2d[0])
103 cell_to_edge[j]--;
104 } else {
105 size_t edge_id_offset = 2 * num_cells_2d[0];
106 for (size_t i = 0, k = 0; i < num_cells_2d[1]; ++i) {
107 size_t edge_id = i * edge_id_offset + 1;
108 for (size_t j = 0; j < num_cells_2d[0]; ++j, k += 4, edge_id += 2) {
109
110 cell_to_edge[k+0] = edge_id;
111 cell_to_edge[k+1] = edge_id + 3;
112 cell_to_edge[k+2] = edge_id + edge_id_offset;
113 cell_to_edge[k+3] = edge_id + 1;
114 }
115 }
116 for (size_t i = 0; i < num_cells_2d[1]; ++i) {
117 cell_to_edge[4*i*num_cells_2d[0]+0]--;
118 cell_to_edge[4*i*num_cells_2d[0]+2]--;
119 cell_to_edge[4*((i+1)*num_cells_2d[0]-2)+1]--;
120 }
121 for (size_t i = 0, * curr_cell_to_edge; i < num_cells_2d[1]; ++i) {
122 curr_cell_to_edge = &cell_to_edge[4*((i+1)*num_cells_2d[0]-1)];
123 size_t edge_id = 1 + i * edge_id_offset;
124 curr_cell_to_edge[0] = edge_id;
125 curr_cell_to_edge[1] = edge_id + 1;
126 curr_cell_to_edge[2] = edge_id + edge_id_offset;
127 curr_cell_to_edge[3] = edge_id + edge_id_offset - 2;
128 }
129 for (size_t i = 0,
130 * curr_edge = cell_to_edge + 4 * (num_cells - num_cells_2d[0] + 1) + 2,
131 edge_id = 2 * (num_cells_2d[0] * num_cells_2d[1] + 1);
132 i < num_cells_2d[0] - 2; ++i, curr_edge += 4, ++edge_id) {
133 *curr_edge = edge_id;
134 }
135 }
136
137 size_t vertex_to_cell_size;
138 size_t * vertex_to_cell;
139 if (!cyclic[0]) {
140 vertex_to_cell_size =
141 4 * 1 + // 4 corners with 1 cell per vertex
142 2 * 2 * (num_cells_2d[0] - 1) + // lower and upper edge with 2 cells per vertex
143 2 * 2 * (num_cells_2d[1] - 1) + // 2 side edges with 2 cells per vertex
144 4 * (num_cells_2d[0] - 1) * (num_cells_2d[1] - 1); // core vertices
146 xmalloc(vertex_to_cell_size * sizeof(*vertex_to_cell));
147 size_t offset = 0;
148 vertex_to_cell[offset++] = 0;
149 for (size_t i = 0; i < num_cells_2d[0] - 1; ++i) {
150 vertex_to_cell[offset++] = i;
151 vertex_to_cell[offset++] = i + 1;
152 }
153 vertex_to_cell[offset++] = num_cells_2d[0] - 1;
154 for (size_t i = 0, cell_idx = 0; i < num_cells_2d[1] - 1; ++i) {
155
156 vertex_to_cell[offset++] = cell_idx;
157 vertex_to_cell[offset++] = cell_idx + num_cells_2d[0];
158 for (size_t j = 0; j < num_cells_2d[0] - 1; ++j, ++cell_idx) {
159 vertex_to_cell[offset++] = cell_idx;
160 vertex_to_cell[offset++] = cell_idx + 1;
161 vertex_to_cell[offset++] = cell_idx + num_cells_2d[0];
162 vertex_to_cell[offset++] = cell_idx + num_cells_2d[0] + 1;
163 }
164 vertex_to_cell[offset++] = cell_idx;
165 vertex_to_cell[offset++] = cell_idx + num_cells_2d[0];
166 ++cell_idx;
167 }
168 vertex_to_cell[offset++] = num_cells - num_cells_2d[0];
169 for (size_t i = num_cells - num_cells_2d[0]; i < num_cells - 1; ++i) {
170 vertex_to_cell[offset++] = i;
171 vertex_to_cell[offset++] = i + 1;
172 }
173 vertex_to_cell[offset++] = num_cells - 1;
174 } else {
175 vertex_to_cell_size = 4 * (num_vertices - num_vertices_2d[0]);
177 xmalloc(vertex_to_cell_size * sizeof(*vertex_to_cell));
178
179 size_t offset = 0;
180 for (size_t i = 0; i < num_cells_2d[0]; ++i) {
181 vertex_to_cell[offset++] = i - 1;
182 vertex_to_cell[offset++] = i;
183 }
184 vertex_to_cell[0] = num_cells_2d[0] - 1;
185
186 size_t vertex_idx = 0;
187 for (size_t i = 0; i < num_cells_2d[1] - 1; ++i) {
188 for (size_t j = 0; j < num_cells_2d[0]; ++j, ++vertex_idx) {
189 vertex_to_cell[offset++] = vertex_idx - 1;
190 vertex_to_cell[offset++] = vertex_idx;
191 vertex_to_cell[offset++] = vertex_idx + num_cells_2d[0];
192 vertex_to_cell[offset++] = vertex_idx + num_cells_2d[0] - 1;
193 }
194 vertex_to_cell[offset - 4 * num_cells_2d[0]] = (vertex_idx - 1);
195 vertex_to_cell[offset - 4 * num_cells_2d[0] + 3] =
196 vertex_idx - 1 + num_cells_2d[0];
197 }
198
199 for (size_t i = 0; i < num_cells_2d[0]; ++i, ++vertex_idx) {
200 vertex_to_cell[offset++] = vertex_idx - 1;
201 vertex_to_cell[offset++] = vertex_idx;
202 }
203 vertex_to_cell[offset - 2 * num_cells_2d[0]] = (vertex_idx - 1);
204 }
205
206 size_t * vertex_to_cell_offsets =
208 for (size_t i = 0, accu = 0; i < num_vertices; ++i) {
209 vertex_to_cell_offsets[i] = accu;
210 accu += num_cells_per_vertex[i];
211 }
212
214 xmalloc(num_edges * sizeof(*edge_to_vertex));
215 if (!cyclic[0]) {
216 for (size_t i = 0, k = 0, vertex_idx = 0; i < num_cells_2d[1]; ++i) {
217 for (size_t j = 0; j < num_cells_2d[0]; ++j, k += 2, ++vertex_idx) {
218 edge_to_vertex[k][0] = vertex_idx;
219 edge_to_vertex[k][1] = vertex_idx + 1;
220 edge_to_vertex[k+1][0] = vertex_idx;
221 edge_to_vertex[k+1][1] = vertex_idx + num_vertices_2d[0];
222 }
223 edge_to_vertex[k][0] = vertex_idx + num_vertices_2d[0];
224 edge_to_vertex[k][1] = vertex_idx;
225 ++vertex_idx;
226 ++k;
227 }
228 for (size_t i = num_edges - num_cells_2d[0],
229 vertex_idx = num_vertices - num_vertices_2d[0]; i < num_edges;
230 ++i, ++vertex_idx) {
231 edge_to_vertex[i][0] = vertex_idx;
232 edge_to_vertex[i][1] = vertex_idx + 1;
233 }
234 } else {
235 for (size_t i = 1, vertex_idx = 0;
236 i < 2 * num_cells_2d[0] * num_cells_2d[1]; i += 2, ++vertex_idx) {
237 edge_to_vertex[i][0] = vertex_idx;
238 edge_to_vertex[i][1] = vertex_idx + 1;
239 edge_to_vertex[i+1][0] = vertex_idx;
240 edge_to_vertex[i+1][1] = vertex_idx + num_vertices_2d[0];
241 }
242 for (size_t i = 0; i <= num_cells_2d[1]; ++i) {
243 edge_to_vertex[2*i*num_cells_2d[0]][0] = i * num_cells_2d[0];
244 edge_to_vertex[2*i*num_cells_2d[0]][1] = i * num_cells_2d[0] + 1;
245 edge_to_vertex[2*i*num_cells_2d[0]+1][0] = i * num_cells_2d[0];
246 edge_to_vertex[2*i*num_cells_2d[0]+1][1] = (i + 1) * num_cells_2d[0]-1;
247 }
248 for (size_t i = 1; i <= num_cells_2d[1]; ++i) {
249 edge_to_vertex[2*i*num_cells_2d[0]-1][0] = i * num_cells_2d[0] - 1;
250 edge_to_vertex[2*i*num_cells_2d[0]-1][1] = (i + 1) * num_cells_2d[0] - 1;
251 }
252 for (size_t i = 2; i < num_cells_2d[0]; ++i) {
253 edge_to_vertex[2*num_cells_2d[0]*num_cells_2d[1]+i][0] =
254 num_cells_2d[0]*num_cells_2d[1]+i-1;
255 edge_to_vertex[2*num_cells_2d[0]*num_cells_2d[1]+i][1] =
256 num_cells_2d[0]*num_cells_2d[1]+i;
257 }
258 }
259
260 struct yac_basic_grid_data grid;
261 grid.vertex_coordinates = NULL;
262 grid.cell_ids = NULL;
263 grid.vertex_ids = NULL;
264 grid.edge_ids = NULL;
265 grid.num_cells = num_cells;
267 grid.num_edges = num_edges;
268 grid.core_cell_mask = NULL;
269 grid.core_vertex_mask = NULL;
270 grid.core_edge_mask = NULL;
280 grid.edge_type = NULL;
284 return grid;
285}
struct yac_basic_grid_data yac_generate_basic_grid_data_reg2d_common(size_t nbr_vertices[2], int cyclic[2])
#define xmalloc(size)
Definition ppm_xfuncs.h:66
yac_coordinate_pointer vertex_coordinates
size_t * vertex_to_cell_offsets
yac_size_t_2_pointer edge_to_vertex
enum yac_edge_type * edge_type
size_t * cell_to_vertex_offsets
#define YAC_ASSERT(exp, msg)
Definition yac_assert.h:15
size_t(* yac_size_t_2_pointer)[2]
Definition yac_types.h:23