85{
86#ifndef NIMBLE_HAVE_EXODUS
88 genesis_mesh, global_data_names, node_data_names, elem_data_names, derived_elem_data_names);
89#else
90
91 int num_global_data = static_cast<int>(global_data_names.size());
92 int num_node_data = static_cast<int>(node_data_names.size());
93
94
96 if (exodus_file_id < 0)
ReportExodusError(exodus_file_id,
"InitializeDatabase",
"ex_create");
97
98
99 int retval = ex_put_init(
103
104
105 const char* coord_names[3] = {"x", "y", "z"};
106 retval = ex_put_coord_names(exodus_file_id, const_cast<char**>(coord_names));
107 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_coord_names");
108
109
110 retval = ex_put_coord(
111 exodus_file_id, genesis_mesh.GetCoordinatesX(), genesis_mesh.GetCoordinatesY(), genesis_mesh.GetCoordinatesZ());
112 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_coord");
113
114
115 std::set<int> gid_list;
117
118
119
120
121
122
124 const auto& gblock_list = genesis_mesh.GetAllBlockIds();
125 int gid = gblock_list[i];
126 int num_elements_in_block = 0;
127 int num_nodes_per_elem = 0;
128 std::string elem_type;
129 if (gid_list.count(gid) > 0) {
130 num_elements_in_block = genesis_mesh.GetNumElementsInBlock(gid);
131 num_nodes_per_elem = genesis_mesh.GetNumNodesPerElement(gid);
132 elem_type = genesis_mesh.GetElementType(gid);
133 }
134 retval = ex_put_block(
135 exodus_file_id, EX_ELEM_BLOCK, gid, elem_type.c_str(), num_elements_in_block, num_nodes_per_elem, 0, 0, 0);
136 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_block");
137 }
138
139
142 block_names[i] = new char[MAX_STR_LENGTH + 1];
144 const std::string block_name = genesis_mesh.GetBlockName(id);
145 strcpy(block_names[i], block_name.c_str());
146 }
147 retval = ex_put_names(exodus_file_id, EX_ELEM_BLOCK, block_names);
148 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_names EX_ELEM_BLOCK");
149
150
153 int num_elements_in_block = genesis_mesh.GetNumElementsInBlock(id);
154 if (num_elements_in_block > 0) {
155 const int* conn = genesis_mesh.GetConnectivity(id);
156
157 int num_node_in_elem = genesis_mesh.GetNumNodesPerElement(id);
158 std::vector<int> exodus_conn(num_elements_in_block * num_node_in_elem);
159 for (int j = 0; j < num_elements_in_block * num_node_in_elem; j++) { exodus_conn[j] = conn[j] + 1; }
160 retval = ex_put_conn(exodus_file_id, EX_ELEM_BLOCK, id, &exodus_conn[0], nullptr, nullptr);
162 }
163 }
164
165
166 const int* node_global_ids = genesis_mesh.GetNodeGlobalIds();
167
168 std::vector<int> temp_node_global_ids(
num_nodes_);
169 for (
int i = 0; i <
num_nodes_; ++i) { temp_node_global_ids[i] = node_global_ids[i] + 1; }
170 retval = ex_put_id_map(exodus_file_id, EX_NODE_MAP, &temp_node_global_ids[0]);
171 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_id_map");
172
173
174 const int* elem_global_ids = genesis_mesh.GetElementGlobalIds();
175
177 for (
int i = 0; i <
num_elements_; ++i) { temp_elem_global_ids[i] = elem_global_ids[i] + 1; }
178 retval = ex_put_id_map(exodus_file_id, EX_ELEM_MAP, &temp_elem_global_ids[0]);
179 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_id_map");
180
181
183 std::vector<int> node_set_ids = genesis_mesh.GetNodeSetIds();
184 std::map<int, std::string> node_set_names = genesis_mesh.GetNodeSetNames();
185 std::map<int, std::vector<int>> node_sets = genesis_mesh.GetNodeSets();
186 std::map<int, std::vector<double>> ns_distribution_factors = genesis_mesh.GetNodeSetDistributionFactors();
188 std::vector<int> num_ns_distribution_factors_per_set(
num_node_sets_);
189 int total_num_node(0);
190 int total_num_dist(0);
192 int id = node_set_ids[i];
193 int nn = static_cast<int>(node_sets[id].size());
194 int ndf = static_cast<int>(ns_distribution_factors[id].size());
195 num_nodes_per_set[i] = nn;
196 num_ns_distribution_factors_per_set[i] = ndf;
197 total_num_node += nn;
198 total_num_dist += ndf;
199 }
202 std::vector<int> node_sets_node_list(total_num_node);
203 std::vector<double> node_sets_dist_fact(total_num_dist);
204 int node_index(0);
205 int dist_index(0);
207 int id = node_set_ids[i];
208 node_sets_node_index[i] = node_index;
209 node_sets_dist_index[i] = dist_index;
210 for (const auto& n_set : node_sets[id]) {
211
212 node_sets_node_list[node_index++] = n_set + 1;
213 }
214 for (const auto& j_factor : ns_distribution_factors[id]) { node_sets_dist_fact[dist_index++] = j_factor; }
215 }
216
217 ex_set_specs set_specs;
218 set_specs.sets_ids = node_set_ids.data();
219 set_specs.num_entries_per_set = num_nodes_per_set.data();
220 set_specs.num_dist_per_set = num_ns_distribution_factors_per_set.data();
221 set_specs.sets_entry_index = node_sets_node_index.data();
222 set_specs.sets_dist_index = node_sets_dist_index.data();
223 set_specs.sets_entry_list = node_sets_node_list.data();
224 set_specs.sets_extra_list = nullptr;
225 set_specs.sets_dist_fact = node_sets_dist_fact.data();
226 retval = ex_put_concat_sets(exodus_file_id, EX_NODE_SET, &set_specs);
227 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_concat_sets");
228 }
229
230
231 char** global_var_names = nullptr;
232 if (num_global_data > 0) {
233 global_var_names = new char*[num_global_data];
234 for (int i = 0; i < num_global_data; i++) {
235 global_var_names[i] = new char[MAX_STR_LENGTH + 1];
236 strcpy(global_var_names[i], global_data_names[i].c_str());
237 }
238 retval = ex_put_variable_param(exodus_file_id, EX_GLOBAL, num_global_data);
239 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_variable_param");
240 retval = ex_put_variable_names(exodus_file_id, EX_GLOBAL, num_global_data, global_var_names);
241 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_variable_names");
242 }
243
244
245 char** node_var_names = nullptr;
247 node_var_names = new char*[num_node_data];
248 for (int i = 0; i < num_node_data; i++) {
249 node_var_names[i] = new char[MAX_STR_LENGTH + 1];
250 strcpy(node_var_names[i], node_data_names[i].c_str());
251 }
252 retval = ex_put_variable_param(exodus_file_id, EX_NODAL, num_node_data);
253 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_variable_param");
254 retval = ex_put_variable_names(exodus_file_id, EX_NODAL, num_node_data, node_var_names);
255 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_variable_names");
256 }
257
258
259 std::set<std::string> unique_elem_var_names;
262 for (const auto& jname : elem_data_names.at(id)) { unique_elem_var_names.insert(jname); }
263 for (const auto& jname : derived_elem_data_names.at(id)) { unique_elem_var_names.insert(jname); }
264 }
265
266
267 std::vector<std::string> elem_var_names;
268 for (std::set<std::string>::const_iterator it = unique_elem_var_names.begin(); it != unique_elem_var_names.end();
269 it++) {
270 elem_var_names.push_back(*it);
272 }
273
274 int num_element_vars = elem_var_names.size();
275 char** element_var_names = nullptr;
276 if (num_element_vars > 0) {
277 element_var_names = new char*[num_element_vars];
278 for (int i = 0; i < num_element_vars; i++) {
279 element_var_names[i] = new char[MAX_STR_LENGTH + 1];
280 strcpy(element_var_names[i], elem_var_names[i].c_str());
281 }
282 retval = ex_put_variable_param(exodus_file_id, EX_ELEM_BLOCK, num_element_vars);
283 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_variable_param");
284 retval = ex_put_variable_names(exodus_file_id, EX_ELEM_BLOCK, num_element_vars, element_var_names);
285 if (retval != 0)
ReportExodusError(retval,
"InitializeDatabase",
"ex_put_variable_names");
286 }
287
288
289 retval = ex_update(exodus_file_id);
291 retval = ex_close(exodus_file_id);
293
294
295 if (block_names != nullptr) {
296 for (
int i =
num_blocks_; i > 0; i--) {
delete[] block_names[i - 1]; }
297 delete[] block_names;
298 }
299 if (global_var_names != nullptr) {
300 for (int i = num_global_data; i > 0; i--) { delete[] global_var_names[i - 1]; }
301 delete[] global_var_names;
302 }
303 if (node_var_names != nullptr) {
304 for (int i = num_node_data; i > 0; i--) { delete[] node_var_names[i - 1]; }
305 delete[] node_var_names;
306 }
307 if (element_var_names != nullptr) {
308 for (int i = num_element_vars; i > 0; i--) { delete[] element_var_names[i - 1]; }
309 delete[] element_var_names;
310 }
311#endif
312}
void ReportExodusError(int error_code, const char *method_name, const char *exodus_method_name)
Definition nimble_exodus_output.cc:592
std::map< std::string, int > elem_data_index_
Definition nimble_exodus_output.h:152
void WriteQARecord(int exodus_file_id)
Definition nimble_exodus_output.cc:552
void InitializeDatabaseTextFile(GenesisMesh const &genesis_mesh, std::vector< std::string > const &global_data_names, std::vector< std::string > const &node_data_names, std::map< int, std::vector< std::string > > const &elem_data_names, std::map< int, std::vector< std::string > > const &derived_elem_data_names)
Definition nimble_exodus_output.cc:399