GRINS-0.6.0
Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Private Member Functions | List of all members
GRINS::MeshAdaptiveSolverBase Class Referenceabstract

#include <mesh_adaptive_solver_base.h>

Inheritance diagram for GRINS::MeshAdaptiveSolverBase:
Inheritance graph
[legend]
Collaboration diagram for GRINS::MeshAdaptiveSolverBase:
Collaboration graph
[legend]

Public Member Functions

 MeshAdaptiveSolverBase (const GetPot &input)
 
virtual ~MeshAdaptiveSolverBase ()
 
virtual void initialize (const GetPot &input, std::tr1::shared_ptr< libMesh::EquationSystems > equation_system, GRINS::MultiphysicsSystem *system)
 
virtual void solve (SolverContext &context)=0
 
virtual void adjoint_qoi_parameter_sensitivity (SolverContext &, const libMesh::QoISet &, const libMesh::ParameterVector &, libMesh::SensitivityData &) const
 
virtual void forward_qoi_parameter_sensitivity (SolverContext &, const libMesh::QoISet &, const libMesh::ParameterVector &, libMesh::SensitivityData &) const
 
void steady_adjoint_solve (SolverContext &context)
 Do steady version of adjoint solve. More...
 

Protected Types

enum  RefinementFlaggingType {
  INVALID = 0, ERROR_TOLERANCE, N_ELEM_TARGET, ERROR_FRACTION,
  ELEM_FRACTION, MEAN_STD_DEV
}
 

Protected Member Functions

void build_mesh_refinement (libMesh::MeshBase &mesh)
 
void set_refinement_type (const GetPot &input, RefinementFlaggingType &refinement_type)
 
bool check_for_convergence (SolverContext &context, const libMesh::ErrorVector &error) const
 
void flag_elements_for_refinement (const libMesh::ErrorVector &error)
 
void set_solver_options (libMesh::DiffSolver &solver)
 
virtual void init_time_solver (GRINS::MultiphysicsSystem *system)=0
 

Protected Attributes

unsigned int _max_refinement_steps
 
bool _coarsen_by_parents
 
libMesh::Real _absolute_global_tolerance
 
unsigned int _nelem_target
 
libMesh::Real _refine_fraction
 
libMesh::Real _coarsen_fraction
 
libMesh::Real _coarsen_threshold
 
bool _plot_cell_errors
 
std::string _error_plot_prefix
 
unsigned int _node_level_mismatch_limit
 
unsigned int _edge_level_mismatch_limit
 
unsigned int _face_level_mismatch_limit
 
bool _enforce_mismatch_limit_prior_to_refinement
 
RefinementFlaggingType _refinement_type
 
boost::scoped_ptr< libMesh::MeshRefinement > _mesh_refinement
 
unsigned int _max_nonlinear_iterations
 
double _relative_step_tolerance
 
double _absolute_step_tolerance
 
double _relative_residual_tolerance
 
double _absolute_residual_tolerance
 
double _initial_linear_tolerance
 
double _minimum_linear_tolerance
 
unsigned int _max_linear_iterations
 
bool _continue_after_backtrack_failure
 
bool _continue_after_max_iterations
 
bool _solver_quiet
 
bool _solver_verbose
 
std::map< std::string, GRINS::NBCContainer > _neumann_bc_funcs
 

Private Member Functions

 MeshAdaptiveSolverBase ()
 

Detailed Description

Definition at line 51 of file mesh_adaptive_solver_base.h.

Member Enumeration Documentation

Constructor & Destructor Documentation

GRINS::MeshAdaptiveSolverBase::MeshAdaptiveSolverBase ( const GetPot &  input)

Definition at line 39 of file mesh_adaptive_solver_base.C.

References _refinement_type, and set_refinement_type().

40  : Solver( input ),
41  _max_refinement_steps( input("MeshAdaptivity/max_refinement_steps", 5) ),
42  _coarsen_by_parents(true),
43  _absolute_global_tolerance( input("MeshAdaptivity/absolute_global_tolerance", 0) ),
44  _nelem_target( input("MeshAdaptivity/nelem_target", 0) ),
45  _refine_fraction( input("MeshAdaptivity/refine_percentage", 0.2) ),
46  _coarsen_fraction( input("MeshAdaptivity/coarsen_percentage", 0.2) ),
47  _coarsen_threshold( input("MeshAdaptivity/coarsen_threshold", 0) ),
48  _plot_cell_errors( input("MeshAdaptivity/plot_cell_errors", false) ),
49  _error_plot_prefix( input("MeshAdaptivity/error_plot_prefix", "cell_error") ),
50  _node_level_mismatch_limit( input("MeshAdaptivity/node_level_mismatch_limit", 0) ),
51  _edge_level_mismatch_limit( input("MeshAdaptivity/edge_level_mismatch_limit", 0 ) ),
52  _face_level_mismatch_limit( input("MeshAdaptivity/face_level_mismatch_limit", 1 ) ),
53  _enforce_mismatch_limit_prior_to_refinement( input("MeshAdaptivity/enforce_mismatch_limit_prior_to_refinement", false ) ),
55  _mesh_refinement(NULL)
56  {
57  this->set_refinement_type( input, _refinement_type );
58 
59  return;
60  }
boost::scoped_ptr< libMesh::MeshRefinement > _mesh_refinement
Solver(const GetPot &input)
Definition: grins_solver.C:44
void set_refinement_type(const GetPot &input, RefinementFlaggingType &refinement_type)
GRINS::MeshAdaptiveSolverBase::~MeshAdaptiveSolverBase ( )
virtual

Definition at line 62 of file mesh_adaptive_solver_base.C.

63  {
64  return;
65  }
GRINS::MeshAdaptiveSolverBase::MeshAdaptiveSolverBase ( )
private

Member Function Documentation

virtual void GRINS::Solver::adjoint_qoi_parameter_sensitivity ( SolverContext &  ,
const libMesh::QoISet &  ,
const libMesh::ParameterVector &  ,
libMesh::SensitivityData &   
) const
inlinevirtualinherited

Reimplemented in GRINS::SteadyMeshAdaptiveSolver, and GRINS::SteadySolver.

Definition at line 71 of file grins_solver.h.

76  { libmesh_not_implemented(); }
void GRINS::MeshAdaptiveSolverBase::build_mesh_refinement ( libMesh::MeshBase &  mesh)
protected

Definition at line 67 of file mesh_adaptive_solver_base.C.

References _absolute_global_tolerance, _coarsen_by_parents, _coarsen_fraction, _coarsen_threshold, _edge_level_mismatch_limit, _enforce_mismatch_limit_prior_to_refinement, _face_level_mismatch_limit, _mesh_refinement, _nelem_target, _node_level_mismatch_limit, and _refine_fraction.

Referenced by GRINS::SteadyMeshAdaptiveSolver::solve().

68  {
69  _mesh_refinement.reset( new libMesh::MeshRefinement( mesh ) );
70  _mesh_refinement->coarsen_by_parents() = _coarsen_by_parents;
71  _mesh_refinement->absolute_global_tolerance() = _absolute_global_tolerance;
72  _mesh_refinement->nelem_target() = _nelem_target;
73  _mesh_refinement->refine_fraction() = _refine_fraction;
74  _mesh_refinement->coarsen_fraction() = _coarsen_fraction;
75  _mesh_refinement->coarsen_threshold() = _coarsen_threshold;
76  _mesh_refinement->node_level_mismatch_limit() = _node_level_mismatch_limit;
77  _mesh_refinement->edge_level_mismatch_limit() = _edge_level_mismatch_limit;
78  _mesh_refinement->face_level_mismatch_limit() = _face_level_mismatch_limit;
79  _mesh_refinement->set_enforce_mismatch_limit_prior_to_refinement(_enforce_mismatch_limit_prior_to_refinement);
80 
81  return;
82  }
boost::scoped_ptr< libMesh::MeshRefinement > _mesh_refinement
bool GRINS::MeshAdaptiveSolverBase::check_for_convergence ( SolverContext &  context,
const libMesh::ErrorVector &  error 
) const
protected

Definition at line 148 of file mesh_adaptive_solver_base.C.

References _absolute_global_tolerance, and GRINS::SolverContext::do_adjoint_solve.

Referenced by GRINS::SteadyMeshAdaptiveSolver::solve().

150  {
151  bool converged = false;
152 
153  libMesh::Real error_estimate = 0.0;
154 
155  if( context.do_adjoint_solve )
156  {
157  error_estimate = std::accumulate( error.begin(), error.end(), 0.0 );
158  }
159  else
160  {
161  error_estimate = error.l2_norm();
162  }
163 
164  std::cout << "==========================================================" << std::endl
165  << "Error estimate = " << error_estimate << std::endl
166  << "==========================================================" << std::endl;
167 
168  // For now, we just check the norm
169  if( std::fabs(error_estimate) <= _absolute_global_tolerance )
170  {
171  converged = true;
172  }
173 
174  return converged;
175  }
void GRINS::MeshAdaptiveSolverBase::flag_elements_for_refinement ( const libMesh::ErrorVector &  error)
protected

Definition at line 177 of file mesh_adaptive_solver_base.C.

References _mesh_refinement, _refinement_type, ELEM_FRACTION, ERROR_FRACTION, ERROR_TOLERANCE, INVALID, MEAN_STD_DEV, and N_ELEM_TARGET.

Referenced by GRINS::SteadyMeshAdaptiveSolver::solve().

178  {
179  switch(_refinement_type)
180  {
181  case(ERROR_TOLERANCE):
182  {
183  _mesh_refinement->flag_elements_by_error_tolerance( error );
184  }
185  break;
186 
187  case(N_ELEM_TARGET):
188  {
189  _mesh_refinement->flag_elements_by_nelem_target( error );
190  }
191  break;
192 
193  case( ERROR_FRACTION ):
194  {
195  _mesh_refinement->flag_elements_by_error_fraction( error );
196  }
197  break;
198 
199  case( ELEM_FRACTION ):
200  {
201  _mesh_refinement->flag_elements_by_elem_fraction( error );
202  }
203  break;
204 
205  case( MEAN_STD_DEV ):
206  {
207  _mesh_refinement->flag_elements_by_mean_stddev( error );
208  }
209  break;
210 
211  case(INVALID):
212  {
213  std::cerr << "Error: Invalid refinement option!" << std::endl;
214  libmesh_error();
215  }
216  break;
217 
218  // Wat?!
219  default:
220  {
221  libmesh_error();
222  }
223 
224  } // switch(_refinement_type)
225 
226  return;
227  }
boost::scoped_ptr< libMesh::MeshRefinement > _mesh_refinement
virtual void GRINS::Solver::forward_qoi_parameter_sensitivity ( SolverContext &  ,
const libMesh::QoISet &  ,
const libMesh::ParameterVector &  ,
libMesh::SensitivityData &   
) const
inlinevirtualinherited

Reimplemented in GRINS::SteadyMeshAdaptiveSolver, and GRINS::SteadySolver.

Definition at line 79 of file grins_solver.h.

84  { libmesh_not_implemented(); }
virtual void GRINS::Solver::init_time_solver ( GRINS::MultiphysicsSystem *  system)
protectedpure virtualinherited
void GRINS::Solver::initialize ( const GetPot &  input,
std::tr1::shared_ptr< libMesh::EquationSystems >  equation_system,
GRINS::MultiphysicsSystem *  system 
)
virtualinherited

Reimplemented in GRINS::DisplacementContinuationSolver.

Definition at line 67 of file grins_solver.C.

References GRINS::Solver::init_time_solver(), and GRINS::Solver::set_solver_options().

Referenced by GRINS::DisplacementContinuationSolver::initialize().

70  {
71 
72  // Defined in subclasses depending on the solver used.
73  this->init_time_solver(system);
74 
75  // Initialize the system
76  equation_system->init();
77 
78  // Get diff solver to set options
79  libMesh::DiffSolver &solver = *(system->time_solver->diff_solver().get());
80 
81  // Set linear/nonlinear solver options
82  this->set_solver_options( solver );
83 
84  return;
85  }
virtual void init_time_solver(GRINS::MultiphysicsSystem *system)=0
void set_solver_options(libMesh::DiffSolver &solver)
Definition: grins_solver.C:87
void GRINS::MeshAdaptiveSolverBase::set_refinement_type ( const GetPot &  input,
MeshAdaptiveSolverBase::RefinementFlaggingType &  refinement_type 
)
protected

Definition at line 84 of file mesh_adaptive_solver_base.C.

References ELEM_FRACTION, ERROR_FRACTION, ERROR_TOLERANCE, MEAN_STD_DEV, and N_ELEM_TARGET.

Referenced by MeshAdaptiveSolverBase().

86  {
87  std::string refinement_stategy = input("MeshAdaptivity/refinement_strategy", "elem_fraction" );
88 
89  if( !input.have_variable("MeshAdaptivity/absolute_global_tolerance" ) )
90  {
91  std::cerr << "Error: Must specify absolute_global_tolerance for" << std::endl
92  << " adaptive refinement algorithms."
93  << std::endl;
94 
95  libmesh_error();
96  }
97 
98  if( refinement_stategy == std::string("error_tolerance") )
99  {
100  refinement_type = ERROR_TOLERANCE;
101  }
102 
103  else if( refinement_stategy == std::string("nelem_target") )
104  {
105  refinement_type = N_ELEM_TARGET;
106 
107  if( !input.have_variable("MeshAdaptivity/nelem_target") )
108  {
109  std::cerr << "Error: Must specify nelem_target for" << std::endl
110  << " for error_tolerance refinement strategy."
111  << std::endl;
112 
113  libmesh_error();
114  }
115  }
116 
117  else if( refinement_stategy == std::string("error_fraction") )
118  {
119  refinement_type = ERROR_FRACTION;
120  }
121 
122  else if( refinement_stategy == std::string("elem_fraction") )
123  {
124  refinement_type = ELEM_FRACTION;
125  }
126 
127  else if( refinement_stategy == std::string("mean_std_dev") )
128  {
129  refinement_type = MEAN_STD_DEV;
130  }
131 
132  else
133  {
134  std::cerr << "Error: Invalid refinement strategy " << refinement_stategy << std::endl
135  << " Valid refinement strategy options are: absolute_global_tolerance" << std::endl
136  << " error_tolerance" << std::endl
137  << " nelem_target" << std::endl
138  << " error_fraction" << std::endl
139  << " elem_fraction" << std::endl
140  << " mean_std_dev" << std::endl;
141 
142  libmesh_error();
143  }
144 
145  return;
146  }
void GRINS::Solver::set_solver_options ( libMesh::DiffSolver &  solver)
protectedinherited

Definition at line 87 of file grins_solver.C.

References GRINS::Solver::_absolute_residual_tolerance, GRINS::Solver::_absolute_step_tolerance, GRINS::Solver::_continue_after_backtrack_failure, GRINS::Solver::_continue_after_max_iterations, GRINS::Solver::_initial_linear_tolerance, GRINS::Solver::_max_linear_iterations, GRINS::Solver::_max_nonlinear_iterations, GRINS::Solver::_minimum_linear_tolerance, GRINS::Solver::_relative_residual_tolerance, GRINS::Solver::_relative_step_tolerance, GRINS::Solver::_solver_quiet, and GRINS::Solver::_solver_verbose.

Referenced by GRINS::Solver::initialize().

88  {
89  solver.quiet = this->_solver_quiet;
90  solver.verbose = this->_solver_verbose;
91  solver.max_nonlinear_iterations = this->_max_nonlinear_iterations;
92  solver.relative_step_tolerance = this->_relative_step_tolerance;
93  solver.absolute_step_tolerance = this->_absolute_step_tolerance;
94  solver.relative_residual_tolerance = this->_relative_residual_tolerance;
95  solver.absolute_residual_tolerance = this->_absolute_residual_tolerance;
96  solver.max_linear_iterations = this->_max_linear_iterations;
97  solver.continue_after_backtrack_failure = this->_continue_after_backtrack_failure;
98  solver.initial_linear_tolerance = this->_initial_linear_tolerance;
99  solver.minimum_linear_tolerance = this->_minimum_linear_tolerance;
100  solver.continue_after_max_iterations = this->_continue_after_max_iterations;
101 
102  return;
103  }
double _absolute_residual_tolerance
Definition: grins_solver.h:103
bool _solver_verbose
Definition: grins_solver.h:112
double _relative_residual_tolerance
Definition: grins_solver.h:101
unsigned int _max_linear_iterations
Definition: grins_solver.h:106
double _relative_step_tolerance
Definition: grins_solver.h:95
bool _continue_after_backtrack_failure
Definition: grins_solver.h:107
double _minimum_linear_tolerance
Definition: grins_solver.h:105
double _absolute_step_tolerance
Definition: grins_solver.h:96
bool _continue_after_max_iterations
Definition: grins_solver.h:108
unsigned int _max_nonlinear_iterations
Definition: grins_solver.h:94
double _initial_linear_tolerance
Definition: grins_solver.h:104
virtual void GRINS::Solver::solve ( SolverContext &  context)
pure virtualinherited
void GRINS::Solver::steady_adjoint_solve ( SolverContext &  context)
inherited

Do steady version of adjoint solve.

We put this here since we may want to reuse this in multiple different steady solves.

Definition at line 105 of file grins_solver.C.

References GRINS::SolverContext::system.

Referenced by GRINS::SteadySolver::solve(), and GRINS::SteadyMeshAdaptiveSolver::solve().

106  {
107  libMesh::out << "==========================================================" << std::endl
108  << "Solving adjoint problem." << std::endl
109  << "==========================================================" << std::endl;
110 
111  context.system->adjoint_solve();
112  context.system->set_adjoint_already_solved(true);
113  }

Member Data Documentation

libMesh::Real GRINS::MeshAdaptiveSolverBase::_absolute_global_tolerance
protected

Definition at line 70 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement(), and check_for_convergence().

double GRINS::Solver::_absolute_residual_tolerance
protectedinherited

Definition at line 103 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

double GRINS::Solver::_absolute_step_tolerance
protectedinherited

Definition at line 96 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

bool GRINS::MeshAdaptiveSolverBase::_coarsen_by_parents
protected

Definition at line 69 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

libMesh::Real GRINS::MeshAdaptiveSolverBase::_coarsen_fraction
protected

Definition at line 73 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

libMesh::Real GRINS::MeshAdaptiveSolverBase::_coarsen_threshold
protected

Definition at line 74 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

bool GRINS::Solver::_continue_after_backtrack_failure
protectedinherited

Definition at line 107 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

bool GRINS::Solver::_continue_after_max_iterations
protectedinherited

Definition at line 108 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

unsigned int GRINS::MeshAdaptiveSolverBase::_edge_level_mismatch_limit
protected

Definition at line 79 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

bool GRINS::MeshAdaptiveSolverBase::_enforce_mismatch_limit_prior_to_refinement
protected

Definition at line 81 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

std::string GRINS::MeshAdaptiveSolverBase::_error_plot_prefix
protected

Definition at line 76 of file mesh_adaptive_solver_base.h.

Referenced by GRINS::SteadyMeshAdaptiveSolver::solve().

unsigned int GRINS::MeshAdaptiveSolverBase::_face_level_mismatch_limit
protected

Definition at line 80 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

double GRINS::Solver::_initial_linear_tolerance
protectedinherited

Definition at line 104 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

unsigned int GRINS::Solver::_max_linear_iterations
protectedinherited

Definition at line 106 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

unsigned int GRINS::Solver::_max_nonlinear_iterations
protectedinherited

Definition at line 94 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

unsigned int GRINS::MeshAdaptiveSolverBase::_max_refinement_steps
protected

Definition at line 68 of file mesh_adaptive_solver_base.h.

Referenced by GRINS::SteadyMeshAdaptiveSolver::solve().

boost::scoped_ptr<libMesh::MeshRefinement> GRINS::MeshAdaptiveSolverBase::_mesh_refinement
protected
double GRINS::Solver::_minimum_linear_tolerance
protectedinherited

Definition at line 105 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

unsigned int GRINS::MeshAdaptiveSolverBase::_nelem_target
protected

Definition at line 71 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

std::map< std::string, GRINS::NBCContainer > GRINS::Solver::_neumann_bc_funcs
protectedinherited

Definition at line 117 of file grins_solver.h.

unsigned int GRINS::MeshAdaptiveSolverBase::_node_level_mismatch_limit
protected

Definition at line 78 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

bool GRINS::MeshAdaptiveSolverBase::_plot_cell_errors
protected

Definition at line 75 of file mesh_adaptive_solver_base.h.

Referenced by GRINS::SteadyMeshAdaptiveSolver::solve().

libMesh::Real GRINS::MeshAdaptiveSolverBase::_refine_fraction
protected

Definition at line 72 of file mesh_adaptive_solver_base.h.

Referenced by build_mesh_refinement().

RefinementFlaggingType GRINS::MeshAdaptiveSolverBase::_refinement_type
protected
double GRINS::Solver::_relative_residual_tolerance
protectedinherited

Definition at line 101 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

double GRINS::Solver::_relative_step_tolerance
protectedinherited

Definition at line 95 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

bool GRINS::Solver::_solver_quiet
protectedinherited

Definition at line 111 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().

bool GRINS::Solver::_solver_verbose
protectedinherited

Definition at line 112 of file grins_solver.h.

Referenced by GRINS::Solver::set_solver_options().


The documentation for this class was generated from the following files:

Generated on Mon Jun 22 2015 21:32:23 for GRINS-0.6.0 by  doxygen 1.8.9.1