void CustomMeshFactory::completeMeshConstruction(STK_Interface &mesh, stk_classic::ParallelMachine parallelMach) const { PANZER_FUNC_TIME_MONITOR("panzer::CustomMeshFactory::completeMeshConstruction()"); if (not mesh.isInitialized()) mesh.initialize(parallelMach); // add node and element information buildElements(mesh); // build edges and faces; fyi: addSides(mesh) builds only edges mesh.buildSubcells(); mesh.buildLocalElementIDs(); // now that edges are built, side and node sets can be added addSideSets(mesh); // set solution fields fillSolutionFieldData(mesh); // calls Stk_MeshFactory::rebalance //this->rebalance(mesh); }
void STK_ExodusReaderFactory::completeMeshConstruction(STK_Interface & mesh,stk::ParallelMachine parallelMach) const { PANZER_FUNC_TIME_MONITOR("panzer::STK_ExodusReaderFactory::completeMeshConstruction()"); using Teuchos::RCP; using Teuchos::rcp; if(not mesh.isInitialized()) mesh.initialize(parallelMach); // grab mesh data pointer to build the bulk data stk::mesh::MetaData & metaData = stk::mesh::fem::FEMMetaData::get_meta_data(*mesh.getMetaData()); stk::io::MeshData * meshData = const_cast<stk::io::MeshData *>(metaData.get_attribute<stk::io::MeshData>()); // if const_cast is wrong ... why does it feel so right? // I believe this is safe since we are basically hiding this object under the covers // until the mesh construction can be completed...below I cleanup the object myself. TEUCHOS_ASSERT(metaData.remove_attribute(meshData)); // remove the MeshData attribute RCP<stk::mesh::BulkData> bulkData = mesh.getBulkData(); // build mesh bulk data mesh.beginModification(); stk::io::populate_bulk_data(*bulkData, *meshData); mesh.endModification(); // put in a negative index and (like python) the restart will be from the back // (-1 is the last time step) int restartIndex = restartIndex_; if(restartIndex<0) { std::pair<int,double> lastTimeStep = meshData->m_input_region->get_max_time(); restartIndex = 1+restartIndex+lastTimeStep.first; } // populate mesh fields with specific index stk::io::process_input_request(*meshData,*bulkData,restartIndex); mesh.buildSubcells(); mesh.buildLocalElementIDs(); if(restartIndex>0) // process_input_request is a no-op if restartIndex<=0 ... thus there would be no inital time mesh.setInitialStateTime(meshData->m_input_region->get_state_time(restartIndex)); else mesh.setInitialStateTime(0.0); // no initial time to speak, might as well use 0.0 // clean up mesh data object delete meshData; // calls Stk_MeshFactory::rebalance this->rebalance(mesh); }
void SculptMeshFactory::completeMeshConstruction(STK_Interface & mesh,stk_classic::ParallelMachine parallelMach) const { PANZER_FUNC_TIME_MONITOR("panzer::SculptMeshFactory::completeMeshConstruction()"); if(not mesh.isInitialized()) mesh.initialize(parallelMach); buildElements(parallelMach,mesh); mesh.buildSubcells(); mesh.buildLocalElementIDs(); addSideSets(mesh); addNodeSets(mesh); this->rebalance(mesh); }
void MultiBlockMeshFactory::completeMeshConstruction(STK_Interface & mesh,stk::ParallelMachine parallelMach) const { if(not mesh.isInitialized()) mesh.initialize(parallelMach); // add node and element information buildElements(parallelMach,mesh); // finish up the edges mesh.buildSubcells(); mesh.buildLocalElementIDs(); // now that edges are built, sidets can be added addSideSets(mesh); // calls Stk_MeshFactory::rebalance this->rebalance(mesh); }
void CubeTetMeshFactory::completeMeshConstruction(STK_Interface & mesh,stk_classic::ParallelMachine parallelMach) const { PANZER_FUNC_TIME_MONITOR("panzer::CubeTetMeshFactory::completeMeshConstruction()"); if(not mesh.isInitialized()) mesh.initialize(parallelMach); // add node and element information buildElements(parallelMach,mesh); // finish up the edges and faces mesh.buildSubcells(); mesh.buildLocalElementIDs(); // now that edges are built, sidets can be added addSideSets(mesh); // calls Stk_MeshFactory::rebalance this->rebalance(mesh); }
void SquareQuadMeshFactory::completeMeshConstruction(STK_Interface & mesh,stk::ParallelMachine parallelMach) const { PANZER_FUNC_TIME_MONITOR("panzer::SquareQuadMeshFactory::completeMeshConstruction()"); if(not mesh.isInitialized()) mesh.initialize(parallelMach); // add node and element information buildElements(parallelMach,mesh); // finish up the edges #ifndef ENABLE_UNIFORM mesh.buildSubcells(); #endif mesh.buildLocalElementIDs(); // now that edges are built, sidsets can be added #ifndef ENABLE_UNIFORM addSideSets(mesh); #endif // add nodesets addNodeSets(mesh); }
void STK_ExodusReaderFactory::completeMeshConstruction(STK_Interface & mesh,stk_classic::ParallelMachine parallelMach) const { PANZER_FUNC_TIME_MONITOR("panzer::STK_ExodusReaderFactory::completeMeshConstruction()"); using Teuchos::RCP; using Teuchos::rcp; if(not mesh.isInitialized()) mesh.initialize(parallelMach); // grab mesh data pointer to build the bulk data stk_classic::mesh::MetaData & metaData = stk_classic::mesh::fem::FEMMetaData::get_meta_data(*mesh.getMetaData()); stk_classic::io::MeshData * meshData = const_cast<stk_classic::io::MeshData *>(metaData.get_attribute<stk_classic::io::MeshData>()); // if const_cast is wrong ... why does it feel so right? // I believe this is safe since we are basically hiding this object under the covers // until the mesh construction can be completed...below I cleanup the object myself. TEUCHOS_ASSERT(metaData.remove_attribute(meshData)); // remove the MeshData attribute RCP<stk_classic::mesh::BulkData> bulkData = mesh.getBulkData(); // build mesh bulk data mesh.beginModification(); stk_classic::io::populate_bulk_data(*bulkData, *meshData); // The following section of code is applicable if mesh scaling is // turned on from the input file. if (userMeshScaling_) { stk_classic::mesh::Field<double,stk_classic::mesh::Cartesian>* coord_field = metaData.get_field<stk_classic::mesh::Field<double, stk_classic::mesh::Cartesian> >("coordinates"); std::vector<stk_classic::mesh::Bucket*> const all_node_buckets = bulkData->buckets(stk_classic::mesh::fem::FEMMetaData::NODE_RANK); stk_classic::mesh::Selector select_all_local = metaData.locally_owned_part() | metaData.globally_shared_part(); std::vector<stk_classic::mesh::Bucket*> my_node_buckets; stk_classic::mesh::get_buckets(select_all_local, all_node_buckets, my_node_buckets); int mesh_dim = mesh.getDimension(); // Scale the mesh for (size_t i=0; i < my_node_buckets.size(); ++i) { stk_classic::mesh::Bucket& b = *(my_node_buckets[i]); stk_classic::mesh::BucketArray<stk_classic::mesh::Field<double,stk_classic::mesh::Cartesian> > coordinate_data(*coord_field, b); for (size_t j=0; j < b.size(); ++j) { int index = j; double inv_msf = 1.0/meshScaleFactor_; for (int k=0; k < mesh_dim; ++k) coordinate_data(k, index) = coordinate_data(k, index) * inv_msf; } } } mesh.endModification(); // put in a negative index and (like python) the restart will be from the back // (-1 is the last time step) int restartIndex = restartIndex_; if(restartIndex<0) { std::pair<int,double> lastTimeStep = meshData->m_input_region->get_max_time(); restartIndex = 1+restartIndex+lastTimeStep.first; } // populate mesh fields with specific index stk_classic::io::process_input_request(*meshData,*bulkData,restartIndex); mesh.buildSubcells(); mesh.buildLocalElementIDs(); if(restartIndex>0) // process_input_request is a no-op if restartIndex<=0 ... thus there would be no inital time mesh.setInitialStateTime(meshData->m_input_region->get_state_time(restartIndex)); else mesh.setInitialStateTime(0.0); // no initial time to speak, might as well use 0.0 // clean up mesh data object delete meshData; // calls Stk_MeshFactory::rebalance this->rebalance(mesh); }