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_ucd_trans.h"
7
8 #include <stdio.h>
9 #include <string.h>
10 #include <math.h>
11 #include "hecmw_vis_mem_util.h"
12 #include "hecmw_vis_voxel_gen.h"
13 #include "hecmw_malloc.h"
14
15 /* This program is used to transform GeoFEM UCD files into PVR data format */
16
transform_ucd_pvr(struct hecmwST_result_data * data,double * node1,struct hecmwST_local_mesh * mesh,Parameter_vr * vr,int my_rank,int pe_size,HECMW_Comm VIS_COMM,double * voxel_dxyz,double * voxel_orig_xyz,int * level,int * voxel_n_neighbor_pe,int ** voxel_neighbor_pe,int voxel_on,int display_range_on,int init_flag,int num_of_pvr)17 void transform_ucd_pvr(struct hecmwST_result_data *data, double *node1,
18 struct hecmwST_local_mesh *mesh, Parameter_vr *vr,
19 int my_rank, int pe_size, HECMW_Comm VIS_COMM,
20 double *voxel_dxyz, double *voxel_orig_xyz, int *level,
21 int *voxel_n_neighbor_pe, int **voxel_neighbor_pe,
22 int voxel_on, int display_range_on, int init_flag,
23 int num_of_pvr)
24
25 {
26 int i, j;
27 int c_base;
28 double range[6], c_range[2];
29 int name_len, find;
30 double x, y, z;
31 int nodeid;
32
33 int tn_component;
34 double tmp;
35
36 if ((init_flag == 1) || (num_of_pvr > 1)) {
37 if (my_rank == 0) {
38 fprintf(stderr, "start ucd-pvr transformation\n");
39 /* fprintf(stderr, "------in ucd_trans color_comp_name = %s\n",
40 * vr->color_comp_name);
41 */
42 }
43
44 if (vr->color_comp == -1) {
45 find = 0;
46 if (strncmp(vr->color_comp_name, "NULL", 4) == 0) {
47 vr->color_comp = 0;
48 find = 1;
49 } else {
50 for (j = 0; j < data->nn_component; j++) {
51 name_len = strlen(data->node_label[j]);
52 if (strncmp(vr->color_comp_name, data->node_label[j], name_len) ==
53 0) {
54 vr->color_comp = j;
55 find = 1;
56 break;
57 }
58 }
59 }
60 if (find == 0) {
61 fprintf(stderr,
62 "ERROR: HEC-MW-VIS-E1053:the name for color component is not "
63 "correct:%s\n",
64 vr->color_comp_name);
65 HECMW_vis_print_exit("please check it again");
66 }
67 }
68 if (data->nn_dof[vr->color_comp] > 1) {
69 if (vr->color_subcomp == -1) {
70 find = 0;
71 if (strncmp(vr->color_subcomp_name, "norm", 4) == 0) {
72 vr->color_subcomp = 0;
73 find = 1;
74 } else if (strncmp(vr->color_subcomp_name, "x", 1) == 0) {
75 vr->color_subcomp = 1;
76 find = 1;
77 } else if (strncmp(vr->color_subcomp_name, "y", 1) == 0) {
78 vr->color_subcomp = 2;
79 find = 1;
80 } else if (strncmp(vr->color_subcomp_name, "z", 1) == 0) {
81 vr->color_subcomp = 3;
82 find = 1;
83 } else
84 vr->color_subcomp = 1;
85 }
86 }
87 }
88 /* fprintf(stderr, "*****ok here color_comp=%d color_subcomp=%d\n",
89 * vr->color_comp, vr->color_subcomp);
90 */
91 range[0] = range[2] = range[4] = 1.0E17;
92 range[1] = range[3] = range[5] = -1.0E17;
93 c_range[0] = 1.0E17;
94 c_range[1] = -1.0E17;
95 /* for(i=0;i<nstep;i++) {
96 tstep=step_start+step_increment*i;
97 sprintf(infile, "%s.%d.%d.inp", resultfile, tstep, my_rank);
98 if ((infp = fopen(infile, "r")) == NULL) {
99 fprintf(stderr, "There is no such an input data file %s:\n", infile);
100 exit (0);
101 }
102
103 v = (struct visual_buf *)HECMW_malloc(sizeof(struct visual_buf));
104 color_comp=read_ucd(infp, v, range, c_range, str_color, color_subcomp);
105 fclose(infp);
106 fprintf(outfp, "%d\n", v->mesh->n_node);
107 fprintf(outfp, "%d\n", tstep);
108 fprintf(outfp, "%lf\n", 0.0);
109 */
110
111 if (vr->color_comp >= data->nn_component)
112 HECMW_vis_print_exit(
113 "ERROR: HEC-MW-VIS-E1054: color_comp is wrong: >nn_component");
114 if (vr->color_subcomp > data->nn_dof[vr->color_comp])
115 HECMW_vis_print_exit(
116 "ERROR: HEC-MW-VIS-E1055: color_subcomp is wrong: >dof");
117 if (data->nn_dof[vr->color_comp] == 1) {
118 c_base = 0;
119 for (i = 0; i < vr->color_comp; i++) c_base += data->nn_dof[i];
120 vr->color_subcomp = 1;
121 } else if (data->nn_dof[vr->color_comp] > 1) {
122 c_base = 0;
123 for (i = 0; i < vr->color_comp; i++) c_base += data->nn_dof[i];
124 }
125 tn_component = 0;
126 for (i = 0; i < data->nn_component; i++) tn_component += data->nn_dof[i];
127
128 if ((data->nn_dof[vr->color_comp] > 1) && (vr->color_subcomp == 0)) {
129 for (i = 0; i < mesh->n_node; i++) {
130 node1[i] = 0.0;
131 for (j = 0; j < data->nn_dof[vr->color_comp]; j++) {
132 tmp = data->node_val_item[c_base + i * tn_component + j];
133 node1[i] += tmp * tmp;
134 }
135 node1[i] = sqrt(node1[i]);
136 if (node1[i] < c_range[0]) c_range[0] = node1[i];
137 if (node1[i] > c_range[1]) c_range[1] = node1[i];
138 }
139 }
140
141 else if (data->nn_dof[vr->color_comp] > 1) {
142 for (i = 0; i < mesh->n_node; i++) {
143 node1[i] = data->node_val_item[c_base + i * tn_component +
144 (vr->color_subcomp - 1)];
145 if (node1[i] < c_range[0]) c_range[0] = node1[i];
146 if (node1[i] > c_range[1]) c_range[1] = node1[i];
147 }
148 } else if (data->nn_dof[vr->color_comp] == 1) {
149 for (i = 0; i < mesh->n_node; i++) {
150 node1[i] = data->node_val_item[c_base + i * tn_component];
151 if (node1[i] < c_range[0]) c_range[0] = node1[i];
152 if (node1[i] > c_range[1]) c_range[1] = node1[i];
153 }
154 }
155 if (my_rank == 0)
156 fprintf(stderr, " colorminmax=%lf %lf\n", c_range[0], c_range[1]);
157 /* free_v_node(v);
158 */
159 HECMW_Barrier(VIS_COMM);
160 /*---------find minmax value of mesh ----------------*/
161 for (i = 0; i < mesh->n_elem; i++) {
162 if (mesh->elem_type[i] < 400) {
163 for (j = mesh->elem_node_index[i]; j < mesh->elem_node_index[i + 1];
164 j++) {
165 nodeid = mesh->elem_node_item[j];
166 x = mesh->node[(nodeid - 1) * 3];
167 y = mesh->node[(nodeid - 1) * 3 + 1];
168 z = mesh->node[2 + (nodeid - 1) * 3];
169 if (x > range[1]) range[1] = x;
170 if (x < range[0]) range[0] = x;
171 if (y > range[3]) range[3] = y;
172 if (y < range[2]) range[2] = y;
173 if (z > range[5]) range[5] = z;
174 if (z < range[4]) range[4] = z;
175 }
176 }
177 }
178
179 voxel_gen(range, c_range, vr->nv_xyz, voxel_dxyz, voxel_orig_xyz, level,
180 voxel_n_neighbor_pe, voxel_neighbor_pe, VIS_COMM, voxel_on,
181 display_range_on, vr->display_range);
182
183 return;
184 }
185