------------------------------------------
Release Notes for Trilinos Package Ifpack2
------------------------------------------

Development version (12.9)
--------------------------

* Experimental multithreaded Gauss-Seidel

This uses a new thread-parallel graph coloring algorithm implemented
in KokkosKernels.  Ifpack2's support for this lives in
Ifpack2::Relaxation.  Currently, building it is disabled by default
(see #288).  Enabling it requires enabling the following CMake options
that are currently OFF by default:

  - TpetraKernels_ENABLE_Experimental
  - Ifpack2_ENABLE_Experimental
  - Ifpack2_ENABLE_Experimental_KokkosKernels_Features

* Ifpack2::Krylov is really SUPER deprecated now

It's been deprecated for a LONG time, complete with deprecated
warnings.  This didn't suffice for warning some users, so I moved the
class to the new Ifpack2::DeprecatedAndMayDisappearAtAnyTime
namespace.

* Encapsulate local sparse triangular solves in a new class,
  LocalSparseTriangularSolver

* Fix various issues

Issues fix include (but are not limited to) #672, #570, #567, #558,
#551, #544, #409, #234, and #64.


Trilinos 12.6:
---------------

* Fixed Ifpack2's part of Bug 6358

Ifpack2, as well as its tests and examples, no longer require
GlobalOrdinal = int to be enabled in Tpetra.

* Fixed Bug 6443

One unit test for RILUK had an excessively tight tolerance for Scalar
= float.  This commit relaxes the tolerance in a principled way.  As a
result, the test now passes.

Trilinos 12.4:
---------------

* Deprecated Ifpack2::Krylov

If you want a Krylov solver, just use Belos.  Ifpack2::Factory now
throws with an informative exception message if you ask for "KRYLOV".

Trilinos 11.10:
---------------

* Fixed bug in ReorderFilter (related to Bug 6117)

ReorderFilter was computing the number of entries for the wrong row,
which caused temporaries (either in Ifpack2::ReorderFilter or in
MueLu) to be allocated with the wrong size.  This may be related to
Bug 6117.

* LocalFilter::apply now checks whether X aliases Y

* Performance improvements to apply() of BlockRelaxation, LocalFilter,
  and Relaxation (10-11 Apr 2014)

Trilinos 11.8:
--------------

* RILUK and Krylov may now be used as subdomain solvers in
  AdditiveSchwarz

We made many improvements to RILUK and LocalFilter.  This will move
towards fixes for a number of Ifpack2 bugs, such as 5992 and 5987.

Trilinos 11.6:
--------------

* AdditiveSchwarz interface changes

AdditiveSchwarz implements additive Schwarz domain decomposition.
The class also manages and invokes the solver for each subdomain.
That solver must implement Ifpack2::Preconditioner.

We made two changes to AdditiveSchwarz:

  1. Subdomain solver type is now determined entirely at run time
  2. Second template parameter (LocalInverseType) is deprecated

These changes are related to each other.  It used to be that users
would specify the type of the subdomain solver as the second template
parameter of AdditiveSchwarz, LocalInverseType.  The value of
LocalInverseType had to be a concrete subclass of Preconditioner.
This is no longer the case.  Users now may and should omit
AdditiveSchwarz's second template parameter.  More importantly, they
may now specify the subdomain solver's type at run time.  They may do
so either as a run-time parameter in the input ParameterList of
AdditiveSchwarz, or by calling AdditiveSchwarz's
setInnerPreconditioner() method.  See AdditiveSchwarz's public class
documentation for details.

AdditiveSchwarz's second template parameter has a default value of
Ifpack2::Preconditioner.  For backwards compatibility, if users
specify a known concrete subclass of Ifpack2::Preconditioner for
LocalInverseType, AdditiveSchwarz will implement the previous behavior
of creating a subdomain solver of that specific type.  In the next
major Trilinos release, we plan to remove AdditiveSchwarz's second
template parameter entirely.

Trilinos 11.4:
--------------

* Relaxation: Use precomputed offsets to extract diagonal

As of this release, Tpetra::CrsMatrix has the ability to to precompute
offsets of diagonal entries, and use them to accelerate extracting a
copy of the diagonal. Relaxation now exploits this feature to speed up
compute() (which extracts a copy of the diagonal of the input matrix).
The optimization only occurs if the input matrix is a CrsMatrix (not
just a RowMatrix) and if it has a const ("static") graph. The latter
is necessary so that we know that the structure can't change between
calls to compute(). (Otherwise we would have to recompute the offsets
each time, which would be no more efficient than what it was doing
before.)
