コード例 #1
0
ファイル: NonlinearSystem.C プロジェクト: huangh-inl/moose
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
}
コード例 #2
0
ファイル: RobotSetup.cpp プロジェクト: tkelman/Bonmin
  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;
    }
  }