# Changes: 3.3

```{rubric} config/configure.py:
```

- Building PETSc using CMake is enabled automatically if CMake is
  installed (enabling parallel builds and fast incremental builds),
  otherwise the plain make-based system is used.
- Added --with-cuda-only flag to allow compiling CUDA files without
  requiring Thrust and Cusp

```{rubric} Vec:
```

- VecCreateSeqWithArray() and VecCreateMPIWithArray() now take a
  blocksize argument before the local length
- VecSetBlockSize() cannot be called after VecCreateSeq() or
  VecCreateMPI() and must be called before VecSetUp() or
  VecSetFromOptions() or before either VecSetType() or VecSetSizes()

```{rubric} Mat:
```

- MatScaleSystem() and MatUnScaleSystem() are gone, they didn't do
  anything.
- Renamed MatNullSpaceAttach() to MatSetNullSpace()
- MatMult() no longer removes the nullspace set by MatSetNullSpace()
- Renamed MatMatMultTranspose() for C=A^T\*B to MatTransposeMatMult()
- Added MatMatTransposeMult() for C=A\*B^T
- Added MatRARt() for C=R\*A\*R^T
- Preallocation routines now automatically set
  MAT_NEW_NONZERO_ALLOCATION_ERR, if you intentionally preallocate
  less than necessary then use
  MatSetOption(mat,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE) to
  disable the error generation.
- MatSetBlockSize() must be called before MatSetUp() or
  MatXXXXSetPreallocation() or block size defaults to 1
- -mat_block_size is NOT processed by MatXXXXSetPreallocation() you
  MUST call MatSetFromOptions() before MatSetUp() to have it
  processed
- You MUST now call MatXXXSetPreallocation() or MatSetUp() on any
  matrix you create directly (not using DMCreateMatrix()) before
  calling MatSetValues(), MatSetValuesBlocked() etc.
- MatGetOwnershipRange() will not work without setting up the
  matrix.
- MatSetUpPreallocation() and MatPreallocated() are removed, use
  MatSetUp()
- MatPreallocateSymmetricInitialize() is removed, use
  MatPreallocateInitialize()
- MatCreateMPIAIJ(), MatCreateMPIBAIJ(), MatCreateMPISBAIJ(),
  MatCreateMPIDense() are now MatCreateAIJ(), MatCreateBAIJ(),
  MatCreateSBAIJ(), MatCreateDense(). Note that on a single process
  they have always created the sequential version of the matrix so
  this naming is more accurate.
- Renamed MatMerge_SeqsToMPI() to MatCreateMPIAIJSumSeqAIJ()
- Renamed MatMerge() to MatCreateMPIAIJConcatenateSeqAIJ()
- Added block size in call to MatCreateIS()
- MatInvertBlockDiagonal() now returns a const pointer

```{rubric} PC:
```

- Remove PCASASetDM(), use PCSetDM() instead.
- Add PCFieldSplitSetSchurFactType(), rename
  -pc_fieldsplit_schur_factorization_type to
  -pc_fieldsplit_schur_fact_type.
- Added native algebraic multigrid method -pc_type gamg. Aggregation
  method is recommended: -pc_gamg_type agg and for elliptic
  operators smoothing is recommended: -pc_gamg_agg_nsmooths 1.
- PCSetCoordinates(PC,PetscInt,PetscInt,PetscReal\*) added second
  integer argument for number of local vertices.
- Added PCISSetSubdomainScalingFactor(PC,PetscScalar).
- ```{rubric} PCGASM:
  ```
  - Remove PCGASMSetLocalSubdomains(), use PCGASMSetSubdomains();
    **note:** the first argument is now the list of "inner"
    subdomains (without overlap), unlike before and for PCASM
  - PCGASMSetTotalSubdomains(PC,PetscInt,PetscBool); added third
    argument to indicate whether local subdomains should be
    constructed.
  - Removed PCGASMCreateSubdomains(), use
    PCGASMCreateLocalSubdomains(Mat,PetscInt,PetscInt,IS\*[],IS\*[]);
    second PetscInt argument is requested overlap
  - PCGASMCreateSubdomains2D(PC,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt,PetscInt\*,IS[]\*,IS[]\*):
    the 9-th and 10-th argument have been swapped: the 9-th outputs
    the inner subdomains, the 10-th outputs the outer subdomains.
- PCMG multigrid defaults changed to use a Chebyshev smoother with
  block Jacobi Gauss-Seidel relaxation. This is a linear
  preconditioner so it can be used with normal Krylov methods rather
  than only flexible methods, as well as having fewer
  synchronization pointst. Use
  `-mg_levels_ksp_type gmres -mg_levels_ksp_max_it 1 -mg_levels_pc_type bjacobi`
  for the original behavior.

```{rubric} KSP:
```

- KSPSetOperators() will automatically set the null space present on
  the input matrix
- Renamed KSPCHEBYCHEV to KSPCHEBYSHEV
- Added Hybrid CHEBYCHEV (-ksp_chebyshev_hybrid)
- Added pipelined GMRES (KSPPGMRES) which performs one non-blocking
  reduction per iteration instead of two blocking reductions.
- Added flexible BiCGStab (KSPFBCGS) which tolerates a nonlinear
  preconditioner (like KSPFGMRES).
- Added improved flexible BiCGStab (KSPIFBCGS) which tolerates a
  nonlinear preconditioner and performs one reduction every other
  iteration (like KSPIBCGS).

```{rubric} SNES:
```

- Added SNESGetSNESLineSearch
- Changed default max_its and max_funcs for non-newton SNES solvers
  to 10000 and 30000 respectively
- Changed options and command-line arguments for SNESFAS to be in
  line with PCMG
- Added quasi-Newton (SNESQN), Nonlinear GMRES (SNESNGMRES),
  nonlinear conjugate gradients (SNESNCG), and multi-stage methods
  (SNESMS, used as a smoother for nonlinear multigrid).
- Support for Full Approximation Scheme nonlinear multigrid
  (SNESFAS) moved from DMMG to SNES and made composable with the
  methods above.
- SNES line search type should be set by name with
  SNESLineSearchSetType rather than with SNESLineSearchSet, see
  below.

```{rubric} SNESLineSearch:
```

- SNESLineSearch object added
- The default SNESLineSearch of a SNES may be gotten with
  SNESGetSNESLineSearch(SNES snes, SNESLineSearch \*linesearch)
- The linesearch type may be set with SNESLineSearchSetType() or
  -snes_linesearch_type
- The line search (and pre and post checks) is applied using
  SNESLineSearchApply()
- Pre/Post-check methods may be set with
  SNESLineSearchSetPre/PostCheck()
- The previous steplength may be accessed through
  SNESLineSearchSetLambda()
- The damping parameter may be set through
  SNESLineSearchSetDamping() or -snes_linesearch_damping
- Success of the line search is determined using
  SNESLineSearchGetSuccess()
- Custom linesearches may be built through
  SNESLINESEARCHSHELL,("shell") or by registering a new linesearch
  type with SNESLineSearchRegisterDynamic()
- SNESLINESEARCHBT,("bt") replaces SNES_LS_CUBIC and
  SNES_LS_QUADRATIC, and order may be set with
  SNESLineSearchSetOrder() or -snes_linesearch_order
- SNESLINESEARCHBASIC,("basic") replaces SNES_LS_BASIC and
  SNES_LS_BASICNONORMS. Norms may be turned off with
  SNESLineSearchSetComputeNorms() or -snes_linesearch_norms 0
- SNESLineSearchSetTolerances() replaces SNESLSSetParams(), with the
  former alpha parameter set with SNESLineSearchBTSetAlpha() or
  -snes_linesearch_alpha
- Added Line Search type SNESLINESEARCHL2,("l2") as the default for
  NRICHARDSON
- SNESLINESEARCHCP,("cp") added as the default line search method
  for SNESNCG and SNESQN

```{rubric} TS:
```

- -ts_max_time changed to -ts_final_time
- TSDefaultComputeJacobian() and TSDefaultComputeJacobianColor()
  have been removed. Configure TS to use coloring with
  SNESSetJacobian().
- Added TSROSW for Rosenbrock-W methods.
- Added a common, extensible system for adaptive controllers, see
  TSGetAdapt().

```{rubric} DM/DA:
```

- Added DMCreateDecomposition(DM,PetscInt,char\*[]\*,IS[]\*,DM[]\*) for
  use with PCFIELDSPLIT,PCASM,PCGASM
- Added DMCreateDecompositionDM(DM,const char\*,DM\*) to create a
  version of the DM encapsulating a named decomposition; use with
  DMCreateDecomposition()
- Added DMRedundant for managing globally coupled degrees of
  freedom.
- Removed DMCompositeAddArray(), use DMRedundantCreate() and
  DMCompositeAddDM().
- Renamed DMGetMatrix(), DMGetInterpolation(), DMGetInjection(), and
  DMGetColoring() to DMCreateMatrix(), etc for semantic consistency.
- The communicator argument to DMRefine() and DMCoarsen() can be
  MPI_COMM_NULL, but not PETSC_NULL, because the latter may not be
  the correct type.
- Added DMCoarsenHookAdd() and DMRefineHookAdd() for shepherding
  persistent resolution-dependent data between levels.
- Added DMGetNamedGlobalVector() for storing persistent
  resolution-dependent data.
- DMDASNESSetFunctionLocal() and DMDASNESSetJacobianLocal() can be
  used for convenient local evaluation; these routines will
  eventually replace DMDASetLocalFunction() and
  DMDASetLocalJacobian().

```{rubric} DMMG:
```

- DMMG is now completely removed from PETSc. Equivalent (and better)
  functionality can now be obtained by calling SNESSetDM() or
  KSPSetDM(). Make sure to avoid resolution-dependent data in the
  user context. Use SNESGetDM() or KSPGetDM() in the function
  evaluation context to obtain the grid. DMGetNamedGlobalVector(),
  DMCoarsenHookAdd(), and DMRefineHookAdd() can be used to manage
  persistent resolution-dependent data.

```{rubric} PetscViewer:
```

- A VTK binary viewer was added, see PETSCVIEWERVTK.

```{rubric} SYS:
```

- PetscBagLoad() now requires you previously created and registered
  all the records in the PETSc bag, allows loading on systems with
  different struct layout/endianness.
- PetscSF added as a type-generic graph communication mechanism. The
  current implementation requires MPI-2 one-sided and the interface
  is currently optional.

```{rubric} Fortran:
```

- PETSC_NULL_TRUTH is now PETSC_NULL_BOOL
- PetscOptionsGetEnum() now available from Fortran

```{rubric} ExternalPackages:
```

- The Hypre interface was updated to 2.8.0b and now supports 64-bit
  integers.
- SuperLU_DIST interface updated to 3.1.
- SuperLU interface updated to 4.3.
- Sundials interface updated to 2.5.0.
- FFTW interface updated to 3.3.2.
- ParMetis updated to 4.0.2 and split from Metis 5.0.2 which is now
  separate.

```{rubric} Build:
```

- If Python 2.7 is available, the config/builder2.py is now
  available for a complete build, including dependency tracking.

```{rubric} Examples:
```

- SNES ex62 illustrates the use of DMComplex to solve the Stokes
  equation on an unstructured mesh. The Python tests show how to use
  block preconditioning strategies from the command line.
- SNES ex52 illustrates the use of CUDA for FEM integration
