NonlinearSystem::NonlinearSystem(FEProblemBase & fe_problem, const std::string & name) : NonlinearSystemBase( fe_problem, fe_problem.es().add_system<TransientNonlinearImplicitSystem>(name), name), _transient_sys(fe_problem.es().get_system<TransientNonlinearImplicitSystem>(name)), _nl_residual_functor(_fe_problem), _fd_residual_functor(_fe_problem), _use_coloring_finite_difference(false) { nonlinearSolver()->residual_object = &_nl_residual_functor; nonlinearSolver()->jacobian = Moose::compute_jacobian; nonlinearSolver()->bounds = Moose::compute_bounds; nonlinearSolver()->nullspace = Moose::compute_nullspace; nonlinearSolver()->transpose_nullspace = Moose::compute_transpose_nullspace; nonlinearSolver()->nearnullspace = Moose::compute_nearnullspace; #ifdef LIBMESH_HAVE_PETSC PetscNonlinearSolver<Real> * petsc_solver = static_cast<PetscNonlinearSolver<Real> *>(_transient_sys.nonlinear_solver.get()); if (petsc_solver) { petsc_solver->set_residual_zero_out(false); petsc_solver->set_jacobian_zero_out(false); petsc_solver->use_default_monitor(false); } #endif }
void RobotSetup::addNWays() { int do_quick; options()->GetEnumValue("do_a_quick_one", do_quick, prefix()); int depth_frac; options()->GetIntegerValue("branch_on_frac_only", depth_frac, prefix()); // pass user set Sos constraints (code inspired from CoinSolve.cpp) const TMINLP::SosInfo * sos = nonlinearSolver()->model()->sosConstraints(); if (!getIntParameter(BabSetupBase::DisableSos) && sos && sos->num > 0) //we have some sos constraints { const int & numSos = sos->num; OsiObject ** objects = new OsiObject*[numSos]; const int * starts = sos->starts; const int * indices = sos->indices; //const char * types = sos->types; const double * weights = sos->weights; bool hasPriorities = false; const int * varPriorities = nonlinearSolver()->getPriorities(); int numberObjects = nonlinearSolver()->numberObjects(); if (varPriorities) { for (int i = 0 ; i < numberObjects ; i++) { if (varPriorities[i]) { hasPriorities = true; break; } } } const int * sosPriorities = sos->priorities; if (sosPriorities) { for (int i = 0 ; i < numSos ; i++) { if (sosPriorities[i]) { hasPriorities = true; break; } } } std::vector<std::list<int> > groups(numSos + 1); for (int i = 0 ; i < numSos ; i++) { int start = starts[i]; int length = starts[i + 1] - start; for(int j = 0 ; j < length ; j++){ groups[(size_t) weights[j]].push_back(indices[start+j]); } } for (int i = 0 ; i < numSos ; i++) { int start = starts[i]; int length = starts[i + 1] - start; BonNWayObject * nway = new BonNWayObject(length, &indices[start],i); nway->setPriority(1); for(int j = 0 ; j < length ; j++){//Setup consequences n_way_consequences cons; std::vector<int>& ids = cons.indices; int idx = (int) weights[j]; const std::list<int> &to_add = groups[idx]; for(std::list<int>::const_iterator k = to_add.begin() ; k != to_add.end() ; k++){ if(*k != indices[start+j]) ids.push_back(*k); } nway->setConsequence(j, cons); } objects[i] = nway; if(do_quick) nway->make_quick(); nway->set_only_frac_branches(depth_frac); if (hasPriorities && sosPriorities && sosPriorities[i]) { objects[i]->setPriority(sosPriorities[i]); } } nonlinearSolver()->addObjects(numSos, objects); for (int i = 0 ; i < numSos ; i++) delete objects[i]; delete [] objects; } }