void
  CustomMeshFactory::addSideSets(STK_Interface &mesh) const
  {
    mesh.beginModification();

    // get all part vectors
    stk_classic::mesh::Part *box[6];
    box[0] = mesh.getSideset("front");
    box[1] = mesh.getSideset("right");
    box[2] = mesh.getSideset("back");
    box[3] = mesh.getSideset("left");
    box[4] = mesh.getSideset("bottom");
    box[5] = mesh.getSideset("top");

    stk_classic::mesh::Part *wall = mesh.getSideset("wall");

    std::vector<stk_classic::mesh::Entity*> elements;
    mesh.getMyElements(elements);

    // loop over elements adding sides to sidesets
    for (std::vector<stk_classic::mesh::Entity*>::const_iterator
           itr=elements.begin();itr!=elements.end();++itr) {
      stk_classic::mesh::Entity *element = (*itr);
      stk_classic::mesh::PairIterRelation relations = element->relations(mesh.getSideRank());

      // loop over side id checking element neighbors
      for (std::size_t i=0;i<relations.size();++i) {
        stk_classic::mesh::Entity *side = relations[i].entity();
        stk_classic::mesh::PairIterRelation neighbors = side->relations(mesh.getElementRank());

        const std::size_t numNeighbors = neighbors.size();
        if (numNeighbors == 1) {
          if (side->owner_rank() == machRank_)
            mesh.addEntityToSideset(*side, box[i]);
        }
        else if (numNeighbors == 2) {
          std::string neig_block_id_0 = mesh.containingBlockId(neighbors[0].entity());
          std::string neig_block_id_1 = mesh.containingBlockId(neighbors[1].entity());
          if ((neig_block_id_0 != neig_block_id_1) && (side->owner_rank() == machRank_))
            mesh.addEntityToSideset(*side, wall);
        }
        else {
          // runtime exception
        }
      }
    }

    mesh.endModification();
  }