FrontISTR  5.7.0
Large-scale structural analysis program with finit element method
hecmw_vis_voxel_gen.c
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #include "hecmw_vis_voxel_gen.h"
7 
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "hecmw_vis_mem_util.h"
11 #include "hecmw_vis_comm_util.h"
12 #include "hecmw_vis_ray_trace.h"
13 #include "hecmw_malloc.h"
14 
15 void voxel_gen(double range[6], double c_range[2], int nv[3],
16  double *voxel_dxyz, double *voxel_orig_xyz, int *level,
18  HECMW_Comm VIS_COMM, int vox_on, int display_range_on,
19  double display_range[6]) {
20  int my_rank;
21  int pe_size;
22 
23  FILE *fp;
24 
25  int i, j, k, i1;
26 
27  double trange[6], tc_range[2];
28  double *s_range, tmp_range[6];
29  int n_voxel;
30  double dx, dy, dz;
31  int flag, num_neipe, *neipe;
32  double minx, miny, minz, maxx, maxy, maxz;
33  HECMW_Status stat;
34 
35  HECMW_Comm_rank(VIS_COMM, &my_rank);
36  HECMW_Comm_size(VIS_COMM, &pe_size);
37 
38  s_range = (double *)HECMW_calloc(6 * pe_size, sizeof(double));
39  if (s_range == NULL) HECMW_vis_memory_exit("s_range");
40  if (display_range_on == 0) {
41  HECMW_Allreduce(&range[0], &trange[0], 1, HECMW_DOUBLE, HECMW_MIN,
42  VIS_COMM);
43  HECMW_Allreduce(&range[1], &trange[1], 1, HECMW_DOUBLE, HECMW_MAX,
44  VIS_COMM);
45  HECMW_Allreduce(&range[2], &trange[2], 1, HECMW_DOUBLE, HECMW_MIN,
46  VIS_COMM);
47  HECMW_Allreduce(&range[3], &trange[3], 1, HECMW_DOUBLE, HECMW_MAX,
48  VIS_COMM);
49  HECMW_Allreduce(&range[4], &trange[4], 1, HECMW_DOUBLE, HECMW_MIN,
50  VIS_COMM);
51  HECMW_Allreduce(&range[5], &trange[5], 1, HECMW_DOUBLE, HECMW_MAX,
52  VIS_COMM);
53  } else if (display_range_on == 1) {
54  for (i = 0; i < 6; i++) trange[i] = display_range[i];
55  }
56  if (my_rank != 0) {
57  HECMW_Send(range, 6, HECMW_DOUBLE, 0, 0, VIS_COMM);
58  /* HECMW_Recv(s_range, 6*pe_size, HECMW_DOUBLE, 0, HECMW_ANY_TAG,
59  * VIS_COMM, &stat);
60  */
61  }
62  if (my_rank == 0) {
63  for (i = 0; i < 6; i++) s_range[i] = range[i];
64  for (j = 1; j < pe_size; j++) {
65  HECMW_Recv(tmp_range, 6, HECMW_DOUBLE, j, HECMW_ANY_TAG, VIS_COMM, &stat);
66  for (i = 0; i < 6; i++) s_range[j * 6 + i] = tmp_range[i];
67  }
68  /* for(j=1;j<pe_size;j++)
69  HECMW_Send(s_range, 6*pe_size,HECMW_DOUBLE, j, 0, VIS_COMM);
70  */
71  }
72 
73  HECMW_Allreduce(&c_range[0], &tc_range[0], 1, HECMW_DOUBLE, HECMW_MIN,
74  VIS_COMM);
75  HECMW_Allreduce(&c_range[1], &tc_range[1], 1, HECMW_DOUBLE, HECMW_MAX,
76  VIS_COMM);
77  if (my_rank == 0) {
78  if ((fp = fopen("extent.file", "w")) == NULL)
79  HECMW_vis_print_exit("output file name error: extent.file");
80  fprintf(fp, "The range of the whole data field is\n");
81  fprintf(fp, "Minimum x= %lf Maximum x=%lf\n", trange[0], trange[1]);
82  fprintf(fp, "Minimum y= %lf Maximum y=%lf\n", trange[2], trange[3]);
83  fprintf(fp, "Minimum z= %lf Maximum z=%lf\n", trange[4], trange[5]);
84  fprintf(fp, "The range of color component is\n");
85  fprintf(fp, "Minimum color=%lf maximum color=%lf\n", tc_range[0],
86  tc_range[1]);
87  fprintf(stderr, "Minimum color=%lf maximum color=%lf\n", tc_range[0],
88  tc_range[1]);
89  fprintf(fp, "The subrange of each PE\n");
90  for (j = 0; j < pe_size; j++) {
91  fprintf(fp, "PE %d:\n", j);
92  fprintf(fp, "Minimum x= %lf Maximum x=%lf\n", s_range[j * 6 + 0],
93  s_range[j * 6 + 1]);
94  fprintf(fp, "Minimum y= %lf Maximum y=%lf\n", s_range[j * 6 + 2],
95  s_range[j * 6 + 3]);
96  fprintf(fp, "Minimum z= %lf Maximum z=%lf\n", s_range[j * 6 + 4],
97  s_range[j * 6 + 5]);
98  }
99 
100  fclose(fp);
101  if (vox_on == 0) {
102  n_voxel = nv[0] * nv[1] * nv[2];
103  /* fprintf(stderr, "the number of voxel is %d\n", n_voxel);
104  */
105  if ((fp = fopen("voxel.file", "w")) == NULL)
106  HECMW_vis_print_exit("output voxel file error: voxel.file");
107  dx = (trange[1] - trange[0]) / nv[0];
108  dy = (trange[3] - trange[2]) / nv[1];
109  dz = (trange[5] - trange[4]) / nv[2];
110  neipe = (int *)HECMW_calloc(pe_size, sizeof(int));
111  if (neipe == NULL) HECMW_vis_memory_exit("in voxel_gen: neipe");
112  if (n_voxel == 0)
114  "ERROR: HEC-MW-VIS-E1042: n_voxel_x,n_voxel_y, and n_voxel_z "
115  "cannot be less or equal to 0");
116  /* vox->info = (Voxel_info *)HECMW_calloc(n_voxel, sizeof(Voxel_info));
117 if(vox->info==NULL) {
118 fprintf(stderr, "There is no enough memory for vox\n");
119 exit(0);
120 }
121 vox->n_voxel=n_voxel;
122  */
123 
124  for (k = 0; k < nv[2]; k++)
125  for (j = 0; j < nv[1]; j++)
126  for (i = 0; i < nv[0]; i++) {
127  fprintf(fp, "%lf %lf %lf %lf %lf %lf\n", trange[0] + i * dx,
128  trange[2] + j * dy, trange[4] + k * dz, dx, dy, dz);
129  voxel_orig_xyz[(k * nv[1] * nv[0] + j * nv[0] + i) * 3] =
130  trange[0] + i * dx;
131  voxel_orig_xyz[(k * nv[1] * nv[0] + j * nv[0] + i) * 3 + 1] =
132  trange[2] + j * dy;
133  voxel_orig_xyz[(k * nv[1] * nv[0] + j * nv[0] + i) * 3 + 2] =
134  trange[4] + k * dz;
135  voxel_dxyz[(k * nv[1] * nv[0] + j * nv[0] + i) * 3] = dx;
136  voxel_dxyz[(k * nv[1] * nv[0] + j * nv[0] + i) * 3 + 1] = dy;
137  voxel_dxyz[(k * nv[1] * nv[0] + j * nv[0] + i) * 3 + 2] = dz;
138 
139  /* fprintf(stderr, "i j k=%d %d %d\n", i,j,k);
140 start_i=i-1; end_i=i+1;
141 start_j=j-1; end_j=j+1;
142 start_k=k-1; end_k=k+1;
143 if(start_i<0) start_i=0;
144 if(end_i>nv[0]-1) end_i=nv[0]-1;
145 if(start_j<0) start_j=0;
146 if(end_j>nv[1]-1) end_j=nv[1]-1;
147 if(start_k<0) start_k=0;
148 if(end_k>nv[2]-1) end_k=nv[2]-1;
149 fprintf(stderr, "%d %d %d %d %d %d\n", start_i, end_i, start_j, end_j, start_k,
150 end_k);
151 fprintf(fp, "%d\n", (end_i-start_i+1)*(end_j-start_j+1)*(end_k-start_k+1));
152 for(k1=start_k;k1<=end_k;k1++)
153 for(j1=start_j;j1<=end_j;j1++)
154  for(i1=start_i;i1<=end_i;i1++)
155  fprintf(fp, "%d\n", k1*nv[0]*nv[1]+j1*nv[0]+i1);
156 
157  */
158  minx = trange[0] + i * dx;
159  maxx = minx + dx;
160  miny = trange[2] + j * dy;
161  maxy = miny + dy;
162  minz = trange[4] + k * dz;
163  maxz = minz + dz;
164  num_neipe = 0;
165  for (i1 = 0; i1 < pe_size; i1++) {
166  flag = 1;
167  neipe[i1] = -1;
168  if ((s_range[i1 * 6] > maxx + EPSILON * dx) ||
169  (s_range[i1 * 6 + 1] < minx - EPSILON * dx) ||
170  (s_range[i1 * 6 + 2] > maxy + EPSILON * dy) ||
171  (s_range[i1 * 6 + 3] < miny - EPSILON * dy) ||
172  (s_range[i1 * 6 + 4] > maxz + EPSILON * dz) ||
173  (s_range[i1 * 6 + 5] < minz - EPSILON * dz))
174  flag = 0;
175  if (flag == 1) {
176  neipe[num_neipe] = i1;
177  num_neipe++;
178  }
179  }
180  fprintf(fp, "%d\n", num_neipe);
181  voxel_n_neighbor_pe[k * nv[1] * nv[0] + j * nv[0] + i] = num_neipe;
182  if (num_neipe > 0) {
183  for (i1 = 0; i1 < num_neipe; i1++) {
184  fprintf(fp, "%d ", neipe[i1]);
185 
186  voxel_neighbor_pe[k * nv[1] * nv[0] + j * nv[0] + i][i1] =
187  neipe[i1];
188 
189  if ((i1 % 8) == 7) fprintf(fp, "\n");
190  }
191  fprintf(fp, "\n");
192  }
193  }
194  fclose(fp);
195  /* send vox information to all other PEs */
196  for (i = 1; i < pe_size; i++) {
197  for (j = 0; j < n_voxel; j++) {
198  HECMW_Send(&(voxel_orig_xyz[j * 3]), 1, HECMW_DOUBLE, i, 0, VIS_COMM);
199  HECMW_Send(&(voxel_orig_xyz[j * 3 + 1]), 1, HECMW_DOUBLE, i, 0,
200  VIS_COMM);
201  HECMW_Send(&(voxel_orig_xyz[j * 3 + 2]), 1, HECMW_DOUBLE, i, 0,
202  VIS_COMM);
203  HECMW_Send(&(voxel_dxyz[j * 3]), 1, HECMW_DOUBLE, i, 0, VIS_COMM);
204  HECMW_Send(&(voxel_dxyz[j * 3 + 1]), 1, HECMW_DOUBLE, i, 0, VIS_COMM);
205  HECMW_Send(&(voxel_dxyz[j * 3 + 2]), 1, HECMW_DOUBLE, i, 0, VIS_COMM);
206  HECMW_Send(&(voxel_n_neighbor_pe[j]), 1, HECMW_INT, i, 0, VIS_COMM);
207  if (voxel_n_neighbor_pe[j] > 0)
208  HECMW_Send(voxel_neighbor_pe[j], n_voxel, HECMW_INT, i, 0,
209  VIS_COMM);
210  }
211  }
212  }
213  }
214  if (my_rank != 0) {
215  if (vox_on == 0) {
216  n_voxel = nv[0] * nv[1] * nv[2];
217  if (n_voxel == 0)
219  "ERROR: HEC-MW-VIS-E1042: n_voxel_x,n_voxel_y, and n_voxel_z "
220  "cannot be less or equal to 0");
221  for (j = 0; j < n_voxel; j++) {
223  VIS_COMM, &stat);
224  HECMW_Recv(&(voxel_orig_xyz[j * 3 + 1]), 1, HECMW_DOUBLE, 0,
225  HECMW_ANY_TAG, VIS_COMM, &stat);
226  HECMW_Recv(&(voxel_orig_xyz[j * 3 + 2]), 1, HECMW_DOUBLE, 0,
227  HECMW_ANY_TAG, VIS_COMM, &stat);
229  VIS_COMM, &stat);
230  HECMW_Recv(&(voxel_dxyz[j * 3 + 1]), 1, HECMW_DOUBLE, 0, HECMW_ANY_TAG,
231  VIS_COMM, &stat);
232  HECMW_Recv(&(voxel_dxyz[j * 3 + 2]), 1, HECMW_DOUBLE, 0, HECMW_ANY_TAG,
233  VIS_COMM, &stat);
235  VIS_COMM, &stat);
236  if (voxel_n_neighbor_pe[j] > 0) {
238  VIS_COMM, &stat);
239  }
240  }
241  }
242  }
243 
244  return;
245 }
hecmw_malloc.h
HECMW_MAX
#define HECMW_MAX
Definition: hecmw_config.h:56
hecmw_vis_mem_util.h
HECMW_DOUBLE
#define HECMW_DOUBLE
Definition: hecmw_config.h:50
HECMW_Allreduce
int HECMW_Allreduce(void *sendbuf, void *recvbuf, int count, HECMW_Datatype datatype, HECMW_Op op, HECMW_Comm comm)
Definition: hecmw_comm.c:364
HECMW_Send
int HECMW_Send(void *buffer, int count, HECMW_Datatype datatype, int dest, int tag, HECMW_Comm comm)
Definition: hecmw_comm.c:193
hecmw_vis_ray_trace.h
voxel_n_neighbor_pe
int * voxel_n_neighbor_pe
Definition: hecmw_vis_pvr_main.c:26
HECMW_vis_print_exit
void HECMW_vis_print_exit(char *var)
Definition: hecmw_vis_mem_util.c:21
voxel_dxyz
double * voxel_dxyz
Definition: hecmw_vis_pvr_main.c:25
level
int * level
Definition: hecmw_vis_pvr_main.c:26
HECMW_calloc
#define HECMW_calloc(nmemb, size)
Definition: hecmw_malloc.h:21
voxel_orig_xyz
double * voxel_orig_xyz
Definition: hecmw_vis_pvr_main.c:25
HECMW_vis_memory_exit
void HECMW_vis_memory_exit(char *var)
Definition: hecmw_vis_mem_util.c:12
HECMW_Status
MPI_Status HECMW_Status
Definition: hecmw_config.h:36
hecmw_vis_comm_util.h
HECMW_ANY_TAG
int HECMW_ANY_TAG
Definition: hecmw_dlb_comm_util.h:7
voxel_neighbor_pe
int ** voxel_neighbor_pe
Definition: hecmw_vis_pvr_main.c:26
HECMW_Comm
MPI_Comm HECMW_Comm
Definition: hecmw_config.h:30
HECMW_MIN
#define HECMW_MIN
Definition: hecmw_config.h:54
HECMW_Comm_rank
int HECMW_Comm_rank(HECMW_Comm comm, int *rank)
Definition: hecmw_comm.c:18
HECMW_Comm_size
int HECMW_Comm_size(HECMW_Comm comm, int *size)
Definition: hecmw_comm.c:37
EPSILON
#define EPSILON
Definition: hecmw_vis_color_mapping.c:10
HECMW_INT
#define HECMW_INT
Definition: hecmw_config.h:48
HECMW_Recv
int HECMW_Recv(void *buffer, int count, HECMW_Datatype datatype, int source, int tag, HECMW_Comm comm, HECMW_Status *status)
Definition: hecmw_comm.c:235
NULL
#define NULL
Definition: hecmw_io_nastran.c:30
hecmw_vis_voxel_gen.h
voxel_gen
void voxel_gen(double range[6], double c_range[2], int nv[3], double *voxel_dxyz, double *voxel_orig_xyz, int *level, int *voxel_n_neighbor_pe, int **voxel_neighbor_pe, HECMW_Comm VIS_COMM, int vox_on, int display_range_on, double display_range[6])
Definition: hecmw_vis_voxel_gen.c:15