59 double view_n[3], nview_n;
61 double point_s[3], point_o[3], ray_direction[3];
63 double range[6], xd, yd;
64 double coff_matrix[3][3], n_vertex[3 * 8], inv_matrix[3][3];
65 double mincolor, maxcolor, view_point[3], scr_area[4], x, y, nn;
66 double tmincolor, tmaxcolor, trange[6], svertex[3 * 8], sn_vertex[3 * 8],
70 double grad_minmax[2], dis_minmax[2], feap_minmax[2], feai_minmax[2];
71 double tfeap_minmax[2];
77 double center[3], dis_c_v, *ndis_c_v, tmpd;
78 int *pe_id, tmpi, pix_num, pix0_num, pixn;
79 double *n_subimage, *n_subopa, *subimage, *subopa;
80 double *subimage1, *subopa1;
83 int starti, startj, endi, endj;
85 double minx, miny, minz, maxx, maxy, maxz, tminx, tminy, tminz, tmaxx, tmaxy,
87 double av_length, tav_length;
89 int num_img, ii, base_x, base_y;
90 double o_v_point[3], m_scr[4];
94 unsigned char r, g, b;
97 int scale, scale_type;
99 char timestep_str[128], rotate_str[128];
111 int x_specified_l, y_specified_l, z_specified_l;
113 int nx, ny, nz, *empty_flag;
114 double *var, *grad_var;
116 double r_dxyz[3], dxyz[3], orig_xyz[3];
117 double org_mincolor, org_maxcolor;
155 if ((*init_flag == 1) || (num_of_pvr > 1)) {
165 for (j = 0; j < pesize; j++) {
173 if (stat_para[22] == 1) {
196 if (*init_flag == 1) {
204 for (i = 0; i < n_voxel; i++)
205 fprintf(stderr,
"voxel %d level: %d %d %d \n", i,
level[i * 3],
209 for (i = 0; i < n_voxel; i++)
level[i * 3] = x_specified_l;
211 for (i = 0; i < n_voxel; i++) {
217 for (i = 0; i < n_voxel; i++)
level[i * 3 + 1] = y_specified_l;
219 for (i = 0; i < n_voxel; i++) {
225 for (i = 0; i < n_voxel; i++)
level[i * 3 + 2] = z_specified_l;
227 for (i = 0; i < n_voxel; i++) {
237 for (i = 0; i < n_node; i++) {
254 fprintf(stderr,
"Start parallel volume rendering module\n");
258 if (mynode == 0) fprintf(stderr,
"calc_gradient\n");
260 calc_gradient(n_node, n_internal, n_elem, node, elem, node1, n_neighbor_pe,
261 neighbor_pe, import_index, import_node, export_index,
262 export_node, phi_x, phi_y, phi_z, mynode, VIS_COMM);
266 "The time for computing gradient is %lf the total time up to now "
272 fprintf(stderr,
"refinement\n");
274 nx =
level[mynode * 3];
275 ny =
level[mynode * 3 + 1];
276 nz =
level[mynode * 3 + 2];
277 empty_flag = (
int *)
HECMW_calloc((nx + 1) * (ny + 1) * (nz + 1),
sizeof(int));
278 var = (
double *)
HECMW_calloc((nx + 1) * (ny + 1) * (nz + 1),
sizeof(double));
280 grad_var = (
double *)
HECMW_calloc((nx + 1) * (ny + 1) * (nz + 1) * 3,
282 if ((grad_var ==
NULL) || (var ==
NULL) || (empty_flag ==
NULL)) {
283 fprintf(stderr,
"There is no enough memory: empty_flag, var, gradient\n");
300 fprintf(stderr,
" Finish refinement now, refinement level: \n");
302 " The time for refinement is %lf the total time up to now is %lf\n",
307 mincolor = tmincolor = 1.0E17;
308 maxcolor = tmaxcolor = -1.0E17;
317 tmincolor = mincolor;
318 tmaxcolor = maxcolor;
320 org_mincolor = tmincolor;
321 org_maxcolor = tmaxcolor;
331 mynode, pesize, VIS_COMM);
334 nz, mynode, pesize, VIS_COMM,
338 nz, mynode, pesize, VIS_COMM,
342 for (i = 0; i < 6; i++) trange[i] = 0.0;
367 fprintf(stderr,
"the range of the field is %lf %lf %lf %lf %lf %lf\n",
368 tminx, tmaxx, tminy, tmaxy, tminz, tmaxz);
375 if ((*init_flag == 1) || (num_of_pvr > 1)) {
376 if (stat_para[4] == 0) {
381 vr->
light_point[1] = tmaxy + 0.1 * (tmaxy - tminy);
382 vr->
light_point[2] = tmaxz + (tmaxz - tminz) * 2.0;
384 if (stat_para[5] == 0) {
389 if (stat_para[6] == 0) {
405 for (i = 0; i < 3; i++)
406 vr->
screen_point[i] = (trange[i * 2] + trange[i * 2 + 1]) / 2.0;
408 for (i = 0; i < 3; i++) o_v_point[i] = vr->
view_point_d[i];
409 m_scr[0] = m_scr[2] = 1.0E+17;
410 m_scr[1] = m_scr[3] = -1.0E+17;
412 for (ii = 0; ii < num_img; ii++) {
418 for (i = 0; i < 3; i++)
420 nview_n = sqrt(
SQR(view_n[0]) +
SQR(view_n[1]) +
SQR(view_n[2]));
422 for (i = 0; i < 3; i++) view_n[i] /= nview_n;
428 for (i = 0; i < 3; i++)
432 if (scr_area[0] < m_scr[0]) m_scr[0] = scr_area[0];
433 if (scr_area[1] > m_scr[1]) m_scr[1] = scr_area[1];
434 if (scr_area[2] < m_scr[2]) m_scr[2] = scr_area[2];
435 if (scr_area[3] > m_scr[3]) m_scr[3] = scr_area[3];
438 for (i = 0; i < 3; i++) vr->
view_point_d[i] = o_v_point[i];
441 for (ii = 0; ii < num_img; ii++) {
446 for (i = 0; i < 3; i++)
448 nview_n = sqrt(
SQR(view_n[0]) +
SQR(view_n[1]) +
SQR(view_n[2]));
450 for (i = 0; i < 3; i++) view_n[i] /= nview_n;
461 "viewpoint=%lf %lf %lf screen_point=%lf %lf %lfup=%lf %lf %lf\n",
464 vr->
up[0], vr->
up[1], vr->
up[2]);
473 for (i = 0; i < 3; i++)
489 xd = (scr_area[1] - scr_area[0]) / (vr->
xr - 20);
490 yd = (scr_area[3] - scr_area[2]) / (vr->
yr - 20);
493 xd = (m_scr[1] - m_scr[0]) / (vr->
xr - 20);
494 yd = (m_scr[3] - m_scr[2]) / (vr->
yr - 20);
500 (int)((
int)(20 + (scr_area[3] - scr_area[2]) / yd) / 10) * 10 +
502 else if (num_img > 1)
504 (int)((
int)(20 + (m_scr[3] - m_scr[2]) / yd) / 10) * 10 + 10;
510 (int)((
int)(20 + (scr_area[1] - scr_area[0]) / xd) / 8) * 8 + 8;
511 else if (num_img > 1)
512 vr->
xr = (int)((
int)(20 + (m_scr[1] - m_scr[0]) / xd) / 8) * 8 + 8;
519 xd = (scr_area[1] - scr_area[0]) / (vr->
xr - 40);
520 yd = (scr_area[3] - scr_area[2]) / (vr->
yr - 20);
521 }
else if (num_img > 1) {
522 xd = (m_scr[1] - m_scr[0]) / (vr->
xr - 40);
523 yd = (m_scr[3] - m_scr[2]) / (vr->
yr - 20);
530 (int)((
int)(20 + (scr_area[3] - scr_area[2]) / yd) / 10) * 10 +
532 else if (num_img > 1)
534 (int)((
int)(20 + (m_scr[3] - m_scr[2]) / yd) / 10) * 10 + 10;
535 }
else if (xd < yd) {
539 (int)((
int)(40 + (scr_area[1] - scr_area[0]) / xd) / 8) * 8 + 8;
540 else if (num_img > 1)
541 vr->
xr = (int)((
int)(40 + (m_scr[1] - m_scr[0]) / xd) / 8) * 8 + 8;
550 if (scale_type == 1) {
551 start_x = 10 + 45 * scale;
553 }
else if (scale_type == 2) {
554 start_x = 10 + 63 * scale;
559 if (vr->
xr < start_x + 10) {
561 "The image x_resolution cannot write such size characters\n");
563 "Please reduce the font size or enlarge x_resolution and run "
568 xd = (scr_area[1] - scr_area[0]) / (vr->
xr - (start_x + 10));
569 yd = (scr_area[3] - scr_area[2]) / (vr->
yr - 20);
570 }
else if (num_img > 1) {
571 xd = (m_scr[1] - m_scr[0]) / (vr->
xr - (start_x + 10));
572 yd = (m_scr[3] - m_scr[2]) / (vr->
yr - 20);
579 (int)((
int)(20 + (scr_area[3] - scr_area[2]) / yd) / 10) * 10 +
581 else if (num_img > 1)
583 (int)((
int)(20 + (m_scr[3] - m_scr[2]) / yd) / 10) * 10 + 10;
584 }
else if (xd < yd) {
588 (int)((
int)(start_x + 10 + (scr_area[1] - scr_area[0]) / xd) /
592 else if (num_img > 1)
594 (int)((
int)(start_x + 10 + (m_scr[1] - m_scr[0]) / xd) / 8) *
605 base_x = (int)((scr_area[0] - m_scr[0]) / xd);
606 base_y = (int)((scr_area[2] - m_scr[2]) / yd);
626 starti = (int)((sscr_area[0] - scr_area[0]) / xd) + start_x - 1;
627 endi = (int)((sscr_area[1] - scr_area[0]) / xd) + start_x + 1;
628 startj = (int)((sscr_area[2] - scr_area[2]) / yd) + start_y - 1;
629 endj = (int)((sscr_area[3] - scr_area[2]) / yd) + start_y + 1;
632 grad_minmax[0] = 1.0E17;
633 grad_minmax[1] = -1.0E17;
641 feap_minmax[0] = 1.0E17;
642 feap_minmax[1] = -1.0E17;
645 tmincolor, tmaxcolor, feap_minmax);
651 feap_minmax[0] = tfeap_minmax[0];
652 feap_minmax[1] = tfeap_minmax[1];
654 feai_minmax[0] = 1.0E17;
655 feai_minmax[1] = -1.0E17;
667 dis_minmax[0] = 1.0E17;
668 dis_minmax[1] = -1.0E17;
703 tav_length = av_length;
711 if (accum_opa ==
NULL)
716 for (j = 0; j < vr->
yr * vr->
xr * 3; j++)
718 for (j = 0; j < vr->
yr * vr->
xr; j++)
725 "The time for preprocessing of pvr is %lf, "
726 "the total time up to now is %lf\n",
731 for (i = 0; i < 3; i++) {
732 r_level[i] =
level[mynode * 3 + i];
734 r_dxyz[i] = dxyz[i] / r_level[i];
740 mincolor = tmincolor;
741 maxcolor = tmaxcolor;
752 for (j = startj; j < endj; j++)
753 for (i = starti; i < endi; i++) {
762 x = xd * (i - start_x + 0.5) + scr_area[0];
763 y = yd * (j - start_y + 0.5) + scr_area[2];
769 inv_matrix, point_o);
771 for (m = 0; m < 3; m++)
778 if (fabs(orig_xyz[0] + dxyz[0] -
782 }
else if (fabs(ray_direction[1]) <
EPSILON) {
783 if (fabs(orig_xyz[1] + dxyz[1] -
787 }
else if (fabs(ray_direction[2]) <
EPSILON) {
788 if (fabs(orig_xyz[2] + dxyz[2] -
793 if (trace_flag == 1) {
794 nn = sqrt(
SQR(ray_direction[0]) +
795 SQR(ray_direction[1]) +
796 SQR(ray_direction[2]));
798 for (m = 0; m < 3; m++) ray_direction[m] /= nn;
813 dxyz, r_dxyz, ray_direction, first_p,
815 if (intersection == 1) {
824 r_dxyz, r_level, empty_flag, var, grad_var,
825 first_p, first_ijk, ray_direction, mincolor,
826 maxcolor, accum_rgba, grad_minmax,
827 feap_minmax, feai_minmax, dis_minmax,
828 opa_table, tav_length, time_step, i, j);
830 for (m = 0; m < 3; m++)
831 image[(j * vr->
xr + i) * 3 + m] =
833 accum_opa[j * vr->
xr + i] = accum_rgba[3];
840 fprintf(stderr,
"Finish the computing on each PE\n");
843 "The volume rendering on each PE is %lf the "
844 "total time up to now is %lf\n",
850 pix_num = (int)(vr->
xr * vr->
yr / pesize);
851 pix0_num = vr->
xr * vr->
yr - pix_num * (pesize - 1);
852 if (mynode == 0) pixn = pix0_num;
853 if (mynode != 0) pixn = pix_num;
858 if ((n_subimage ==
NULL) || (n_subopa ==
NULL))
861 for (j = 0; j < pixn * 3; j++) {
863 n_subimage[j] =
image[j];
864 else if (mynode != 0)
865 n_subimage[mynode * pixn * 3 + j] =
867 (mynode - 1) * pix_num * 3 + j];
870 for (j = 0; j < pixn; j++)
871 n_subopa[j] = accum_opa[j];
872 else if (mynode != 0)
873 for (j = 0; j < pixn; j++)
874 n_subopa[mynode * pixn + j] =
875 accum_opa[pix0_num + (mynode - 1) * pix_num +
881 if ((subimage ==
NULL) || (subopa ==
NULL))
885 for (i = 0; i < pesize; i++) {
890 for (k = 0; k < pesize; k++) {
894 pix0_num * 3,
sizeof(
double));
896 pix0_num,
sizeof(
double));
899 pix_num * 3,
sizeof(
double));
901 pix_num,
sizeof(
double));
904 if ((subimage1 ==
NULL) || (subopa1 ==
NULL))
907 for (j = 0; j < pix0_num * 3; j++)
908 subimage1[j] =
image[j];
909 for (j = 0; j < pix0_num; j++)
910 subopa1[j] = accum_opa[j];
912 for (j = 0; j < pix_num * 3; j++)
915 (k - 1) * pix_num * 3 + j];
916 for (j = 0; j < pix_num; j++)
919 (k - 1) * pix_num + j];
943 for (j = 0; j < pixn * 3; j++)
944 n_subimage[i * pixn * 3 + j] = subimage[j];
945 for (j = 0; j < pixn; j++)
946 n_subopa[i * pixn + j] = subopa[j];
953 for (i = 0; i < 3; i++)
954 center[i] = orig_xyz[i] + dxyz[i] / 2.0;
969 if (ndis_c_v ==
NULL)
971 ndis_c_v[0] = dis_c_v;
972 for (i = 1; i < pesize; i++) {
975 ndis_c_v[i] = dis_c_v;
979 for (i = 0; i < pesize; i++) pe_id[i] = i;
980 for (i = 0; i < pesize - 1; i++)
981 for (j = i + 1; j < pesize; j++) {
982 if (ndis_c_v[i] > ndis_c_v[j]) {
984 ndis_c_v[i] = ndis_c_v[j];
991 for (i = 1; i < pesize; i++)
1008 for (j = 0; j < pix0_num * 3; j++)
1009 image[j] = subimage[j];
1010 for (i = 1; i < pesize; i++) {
1013 for (j = 0; j < pix_num * 3; j++)
1014 image[pix0_num * 3 + (i - 1) * pix_num * 3 +
1021 fprintf(stderr,
" Finish combining \n");
1024 "The combining time is %lf the total time up "
1036 tmincolor, tmaxcolor, tmincolor, tmaxcolor,
1046 tmincolor, tmaxcolor, org_mincolor,
1047 org_maxcolor,
image);
1064 if (*timestep >= 1000)
1065 sprintf(timestep_str,
"%d", *timestep);
1066 else if (*timestep >= 100)
1067 sprintf(timestep_str,
"0%d", *timestep);
1068 else if (*timestep >= 10)
1069 sprintf(timestep_str,
"00%d", *timestep);
1071 sprintf(timestep_str,
"000%d", *timestep);
1073 sprintf(rotate_str,
"%d", ii);
1075 sprintf(rotate_str,
"0%d", ii);
1076 sprintf(fname,
"%s.%s.%s.bmp", outfile, timestep_str,
1079 FP = fopen(fname,
"wb");
1083 "ERROR: HEC-MW-VIS-E0009: Cannot open output "
1087 #ifdef CONVERSE_ORDER
1089 54 + 3 * vr->
xr * vr->
yr);
1092 #ifdef CONVERSE_ORDER
1097 #ifdef CONVERSE_ORDER
1102 #ifdef CONVERSE_ORDER
1107 #ifdef CONVERSE_ORDER
1112 #ifdef CONVERSE_ORDER
1117 #ifdef CONVERSE_ORDER
1122 #ifdef CONVERSE_ORDER
1127 #ifdef CONVERSE_ORDER
1133 #ifdef CONVERSE_ORDER
1138 #ifdef CONVERSE_ORDER
1143 #ifdef CONVERSE_ORDER
1148 #ifdef CONVERSE_ORDER
1153 #ifdef CONVERSE_ORDER
1158 #ifdef CONVERSE_ORDER
1164 fwrite(&(header.
bfSize),
sizeof(
unsigned int), 1, FP);
1166 sizeof(
unsigned short int), 1, FP);
1168 sizeof(
unsigned short int), 1, FP);
1169 fwrite(&header.
bfOffBits,
sizeof(
unsigned int), 1,
1171 fwrite(&info, 40, 1, FP);
1172 for (j = 0; j < vr->
yr; j++)
1173 for (i = vr->
xr - 1; i >= 0; i--) {
1174 if ((
image[(j * vr->
xr + i) * 3] < 0.1) &&
1175 (
image[(j * vr->
xr + i) * 3 + 1] < 0.1) &&
1176 (
image[(j * vr->
xr + i) * 3 + 2] < 0.1)) {
1181 ri = (int)(
image[(j * vr->
xr + i) * 3] * 256);
1182 gi = (int)(
image[(j * vr->
xr + i) * 3 + 1] *
1184 bi = (int)(
image[(j * vr->
xr + i) * 3 + 2] *
1188 if (ri > 255) ri = 255;
1190 if (gi > 255) gi = 255;
1192 if (bi > 255) bi = 255;
1211 if (num_of_pvr > 1) {
1220 fprintf(stderr,
" Finish the module\n");
1223 " the time for output is %lf the total time of the module is %lf\n",