17 static void free_cubehead(
Cube_head *cubehead,
int voxn);
61 static void transform_face_node_351(
int face,
int node[4]) {
98 double x,
double y,
double z,
int elem_ID,
102 double coord_x, coord_y, coord_z;
117 coord_y =
mesh->
node[nodeID * 3 + 1];
118 coord_z =
mesh->
node[nodeID * 3 + 2];
119 v_data[j] = node1[nodeID];
121 dist[j] = (x - coord_x) * (x - coord_x) + (y - coord_y) * (y - coord_y) +
122 (z - coord_z) * (z - coord_z);
128 if (return_flag == 0) {
135 if (j != k) coef[j] = coef[j] * dist[k];
142 *field = *field + v_data[j] * coef[j] / sum_coef;
148 static int judge_inner_voxel_361(
double vv[
MAX_N_NODE * 3],
double point[3]) {
149 double fp[4][3], n_f[3], cen_point[3], sign_f, sign_p, f_cen_point[3], c_c[3],
151 double n_norm, n_c, n_p;
152 int i, j, m, inside, node[4];
155 for (j = 0; j < 3; j++) {
157 for (i = 0; i < 8; i++) cen_point[j] += vv[i * 3 + j];
162 for (m = 0; m < 6; m++) {
164 for (j = 0; j < 3; j++)
165 for (i = 0; i < 4; i++) {
166 fp[i][j] = vv[node[i] * 3 + j];
169 n_f[0] = (fp[1][1] - fp[0][1]) * (fp[3][2] - fp[0][2]) -
170 (fp[3][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
171 n_f[1] = -(fp[1][0] - fp[0][0]) * (fp[3][2] - fp[0][2]) +
172 (fp[3][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
173 n_f[2] = (fp[1][0] - fp[0][0]) * (fp[3][1] - fp[0][1]) -
174 (fp[3][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
175 n_norm = sqrt(n_f[0] * n_f[0] + n_f[1] * n_f[1] + n_f[2] * n_f[2]);
177 for (j = 0; j < 3; j++) n_f[j] /= n_norm;
180 for (j = 0; j < 3; j++)
181 f_cen_point[j] = (fp[0][j] + fp[1][j] + fp[2][j] + fp[3][j]) / 4.0;
182 for (j = 0; j < 3; j++) c_c[j] = cen_point[j] - f_cen_point[j];
183 n_c = sqrt(c_c[0] * c_c[0] + c_c[1] * c_c[1] + c_c[2] * c_c[2]);
185 for (j = 0; j < 3; j++) c_c[j] /= n_c;
187 sign_f = n_f[0] * c_c[0] + n_f[1] * c_c[1] + n_f[2] * c_c[2];
189 for (j = 0; j < 3; j++) n_f[j] = -n_f[j];
191 for (j = 0; j < 3; j++) p_c[j] = point[j] - f_cen_point[j];
192 n_p = sqrt(p_c[0] * p_c[0] + p_c[1] * p_c[1] + p_c[2] * p_c[2]);
194 for (j = 0; j < 3; j++) p_c[j] /= n_p;
196 sign_p = p_c[0] * n_f[0] + p_c[1] * n_f[1] + p_c[2] * n_f[2];
205 static int judge_inner_voxel_351(
double vv[
MAX_N_NODE * 3],
double point[3]) {
206 double fp[4][3], n_f[3], cen_point[3], sign_f, sign_p, f_cen_point[3], c_c[3],
208 double n_norm, n_c, n_p;
209 int i, j, m, inside, node[4];
212 for (j = 0; j < 3; j++) {
214 for (i = 0; i < 6; i++) cen_point[j] += vv[i * 3 + j];
219 for (m = 0; m < 3; m++) {
220 transform_face_node_351(m, node);
221 for (j = 0; j < 3; j++)
222 for (i = 0; i < 4; i++) {
223 fp[i][j] = vv[node[i] * 3 + j];
226 n_f[0] = (fp[1][1] - fp[0][1]) * (fp[3][2] - fp[0][2]) -
227 (fp[3][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
228 n_f[1] = -(fp[1][0] - fp[0][0]) * (fp[3][2] - fp[0][2]) +
229 (fp[3][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
230 n_f[2] = (fp[1][0] - fp[0][0]) * (fp[3][1] - fp[0][1]) -
231 (fp[3][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
232 n_norm = sqrt(n_f[0] * n_f[0] + n_f[1] * n_f[1] + n_f[2] * n_f[2]);
234 for (j = 0; j < 3; j++) n_f[j] /= n_norm;
237 for (j = 0; j < 3; j++)
238 f_cen_point[j] = (fp[0][j] + fp[1][j] + fp[2][j] + fp[3][j]) / 4.0;
239 for (j = 0; j < 3; j++) c_c[j] = cen_point[j] - f_cen_point[j];
240 n_c = sqrt(c_c[0] * c_c[0] + c_c[1] * c_c[1] + c_c[2] * c_c[2]);
242 for (j = 0; j < 3; j++) c_c[j] /= n_c;
244 sign_f = n_f[0] * c_c[0] + n_f[1] * c_c[1] + n_f[2] * c_c[2];
246 for (j = 0; j < 3; j++) n_f[j] = -n_f[j];
248 for (j = 0; j < 3; j++) p_c[j] = point[j] - f_cen_point[j];
249 n_p = sqrt(p_c[0] * p_c[0] + p_c[1] * p_c[1] + p_c[2] * p_c[2]);
251 for (j = 0; j < 3; j++) p_c[j] /= n_p;
253 sign_p = p_c[0] * n_f[0] + p_c[1] * n_f[1] + p_c[2] * n_f[2];
259 for (m = 3; m < 5; m++) {
260 for (j = 0; j < 3; j++)
261 for (i = 0; i < 3; i++) {
262 fp[i][j] = vv[node[i] * 3 + j];
265 n_f[0] = (fp[1][1] - fp[0][1]) * (fp[2][2] - fp[0][2]) -
266 (fp[2][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
267 n_f[1] = -(fp[1][0] - fp[0][0]) * (fp[2][2] - fp[0][2]) +
268 (fp[2][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
269 n_f[2] = (fp[1][0] - fp[0][0]) * (fp[2][1] - fp[0][1]) -
270 (fp[2][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
271 n_norm = sqrt(n_f[0] * n_f[0] + n_f[1] * n_f[1] + n_f[2] * n_f[2]);
273 for (j = 0; j < 3; j++) n_f[j] /= n_norm;
276 for (j = 0; j < 3; j++)
277 f_cen_point[j] = (fp[0][j] + fp[1][j] + fp[2][j]) / 3.0;
278 for (j = 0; j < 3; j++) c_c[j] = cen_point[j] - f_cen_point[j];
279 n_c = sqrt(c_c[0] * c_c[0] + c_c[1] * c_c[1] + c_c[2] * c_c[2]);
281 for (j = 0; j < 3; j++) c_c[j] /= n_c;
283 sign_f = n_f[0] * c_c[0] + n_f[1] * c_c[1] + n_f[2] * c_c[2];
285 for (j = 0; j < 3; j++) n_f[j] = -n_f[j];
287 for (j = 0; j < 3; j++) p_c[j] = point[j] - f_cen_point[j];
288 n_p = sqrt(p_c[0] * p_c[0] + p_c[1] * p_c[1] + p_c[2] * p_c[2]);
290 for (j = 0; j < 3; j++) p_c[j] /= n_p;
292 sign_p = p_c[0] * n_f[0] + p_c[1] * n_f[1] + p_c[2] * n_f[2];
302 static int judge_inner_voxel_341(
double vv[
MAX_N_NODE * 3],
double point[3]) {
303 double fp[4][3], n_f[3], cen_point[3], sign_f, sign_p, f_cen_point[3], c_c[3],
305 double n_norm, n_c, n_p;
306 int i, j, m, inside, node[4];
309 for (j = 0; j < 3; j++) {
311 for (i = 0; i < 4; i++) cen_point[j] += vv[i * 3 + j];
316 for (m = 0; m < 4; m++) {
335 for (j = 0; j < 3; j++)
336 for (i = 0; i < 3; i++) {
337 fp[i][j] = vv[node[i] * 3 + j];
340 n_f[0] = (fp[1][1] - fp[0][1]) * (fp[2][2] - fp[0][2]) -
341 (fp[2][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
342 n_f[1] = -(fp[1][0] - fp[0][0]) * (fp[2][2] - fp[0][2]) +
343 (fp[2][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
344 n_f[2] = (fp[1][0] - fp[0][0]) * (fp[2][1] - fp[0][1]) -
345 (fp[2][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
346 n_norm = sqrt(n_f[0] * n_f[0] + n_f[1] * n_f[1] + n_f[2] * n_f[2]);
348 for (j = 0; j < 3; j++) n_f[j] /= n_norm;
351 for (j = 0; j < 3; j++)
352 f_cen_point[j] = (fp[0][j] + fp[1][j] + fp[2][j]) / 3.0;
353 for (j = 0; j < 3; j++) c_c[j] = cen_point[j] - f_cen_point[j];
354 n_c = sqrt(c_c[0] * c_c[0] + c_c[1] * c_c[1] + c_c[2] * c_c[2]);
356 for (j = 0; j < 3; j++) c_c[j] /= n_c;
358 sign_f = n_f[0] * c_c[0] + n_f[1] * c_c[1] + n_f[2] * c_c[2];
360 for (j = 0; j < 3; j++) n_f[j] = -n_f[j];
362 for (j = 0; j < 3; j++) p_c[j] = point[j] - f_cen_point[j];
363 n_p = sqrt(p_c[0] * p_c[0] + p_c[1] * p_c[1] + p_c[2] * p_c[2]);
365 for (j = 0; j < 3; j++) p_c[j] /= n_p;
367 sign_p = p_c[0] * n_f[0] + p_c[1] * n_f[1] + p_c[2] * n_f[2];
404 int *empty_flag,
double *var)
412 int m1, m2, n1, n2, n3, m;
413 int nx, ny, nz, flag;
414 int i1, j1, k1, i2, j2, k2;
415 double dx, dy, dz, minx, miny, minz, maxx, maxy, maxz, x, y, z;
419 int vox_id, point_num;
428 for (i = 0; i < n_voxel; i++) {
433 for (m1 = 0; m1 < n_voxel; m1++)
437 ny =
level[m1 * 3 + 1];
438 nz =
level[m1 * 3 + 2];
454 if ((
extent[i * 6] > maxx) || (
extent[i * 6 + 1] < minx) ||
455 (
extent[i * 6 + 2] > maxy) || (
extent[i * 6 + 3] < miny) ||
456 (
extent[i * 6 + 4] > maxz) || (
extent[i * 6 + 5] < minz))
466 if (i1 > nx) i1 = i2 + 1;
468 if (j1 > ny) j1 = j2 + 1;
470 if (k1 > nz) k1 = k2 + 1;
471 if (i2 < 0) i2 = i1 - 1;
472 if (i2 > nx) i2 = nx;
473 if (j2 < 0) j2 = j1 - 1;
474 if (j2 > ny) j2 = ny;
475 if (k2 < 0) k2 = k1 - 1;
476 if (k2 > nz) k2 = nz;
477 for (n3 = k1; n3 <= k2; n3++)
478 for (n2 = j1; n2 <= j2; n2++)
479 for (n1 = i1; n1 <= i2; n1++) {
492 m < mesh->elem_node_index[i + 1]; m++) {
503 inside = judge_inner_voxel_361(vv, in_point);
506 inside = judge_inner_voxel_341(vv, in_point);
509 inside = judge_inner_voxel_351(vv, in_point);
522 value2_compute(
mesh, node1, x, y, z, i, &field);
571 for (m1 = 0; m1 < n_voxel; m1++) {
572 pe_id = m1 % pe_size;
577 if (pe_id != my_rank) {
578 if (cubehead[m1].point_num == 0) {
587 }
else if (cubehead[m1].point_num > 0) {
588 code = (
int *)
HECMW_calloc(3 * cubehead[m1].point_num,
sizeof(
int));
589 value = (
double *)
HECMW_calloc(cubehead[m1].point_num,
sizeof(
double));
590 if ((code ==
NULL) || (value ==
NULL))
593 for (i = 0; i < cubehead[m1].
point_num; i++) {
594 for (j = 0; j < 3; j++) code[i * 3 + j] = p1->
code[j];
595 value[i] = p1->
field;
617 else if (pe_id == my_rank) {
627 ny =
level[m1 * 3 + 1];
628 nz =
level[m1 * 3 + 2];
633 for (i = 0; i < (nx + 1) * (ny + 1) * (nz + 1); i++) empty_flag[i] = 0;
635 if (cubehead[m1].point_num > 0) {
637 for (i = 0; i < cubehead[m1].
point_num; i++) {
641 if ((k1 * (ny + 1) * (nx + 1) + j1 * (nx + 1) + i1 < 0) ||
642 (k1 * (ny + 1) * (nx + 1) + j1 * (nx + 1) + i1 >
643 (nx + 1) * (ny + 1) * (nz + 1))) {
644 fprintf(stderr,
"There is wrong with code code=%d %d %d\n", i1, j1,
647 "ERROR: HEC-MW-VIS-E2004: voxel search error in new_refine");
650 var[k1 * (ny + 1) * (nx + 1) +
651 j1 * (nx + 1) + i1] = p1->
field;
657 empty_flag[k1 * (ny + 1) * (nx + 1) + j1 * (nx + 1) + i1] = 1;
663 for (i = 0; i < pe_size; i++)
674 "ERROR: HEC-MW-VIS-E2005: data communication error in "
682 value = (
double *)
HECMW_calloc(point_num,
sizeof(
double));
683 if ((code ==
NULL) || (value ==
NULL))
693 for (j = 0; j < point_num;
696 j1 = code[j * 3 + 1];
697 k1 = code[j * 3 + 2];
703 var[k1 * (ny + 1) * (nx + 1) + j1 * (nx + 1) + i1] = value[j];
704 empty_flag[k1 * (ny + 1) * (nx + 1) + j1 * (nx + 1) + i1] = 1;
753 free_cubehead(cubehead, n_voxel);
764 for(i=0;i<nx*ny*nz;i++) {
765 if(head_patch[i].num_of_patch>0) {
779 static void free_cubehead(
Cube_head *cubehead,
int voxn) {
783 for (i = 0; i < voxn; i++) {
784 if (cubehead[i].point_num > 0) {