moab
ReadABAQUS.cpp
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines