std::map< GRINS::PhysicsName, GRINS::NBCContainer > GRINS::ThermallyDrivenFlowTestBCFactory::build_neumann( libMesh::EquationSystems& es )
{
    std::map< std::string, GRINS::NBCContainer > nbcs;

    /* Hack to work around the fact that we're using this test for the axisymmetric
       case as well the fact I'm and idiot in the design of the axisymmetric cases. */
    if( _input("Physics/enabled_physics", "DIE!", 1) != std::string("HeatTransfer") )
    {
        // Do nothing.
    }
    else
    {
        // These are hardcoded for the 2D and 3D tests, *not* the axisymmetric test.
        const libMesh::System& system = es.get_system("GRINS");
        const GRINS::VariableIndex T_var = system.variable_number("T");

        GRINS::SharedPtr<GRINS::NeumannFuncObj> func( new ZeroFluxBC );

        GRINS::NBCContainer nbc_container;
        nbc_container.set_bc_id(0);
        nbc_container.add_var_func_pair( T_var, func );


        nbcs.insert( std::pair< std::string, GRINS::NBCContainer >( "HeatTransfer", nbc_container ) );
    }

    return nbcs;
}
  void DisplacementContinuationSolver::increment_displacement( GRINS::MultiphysicsSystem& system,
                                                               libMesh::EquationSystems& equation_system,
                                                               const libMesh::Real displacement )
  {
    // Get DirichetBoundaries vector.
    libMesh::DirichletBoundaries* d_vector = system.get_dof_map().get_dirichlet_boundaries();

    // Get the DirichletBoundary we want
    libMesh::DirichletBoundary* dirichlet = (*d_vector)[_bc_index];

    // Kill the old FunctionBase object and put in our new one.
    libMesh::FunctionBase<libMesh::Real>* composite_func_ptr = new libMesh::CompositeFunction<libMesh::Real>;
    libMesh::CompositeFunction<libMesh::Real>& composite_func = libMesh::cast_ref<libMesh::CompositeFunction<libMesh::Real>&>( *composite_func_ptr );

    std::vector<VariableIndex> var_idx(1,0); // Hardcoding to Ux displacement component
    composite_func.attach_subfunction( libMesh::ConstFunction<libMesh::Real>(displacement), var_idx );

    // DirichletBoundary now takes ownership of the pointer
    dirichlet->f.reset(composite_func_ptr);

    // Need to reinit system
    equation_system.reinit();

    return;
  }
  void DisplacementContinuationSolver::increment_displacement( GRINS::MultiphysicsSystem& system,
                                                               libMesh::EquationSystems& equation_system,
                                                               const libMesh::Real displacement )
  {
    // Get DirichetBoundaries vector.
    libMesh::DirichletBoundaries* d_vector = system.get_dof_map().get_dirichlet_boundaries();

    // Get the DirichletBoundary we want
    libMesh::DirichletBoundary* dirichlet = (*d_vector)[_bc_index];

    // Kill the old FunctionBase object and put in our new one.
    dirichlet->f.reset( new libMesh::ConstFunction<libMesh::Real>( displacement ) );

    // Need to reinit system
    equation_system.reinit();

    return;
  }