84 {
85 assert( 0 != mMaterialSetTag && 0 != mNeumannSetTag && 0 != mDirichletSetTag );
86
87 ErrorCode result;
88
89
90 const char* ETSolid45 = "60045";
91 const char* ETSolid92 = "60042";
92 const char* ETSolid95 = "60095";
93
94
95
96
97 const char* MATDefault = "1";
98
99
100 std::ofstream node_file;
101 std::ofstream elem_file;
102 std::ofstream ans_file;
103
104
105 std::string temp_string;
106 std::string base_string;
107 base_string.assign( file_name );
108 base_string.replace( base_string.find_last_of( ".ans" ) - 3, 4, "" );
109
110
111 temp_string = base_string + ".node";
112 node_file.open( temp_string.c_str() );
113 node_file.setf( std::ios::scientific, std::ios::floatfield );
114 node_file.precision( 13 );
115
116
117 temp_string = base_string + ".elem";
118 elem_file.open( temp_string.c_str() );
119
120
121 ans_file.open( file_name );
122 ans_file << "/prep7" << std::endl;
123
124
125 EntityHandle output_set = 0;
126 if( ent_handles && num_sets > 0 )
127 {
128 for( int i = 0; i < num_sets; i++ )
129 {
130
131 result = mbImpl->unite_meshset( output_set, ent_handles[i] );
132 if( result != MB_SUCCESS ) return result;
133 }
134 }
135
136
137 Range node_range;
138 result = mbImpl->get_entities_by_type( output_set, MBVERTEX, node_range, true );
139 if( result != MB_SUCCESS ) return result;
140
141
142
143
144
145
146
147
148
149
150 double coord[3];
151 for( Range::iterator it = node_range.begin(); it != node_range.end(); ++it )
152 {
153 EntityHandle node_handle = *it;
154
155 result = mbImpl->get_coords( &node_handle, 1, coord );
156 if( result != MB_SUCCESS ) return result;
157
158 node_file.width( 8 );
159 node_file << mbImpl->id_from_handle( node_handle );
160 node_file.width( 20 );
161 node_file << coord[0];
162 node_file.width( 20 );
163 node_file << coord[1];
164 node_file.width( 20 );
165 node_file << coord[2] << std::endl;
166 }
167
168
169 ans_file << "nread," << base_string << ",node" << std::endl;
170
171
172 Range node_mesh_sets;
173 int ns_id;
174 result = mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mDirichletSetTag, NULL, 1, node_mesh_sets );
175 if( result != MB_SUCCESS ) return result;
176
177 for( Range::iterator ns_it = node_mesh_sets.begin(); ns_it != node_mesh_sets.end(); ++ns_it )
178 {
179 result = mbImpl->tag_get_data( mDirichletSetTag, &( *ns_it ), 1, &ns_id );
180 if( result != MB_SUCCESS ) return result;
181 std::vector< EntityHandle > node_vector;
182 result = mbImpl->get_entities_by_handle( *ns_it, node_vector, true );
183 if( result != MB_SUCCESS ) return result;
184
185 for( std::vector< EntityHandle >::iterator node_it = node_vector.begin(); node_it != node_vector.end();
186 ++node_it )
187 {
188 int ns_node_id = mbImpl->id_from_handle( *node_it );
189 if( node_it == node_vector.begin() )
190 {
191
192 ans_file << "nsel,s,node,," << std::setw( 8 ) << ns_node_id << std::endl;
193 }
194 else
195 {
196
197 ans_file << "nsel,a,node,," << std::setw( 8 ) << ns_node_id << std::endl;
198 }
199 }
200
201 ans_file << "cm,NS" << ns_id << ",node" << std::endl;
202 }
203
204
205
206
207
208
209
210
211
212
213
214
215
216 Range tet_range;
217 result = mbImpl->get_entities_by_type( output_set, MBTET, tet_range, true );
218 if( result != MB_SUCCESS ) return result;
219 for( Range::iterator elem_it = tet_range.begin(); elem_it != tet_range.end(); ++elem_it )
220 {
221 EntityHandle elem_handle = *elem_it;
222 int elem_id = mbImpl->id_from_handle( elem_handle );
223 std::vector< EntityHandle > conn;
224 result = mbImpl->get_connectivity( &elem_handle, 1, conn, false );
225 if( result != MB_SUCCESS ) return result;
226
227 if( conn.size() != 4 && conn.size() != 10 )
228 {
229 std::cout << "Support not added for element type. \n";
230 return MB_FAILURE;
231 }
232
233 if( conn.size() == 4 )
234 {
235 elem_file << std::setw( 8 ) << conn[0] << std::setw( 8 ) << conn[1];
236 elem_file << std::setw( 8 ) << conn[2] << std::setw( 8 ) << conn[2];
237 elem_file << std::setw( 8 ) << conn[3] << std::setw( 8 ) << conn[3];
238 elem_file << std::setw( 8 ) << conn[3] << std::setw( 8 ) << conn[3];
239
240 elem_file << std::setw( 8 ) << MATDefault << std::setw( 8 ) << ETSolid45;
241 elem_file << std::setw( 8 ) << "1" << std::setw( 8 ) << "1";
242 elem_file << std::setw( 8 ) << "0" << std::setw( 8 ) << elem_id;
243 elem_file << std::endl;
244 }
245
246
247 if( conn.size() == 10 )
248 {
249 elem_file << std::setw( 8 ) << conn[0] << std::setw( 8 ) << conn[1];
250 elem_file << std::setw( 8 ) << conn[2] << std::setw( 8 ) << conn[3];
251 elem_file << std::setw( 8 ) << conn[4] << std::setw( 8 ) << conn[5];
252 elem_file << std::setw( 8 ) << conn[6] << std::setw( 8 ) << conn[7];
253
254 elem_file << std::setw( 8 ) << MATDefault << std::setw( 8 ) << ETSolid92;
255 elem_file << std::setw( 8 ) << "1" << std::setw( 8 ) << "1";
256 elem_file << std::setw( 8 ) << "0" << std::setw( 8 ) << elem_id;
257 elem_file << std::endl;
258
259 elem_file << std::setw( 8 ) << conn[8] << std::setw( 8 ) << conn[9];
260 elem_file << std::endl;
261 }
262 }
263
264
265 Range hex_range;
266 result = mbImpl->get_entities_by_type( output_set, MBHEX, hex_range, true );
267 if( result != MB_SUCCESS ) return result;
268 for( Range::iterator elem_it = hex_range.begin(); elem_it != hex_range.end(); ++elem_it )
269 {
270 EntityHandle elem_handle = *elem_it;
271 int elem_id = mbImpl->id_from_handle( elem_handle );
272 std::vector< EntityHandle > conn;
273 result = mbImpl->get_connectivity( &elem_handle, 1, conn, false );
274 if( result != MB_SUCCESS ) return result;
275
276 if( conn.size() != 8 && conn.size() != 20 )
277 {
278 std::cout << "Support not added for element type. \n";
279 return MB_FAILURE;
280 }
281
282
283 if( conn.size() == 8 )
284 {
285 elem_file << std::setw( 8 ) << conn[0] << std::setw( 8 ) << conn[1];
286 elem_file << std::setw( 8 ) << conn[2] << std::setw( 8 ) << conn[3];
287 elem_file << std::setw( 8 ) << conn[4] << std::setw( 8 ) << conn[5];
288 elem_file << std::setw( 8 ) << conn[6] << std::setw( 8 ) << conn[7];
289
290 elem_file << std::setw( 8 ) << MATDefault << std::setw( 8 ) << ETSolid45;
291 elem_file << std::setw( 8 ) << "1" << std::setw( 8 ) << "1";
292 elem_file << std::setw( 8 ) << "0" << std::setw( 8 ) << elem_id;
293 elem_file << std::endl;
294 }
295
296
297 if( conn.size() == 20 )
298 {
299
300 elem_file << std::setw( 8 ) << conn[4] << std::setw( 8 ) << conn[5];
301 elem_file << std::setw( 8 ) << conn[1] << std::setw( 8 ) << conn[0];
302 elem_file << std::setw( 8 ) << conn[7] << std::setw( 8 ) << conn[6];
303 elem_file << std::setw( 8 ) << conn[2] << std::setw( 8 ) << conn[3];
304
305 elem_file << std::setw( 8 ) << MATDefault << std::setw( 8 ) << ETSolid95;
306 elem_file << std::setw( 8 ) << "1" << std::setw( 8 ) << "1";
307 elem_file << std::setw( 8 ) << "0" << std::setw( 8 ) << elem_id;
308 elem_file << std::endl;
309
310 elem_file << std::setw( 8 ) << conn[16] << std::setw( 8 ) << conn[13];
311 elem_file << std::setw( 8 ) << conn[8] << std::setw( 8 ) << conn[12];
312 elem_file << std::setw( 8 ) << conn[18] << std::setw( 8 ) << conn[14];
313 elem_file << std::setw( 8 ) << conn[10] << std::setw( 8 ) << conn[15];
314 elem_file << std::setw( 8 ) << conn[19] << std::setw( 8 ) << conn[17];
315 elem_file << std::setw( 8 ) << conn[9] << std::setw( 8 ) << conn[11];
316 elem_file << std::endl;
317 }
318 }
319
320 Range prism_range;
321 result = mbImpl->get_entities_by_type( output_set, MBPRISM, prism_range, true );
322 if( result != MB_SUCCESS ) return result;
323 for( Range::iterator elem_it = prism_range.begin(); elem_it != prism_range.end(); ++elem_it )
324 {
325 EntityHandle elem_handle = *elem_it;
326 int elem_id = mbImpl->id_from_handle( elem_handle );
327 std::vector< EntityHandle > conn;
328 result = mbImpl->get_connectivity( &elem_handle, 1, conn, false );
329 if( result != MB_SUCCESS ) return result;
330
331 if( conn.size() != 6 )
332 {
333 std::cout << "Support not added for element type. \n";
334 return MB_FAILURE;
335 }
336
337
338 if( conn.size() == 6 )
339 {
340 elem_file << std::setw( 8 ) << conn[0] << std::setw( 8 ) << conn[3];
341 elem_file << std::setw( 8 ) << conn[4] << std::setw( 8 ) << conn[4];
342 elem_file << std::setw( 8 ) << conn[1] << std::setw( 8 ) << conn[2];
343 elem_file << std::setw( 8 ) << conn[5] << std::setw( 8 ) << conn[5];
344
345 elem_file << std::setw( 8 ) << MATDefault << std::setw( 8 ) << ETSolid45;
346 elem_file << std::setw( 8 ) << "1" << std::setw( 8 ) << "1";
347 elem_file << std::setw( 8 ) << "0" << std::setw( 8 ) << elem_id;
348 elem_file << std::endl;
349 }
350 }
351
352
353 ans_file << "et," << ETSolid45 << ",SOLID45" << std::endl;
354 ans_file << "et," << ETSolid92 << ",SOLID92" << std::endl;
355 ans_file << "et," << ETSolid95 << ",SOLID95" << std::endl;
356
357
358
359
360 ans_file << "eread," << base_string << ",elem" << std::endl;
361
362
363 Range side_mesh_sets;
364 int ss_id;
365 result = mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mNeumannSetTag, NULL, 1, side_mesh_sets );
366 if( result != MB_SUCCESS ) return result;
367
368 for( Range::iterator ss_it = side_mesh_sets.begin(); ss_it != side_mesh_sets.end(); ++ss_it )
369 {
370 result = mbImpl->tag_get_data( mNeumannSetTag, &( *ss_it ), 1, &ss_id );
371 if( result != MB_SUCCESS ) return result;
372 std::vector< EntityHandle > elem_vector;
373 result = mbImpl->get_entities_by_handle( *ss_it, elem_vector, true );
374 if( result != MB_SUCCESS ) return result;
375
376
377 for( std::vector< EntityHandle >::iterator elem_it = elem_vector.begin(); elem_it != elem_vector.end();
378 ++elem_it )
379 {
380 EntityHandle elem_handle = *elem_it;
381
382
383 std::vector< EntityHandle > conn;
384 result = mbImpl->get_connectivity( &elem_handle, 1, conn );
385 if( result != MB_SUCCESS ) return result;
386 if( elem_it == elem_vector.begin() )
387 {
388 ans_file << "nsel,s,node,," << std::setw( 8 ) << conn[0] << std::endl;
389 for( unsigned int i = 1; i < conn.size(); i++ )
390 {
391 ans_file << "nsel,a,node,," << std::setw( 8 ) << conn[i] << std::endl;
392 }
393 }
394 else
395 {
396 for( unsigned int i = 0; i < conn.size(); i++ )
397 {
398 ans_file << "nsel,a,node,," << std::setw( 8 ) << conn[i] << std::endl;
399 }
400 }
401 }
402
403 ans_file << "cm,SS" << ss_id << ",node" << std::endl;
404 }
405
406
407 Range matset;
408 int mat_id;
409 result = mbImpl->get_entities_by_type_and_tag( 0, MBENTITYSET, &mMaterialSetTag, NULL, 1, matset );
410 if( result != MB_SUCCESS ) return result;
411
412 for( Range::iterator mat_it = matset.begin(); mat_it != matset.end(); ++mat_it )
413 {
414 EntityHandle matset_handle = *mat_it;
415 result = mbImpl->tag_get_data( mMaterialSetTag, &matset_handle, 1, &mat_id );
416 if( result != MB_SUCCESS ) return result;
417 std::vector< EntityHandle > mat_vector;
418 result = mbImpl->get_entities_by_handle( *mat_it, mat_vector, true );
419 if( result != MB_SUCCESS ) return result;
420
421 for( std::vector< EntityHandle >::iterator elem_it = mat_vector.begin(); elem_it != mat_vector.end();
422 ++elem_it )
423 {
424 EntityHandle elem_handle = *elem_it;
425 int elem_id = mbImpl->id_from_handle( elem_handle );
426 if( elem_it == mat_vector.begin() )
427 {
428 ans_file << "esel,s,elem,," << std::setw( 8 ) << elem_id << std::endl;
429 }
430 else
431 {
432 ans_file << "esel,a,elem,," << std::setw( 8 ) << elem_id << std::endl;
433 }
434 }
435
436 ans_file << "cm,EB" << mat_id << ",elem" << std::endl;
437 }
438
439
440 node_file.close();
441 elem_file.close();
442 ans_file.close();
443
444 return MB_SUCCESS;
445 }