NodeSet::NodeSet(const Ioss::NodeSet &other) { id = other.get_property("id").get_int(); nodeCount = other.get_property("entity_count").get_int(); dfCount = other.get_property("distribution_factor_count").get_int(); std::string io_name = other.name(); std::strncpy(name, io_name.c_str(), MAX_STR_LENGTH); name[MAX_STR_LENGTH] = 0; }
// ======================================================================== void process_nodesets(Ioss::Region ®ion, stk::mesh::BulkData &bulk) { // Should only process nodes that have already been defined via the element // blocks connectivity lists. const Ioss::NodeSetContainer& node_sets = region.get_nodesets(); for(Ioss::NodeSetContainer::const_iterator it = node_sets.begin(); it != node_sets.end(); ++it) { Ioss::NodeSet *entity = *it; if (stk::io::include_entity(entity)) { const std::string & name = entity->name(); const stk::mesh::MetaData& meta = stk::mesh::MetaData::get(bulk); stk::mesh::Part* const part = meta.get_part(name); STKIORequire(part != NULL); stk::mesh::PartVector add_parts( 1 , part ); std::vector<int> node_ids ; int node_count = entity->get_field_data("ids", node_ids); std::vector<stk::mesh::Entity> nodes(node_count); for(int i=0; i<node_count; ++i) { nodes[i] = bulk.get_entity( stk::topology::NODE_RANK, node_ids[i] ); if (bulk.is_valid(nodes[i])) { bulk.declare_entity(stk::topology::NODE_RANK, node_ids[i], add_parts ); } } /** \todo REFACTOR Application would probably store this field * (and others) somewhere after the declaration instead of * looking it up each time it is needed. */ stk::mesh::Field<double> *df_field = meta.get_field<stk::mesh::Field<double> >(stk::topology::NODE_RANK, "distribution_factors"); if (df_field != NULL) { stk::io::field_data_from_ioss(bulk, df_field, nodes, entity, "distribution_factors"); } } } }
// ======================================================================== void process_nodesets(Ioss::Region ®ion, stk::mesh::MetaData &meta) { const Ioss::NodeSetContainer& node_sets = region.get_nodesets(); stk::io::default_part_processing(node_sets, meta, stk::topology::NODE_RANK); /** \todo REFACTOR should "distribution_factor" be a default field * that is automatically declared on all objects that it exists * on as is done in current framework? */ stk::mesh::Field<double> & distribution_factors_field = meta.declare_field<stk::mesh::Field<double> >(stk::topology::NODE_RANK, "distribution_factors"); /** \todo REFACTOR How to associate distribution_factors field * with the nodeset part if a node is a member of multiple * nodesets */ for(Ioss::NodeSetContainer::const_iterator it = node_sets.begin(); it != node_sets.end(); ++it) { Ioss::NodeSet *entity = *it; if (stk::io::include_entity(entity)) { stk::mesh::Part* const part = meta.get_part(entity->name()); STKIORequire(part != NULL); STKIORequire(entity->field_exists("distribution_factors")); stk::mesh::put_field(distribution_factors_field, *part); /** \todo IMPLEMENT truly handle fields... For this case we * are just defining a field for each transient field that is * present in the mesh... */ stk::io::define_io_fields(entity, Ioss::Field::TRANSIENT, *part, part->primary_entity_rank() ) ; } } }