33 #include "libmesh/auto_ptr.h"
34 #include "libmesh/dof_map.h"
35 #include "libmesh/getpot.h"
36 #include "libmesh/dirichlet_boundaries.h"
37 #include "libmesh/const_function.h"
44 _bc_id( input(
"SolverOptions/DisplacementContinuation/boundary", -1) )
46 if( !input.have_variable(
"SolverOptions/DisplacementContinuation/boundary") )
48 std::cerr <<
"Error: Did not find boundary id for DisplacementContinuationSolver" << std::endl
49 <<
" Must specify SolverOptions/DisplacementContinuation/boundary in input." << std::endl;
53 if( !input.have_variable(
"SolverOptions/DisplacementContinuation/final_displacement") )
55 std::cerr <<
"Error: Did not find final_displacement value for DisplacementContinuationSolver" << std::endl
56 <<
" Must specify SolverOptions/DisplacementContinuation/final_displacement" << std::endl;
59 libMesh::Real disp_value = input(
"SolverOptions/DisplacementContinuation/final_displacement", 0.0);
62 if( !input.have_variable(
"SolverOptions/DisplacementContinuation/n_increments") )
64 std::cerr <<
"Error: Did not find final_displacement value for DisplacementContinuationSolver" << std::endl
65 <<
" Must specify SolverOptions/DisplacementContinuation/n_increments" << std::endl;
68 unsigned int n_increments = input(
"SolverOptions/DisplacementContinuation/n_increments", 1);
72 libMesh::Real increment = disp_value/n_increments;
74 for(
unsigned int i = 0; i < n_increments; i++ )
88 std::tr1::shared_ptr<libMesh::EquationSystems> equation_system,
95 libMesh::DirichletBoundaries* d_vector = system->get_dof_map().get_dirichlet_boundaries();
97 bool found_bc_id =
false;
98 for( libMesh::DirichletBoundaries::const_iterator it = d_vector->begin(); it != d_vector->end(); ++it )
100 if( (*it)->b.find(
_bc_id) != (*it)->b.end() )
111 std::cerr <<
"Error: Did not find prescribed boundary for DisplacementContinuationSolver" << std::endl
112 <<
" Was searching for bc_id = " <<
_bc_id << std::endl;
126 std::cout <<
"==========================================================" << std::endl
127 <<
" Displacement step " << s <<
", displacement = " << disp << std::endl
128 <<
"==========================================================" << std::endl;
145 libMesh::EquationSystems& equation_system,
146 const libMesh::Real displacement )
149 libMesh::DirichletBoundaries* d_vector = system.get_dof_map().get_dirichlet_boundaries();
152 libMesh::DirichletBoundary* dirichlet = (*d_vector)[
_bc_index];
155 dirichlet->f.reset(
new libMesh::ConstFunction<libMesh::Real>( displacement ) );
158 equation_system.reinit();
unsigned int _bc_index
Cache index into libMesh::DirichletBoundaries.
virtual void solve(SolverContext &context)
virtual ~DisplacementContinuationSolver()
virtual void initialize(const GetPot &input, std::tr1::shared_ptr< libMesh::EquationSystems > equation_system, GRINS::MultiphysicsSystem *system)
DisplacementContinuationSolver(const GetPot &input)
std::tr1::shared_ptr< libMesh::EquationSystems > equation_system
GRINS::MultiphysicsSystem * system
std::vector< libMesh::Real > _displacements
Interface with libMesh for solving Multiphysics problems.
std::tr1::shared_ptr< PostProcessedQuantities< libMesh::Real > > postprocessing
void increment_displacement(GRINS::MultiphysicsSystem &system, libMesh::EquationSystems &equation_system, const libMesh::Real displacement)
std::tr1::shared_ptr< GRINS::Visualization > vis
virtual void initialize(const GetPot &input, std::tr1::shared_ptr< libMesh::EquationSystems > equation_system, GRINS::MultiphysicsSystem *system)
Simple class to hold objects passed to Solver::solve.
libMesh::boundary_id_type _bc_id
Boundary on which we want to increment the displacement.