EigenLDLTSolverT.cc 4.08 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*===========================================================================*\
 *                                                                           *
 *                               CoMISo                                      *
 *      Copyright (C) 2008-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.rwth-graphics.de                            *
 *                                                                           *
 *---------------------------------------------------------------------------* 
 *  This file is part of CoMISo.                                             *
 *                                                                           *
 *  CoMISo is free software: you can redistribute it and/or modify           *
 *  it under the terms of the GNU General Public License as published by     *
 *  the Free Software Foundation, either version 3 of the License, or        *
 *  (at your option) any later version.                                      *
 *                                                                           *
 *  CoMISo is distributed in the hope that it will be useful,                *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *  GNU General Public License for more details.                             *
 *                                                                           *
 *  You should have received a copy of the GNU General Public License        *
 *  along with CoMISo.  If not, see <http://www.gnu.org/licenses/>.          *
 *                                                                           *
\*===========================================================================*/ 

25 26
//== COMPILE-TIME PACKAGE REQUIREMENTS ========================================
#include <CoMISo/Config/config.hh>
27
#if (COMISO_EIGEN3_AVAILABLE)
28
//== INCLUDES =================================================================
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

#define COMISO_EIGEN_LDLT_SOLVER_TEMPLATES_C

#include <CoMISo/Solver/GMM_Tools.hh>
#include <CoMISo/Solver/Eigen_Tools.hh>
#include <CoMISo/Solver/EigenLDLTSolver.hh>


namespace COMISO {


template< class GMM_MatrixT>
bool EigenLDLTSolver::calc_system_gmm( const GMM_MatrixT& _mat)
{
  if(show_timings_) sw_.start();

  Eigen::SparseMatrix<double> E;
  COMISO_EIGEN::gmm_to_eigen(_mat, E);

  if(show_timings_)
  {
      std::cerr << "EigenLDLT Timing GMM convert: " << sw_.stop()/1000.0 << "s\n";
      std::cerr << "#nnz: " << E.nonZeros() << std::endl;
  }

  return calc_system_eigen( E);
}
  

//-----------------------------------------------------------------------------


template< class GMM_MatrixT>
bool EigenLDLTSolver::update_system_gmm( const GMM_MatrixT& _mat)
{
  if(show_timings_) sw_.start();

  Eigen::SparseMatrix<double> E;
  COMISO_EIGEN::gmm_to_eigen(_mat, E);

  if(show_timings_)
  {
      std::cerr << "EigenLDLT Timing GMM convert: " << sw_.stop()/1000.0 << "s\n";
      std::cerr << "#nnz: " << E.nonZeros() << std::endl;
  }

  return update_system_eigen( E);
}

//-----------------------------------------------------------------------------
  
template< class Eigen_MatrixT>
bool EigenLDLTSolver::calc_system_eigen( const Eigen_MatrixT& _mat)
{
    n_ = _mat.rows();

    if(show_timings_) sw_.start();

    ldlt_.compute(_mat);

    if(show_timings_)
    {
      std::cerr << "EigenLDLT Timing EIGEN compute: " << sw_.stop()/1000.0 << "s\n";
    }

    return (ldlt_.info()==Eigen::Success);
}
  
//-----------------------------------------------------------------------------

template< class Eigen_MatrixT>
bool EigenLDLTSolver::update_system_eigen( const Eigen_MatrixT& _mat)
{
  if(show_timings_) sw_.start();

  ldlt_.factorize(_mat);

  if(show_timings_)
  {
    std::cerr << "EigenLDLT Timing EIGEN factorize: " << sw_.stop()/1000.0 << "s\n";
  }

  return (ldlt_.info()==Eigen::Success );
}


}
116 117

//=============================================================================
118
#endif // COMISO_EIGEN3_AVAILABLE
119
//=============================================================================