moab
|
00001 00019 #ifdef WIN32 00020 #pragma warning(disable:4786) 00021 #endif 00022 00023 #include "ReadABAQUS.hpp" 00024 00025 #include <algorithm> 00026 #include <time.h> 00027 #include <string> 00028 #include <assert.h> 00029 #include <stdio.h> 00030 #include <cmath> 00031 00032 #include "moab/Range.hpp" 00033 #include "moab/Interface.hpp" 00034 #include "MBTagConventions.hpp" 00035 #include "Internals.hpp" 00036 #include "moab/ReadUtilIface.hpp" 00037 #include "AffineXform.hpp" 00038 // #include "abaqus_order.h" 00039 #include "moab/FileOptions.hpp" 00040 00041 namespace moab { 00042 00043 #define ABQ_AMBIGUOUS "AMBIGUOUS" 00044 #define ABQ_UNDEFINED "UNDEFINED" 00045 #define DEG2RAD 0.017453292519943295769236907684886 00046 00047 #define MB_RETURN_IF_FAIL if (MB_SUCCESS != status) return status 00048 00049 ReaderIface* ReadABAQUS::factory( Interface* iface ) 00050 { return new ReadABAQUS( iface ); } 00051 00052 00053 00054 ReadABAQUS::ReadABAQUS(Interface* impl) 00055 : mdbImpl(impl) 00056 { 00057 assert(impl != NULL); 00058 reset(); 00059 00060 impl->query_interface( readMeshIface ); 00061 00062 // initialize in case tag_get_handle fails below 00063 mMaterialSetTag = 0; 00064 mDirichletSetTag = 0; 00065 mNeumannSetTag = 0; 00066 mHasMidNodesTag = 0; 00067 00068 mSetTypeTag = 0; 00069 mPartHandleTag = 0; 00070 mInstancePIDTag = 0; 00071 mInstanceGIDTag = 0; 00072 mLocalIDTag = 0; 00073 mInstanceHandleTag = 0; 00074 mAssemblyHandleTag = 0; 00075 mSetNameTag = 0; 00076 mMatNameTag = 0; 00077 00078 mat_id = 0; 00079 00081 int zero = 0, negone = -1, negonearr[] = {-1, -1, -1, -1}; 00082 mMaterialSetTag = get_tag(MATERIAL_SET_TAG_NAME, 1,MB_TAG_SPARSE,MB_TYPE_INTEGER, &negone); 00083 mDirichletSetTag = get_tag(DIRICHLET_SET_TAG_NAME,1,MB_TAG_SPARSE,MB_TYPE_INTEGER, &negone); 00084 mNeumannSetTag = get_tag(NEUMANN_SET_TAG_NAME, 1,MB_TAG_SPARSE,MB_TYPE_INTEGER, &negone); 00085 mHasMidNodesTag = get_tag(HAS_MID_NODES_TAG_NAME,4,MB_TAG_SPARSE,MB_TYPE_INTEGER, negonearr); 00086 00087 mSetTypeTag = get_tag(ABAQUS_SET_TYPE_TAG_NAME, 1,MB_TAG_SPARSE,MB_TYPE_INTEGER); 00088 mPartHandleTag = get_tag(ABAQUS_PART_HANDLE_TAG_NAME, 1,MB_TAG_SPARSE,MB_TYPE_HANDLE); 00089 mInstanceHandleTag = get_tag(ABAQUS_INSTANCE_HANDLE_TAG_NAME, 1,MB_TAG_DENSE, MB_TYPE_HANDLE); 00090 mAssemblyHandleTag = get_tag(ABAQUS_ASSEMBLY_HANDLE_TAG_NAME, 1,MB_TAG_DENSE, MB_TYPE_HANDLE); 00091 mInstancePIDTag = get_tag(ABAQUS_INSTANCE_PART_ID_TAG_NAME, 1,MB_TAG_SPARSE,MB_TYPE_INTEGER); 00092 mInstanceGIDTag = get_tag(ABAQUS_INSTANCE_GLOBAL_ID_TAG_NAME,1,MB_TAG_SPARSE,MB_TYPE_INTEGER, &zero); 00093 mLocalIDTag = get_tag(ABAQUS_LOCAL_ID_TAG_NAME, 1,MB_TAG_DENSE, MB_TYPE_INTEGER); 00094 mSetNameTag = get_tag(ABAQUS_SET_NAME_TAG_NAME, ABAQUS_SET_NAME_LENGTH, MB_TAG_SPARSE,MB_TYPE_OPAQUE,0); 00095 mMatNameTag = get_tag(ABAQUS_MAT_NAME_TAG_NAME, ABAQUS_MAT_NAME_LENGTH, MB_TAG_SPARSE,MB_TYPE_OPAQUE,0); 00096 00097 } 00098 00099 void ReadABAQUS::reset() 00100 { 00101 00102 } 00103 00104 00105 ReadABAQUS::~ReadABAQUS() 00106 { 00107 mdbImpl->release_interface(readMeshIface); 00108 if (NULL != abFile) 00109 abFile.close(); 00110 } 00111 00112 /* 00113 00114 ErrorCode ReadABAQUS::check_file_stats() 00115 * check for existence of file 00116 * initialize meshsets, and offsets if necessary 00117 00118 */ 00119 00120 ErrorCode ReadABAQUS::read_tag_values( const char* /* file_name */, 00121 const char* /* tag_name */, 00122 const FileOptions& /* opts */, 00123 std::vector<int>& /* tag_values_out */, 00124 const SubsetList* /* subset_list */ ) 00125 { 00126 return MB_NOT_IMPLEMENTED; 00127 } 00128 00129 00130 00131 ErrorCode ReadABAQUS::load_file(const char *abaqus_file_name, 00132 const EntityHandle* file_set_ptr, 00133 const FileOptions& /*opts*/, 00134 const ReaderIface::SubsetList* subset_list, 00135 const Tag* /*file_id_tag*/) 00136 { 00137 ErrorCode status; 00138 00139 if (subset_list) { 00140 readMeshIface->report_error( "Reading subset of files not supported for ABAQUS data." ); 00141 return MB_UNSUPPORTED_OPERATION; 00142 } 00143 00144 // open file 00145 lineNo = 0; 00146 abFile.open(abaqus_file_name); 00147 if (!abFile) 00148 return MB_FILE_DOES_NOT_EXIST; 00149 00150 bool in_unsupported = false; 00151 00152 EntityHandle file_set; 00153 status = mdbImpl->create_meshset( MESHSET_SET, file_set ); 00154 if (MB_SUCCESS != status) 00155 return status; 00156 00157 next_line_type = get_next_line_type(); 00158 while (next_line_type != abq_eof) 00159 { 00160 switch (next_line_type) 00161 { 00162 case abq_keyword_line: 00163 in_unsupported=false; 00164 switch (get_keyword()) 00165 { 00166 case abq_heading: 00167 // read header 00168 status = read_heading(file_set); 00169 break; 00170 00171 case abq_part: 00172 // read parts until done 00173 status = read_part(file_set); 00174 break; 00175 00176 case abq_assembly: 00177 // read assembly (or assemblies?) 00178 status = read_assembly(file_set); 00179 break; 00180 00181 default: 00182 // skip reading other content for now 00183 // (e.g. material properties, loads, surface interactions, etc) 00184 in_unsupported = true; 00185 // std::cout << "Ignoring unsupported keyword: " << readline << std::endl; 00186 } 00187 MB_RETURN_IF_FAIL; 00188 break; 00189 case abq_comment_line: 00190 break; 00191 case abq_data_line: 00192 if (!in_unsupported) 00193 { 00194 report_error( "Expected Keyword" ); 00195 return MB_FAILURE; 00196 } 00197 break; 00198 default: 00199 report_error( "Invalid/unreconginzed line" ); 00200 return MB_FAILURE; 00201 } 00202 next_line_type = get_next_line_type(); 00203 } 00204 00205 00206 // temporary??? delete parts 00207 // get all node sets in part 00208 Range part_sets; 00209 int tag_val = ABQ_PART_SET; 00210 void* tag_data[] = {&tag_val}; 00211 status = mdbImpl->get_entities_by_type_and_tag(file_set, 00212 MBENTITYSET, 00213 &mSetTypeTag, 00214 tag_data, 1, part_sets); 00215 MB_RETURN_IF_FAIL; 00216 00217 for (Range::iterator part_set = part_sets.begin(); 00218 part_set != part_sets.end(); 00219 part_set++) 00220 { 00221 Range ent_sets; 00222 tag_val = ABQ_NODE_SET; 00223 tag_data[0] = &tag_val; 00224 00225 status = mdbImpl->get_entities_by_type_and_tag(*part_set, 00226 MBENTITYSET, 00227 &mSetTypeTag, 00228 tag_data, 1, ent_sets); 00229 MB_RETURN_IF_FAIL; 00230 00231 status = mdbImpl->delete_entities(ent_sets); 00232 MB_RETURN_IF_FAIL; 00233 00234 tag_val = ABQ_ELEMENT_SET; 00235 tag_data[0] = &tag_val; 00236 00237 status = mdbImpl->get_entities_by_type_and_tag(*part_set, 00238 MBENTITYSET, 00239 &mSetTypeTag, 00240 tag_data, 1, ent_sets); 00241 MB_RETURN_IF_FAIL; 00242 00243 status = mdbImpl->delete_entities(ent_sets); 00244 MB_RETURN_IF_FAIL; 00245 00246 Range node_list,ele_list; 00247 status = get_set_elements(*part_set,ele_list); 00248 MB_RETURN_IF_FAIL; 00249 00250 status = mdbImpl->delete_entities(ele_list); 00251 MB_RETURN_IF_FAIL; 00252 00253 status = mdbImpl->get_entities_by_dimension(*part_set,0,node_list); 00254 MB_RETURN_IF_FAIL; 00255 00256 status = mdbImpl->delete_entities(node_list); 00257 MB_RETURN_IF_FAIL; 00258 00259 00260 00261 } 00262 00263 if (file_set_ptr) { 00264 status = mdbImpl->unite_meshset( *file_set_ptr, file_set ); 00265 MB_RETURN_IF_FAIL; 00266 } 00267 return mdbImpl->delete_entities( &file_set, 1 ); 00268 } 00269 00270 00271 ErrorCode ReadABAQUS::read_heading(EntityHandle /*file_set*/) 00272 { 00273 00274 std::vector<std::string> tokens; 00275 00276 // current line is only heading token. get next line 00277 next_line_type = get_next_line_type(); 00278 00279 // perhaps keep first line and tag gometry with title? 00280 00281 while (abq_data_line == next_line_type || 00282 abq_comment_line == next_line_type ) 00283 next_line_type = get_next_line_type(); 00284 00285 return MB_SUCCESS; 00286 } 00287 00288 ErrorCode ReadABAQUS::read_assembly(EntityHandle file_set) 00289 { 00290 ErrorCode status = MB_SUCCESS; 00291 00292 std::vector<std::string> tokens; 00293 std::map<std::string,std::string> params; 00294 std::map<std::string,abaqus_assembly_params> requiredParams; 00295 requiredParams["NAME"] = abq_assembly_name; 00296 00297 std::map<std::string,abaqus_assembly_params> allowableParams; 00298 allowableParams[ABQ_AMBIGUOUS] = abq_assembly_ambiguous; 00299 00300 abaqus_assembly_params param; 00301 00302 std::string assembly_name; 00303 00304 // tokenize last line read 00305 tokenize(readline,tokens,",\n"); 00306 extract_keyword_parameters(tokens,params); 00307 00308 // search for required parameters 00309 for (std::map<std::string,abaqus_assembly_params>::iterator thisParam=requiredParams.begin(); 00310 thisParam != requiredParams.end(); 00311 thisParam++) 00312 { 00313 std::string param_key = match( (*thisParam).first,params ); 00314 param = requiredParams[param_key]; 00315 switch (param) 00316 { 00317 case abq_assembly_name: 00318 assembly_name = params[param_key]; 00319 params.erase(param_key); 00320 // std::cout << "Adding ASSEMBLY with name: " << assembly_name << std::endl; // REMOVE 00321 break; 00322 default: 00323 // std::cout << "Missing required ASSEMBLY parameter " << (*thisParam).first << std::endl; 00324 return MB_FAILURE; 00325 } 00326 } 00327 00328 // process parameters 00329 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 00330 thisParam != params.end(); 00331 thisParam++) 00332 { 00333 // look for unambiguous match with this node parameter 00334 param = allowableParams[match( (*thisParam).first, allowableParams )]; 00335 switch (param) 00336 { 00337 case abq_assembly_ambiguous: 00338 // std::cout << "\tIgnoring ambiguous ASSEMBLY parameter: " << (*thisParam).first 00339 // << "=" << (*thisParam).second << std::endl; 00340 break; 00341 default: 00342 // std::cout << "\tIgnoring unsupported ASSEMBLY parameter: " << (*thisParam).first 00343 // << "=" << (*thisParam).second << std::endl; 00344 break; 00345 } 00346 } 00347 00348 00349 EntityHandle assembly_set; 00350 00351 status = add_entity_set(file_set,ABQ_ASSEMBLY_SET,assembly_name,assembly_set); 00352 00353 next_line_type = get_next_line_type(); 00354 00355 bool end_assembly = false; 00356 bool in_unsupported = false; 00357 00358 while (next_line_type != abq_eof && !end_assembly) 00359 { 00360 switch(next_line_type) 00361 { 00362 case abq_keyword_line: 00363 in_unsupported = false; 00364 switch(get_keyword()) 00365 { 00366 case abq_end_assembly: 00367 end_assembly = true; 00368 break; 00369 case abq_instance: 00370 status = read_instance(assembly_set,file_set); 00371 break; 00372 case abq_nset: 00373 status = read_node_set(assembly_set,file_set); 00374 break; 00375 default: 00376 in_unsupported = true; 00377 // std::cout << "\tIgnoring unsupported keyword in this ASSEMBLY: " 00378 // << readline << std::endl; 00379 next_line_type = get_next_line_type(); 00380 break; 00381 } 00382 break; 00383 case abq_comment_line: 00384 next_line_type = get_next_line_type(); 00385 break; 00386 case abq_data_line: 00387 if (!in_unsupported) 00388 { 00389 // std::cout << "Internal Error: Data lines not allowed in ASSEMBLY keyword." 00390 // << std::endl << readline << std::endl; 00391 return MB_FAILURE; 00392 } 00393 next_line_type = get_next_line_type(); 00394 break; 00395 case abq_blank_line: 00396 // std::cout << "Error: Blank lines are not allowed." << std::endl; 00397 return MB_FAILURE; 00398 default: 00399 // std::cout << "Error reading ASSEMBLY " << assembly_name << std::endl; 00400 return MB_FAILURE; 00401 00402 } 00403 MB_RETURN_IF_FAIL; 00404 00405 } 00406 00407 00408 num_assembly_instances[assembly_set] = 0; 00409 00410 return MB_SUCCESS; 00411 } 00412 00413 00414 ErrorCode ReadABAQUS::read_instance(EntityHandle assembly_set,EntityHandle file_set) 00415 { 00416 ErrorCode status = MB_SUCCESS; 00417 00418 std::vector<std::string> tokens; 00419 std::map<std::string,std::string> params; 00420 std::map<std::string,abaqus_instance_params> requiredParams; 00421 requiredParams["NAME"] = abq_instance_name; 00422 requiredParams["PART"] = abq_instance_part; 00423 00424 std::map<std::string,abaqus_instance_params> allowableParams; 00425 allowableParams[ABQ_AMBIGUOUS] = abq_instance_ambiguous; 00426 00427 abaqus_instance_params param; 00428 00429 std::string instance_name,part_name; 00430 00431 // tokenize last line read 00432 tokenize(readline,tokens,",\n"); 00433 extract_keyword_parameters(tokens,params); 00434 00435 // search for required parameters 00436 for (std::map<std::string,abaqus_instance_params>::iterator thisParam=requiredParams.begin(); 00437 thisParam != requiredParams.end(); 00438 thisParam++) 00439 { 00440 std::string param_key = match( (*thisParam).first,params ); 00441 param = requiredParams[param_key]; 00442 switch (param) 00443 { 00444 case abq_instance_name: 00445 instance_name = params[param_key]; 00446 params.erase(param_key); 00447 break; 00448 case abq_instance_part: 00449 part_name = params[param_key]; 00450 params.erase(param_key); 00451 break; 00452 default: 00453 // std::cout << "Missing required INSTANCE parameter " << (*thisParam).first << std::endl; 00454 return MB_FAILURE; 00455 } 00456 } 00457 // std::cout << "\tAdding INSTANCE with name: " << instance_name << " of PART wit name: " << part_name << std::endl; // REMOVE 00458 00459 // process parameters 00460 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 00461 thisParam != params.end(); 00462 thisParam++) 00463 { 00464 // look for unambiguous match with this node parameter 00465 param = allowableParams[match( (*thisParam).first, allowableParams )]; 00466 switch (param) 00467 { 00468 case abq_instance_ambiguous: 00469 // std::cout << "\t\tIgnoring ambiguous INSTANCE parameter: " << (*thisParam).first 00470 // << "=" << (*thisParam).second << std::endl; 00471 break; 00472 default: 00473 // std::cout << "\t\tIgnoring unsupported INSTANCE parameter: " << (*thisParam).first 00474 // << "=" << (*thisParam).second << std::endl; 00475 break; 00476 } 00477 } 00478 00479 00480 next_line_type = get_next_line_type(); 00481 00482 bool read_translation = false; 00483 bool read_rotation = false; 00484 std::vector<double> translation(3,0); 00485 std::vector<double> rotation(7,0); 00486 bool end_instance = false; 00487 bool in_unsupported = false; 00488 00489 EntityHandle instance_set; 00490 status = add_entity_set(assembly_set,ABQ_INSTANCE_SET,instance_name,instance_set); 00491 MB_RETURN_IF_FAIL; 00492 00493 while (next_line_type != abq_eof && !end_instance) 00494 { 00495 switch(next_line_type) 00496 { 00497 case abq_keyword_line: 00498 in_unsupported=false; 00499 switch(get_keyword()) 00500 { 00501 case abq_end_instance: 00502 end_instance = true; 00503 next_line_type = get_next_line_type(); 00504 break; 00505 case abq_node: 00506 status = read_node_list(instance_set,assembly_set); 00507 break; 00508 case abq_element: 00509 status = read_element_list(instance_set,assembly_set); 00510 break; 00511 case abq_nset: 00512 status = read_node_set(instance_set,file_set,assembly_set); 00513 break; 00514 case abq_elset: 00515 status = read_element_set(instance_set,file_set,assembly_set); 00516 break; 00517 case abq_solid_section: 00518 status = read_solid_section(instance_set); 00519 break; 00520 default: 00521 in_unsupported = true; 00522 // std::cout << "\t\tIgnoring unsupported keyword in this INSTANCE: " 00523 // << readline << std::endl; 00524 next_line_type = get_next_line_type(); 00525 break; 00526 } 00527 break; 00528 case abq_comment_line: 00529 next_line_type = get_next_line_type(); 00530 break; 00531 case abq_data_line: 00532 if (!in_unsupported) 00533 { 00534 tokenize(readline,tokens,", \n"); 00535 if (!read_translation) 00536 { 00537 if (tokens.size() != 3) 00538 { 00539 report_error( "Wrong number of entries on INSTANCE translation line" ); 00540 return MB_FAILURE; 00541 } 00542 00543 for (unsigned int i=0;i<3;i++) 00544 translation[i] = atof(tokens[i].c_str()); 00545 00546 read_translation = true; 00547 } 00548 else 00549 if (!read_rotation) 00550 { 00551 if (tokens.size() != 7) 00552 { 00553 report_error( "Wrong number of entries on INSTANCE rotation line" ); 00554 return MB_FAILURE; 00555 } 00556 for (unsigned int i=0;i<7;i++) 00557 rotation[i] = atof(tokens[i].c_str()); 00558 00559 read_rotation = true; 00560 } 00561 else 00562 { 00563 report_error( "Too many data lines for this INSTANCE" ); 00564 return MB_FAILURE; 00565 } 00566 } 00567 next_line_type = get_next_line_type(); 00568 break; 00569 case abq_blank_line: 00570 report_error( "Error: Blank lines are not allowed." ); 00571 return MB_FAILURE; 00572 default: 00573 report_error( "Error reading INSTANCE " ); 00574 return MB_FAILURE; 00575 00576 } 00577 00578 } 00579 00580 status = create_instance_of_part(file_set,assembly_set,part_name, 00581 instance_name,instance_set,translation,rotation); 00582 MB_RETURN_IF_FAIL; 00583 00584 return MB_SUCCESS; 00585 00586 } 00587 00588 00589 ErrorCode ReadABAQUS::read_part(EntityHandle file_set) 00590 { 00591 ErrorCode status = MB_SUCCESS; 00592 00593 std::vector<std::string> tokens; 00594 std::map<std::string,std::string> params; 00595 std::map<std::string,abaqus_part_params> requiredParams; 00596 requiredParams["NAME"] = abq_part_name; 00597 00598 std::map<std::string,abaqus_part_params> allowableParams; 00599 allowableParams[ABQ_AMBIGUOUS] = abq_part_ambiguous; 00600 00601 abaqus_part_params param; 00602 00603 std::string part_name; 00604 00605 // tokenize last line read 00606 tokenize(readline,tokens,",\n"); 00607 extract_keyword_parameters(tokens,params); 00608 00609 // search for required parameters 00610 for (std::map<std::string,abaqus_part_params>::iterator thisParam=requiredParams.begin(); 00611 thisParam != requiredParams.end(); 00612 thisParam++) 00613 { 00614 std::string param_key = match( (*thisParam).first,params ); 00615 param = requiredParams[param_key]; 00616 switch (param) 00617 { 00618 case abq_part_name: 00619 part_name = params[param_key]; 00620 params.erase(param_key); 00621 // std::cout << "Adding PART with name: " << part_name << std::endl; // REMOVE 00622 break; 00623 default: 00624 report_error( "Missing required PART parameter" ); 00625 return MB_FAILURE; 00626 } 00627 } 00628 00629 // process parameters 00630 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 00631 thisParam != params.end(); 00632 thisParam++) 00633 { 00634 // look for unambiguous match with this node parameter 00635 param = allowableParams[match( (*thisParam).first, allowableParams )]; 00636 switch (param) 00637 { 00638 case abq_part_ambiguous: 00639 // std::cout << "\tIgnoring ambiguous PART parameter: " << (*thisParam).first 00640 // << "=" << (*thisParam).second << std::endl; 00641 break; 00642 default: 00643 // std::cout << "\tIgnoring unsupported PART parameter: " << (*thisParam).first 00644 // << "=" << (*thisParam).second << std::endl; 00645 break; 00646 } 00647 } 00648 00649 00650 EntityHandle part_set; 00651 00652 status = add_entity_set(file_set,ABQ_PART_SET,part_name,part_set); 00653 00654 next_line_type = get_next_line_type(); 00655 00656 bool end_part = false; 00657 bool in_unsupported = false; 00658 00659 while (next_line_type != abq_eof && !end_part) 00660 { 00661 switch(next_line_type) 00662 { 00663 case abq_keyword_line: 00664 in_unsupported=false; 00665 switch(get_keyword()) 00666 { 00667 case abq_end_part: 00668 end_part = true; 00669 break; 00670 case abq_node: 00671 status = read_node_list(part_set); 00672 break; 00673 case abq_element: 00674 status = read_element_list(part_set); 00675 break; 00676 case abq_nset: 00677 status = read_node_set(part_set); 00678 break; 00679 case abq_elset: 00680 status = read_element_set(part_set); 00681 break; 00682 case abq_solid_section: 00683 status = read_solid_section(part_set); 00684 break; 00685 default: 00686 in_unsupported = true; 00687 // std::cout << "\tIgnoring unsupported keyword in this PART: " 00688 // << readline << std::endl; 00689 next_line_type = get_next_line_type(); 00690 break; 00691 } 00692 MB_RETURN_IF_FAIL; 00693 break; 00694 case abq_comment_line: 00695 next_line_type = get_next_line_type(); 00696 break; 00697 case abq_data_line: 00698 if (!in_unsupported) 00699 { 00700 report_error ("Data lines not allowed in PART keyword."); 00701 return MB_FAILURE; 00702 } 00703 next_line_type = get_next_line_type(); 00704 break; 00705 case abq_blank_line: 00706 report_error( "Blank lines are not allowed." ); 00707 return MB_FAILURE; 00708 default: 00709 report_error( "Error reading PART." ); 00710 return MB_FAILURE; 00711 00712 } 00713 } 00714 00715 num_part_instances[part_set] = 0; 00716 00717 return MB_SUCCESS; 00718 } 00719 00720 ErrorCode ReadABAQUS::read_solid_section(EntityHandle parent_set) 00721 { 00722 ErrorCode status; 00723 00724 std::vector<std::string> tokens; 00725 std::map<std::string,std::string> params; 00726 std::map<std::string,abaqus_solid_section_params> requiredParams; 00727 requiredParams["ELSET"] = abq_solid_section_elset; 00728 requiredParams["MATERIAL"] = abq_solid_section_matname; 00729 00730 std::map<std::string,abaqus_solid_section_params> allowableParams; 00731 allowableParams[ABQ_AMBIGUOUS] = abq_solid_section_ambiguous; 00732 00733 abaqus_solid_section_params param; 00734 00735 // tokenize last line read 00736 tokenize(readline,tokens,",\n"); 00737 extract_keyword_parameters(tokens,params); 00738 00739 std::string elset_name,mat_name; 00740 00741 // search for required parameters 00742 for (std::map<std::string,abaqus_solid_section_params>::iterator thisParam=requiredParams.begin(); 00743 thisParam != requiredParams.end(); 00744 thisParam++) 00745 { 00746 std::string param_key = match( (*thisParam).first,params ); 00747 param = requiredParams[param_key]; 00748 switch (param) 00749 { 00750 case abq_solid_section_elset: 00751 elset_name = params[param_key]; 00752 params.erase(param_key); 00753 break; 00754 case abq_solid_section_matname: 00755 mat_name = params[param_key]; 00756 params.erase(param_key); 00757 break; 00758 default: 00759 report_error( "Missing required SOLID SECTION parameter." ); 00760 return MB_FAILURE; 00761 } 00762 } 00763 // std::cout << "\tAdding SOLID SECTION with to ELEMENT SET: " << elset_name << " with material: " << mat_name << std::endl; // REMOVE 00764 00765 // process parameters 00766 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 00767 thisParam != params.end(); 00768 thisParam++) 00769 { 00770 // look for unambiguous match with this node parameter 00771 param = allowableParams[match( (*thisParam).first, allowableParams )]; 00772 switch (param) 00773 { 00774 case abq_solid_section_ambiguous: 00775 // std::cout << "\t\tIgnoring ambiguous SOLID_SECTION parameter: " << (*thisParam).first 00776 // << "=" << (*thisParam).second << std::endl; 00777 break; 00778 default: 00779 // std::cout << "\t\tIgnoring unsupported SOLID_SECTION parameter: " << (*thisParam).first 00780 // << "=" << (*thisParam).second << std::endl; 00781 break; 00782 } 00783 } 00784 00785 EntityHandle set_handle; 00786 status = get_set_by_name(parent_set,ABQ_ELEMENT_SET,elset_name,set_handle); 00787 00788 status = mdbImpl->tag_set_data(mMatNameTag,&set_handle,1,mat_name.c_str()); 00789 MB_RETURN_IF_FAIL; 00790 00791 if (0 == matIDmap[mat_name]) 00792 matIDmap[mat_name] = ++mat_id; 00793 00794 status = mdbImpl->tag_set_data(mMaterialSetTag,&set_handle,1,&(matIDmap[mat_name])); 00795 MB_RETURN_IF_FAIL; 00796 00797 next_line_type = get_next_line_type(); 00798 00799 while (next_line_type != abq_eof && 00800 next_line_type != abq_keyword_line) 00801 next_line_type = get_next_line_type(); 00802 00803 return MB_SUCCESS; 00804 00805 } 00806 00807 ErrorCode ReadABAQUS::read_element_set(EntityHandle parent_set, EntityHandle file_set, EntityHandle assembly_set) 00808 { 00809 ErrorCode status; 00810 00811 std::vector<std::string> tokens; 00812 std::map<std::string,std::string> params; 00813 std::map<std::string,abaqus_elset_params> requiredParams; 00814 requiredParams["ELSET"] = abq_elset_elset; 00815 00816 std::map<std::string,abaqus_elset_params> allowableParams; 00817 allowableParams[ABQ_AMBIGUOUS] = abq_elset_ambiguous; 00818 allowableParams["GENERATE"] = abq_elset_generate; 00819 allowableParams["INSTANCE"] = abq_elset_instance; 00820 00821 abaqus_elset_params param; 00822 00823 std::string elset_name; 00824 bool generate_elset = false; 00825 std::string instance_name; 00826 EntityHandle element_container_set = parent_set; 00827 00828 // tokenize last line read 00829 tokenize(readline,tokens,",\n"); 00830 extract_keyword_parameters(tokens,params); 00831 00832 Range element_range; 00833 00834 // search for required parameters 00835 for (std::map<std::string,abaqus_elset_params>::iterator thisParam=requiredParams.begin(); 00836 thisParam != requiredParams.end(); 00837 thisParam++) 00838 { 00839 std::string param_key = match( (*thisParam).first,params ); 00840 param = requiredParams[param_key]; 00841 switch (param) 00842 { 00843 case abq_elset_elset: 00844 elset_name = params[param_key]; 00845 params.erase(param_key); 00846 // std::cout << "\tAdding ELSET with name: " << elset_name << std::endl; // REMOVE 00847 break; 00848 default: 00849 report_error( "Missing required ELSET parameter." ); 00850 return MB_FAILURE; 00851 } 00852 } 00853 00854 // process parameters 00855 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 00856 thisParam != params.end(); 00857 thisParam++) 00858 { 00859 // look for unambiguous match with this node parameter 00860 param = allowableParams[match( (*thisParam).first, allowableParams )]; 00861 switch (param) 00862 { 00863 case abq_elset_generate: 00864 generate_elset = true; 00865 break; 00866 case abq_elset_instance: 00867 instance_name = (*thisParam).second; 00868 status = get_set_by_name(parent_set,ABQ_INSTANCE_SET,instance_name,element_container_set); 00869 MB_RETURN_IF_FAIL; 00870 break; 00871 case abq_elset_ambiguous: 00872 // std::cout << "\t\tIgnoring ambiguous ELSET parameter: " << (*thisParam).first 00873 // << "=" << (*thisParam).second << std::endl; 00874 break; 00875 default: 00876 // std::cout << "\t\tIgnoring unsupported ELSET parameter: " << (*thisParam).first 00877 // << "=" << (*thisParam).second << std::endl; 00878 break; 00879 } 00880 } 00881 00882 00883 std::vector<int> element_list; 00884 Range tmp_element_range; 00885 00886 next_line_type = get_next_line_type(); 00887 00888 while (next_line_type != abq_eof && 00889 next_line_type != abq_keyword_line) 00890 { 00891 if (abq_data_line == next_line_type) 00892 { 00893 tokenize(readline,tokens,", \n"); 00894 if (generate_elset) 00895 { 00896 if (tokens.size() != 3) 00897 { 00898 report_error( "Wrong number of entries on GENERATE element set data line "); 00899 return MB_FAILURE; 00900 } 00901 int e1 = atoi(tokens[0].c_str()); 00902 int e2 = atoi(tokens[1].c_str()); 00903 int incr = atoi(tokens[2].c_str()); 00904 if ( ( (e2-e1)%incr ) != 0) 00905 { 00906 report_error( "Invalid data on GENERATE element set data line:" ); 00907 return MB_FAILURE; 00908 } 00909 for (int element_id=e1; element_id<=e2;element_id+=incr) 00910 element_list.push_back(element_id); 00911 } 00912 else 00913 for (unsigned int idx=0;idx<tokens.size();idx++) 00914 if(isalpha(tokens[idx][0])) 00915 { 00916 tmp_element_range.clear(); 00917 status = get_set_elements_by_name(element_container_set,ABQ_ELEMENT_SET,tokens[idx],tmp_element_range); 00918 MB_RETURN_IF_FAIL; 00919 00920 element_range.merge(tmp_element_range); 00921 } 00922 else 00923 element_list.push_back(atoi(tokens[idx].c_str())); 00924 } 00925 00926 next_line_type = get_next_line_type(); 00927 } 00928 00929 tmp_element_range.clear(); 00930 status = get_elements_by_id(element_container_set,element_list,tmp_element_range); 00931 MB_RETURN_IF_FAIL; 00932 00933 element_range.merge(tmp_element_range); 00934 00935 EntityHandle element_set; 00936 00937 status = add_entity_set(parent_set,ABQ_ELEMENT_SET,elset_name,element_set); 00938 MB_RETURN_IF_FAIL; 00939 00940 status = mdbImpl->add_entities(element_set,element_range); 00941 MB_RETURN_IF_FAIL; 00942 00943 // SHOULD WE EVER DO THIS??? 00944 if (file_set) 00945 { 00946 status = mdbImpl->add_entities(file_set,&element_set,1); 00947 MB_RETURN_IF_FAIL; 00948 } 00949 00950 // SHOULD WE EVER DO THIS??? 00951 if (assembly_set) 00952 { 00953 status = mdbImpl->add_entities(assembly_set,&element_set,1); 00954 MB_RETURN_IF_FAIL; 00955 00956 status = mdbImpl->tag_set_data(mAssemblyHandleTag,&element_set,1,&assembly_set); 00957 MB_RETURN_IF_FAIL; 00958 } 00959 00960 return MB_SUCCESS; 00961 00962 } 00963 00964 00965 00966 ErrorCode ReadABAQUS::read_node_set(EntityHandle parent_set,EntityHandle file_set, EntityHandle assembly_set) 00967 { 00968 ErrorCode status; 00969 00970 std::vector<std::string> tokens; 00971 std::map<std::string,std::string> params; 00972 std::map<std::string,abaqus_nset_params> requiredParams; 00973 requiredParams["NSET"] = abq_nset_nset; 00974 00975 std::map<std::string,abaqus_nset_params> allowableParams; 00976 allowableParams[ABQ_AMBIGUOUS] = abq_nset_ambiguous; 00977 allowableParams["ELSET"] = abq_nset_elset; 00978 allowableParams["GENERATE"] = abq_nset_generate; 00979 allowableParams["INSTANCE"] = abq_nset_instance; 00980 00981 abaqus_nset_params param; 00982 00983 std::string nset_name; 00984 bool make_from_elset = false; 00985 bool generate_nset = false; 00986 std::string elset_name, instance_name; 00987 EntityHandle node_container_set = parent_set; 00988 00989 // tokenize last line read 00990 tokenize(readline,tokens,",\n"); 00991 extract_keyword_parameters(tokens,params); 00992 00993 Range node_range; 00994 00995 // search for required parameters 00996 for (std::map<std::string,abaqus_nset_params>::iterator thisParam=requiredParams.begin(); 00997 thisParam != requiredParams.end(); 00998 thisParam++) 00999 { 01000 std::string param_key = match( (*thisParam).first,params ); 01001 param = requiredParams[param_key]; 01002 switch (param) 01003 { 01004 case abq_nset_nset: 01005 nset_name = params[param_key]; 01006 params.erase(param_key); 01007 // std::cout << "\tAdding NSET with name: " << nset_name << std::endl; // REMOVE 01008 break; 01009 default: 01010 report_error( "Missing required NSET parameter" ); 01011 return MB_FAILURE; 01012 } 01013 } 01014 01015 // process parameters 01016 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 01017 thisParam != params.end(); 01018 thisParam++) 01019 { 01020 // look for unambiguous match with this node parameter 01021 param = allowableParams[match( (*thisParam).first, allowableParams )]; 01022 switch (param) 01023 { 01024 case abq_nset_elset: 01025 make_from_elset = true; 01026 elset_name = (*thisParam).second; 01027 break; 01028 case abq_nset_generate: 01029 generate_nset = true; 01030 break; 01031 case abq_nset_instance: 01032 instance_name = (*thisParam).second; 01033 status = get_set_by_name(parent_set, ABQ_INSTANCE_SET, instance_name,node_container_set); 01034 MB_RETURN_IF_FAIL; 01035 break; 01036 case abq_nset_ambiguous: 01037 // std::cout << "\t\tIgnoring ambiguous NSET parameter: " << (*thisParam).first 01038 // << "=" << (*thisParam).second << std::endl; 01039 break; 01040 default: 01041 // std::cout << "\t\tIgnoring unsupported NSET parameter: " << (*thisParam).first 01042 // << "=" << (*thisParam).second << std::endl; 01043 break; 01044 } 01045 } 01046 01047 if (make_from_elset && generate_nset) 01048 { 01049 report_error( "Incompatible NSET parameters ELSET & GENERATE" ); 01050 return MB_FAILURE; 01051 } 01052 01053 if (make_from_elset) 01054 { 01055 status = get_set_nodes(parent_set,ABQ_ELEMENT_SET,elset_name,node_range); 01056 MB_RETURN_IF_FAIL; 01057 } 01058 else 01059 { 01060 std::vector<int> node_list; 01061 Range tmp_node_range; 01062 01063 next_line_type = get_next_line_type(); 01064 01065 while (next_line_type != abq_eof && 01066 next_line_type != abq_keyword_line) 01067 { 01068 if (abq_data_line == next_line_type) 01069 { 01070 tokenize(readline,tokens,", \n"); 01071 if (generate_nset) 01072 { 01073 if (tokens.size() != 3) 01074 { 01075 report_error( "Wrong number of entries on GENERATE node set data line" ); 01076 return MB_FAILURE; 01077 } 01078 int n1 = atoi(tokens[0].c_str()); 01079 int n2 = atoi(tokens[1].c_str()); 01080 int incr = atoi(tokens[2].c_str()); 01081 if ( ( (n2-n1) % incr ) != 0) 01082 { 01083 report_error( "Invalid data on GENERATE node set data line" ); 01084 return MB_FAILURE; 01085 } 01086 for (int node_id=n1; node_id<=n2;node_id+=incr) 01087 node_list.push_back(node_id); 01088 } 01089 else 01090 for (unsigned int idx=0;idx<tokens.size();idx++) 01091 if(isalpha(tokens[idx][0])) 01092 { 01093 tmp_node_range.clear(); 01094 status = get_set_nodes(parent_set,ABQ_NODE_SET,tokens[idx],tmp_node_range); 01095 MB_RETURN_IF_FAIL; 01096 01097 node_range.merge(tmp_node_range); 01098 } 01099 else 01100 node_list.push_back(atoi(tokens[idx].c_str())); 01101 } 01102 01103 next_line_type = get_next_line_type(); 01104 } 01105 01106 tmp_node_range.clear(); 01107 01108 status = get_nodes_by_id(node_container_set,node_list,tmp_node_range); 01109 MB_RETURN_IF_FAIL; 01110 01111 node_range.merge(tmp_node_range); 01112 01113 } 01114 01115 EntityHandle node_set; 01116 01117 status = add_entity_set(parent_set,ABQ_NODE_SET,nset_name,node_set); 01118 MB_RETURN_IF_FAIL; 01119 01120 status = mdbImpl->add_entities(node_set,node_range); 01121 MB_RETURN_IF_FAIL; 01122 01123 if (file_set) 01124 { 01125 status = mdbImpl->add_entities(file_set,&node_set,1); 01126 MB_RETURN_IF_FAIL; 01127 } 01128 01129 if (assembly_set) 01130 { 01131 status = mdbImpl->add_entities(assembly_set,&node_set,1); 01132 MB_RETURN_IF_FAIL; 01133 01134 status = mdbImpl->tag_set_data(mAssemblyHandleTag,&node_set,1,&assembly_set); 01135 MB_RETURN_IF_FAIL; 01136 } 01137 01138 return MB_SUCCESS; 01139 01140 } 01141 01142 ErrorCode ReadABAQUS::read_element_list(EntityHandle parent_set, EntityHandle assembly_set) 01143 { 01144 ErrorCode status; 01145 01146 std::vector<std::string> tokens; 01147 std::map<std::string,std::string> params; 01148 std::map<std::string,abaqus_element_params> requiredParams; 01149 requiredParams["TYPE"] = abq_element_type; 01150 01151 std::map<std::string,abaqus_element_params> allowableParams; 01152 allowableParams[ABQ_AMBIGUOUS] = abq_element_ambiguous; 01153 allowableParams["ELSET"] = abq_element_elset; 01154 01155 abaqus_element_params param; 01156 01157 std::map<std::string,abaqus_element_type> elementTypes; 01158 std::map<abaqus_element_type,unsigned int> nodes_per_element; 01159 std::map<abaqus_element_type,EntityType> entityTypeMap; 01160 elementTypes["DC3D8"] = abq_eletype_dc3d8; 01161 nodes_per_element[abq_eletype_dc3d8] = 8; 01162 entityTypeMap[abq_eletype_dc3d8] = MBHEX; 01163 01164 elementTypes["DCC3D8"] = abq_eletype_dcc3d8; 01165 nodes_per_element[abq_eletype_dcc3d8] = 8; 01166 entityTypeMap[abq_eletype_dcc3d8] = MBHEX; 01167 01168 elementTypes["C3D4"] = abq_eletype_c3d4; 01169 nodes_per_element[abq_eletype_c3d4] = 4; 01170 entityTypeMap[abq_eletype_c3d4] = MBTET; 01171 01172 elementTypes["DC3D4"] = abq_eletype_dc3d4; 01173 nodes_per_element[abq_eletype_dc3d4] = 4; 01174 entityTypeMap[abq_eletype_dc3d4] = MBTET; 01175 01176 elementTypes["C3D8R"] = abq_eletype_c3d8r; 01177 nodes_per_element[abq_eletype_c3d8r] = 8; 01178 entityTypeMap[abq_eletype_c3d8r] = MBHEX; 01179 01180 elementTypes["DS4"] = abq_eletype_ds4; 01181 nodes_per_element[abq_eletype_ds4] = 4; 01182 entityTypeMap[abq_eletype_ds4] = MBQUAD; 01183 01184 abaqus_element_type element_type = abq_eletype_dc3d8; 01185 01186 bool make_element_set = false; 01187 std::string element_set_name; 01188 01189 // tokenize last line read 01190 tokenize(readline,tokens,",\n"); 01191 extract_keyword_parameters(tokens,params); 01192 01193 // search for required parameters 01194 for (std::map<std::string,abaqus_element_params>::iterator thisParam=requiredParams.begin(); 01195 thisParam != requiredParams.end(); 01196 thisParam++) 01197 { 01198 std::string param_key = match( (*thisParam).first,params ); 01199 param = requiredParams[param_key]; 01200 switch (param) 01201 { 01202 case abq_element_type: 01203 element_type = elementTypes[ params[param_key]]; 01204 if (abq_eletype_unsupported == element_type) 01205 { 01206 report_error( "MOAB doesn't currently support this element type" ); 01207 return MB_FAILURE; 01208 } 01209 // std::cout << "\tAdding ELEMENTS of type: " << params[param_key] << std::endl; // REMOVE 01210 params.erase(param_key); 01211 break; 01212 case abq_element_undefined: 01213 report_error( "Missing required ELEMENT parameter" ); 01214 return MB_FAILURE; 01215 default: 01216 break; 01217 } 01218 } 01219 01220 // process parameters 01221 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 01222 thisParam != params.end(); 01223 thisParam++) 01224 { 01225 // look for unambiguous match with this node parameter 01226 param = allowableParams[match( (*thisParam).first, allowableParams )]; 01227 switch (param) 01228 { 01229 case abq_element_elset: 01230 make_element_set = true; 01231 element_set_name = (*thisParam).second; 01232 break; 01233 case abq_element_ambiguous: 01234 // std::cout << "\t\tIgnoring ambiguous ELEMENT parameter: " << (*thisParam).first 01235 // << "=" << (*thisParam).second << std::endl; 01236 break; 01237 default: 01238 // std::cout << "\t\tIgnoring unsupported ELEMENT parameter: " << (*thisParam).first 01239 // << "=" << (*thisParam).second << std::endl; 01240 break; 01241 } 01242 } 01243 01244 std::vector<int> connect_list, element_ids; 01245 01246 next_line_type = get_next_line_type(); 01247 01248 while (next_line_type != abq_eof && 01249 next_line_type != abq_keyword_line) 01250 { 01251 if (abq_data_line == next_line_type) 01252 { 01253 tokenize(readline,tokens,", \n"); 01254 if (tokens.size() < nodes_per_element[element_type]+1) 01255 { 01256 report_error( "Not enough data on node data line" ); 01257 return MB_FAILURE; 01258 } 01259 element_ids.push_back(atoi(tokens[0].c_str())); 01260 for (unsigned int i=1;i<nodes_per_element[element_type]+1;i++) 01261 connect_list.push_back(atoi(tokens[i].c_str())); 01262 } 01263 next_line_type = get_next_line_type(); 01264 } 01265 01266 int num_elements = element_ids.size(); 01267 01268 // get and fill element arrays 01269 EntityHandle start_element = 0; 01270 EntityHandle *connect; 01271 01272 status = readMeshIface->get_element_connect( num_elements, nodes_per_element[element_type], 01273 entityTypeMap[element_type], MB_START_ID, 01274 start_element, connect); 01275 MB_RETURN_IF_FAIL; 01276 if (0 == start_element) return MB_FAILURE; 01277 01278 // ASSUME: elements must be defined after nodes! 01279 // get list of node entity handles and node IDs 01280 Range node_list; 01281 status = mdbImpl->get_entities_by_dimension(parent_set, 0, node_list); 01282 MB_RETURN_IF_FAIL; 01283 01284 std::vector<int> node_ids(node_list.size()); 01285 status = mdbImpl->tag_get_data(mLocalIDTag,node_list,&node_ids[0]); 01286 MB_RETURN_IF_FAIL; 01287 01288 std::map<int,EntityHandle> nodeIdMap; 01289 for (unsigned int idx=0;idx<node_list.size();idx++) 01290 nodeIdMap[node_ids[idx]] = node_list[idx]; 01291 01292 for (unsigned int node=0;node<connect_list.size();node++) 01293 connect[node] = nodeIdMap[connect_list[node]]; 01294 01295 Range element_range(start_element, start_element+num_elements-1); 01296 01297 // add elements to file_set 01298 // status = mdbImpl->add_entities(file_set,element_range); 01299 // MB_RETURN_IF_FAIL; 01300 01301 // add elements to this parent_set 01302 status = mdbImpl->add_entities(parent_set,element_range); 01303 MB_RETURN_IF_FAIL; 01304 01305 // tag elements with their local ID's 01306 status = mdbImpl->tag_set_data(mLocalIDTag,element_range,&element_ids[0]); 01307 MB_RETURN_IF_FAIL; 01308 01309 if (assembly_set) 01310 { 01311 status = mdbImpl->add_entities(assembly_set,element_range); 01312 MB_RETURN_IF_FAIL; 01313 01314 std::vector<EntityHandle> tmp_assembly_handles; 01315 tmp_assembly_handles.assign(element_range.size(),assembly_set); 01316 status = mdbImpl->tag_set_data(mAssemblyHandleTag,element_range,&(tmp_assembly_handles[0])); 01317 MB_RETURN_IF_FAIL; 01318 } 01319 01320 // these elements don't know their instance_set (probably not defined) 01321 01322 if (make_element_set) 01323 { 01324 EntityHandle element_set; 01325 01326 status = add_entity_set(parent_set,ABQ_ELEMENT_SET,element_set_name,element_set); 01327 MB_RETURN_IF_FAIL; 01328 01329 status = mdbImpl->add_entities(element_set,element_range); 01330 MB_RETURN_IF_FAIL; 01331 01332 // this ad-hoc element set doesn't know its: 01333 // * part_set (probably parent_set) 01334 // * instance_set (probably not defined) 01335 // * assembly_set (probably not defined) 01336 01337 } 01338 01339 return MB_SUCCESS; 01340 01341 01342 } 01343 01344 ErrorCode ReadABAQUS::read_node_list(EntityHandle parent_set, EntityHandle assembly_set) 01345 { 01346 ErrorCode status; 01347 01348 std::vector<std::string> tokens; 01349 std::map<std::string,std::string> params; 01350 std::map<std::string,abaqus_node_params> allowableParams; 01351 01352 allowableParams[ABQ_AMBIGUOUS] = abq_node_ambiguous; 01353 allowableParams["NSET"] = abq_node_nset; 01354 allowableParams["SYSTEM"] = abq_node_system; 01355 01356 abaqus_node_params param; 01357 01358 bool make_node_set = false; 01359 std::string node_set_name; 01360 01361 char coord_system = 'R'; 01362 01363 // tokenize last line read 01364 tokenize(readline,tokens,",\n"); 01365 extract_keyword_parameters(tokens,params); 01366 01367 // std::cout << "\tAdding NODES" << std::endl; // REMOVE 01368 01369 01370 // process parameters 01371 for (std::map<std::string,std::string>::iterator thisParam=params.begin(); 01372 thisParam != params.end(); 01373 thisParam++) 01374 { 01375 // look for unambiguous match with this node parameter 01376 param = allowableParams[match( (*thisParam).first, allowableParams )]; 01377 switch (param) 01378 { 01379 case abq_node_nset: 01380 make_node_set = true; 01381 node_set_name = (*thisParam).second; 01382 break; 01383 case abq_node_system: 01384 // store coordinate system 01385 coord_system = (*thisParam).second[0]; 01386 break; 01387 case abq_node_ambiguous: 01388 // std::cout << "\t\tIgnoring ambiguous NODE parameter: " << (*thisParam).first 01389 // << "=" << (*thisParam).second << std::endl; 01390 break; 01391 default: 01392 // std::cout << "\t\tIgnoring unsupported NODE parameter: " << (*thisParam).first 01393 // << "=" << (*thisParam).second << std::endl; 01394 break; 01395 } 01396 } 01397 01398 std::vector<double> coord_list; 01399 std::vector<int> node_ids; 01400 01401 next_line_type = get_next_line_type(); 01402 01403 while (next_line_type != abq_eof && 01404 next_line_type != abq_keyword_line) 01405 { 01406 if (abq_data_line == next_line_type) 01407 { 01408 tokenize(readline,tokens,", \n"); 01409 if (tokens.size() < 4) 01410 { 01411 report_error( "Not enough data on node data line" ); 01412 return MB_FAILURE; 01413 } 01414 node_ids.push_back(atoi(tokens[0].c_str())); 01415 for (unsigned int i=1;i<4;i++) 01416 coord_list.push_back(atof(tokens[i].c_str())); 01417 } 01418 next_line_type = get_next_line_type(); 01419 } 01420 01421 unsigned int num_nodes = node_ids.size(); 01422 01423 // transform coordinate systems 01424 switch (coord_system) 01425 { 01426 case 'R': 01427 break; 01428 case 'C': 01429 cyl2rect(coord_list); 01430 break; 01431 case 'S': 01432 sph2rect(coord_list); 01433 break; 01434 default: 01435 // std::cout << "Treating undefined coordinate system: " << coord_system 01436 // << " as rectangular/Cartesian." << std::endl; 01437 break; 01438 } 01439 01440 // get and fill coordinate arrays 01441 std::vector<double*> coord_arrays(3); 01442 EntityHandle start_node = 0; 01443 status = readMeshIface->get_node_coords(3, num_nodes,MB_START_ID, 01444 start_node,coord_arrays); 01445 MB_RETURN_IF_FAIL; 01446 01447 if (0 == start_node) return MB_FAILURE; 01448 01449 for (unsigned int idx=0;idx<num_nodes;idx++) 01450 { 01451 coord_arrays[0][idx] = coord_list[idx*3]; 01452 coord_arrays[1][idx] = coord_list[idx*3+1]; 01453 coord_arrays[2][idx] = coord_list[idx*3+2]; 01454 } 01455 01456 Range node_range(start_node, start_node+num_nodes-1); 01457 // add nodes to file_set 01458 // status = mdbImpl->add_entities(file_set,node_range); 01459 // MB_RETURN_IF_FAIL; 01460 01461 // add nodes to this parent_set 01462 status = mdbImpl->add_entities(parent_set,node_range); 01463 MB_RETURN_IF_FAIL; 01464 01465 // tag nodes with their local ID's 01466 status = mdbImpl->tag_set_data(mLocalIDTag,node_range,&node_ids[0]); 01467 MB_RETURN_IF_FAIL; 01468 01469 if (assembly_set) 01470 { 01471 status = mdbImpl->add_entities(assembly_set,node_range); 01472 MB_RETURN_IF_FAIL; 01473 01474 std::vector<EntityHandle> tmp_assembly_handles; 01475 tmp_assembly_handles.assign(node_range.size(),assembly_set); 01476 status = mdbImpl->tag_set_data(mAssemblyHandleTag,node_range,&(tmp_assembly_handles[0])); 01477 MB_RETURN_IF_FAIL; 01478 } 01479 01480 // these nodes don't know their instance_set (probably not defined) 01481 01482 if (make_node_set) 01483 { 01484 EntityHandle node_set; 01485 01486 status = add_entity_set(parent_set,ABQ_NODE_SET,node_set_name,node_set); 01487 MB_RETURN_IF_FAIL; 01488 01489 status = mdbImpl->add_entities(node_set,node_range); 01490 MB_RETURN_IF_FAIL; 01491 01492 // this ad-hoc node set doesn't know its: 01493 // * part_set (probably parent_set) 01494 // * instance_set (probably not defined) 01495 // * assembly_set (probably not defined) 01496 01497 } 01498 01499 01500 return MB_SUCCESS; 01501 } 01502 01503 // SET CREATION & ACCESS UTILITIES 01504 01505 ErrorCode ReadABAQUS::get_elements_by_id(EntityHandle parent_set, 01506 std::vector<int> element_ids_subset, 01507 Range &element_range) 01508 { 01509 ErrorCode status; 01510 Range all_elements; 01511 01512 status = get_set_elements(parent_set,all_elements); 01513 MB_RETURN_IF_FAIL; 01514 01515 std::vector<int> element_ids(all_elements.size()); 01516 status = mdbImpl->tag_get_data(mLocalIDTag,all_elements,&element_ids[0]); 01517 MB_RETURN_IF_FAIL; 01518 01519 std::map<int,EntityHandle> elementIdMap; 01520 for (unsigned int idx=0;idx<all_elements.size();idx++) 01521 elementIdMap[element_ids[idx]] = all_elements[idx]; 01522 01523 for (std::vector<int>::iterator element=element_ids_subset.begin(); 01524 element != element_ids_subset.end(); 01525 element++) 01526 element_range.insert(elementIdMap[*element]); 01527 01528 return MB_SUCCESS; 01529 01530 } 01531 ErrorCode ReadABAQUS::get_nodes_by_id(EntityHandle parent_set, 01532 std::vector<int> node_ids_subset, 01533 Range &node_range) 01534 { 01535 ErrorCode status; 01536 01537 Range all_nodes; 01538 status = mdbImpl->get_entities_by_type(parent_set,MBVERTEX,all_nodes); 01539 MB_RETURN_IF_FAIL; 01540 01541 std::vector<int> node_ids(all_nodes.size()); 01542 status = mdbImpl->tag_get_data(mLocalIDTag,all_nodes,&node_ids[0]); 01543 MB_RETURN_IF_FAIL; 01544 01545 std::map<int,EntityHandle> nodeIdMap; 01546 for (unsigned int idx=0;idx<all_nodes.size();idx++) 01547 nodeIdMap[node_ids[idx]] = all_nodes[idx]; 01548 01549 for (std::vector<int>::iterator node=node_ids_subset.begin(); 01550 node != node_ids_subset.end(); 01551 node++) 01552 { 01553 node_range.insert(nodeIdMap[*node]); 01554 } 01555 01556 return MB_SUCCESS; 01557 01558 } 01559 01560 01561 ErrorCode ReadABAQUS::get_set_by_name(EntityHandle parent_set, 01562 int ABQ_set_type, 01563 std::string set_name, 01564 EntityHandle &set_handle) 01565 { 01566 ErrorCode status; 01567 01568 char this_set_name[ABAQUS_SET_NAME_LENGTH]; 01569 01570 set_handle = 0; 01571 01572 Range sets; 01573 void* tag_data[] = {&ABQ_set_type}; 01574 status = mdbImpl->get_entities_by_type_and_tag(parent_set, 01575 MBENTITYSET, 01576 &mSetTypeTag, 01577 tag_data, 1, sets); 01578 if (MB_SUCCESS != status) 01579 { 01580 report_error( "Did not find any sets of that type" ); 01581 return status; 01582 } 01583 01584 for (Range::iterator this_set=sets.begin(); 01585 this_set != sets.end() && 0 == set_handle; 01586 this_set++) 01587 { 01588 std::fill(this_set_name,this_set_name+ABAQUS_SET_NAME_LENGTH,'\0'); 01589 status = mdbImpl->tag_get_data(mSetNameTag, &(*this_set), 1, &this_set_name[0]); 01590 if (MB_SUCCESS != status && MB_TAG_NOT_FOUND != status) return status; 01591 01592 if (set_name == std::string(this_set_name)) 01593 set_handle = *this_set; 01594 } 01595 01596 if (0 == set_handle) 01597 { 01598 report_error( "Did not find requested set" ); 01599 return MB_FAILURE; 01600 } 01601 01602 return MB_SUCCESS; 01603 } 01604 01605 ErrorCode ReadABAQUS::get_set_elements(EntityHandle set_handle, 01606 Range &element_range) 01607 { 01608 ErrorCode status; 01609 01610 Range dim_ent_list; 01611 01612 // could have elements of multiple dimensions in this set??? 01613 for (int dim=1;dim<=3;dim++) 01614 { 01615 dim_ent_list.clear(); 01616 status = mdbImpl->get_entities_by_dimension(set_handle,dim,dim_ent_list); 01617 MB_RETURN_IF_FAIL; 01618 01619 element_range.merge(dim_ent_list); 01620 } 01621 01622 return MB_SUCCESS; 01623 } 01624 01625 ErrorCode ReadABAQUS::get_set_elements_by_name(EntityHandle parent_set, 01626 int ABQ_set_type, 01627 std::string set_name, 01628 Range &element_range) 01629 { 01630 ErrorCode status; 01631 01632 EntityHandle set_handle; 01633 status = get_set_by_name(parent_set,ABQ_set_type,set_name,set_handle); 01634 MB_RETURN_IF_FAIL; 01635 01636 status = get_set_elements(set_handle,element_range); 01637 MB_RETURN_IF_FAIL; 01638 01639 if (element_range.size() == 0) 01640 { 01641 // std::cout << "No elements were found in set " << set_name << std::endl; 01642 } 01643 01644 return MB_SUCCESS; 01645 01646 } 01647 01648 01649 ErrorCode ReadABAQUS::get_set_nodes(EntityHandle parent_set, 01650 int ABQ_set_type, 01651 std::string set_name, 01652 Range &node_range) 01653 { 01654 ErrorCode status; 01655 01656 EntityHandle set_handle; 01657 status = get_set_by_name(parent_set,ABQ_set_type,set_name,set_handle); 01658 MB_RETURN_IF_FAIL; 01659 01660 Range ent_list; 01661 Range dim_ent_list; 01662 // could have elements of multiple dimensions in this set??? 01663 for (int dim=0;dim<=3;dim++) 01664 { 01665 dim_ent_list.clear(); 01666 status = mdbImpl->get_entities_by_dimension(set_handle,dim,dim_ent_list); 01667 MB_RETURN_IF_FAIL; 01668 01669 ent_list.merge(dim_ent_list); 01670 } 01671 01672 status = mdbImpl->get_adjacencies(ent_list,0,false,node_range); 01673 MB_RETURN_IF_FAIL; 01674 01675 if (node_range.size() == 0) 01676 { 01677 std::cout << "No nodes were found in set " << set_name << std::endl; 01678 } 01679 01680 return MB_SUCCESS; 01681 } 01682 01683 01684 Tag ReadABAQUS::get_tag(const char* tag_name, 01685 int tag_size, 01686 TagType tag_type, 01687 DataType tag_data_type, 01688 const void* def_val) 01689 { 01690 Tag retval; 01691 01692 ErrorCode rval = mdbImpl->tag_get_handle( tag_name, tag_size, tag_data_type, 01693 retval, tag_type|MB_TAG_CREAT, 01694 def_val ); 01695 assert(MB_SUCCESS == rval); 01696 return MB_SUCCESS == rval ? retval : 0; 01697 } 01698 01699 ErrorCode ReadABAQUS::create_instance_of_part(const EntityHandle file_set, 01700 const EntityHandle assembly_set, 01701 const std::string part_name, 01702 const std::string /*instance_name*/, 01703 EntityHandle &instance_set, 01704 const std::vector<double> &translation, 01705 const std::vector<double> &rotation) 01706 { 01707 ErrorCode status; 01708 01709 EntityHandle part_set; 01710 status = get_set_by_name(file_set,ABQ_PART_SET,part_name,part_set); 01711 MB_RETURN_IF_FAIL; 01712 01713 // cross-reference 01714 status = mdbImpl->tag_set_data(mPartHandleTag,&instance_set,1,&part_set); 01715 MB_RETURN_IF_FAIL; 01716 01717 int instance_id = ++num_part_instances[part_set]; 01718 status = mdbImpl->tag_set_data(mInstancePIDTag,&instance_set,1,&instance_id); 01719 MB_RETURN_IF_FAIL; 01720 01721 status = mdbImpl->tag_set_data(mAssemblyHandleTag,&instance_set,1,&assembly_set); 01722 MB_RETURN_IF_FAIL; 01723 01724 instance_id = ++num_assembly_instances[assembly_set]; 01725 status = mdbImpl->tag_set_data(mInstanceGIDTag,&instance_set,1,&instance_id); 01726 01727 // create maps to cross-reference the part and instance versions of each entity 01728 std::map<EntityHandle,EntityHandle> p2i_nodes, 01729 p2i_elements; 01730 01731 01732 // ---- NODES ---- 01733 01734 // get all nodes and IDs 01735 Range part_node_list; 01736 status = mdbImpl->get_entities_by_dimension(part_set,0,part_node_list); 01737 MB_RETURN_IF_FAIL; 01738 01739 if (0 < part_node_list.size()) { 01740 std::vector<int> node_ids(part_node_list.size()); 01741 status = mdbImpl->tag_get_data(mLocalIDTag,part_node_list,&node_ids[0]); 01742 MB_RETURN_IF_FAIL; 01743 01744 std::map<int,EntityHandle> nodeIdMap; 01745 for (unsigned int idx=0;idx<part_node_list.size();idx++) 01746 nodeIdMap[node_ids[idx]] = part_node_list[idx]; 01747 01748 // create new nodes 01749 std::vector<double*> coord_arrays(3); 01750 EntityHandle start_node = 0; 01751 status = readMeshIface->get_node_coords(3, part_node_list.size(),MB_START_ID, 01752 start_node,coord_arrays); 01753 MB_RETURN_IF_FAIL; 01754 01755 if (0 == start_node) return MB_FAILURE; 01756 01757 // copy coordinates into new coord_arrays 01758 status = mdbImpl->get_coords(part_node_list,coord_arrays[0],coord_arrays[1],coord_arrays[2]); 01759 01760 // rotate to new position 01761 double rot_axis[3]; 01762 rot_axis[0] = rotation[3]-rotation[0]; 01763 rot_axis[1] = rotation[4]-rotation[1]; 01764 rot_axis[2] = rotation[5]-rotation[2]; 01765 01766 AffineXform rotationXform; 01767 if (rotation[6] != 0) 01768 rotationXform = AffineXform::rotation(rotation[6]*DEG2RAD,rot_axis); 01769 01770 // translate to new position 01771 for (unsigned int idx=0;idx<part_node_list.size();idx++) 01772 { 01773 double coords[3]; 01774 01775 // transform to new location and then shift origin of rotation 01776 for (unsigned int dim=0;dim<3;dim++) 01777 coords[dim] = coord_arrays[dim][idx] + translation[dim] - rotation[dim]; 01778 01779 // rotate around this origin 01780 if (rotation[6] != 0) 01781 rotationXform.xform_vector(coords); 01782 01783 // transform irigin of rotation back 01784 for (unsigned int dim=0;dim<3;dim++) 01785 coord_arrays[dim][idx] = coords[dim] + rotation[dim]; 01786 01787 } 01788 01789 Range instance_node_list(start_node, start_node+part_node_list.size()-1); 01790 01791 // (DO NOT) add nodes to file_set 01792 // status = mdbImpl->add_entities(file_set,instance_node_list); 01793 // MB_RETURN_IF_FAIL; 01794 01795 // add nodes to this instance_set 01796 status = mdbImpl->add_entities(instance_set,instance_node_list); 01797 MB_RETURN_IF_FAIL; 01798 01799 // add nodes to this assembly_set 01800 status = mdbImpl->add_entities(assembly_set,instance_node_list); 01801 MB_RETURN_IF_FAIL; 01802 01803 // tag nodes with their local ID's 01804 status = mdbImpl->tag_set_data(mLocalIDTag,instance_node_list,&node_ids[0]); 01805 MB_RETURN_IF_FAIL; 01806 01807 // create a map of old handles to new handles!!! 01808 for (unsigned int idx=0;idx<part_node_list.size();idx++) 01809 p2i_nodes[part_node_list[idx]]=instance_node_list[idx]; 01810 } 01811 01812 // ---- ELEMENTS ---- 01813 01814 Range part_element_list; 01815 status = get_set_elements(part_set,part_element_list); 01816 MB_RETURN_IF_FAIL; 01817 01818 if (0 < part_element_list.size()) { 01819 std::vector<int> part_element_ids(part_element_list.size()); 01820 status = mdbImpl->tag_get_data(mLocalIDTag,part_element_list,&part_element_ids[0]); 01821 MB_RETURN_IF_FAIL; 01822 01823 std::map<int,EntityHandle> elementIdMap; 01824 for (unsigned int idx=0;idx<part_element_list.size();idx++) 01825 elementIdMap[part_element_ids[idx]] = part_element_list[idx]; 01826 01827 // create new elements 01828 Range instance_element_list; 01829 instance_element_list.clear(); 01830 01831 // cross-referencing storage and pointers/iterators 01832 std::vector<int> instance_element_ids; 01833 std::vector<int>::iterator part_element_id = part_element_ids.begin(); 01834 01835 for (Range::iterator part_element=part_element_list.begin(); 01836 part_element != part_element_list.end(); 01837 part_element++,part_element_id++) 01838 { 01839 EntityType element_type = mdbImpl->type_from_handle(*part_element); 01840 std::vector<EntityHandle> part_connectivity,instance_connectivity; 01841 EntityHandle new_element; 01842 status = mdbImpl->get_connectivity(&(*part_element),1,part_connectivity); 01843 MB_RETURN_IF_FAIL; 01844 01845 instance_connectivity.clear(); 01846 for (std::vector<EntityHandle>::iterator connectivity_node=part_connectivity.begin(); 01847 connectivity_node != part_connectivity.end(); 01848 connectivity_node++) 01849 instance_connectivity.push_back(p2i_nodes[*connectivity_node]); 01850 01851 status = mdbImpl->create_element(element_type,&instance_connectivity[0],instance_connectivity.size(),new_element); 01852 MB_RETURN_IF_FAIL; 01853 01854 instance_element_list.insert(new_element); 01855 p2i_elements[*part_element] = new_element; 01856 instance_element_ids.push_back(*part_element_id); 01857 } 01858 01859 // (DO NOT) add elements to file_set 01860 // status = mdbImpl->add_entities(file_set,instance_element_list); 01861 // MB_RETURN_IF_FAIL; 01862 01863 // add elements to this instance_set 01864 status = mdbImpl->add_entities(instance_set,instance_element_list); 01865 MB_RETURN_IF_FAIL; 01866 01867 // add elements to this assembly_set 01868 status = mdbImpl->add_entities(assembly_set,instance_element_list); 01869 MB_RETURN_IF_FAIL; 01870 01871 // tag elements with their local ID's 01872 status = mdbImpl->tag_set_data(mLocalIDTag,instance_element_list,&(instance_element_ids[0])); 01873 MB_RETURN_IF_FAIL; 01874 } 01875 01876 // ----- NODE SETS ----- 01877 01878 // get all node sets in part 01879 Range part_node_sets; 01880 int tag_val = ABQ_NODE_SET; 01881 void* tag_data[] = {&tag_val}; 01882 status = mdbImpl->get_entities_by_type_and_tag(part_set, 01883 MBENTITYSET, 01884 &mSetTypeTag, 01885 tag_data, 1, part_node_sets); 01886 MB_RETURN_IF_FAIL; 01887 01888 Range part_node_set_list, instance_node_set_list; 01889 for (Range::iterator part_node_set = part_node_sets.begin(); 01890 part_node_set != part_node_sets.end(); 01891 part_node_set++) 01892 { 01893 char node_set_name[ABAQUS_SET_NAME_LENGTH]; 01894 std::fill(node_set_name,node_set_name+ABAQUS_SET_NAME_LENGTH,'\0'); 01895 status = mdbImpl->tag_get_data(mSetNameTag, &(*part_node_set), 1, &node_set_name[0]); 01896 if (MB_SUCCESS != status && MB_TAG_NOT_FOUND != status) return status; 01897 01898 part_node_set_list.clear(); 01899 status = mdbImpl->get_entities_by_dimension(*part_node_set,0,part_node_set_list); 01900 01901 instance_node_set_list.clear(); 01902 for (Range::iterator set_node = part_node_set_list.begin(); 01903 set_node != part_node_set_list.end(); 01904 set_node++) 01905 instance_node_set_list.insert(p2i_nodes[*set_node]); 01906 01907 EntityHandle instance_node_set; 01908 01909 status = add_entity_set(instance_set,ABQ_NODE_SET,node_set_name,instance_node_set); 01910 MB_RETURN_IF_FAIL; 01911 01912 status = mdbImpl->add_entities(instance_node_set,instance_node_set_list); 01913 MB_RETURN_IF_FAIL; 01914 01915 status = mdbImpl->add_entities(assembly_set,&instance_node_set,1); 01916 MB_RETURN_IF_FAIL; 01917 01918 status = mdbImpl->tag_set_data(mPartHandleTag,&instance_node_set,1,&part_set); 01919 MB_RETURN_IF_FAIL; 01920 01921 status = mdbImpl->tag_set_data(mAssemblyHandleTag,&instance_node_set,1,&assembly_set); 01922 MB_RETURN_IF_FAIL; 01923 01924 } 01925 01926 // ----- ELEMENT SETS ----- 01927 01928 // get all element sets in part 01929 Range part_element_sets; 01930 tag_val = ABQ_ELEMENT_SET; 01931 tag_data[0] = &tag_val; 01932 status = mdbImpl->get_entities_by_type_and_tag(part_set, 01933 MBENTITYSET, 01934 &mSetTypeTag, 01935 tag_data, 1, part_element_sets); 01936 MB_RETURN_IF_FAIL; 01937 01938 Range part_element_set_list, instance_element_set_list; 01939 for (Range::iterator part_element_set = part_element_sets.begin(); 01940 part_element_set != part_element_sets.end(); 01941 part_element_set++) 01942 { 01943 char element_set_name[ABAQUS_SET_NAME_LENGTH]; 01944 std::fill(element_set_name,element_set_name+ABAQUS_SET_NAME_LENGTH,'\0'); 01945 status = mdbImpl->tag_get_data(mSetNameTag, &(*part_element_set), 1, &element_set_name[0]); 01946 if (MB_SUCCESS != status && MB_TAG_NOT_FOUND != status) return status; 01947 01948 part_element_set_list.clear(); 01949 status = get_set_elements(*part_element_set,part_element_set_list); 01950 01951 instance_element_set_list.clear(); 01952 for (Range::iterator set_element = part_element_set_list.begin(); 01953 set_element != part_element_set_list.end(); 01954 set_element++) 01955 instance_element_set_list.insert(p2i_elements[*set_element]); 01956 01957 EntityHandle instance_element_set; 01958 status = add_entity_set(instance_set,ABQ_ELEMENT_SET,element_set_name,instance_element_set); 01959 MB_RETURN_IF_FAIL; 01960 01961 //std::cerr << instance_set << "\t" << instance_element_set << std::endl; 01962 status = mdbImpl->add_entities(instance_element_set,instance_element_set_list); 01963 MB_RETURN_IF_FAIL; 01964 01965 status = mdbImpl->add_entities(assembly_set,&instance_element_set,1); 01966 MB_RETURN_IF_FAIL; 01967 01968 // status = mdbImpl->add_entities(file_set,&instance_element_set,1); 01969 //MB_RETURN_IF_FAIL; 01970 01971 status = mdbImpl->tag_set_data(mPartHandleTag,&instance_element_set,1,&part_set); 01972 MB_RETURN_IF_FAIL; 01973 01974 status = mdbImpl->tag_set_data(mAssemblyHandleTag,&instance_element_set,1,&assembly_set); 01975 MB_RETURN_IF_FAIL; 01976 01977 char element_set_matname[ABAQUS_SET_NAME_LENGTH]; 01978 std::fill(element_set_matname,element_set_matname+ABAQUS_SET_NAME_LENGTH,'\0'); 01979 status = mdbImpl->tag_get_data(mMatNameTag, &(*part_element_set), 1, &element_set_matname[0]); 01980 if (MB_SUCCESS != status && MB_TAG_NOT_FOUND != status) return status; 01981 01982 if (MB_TAG_NOT_FOUND != status) 01983 { 01984 status = mdbImpl->tag_set_data(mMatNameTag,&instance_element_set,1,element_set_matname); 01985 MB_RETURN_IF_FAIL; 01986 } 01987 01988 int element_set_mat_id; 01989 status = mdbImpl->tag_get_data(mMaterialSetTag,&(*part_element_set), 1, &element_set_mat_id); 01990 if (MB_SUCCESS != status && MB_TAG_NOT_FOUND != status) return status; 01991 01992 if (MB_TAG_NOT_FOUND != status) 01993 { 01994 status = mdbImpl->tag_set_data(mMaterialSetTag,&instance_element_set,1,&element_set_mat_id); 01995 MB_RETURN_IF_FAIL; 01996 } 01997 01998 01999 02000 } 02001 02002 // tag everything with their instance handle 02003 // some nodes are assigned outside of this routine so query final list of all 02004 // instance nodes, elements, etc 02005 Range instance_entity_list; 02006 status = mdbImpl->get_entities_by_dimension(instance_set,0,instance_entity_list); 02007 MB_RETURN_IF_FAIL; 02008 02009 std::vector<EntityHandle> tmp_instance_handles; 02010 tmp_instance_handles.assign(instance_entity_list.size(),instance_set); 02011 status = mdbImpl->tag_set_data(mInstanceHandleTag,instance_entity_list,&tmp_instance_handles[0]); 02012 MB_RETURN_IF_FAIL; 02013 02014 instance_entity_list.clear(); 02015 status = get_set_elements(instance_set,instance_entity_list); 02016 MB_RETURN_IF_FAIL; 02017 02018 tmp_instance_handles.clear(); 02019 tmp_instance_handles.assign(instance_entity_list.size(),instance_set); 02020 status = mdbImpl->tag_set_data(mInstanceHandleTag,instance_entity_list,&tmp_instance_handles[0]); 02021 MB_RETURN_IF_FAIL; 02022 02023 // get all node sets in instance 02024 instance_entity_list.clear(); 02025 tag_val = ABQ_NODE_SET; 02026 tag_data[0] = &tag_val; 02027 status = mdbImpl->get_entities_by_type_and_tag(instance_set, 02028 MBENTITYSET, 02029 &mSetTypeTag, 02030 tag_data, 1, instance_entity_list); 02031 MB_RETURN_IF_FAIL; 02032 02033 tmp_instance_handles.clear(); 02034 tmp_instance_handles.assign(instance_entity_list.size(),instance_set); 02035 status = mdbImpl->tag_set_data(mInstanceHandleTag,instance_entity_list,&tmp_instance_handles[0]); 02036 MB_RETURN_IF_FAIL; 02037 02038 // get all element sets in part 02039 instance_entity_list.clear(); 02040 tag_val = ABQ_ELEMENT_SET; 02041 tag_data[0] = &tag_val; 02042 status = mdbImpl->get_entities_by_type_and_tag(instance_set, 02043 MBENTITYSET, 02044 &mSetTypeTag, 02045 tag_data, 1, instance_entity_list); 02046 MB_RETURN_IF_FAIL; 02047 02048 tmp_instance_handles.clear(); 02049 tmp_instance_handles.assign(instance_entity_list.size(),instance_set); 02050 status = mdbImpl->tag_set_data(mInstanceHandleTag,instance_entity_list,&tmp_instance_handles[0]); 02051 MB_RETURN_IF_FAIL; 02052 02053 return MB_SUCCESS; 02054 } 02055 02056 02057 ErrorCode ReadABAQUS::add_entity_set(EntityHandle parent_set, 02058 int ABQ_Set_Type, 02059 std::string set_name, 02060 EntityHandle &entity_set) 02061 { 02062 ErrorCode status; 02063 02064 status = mdbImpl->create_meshset(MESHSET_SET, entity_set); 02065 MB_RETURN_IF_FAIL; 02066 02067 status = mdbImpl->tag_set_data(mSetTypeTag,&entity_set,1,&ABQ_Set_Type); 02068 MB_RETURN_IF_FAIL; 02069 02070 status = mdbImpl->tag_set_data(mSetNameTag,&entity_set,1,set_name.c_str()); 02071 MB_RETURN_IF_FAIL; 02072 02073 status = mdbImpl->add_entities(parent_set,&entity_set,1); 02074 MB_RETURN_IF_FAIL; 02075 02076 return MB_SUCCESS; 02077 } 02078 02079 02080 02081 02082 void ReadABAQUS::cyl2rect(std::vector<double> coord_list) 02083 { 02084 int num_nodes = coord_list.size()/3; 02085 double x,y,r,t; 02086 02087 for (int node=0;node<num_nodes;node++) 02088 { 02089 r = coord_list[3*node]; 02090 t = coord_list[3*node+1]*DEG2RAD; 02091 02092 x = r*cos(t); 02093 y = r*sin(t); 02094 02095 coord_list[3*node] = x; 02096 coord_list[3*node+1] = y; 02097 } 02098 } 02099 02100 void ReadABAQUS::sph2rect(std::vector<double> coord_list) 02101 { 02102 int num_nodes = coord_list.size()/3; 02103 double x,y,z,r,t,p; 02104 02105 for (int node=0;node<num_nodes;node++) 02106 { 02107 r = coord_list[3*node]; 02108 t = coord_list[3*node+1]*DEG2RAD; 02109 p = coord_list[3*node+2]*DEG2RAD; 02110 02111 x = r*cos(p)*cos(t); 02112 y = r*cos(p)*sin(t); 02113 z = r*sin(p); 02114 02115 coord_list[3*node] = x; 02116 coord_list[3*node+1] = y; 02117 coord_list[3*node+2] = z; 02118 } 02119 } 02120 02121 02122 // PARSING RECOGNITION 02123 02124 abaqus_line_types ReadABAQUS::get_next_line_type() 02125 { 02126 02127 readline.clear(); 02128 std::getline(abFile,readline); 02129 ++lineNo; 02130 02131 if (abFile.eof()) 02132 return abq_eof; 02133 02134 std::string::size_type pos = readline.find_first_not_of(' '); 02135 02136 if (std::string::npos == pos) 02137 return abq_blank_line; 02138 02139 if ('*' == readline[pos]) 02140 if ('*' == readline[pos+1]) 02141 return abq_comment_line; 02142 else 02143 return abq_keyword_line; 02144 else 02145 return abq_data_line; 02146 } 02147 02148 02149 abaqus_keyword_type ReadABAQUS::get_keyword() 02150 { 02151 02152 std::vector<std::string> tokens; 02153 std::map<std::string,abaqus_keyword_type> keywords; 02154 02155 // set up list of supported keywords 02156 // Note: any attempt to match something not in the keyword list 02157 // using the [] operator will create a new entry in the map 02158 // but that entry will have value abq_undefined based on the 02159 // definition of the abaqus_keyword_type enum. 02160 keywords[ABQ_AMBIGUOUS] = abq_ambiguous; 02161 keywords["HEADING"] = abq_heading; 02162 keywords["PART"] = abq_part; 02163 keywords["END PART"] = abq_end_part; 02164 keywords["ASSEMBLY"] = abq_assembly; 02165 keywords["END ASSEMBLY"] = abq_end_assembly; 02166 keywords["NODE"] = abq_node; 02167 keywords["ELEMENT"] = abq_element; 02168 keywords["NSET"] = abq_nset; 02169 keywords["ELSET"] = abq_elset; 02170 keywords["SOLID SECTION"] = abq_solid_section; 02171 keywords["INSTANCE"] = abq_instance; 02172 keywords["END INSTANCE"] = abq_end_instance; 02173 02174 tokenize(readline,tokens,"*,\n"); 02175 02176 // convert to upper case and test for unambiguous match/partial match 02177 stringToUpper(tokens[0],tokens[0]); 02178 return keywords[match(tokens[0],keywords)]; 02179 02180 } 02181 02182 02183 02184 // PARSING UTILITY FUNCTIONS 02185 02186 // for a map of strings to values of type T 02187 // search the key list of the map for an unambiguous partial match with the token 02188 template <typename T> 02189 std::string ReadABAQUS::match(const std::string &token, 02190 std::map<std::string,T> &tokenList) 02191 { 02192 // initialize with no match and ABQ_UNDEFINED as return string 02193 bool found_match = false; 02194 std::string best_match = ABQ_UNDEFINED; 02195 02196 // search the map 02197 for (typename std::map<std::string,T>::iterator thisToken=tokenList.begin(); 02198 thisToken != tokenList.end(); 02199 thisToken++) 02200 { 02201 // if a perfect match break the loop (assume keyword list is unambiguous) 02202 if (token == (*thisToken).first) 02203 { 02204 best_match = token; 02205 break; 02206 } 02207 else 02208 { 02209 int short_length = ( token.length()<(*thisToken).first.length()?token.length():(*thisToken).first.length() ); 02210 // if the token matches the first token.length() characters of the keyword 02211 // consider this a match 02212 if ( token.substr(short_length) == (*thisToken).first.substr(short_length) ) 02213 { 02214 if (!found_match) 02215 { 02216 // if no match already, record match and matching keyword 02217 found_match = true; 02218 best_match = (*thisToken).first; 02219 } 02220 else 02221 // if match already set matching keyword to ABQ_AMBIGUOUS 02222 best_match = ABQ_AMBIGUOUS; 02223 } 02224 } 02225 } 02226 02227 // Possible return values: ABQ_UNDEFINED, keyword from list, ABQ_AMBIGUOUS 02228 return best_match; 02229 } 02230 02231 // convert a string to upper case 02232 void ReadABAQUS::stringToUpper(std::string toBeConverted, std::string& converted) 02233 { 02234 converted = toBeConverted; 02235 02236 for (unsigned int i=0;i<toBeConverted.length();i++) 02237 converted[i] = toupper(toBeConverted[i]); 02238 02239 } 02240 02241 // extract key/value pairs from parameter list 02242 void ReadABAQUS::extract_keyword_parameters(std::vector<std::string> tokens, 02243 std::map<std::string,std::string>& params) 02244 { 02245 02246 std::string key, value; 02247 02248 02249 // NOTE: skip first token - it is the keyword 02250 for (std::vector<std::string>::iterator token=tokens.begin()+1; 02251 token!=tokens.end(); token++) 02252 { 02253 std::string::size_type pos = token->find('='); 02254 stringToUpper(token->substr(0,pos),key); 02255 if(std::string::npos != pos) 02256 value = token->substr(pos+1); 02257 else 02258 value = ""; 02259 pos = key.find_first_not_of(' ',0); 02260 key = key.substr(pos); 02261 params[key] = value; 02262 } 02263 } 02264 02265 // tokenize a string based on a set of possible delimiters 02266 void ReadABAQUS::tokenize( const std::string& str, 02267 std::vector<std::string>& tokens, 02268 const char* delimiters ) 02269 { 02270 tokens.clear(); 02271 02272 std::string::size_type pos, last = str.find_first_not_of( delimiters, 0 ); 02273 02274 while ( std::string::npos != last ) 02275 { 02276 pos = str.find_first_of( delimiters, last ); 02277 if ( std::string::npos == pos ) 02278 { 02279 tokens.push_back(str.substr(last)); 02280 last = std::string::npos; 02281 } 02282 else 02283 { 02284 tokens.push_back( str.substr( last, pos - last ) ); 02285 last = str.find_first_not_of( delimiters, pos ); 02286 } 02287 } 02288 } 02289 02290 02291 void ReadABAQUS::report_error( const char* message ) 02292 { 02293 readMeshIface->report_error( "Error at line %d: %s\n", lineNo, message ); 02294 } 02295 02296 } // namespace moab 02297