# Changes: 3.15

```{rubric} General:
```

- Add `PetscKokkosInitializeCheck()`, which initializes Kokkos if it
  is not yet initialized
- Add support for `-debug_terminal` Terminal to use Apple's Terminal
  instead of xterm, allowing use of cut-paste
- Make Terminal the default device to display the debugger on Apple
  instead of xterm
- Add PetscHasExternalPackage() determining whether PETSc has been
  configured with the given external package such as "hdf5"

```{rubric} Configure/Build:
```

- On macOS, `MACOS_FIREWALL=1` or `MACOS_FIREWALL_REFRESH=1` can
  be passed to make to automatically add firewall rules preventing
  firewall popups during testing. See
  `make -f gmakefile.test help` for details

- `./configure --with-macos-firewall-rules` makes
  `MACOS_FIREWALL=1` the default

- Change `--download-petsc4py` to `--with-petsc4py` to have PETSc build
  and use petsc4py

- Add `--download-mmg` and `--download-parmmg`, 3D unstructured mesh
  adaptation package (interaction with DMPlex not available yet)

- Improve detection of Git repositories when a `--download-package`
  option is used

  - Support `ssh://*.git` and `https://*.git` URLs without the
    additional `git://` prefix
  - Local directories can be specified without the `git://`
    prefix as well
  - Any valid Git repository (including bare and with
    `--separate-git-dir`) is now correctly detected

- `--download-yaml` or `--with-yaml` are no longer required for
  YAML support (but can still be used to avoid compiling source
  included with PETSc)

```{rubric} Sys:
```

- Add `PETSCRANDOMCURAND` to support CURAND random number generator
- Add `PetscRandomGetValues()` and `PetscRandomGetValuesReal()` to retrieve
  an array of random numbers
- Add `PetscOptions` argument to `PetscOptionsInsertFileYAML()`
- Add `PetscCalloc()` to allocate zeroed memory
- Automatically detect YAML and JSON option files by extension or
  particular first line
- Update YAML options file processing to ignore keys starting with
  `$`, Add some special processing
- Add `PetscBagViewFromOptions()`
- Add `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
- Add new option to `-log_view` to view nested event timing
  information as a flame graph

```{rubric} PetscViewer:
```

- `PetscViewerAndFormat` now allows a payload
- Change `PetscViewerFlowControlStepMaster()`,
  `PetscViewerFlowControlEndMaster()` to
  `PetscViewerFlowControlStepMain()`, `PetscViewerFlowControlEndMain()`
- HDF5: `FILE_MODE_APPEND` (= `FILE_MODE_UPDATE`) now creates a new file if it does not exist yet
- VU: `PetscViewerVUSetMode()` is now deprecated;
  please use standard `PetscViewerFileSetMode()` instead

```{rubric} PetscDraw:
```

```{rubric} AO:
```

```{rubric} IS:
```

```{rubric} VecScatter / PetscSF:
```

- `VecScatter` is now the same type as `PetscSF`, in other words, we
  have `typedef PetscSF VecScatter`
- Remove `VecScatter` types `VECSCATTER{SEQ,MPI1,MPI3,MPI3NODE,SF}`. One
  can use all `PetscSF` types as `VecScatter` types
- Rename `PetscLayoutsCreateSF()` to `PetscSFCreateFromLayouts()` and
  move its declaration from `petscis.h` to `petscsf.h`
- Deprecate `MPIU_REPLACE`; Use `MPI_REPLACE` instead
- Deprecate `PetscSFBcastAndOp` variants; Use `PetscSFBcast` instead
- Deprecate `PetscSFCreateEmbeddedSF`; Use `PetscSFCreateEmbeddedRootSF`
  instead
- Add experimental NVIDIA NVSHMEM support; For details on how to use
  it, contact <mailto:petsc-maint@mcs.anl.gov>
- Add `PetscSFCreateByMatchingIndices()` to create SF by matching root
  and leaf indices

```{rubric} PF:
```

```{rubric} Vec:
```

- Change `Vec{Get,Restore}Array{Read}Inplace` to
  `Vec{Get,Restore}Array{Read}AndMemType()` and add an extra argument
  to also return the memory type of the array
- Remove vector type `VECNODE`
- Add `VecConcatenate()` function for vertically concatenating an
  array of vectors into a single vector. Also returns an array of
  index sets to access the original components within the
  concatenated final vector

```{rubric} PetscSection:
```

```{rubric} PetscPartitioner:
```

```{rubric} Mat:
```

- Add `MatSetPreallocationCOO()` and `MatSetValuesCOO()` to preallocate and
  set values in a matrix using COO format. Currently efficiently
  implemented only for `MATCUSPARSE`
- Add the option `MAT_FORCE_DIAGONAL_ENTRIES` for `MatSetOption()`. It
  forces allocation of all diagonal entries
- Remove `MAT_NEW_DIAGONALS` from `MatOption`
- Add `UNKNOW_NONZERO_PATTERN` as new value for `MatStructure`. It
  indicates that the relationship is unknown, when set the AIJ
  matrices check if the two matrices have identical patterns and if
  so use the faster code
- Add `MAT_FACTOR_QR`, `MatQRFactor()`, `MatQRFactorSymbolic()`, and
  `MatQRFactorNumeric()` for QR factorizations. Currently the only
  built-in implementation uses LAPACK on sequential dense matrices
- Change option `-mat_cusparse_transgen` to `-mat_form_explicit_transpose` to hint PETSc to form an explicit transpose for repeated operations like MatMultTranspose. Currently implemented only for `AIJCUSPARSE` and `AIJKOKKOS`
- Add a `MatOption` `MAT_FORM_EXPLICIT_TRANSPOSE`

```{rubric} PC:
```

- Add `PCGAMGSetRankReductionFactors()`, provide an array,
  `-pc_gamg_rank_reduction_factors factors`, tp specify factor by
  which to reduce active processors on coarse grids in `PCGAMG` that
  overrides default heuristics
- Change `PCCompositeAddPC()` to `PCCompositeAddPCType()`, now
  `PCCompositeAddPC()` adds a specific `PC` object
- Add a Compatible Relaxation (CR) viewer `PCMG` with `-pc_mg_adapt_cr`
- Experimental: Add support for assembling AIJ (CUSPARSE and KOKKOS)
  matrix on the Cuda device with `MatSetValuesDevice()`,
  `MatCUSPARSEGetDeviceMatWrite()`, and Kokkos with
  `MatKokkosGetDeviceMatWrite`
- Add `PCMGSetResidualTranspose()` to support transposed linear solve
  using `PCMG` and `PCGAMG`

```{rubric} KSP:
```

- Add `-all_ksp_monitor` which turns on monitoring for all KSP
  solvers regardless of their prefix. This is useful for monitoring
  solvers with inner solvers such as `PCMG`, `PCGAMG`, `PCFIELDSPLIT`.
- Add support for monitor `KSPPREONLY`. This is useful for monitoring
  solvers with inner solvers such as `PCMG`, `PCGAMG`, `PCFIELDSPLIT`.
- Add `KSPConvergedReasonViewSet()` to set an ADDITIONAL function that
  is to be used at the end of the linear solver to display the
  convergence reason of the linear solver
- Add `KSPConvergedReasonViewCancel()` to remove all user-added
  converged reason view functions
- Add `KSPGetConvergedReasonString()` to retrieve a human readable
  string for ksp converged reason
- Change `KSPReasonView()` to `KSPConvergenceReasonView()`
- Change `KSPReasonViewFromOptions()` to
  `KSPConvergedReasonViewFromOptions()`
- Add `KSPConvergedDefaultSetConvergedMaxits()` to declare convergence
  when the maximum number of iterations is reached
- Fix many `KSP` implementations to actually perform the number of
  iterations requested
- Chebyshev uses `MAT_SPD` to default to CG for the eigen estimate
- Add `KSPPIPECG2`, a pipelined solver that reduces the number of
  allreduces to one per two iterations and overlaps it with two PCs
  and SPMVs using non-blocking allreduce
- Add `KSPConvergedRateView()` and `KSPComputeConvergenceRate()` to
  check the convergence rate of a linear solve
- Add `KSPSetUseExplicitTranspose()` to explicitly transpose the
  system in `KSPSolveTranspose()`
- Add `KSPMonitorLGCreate()`, and remove `KSPMonitorLGResidualNorm*()`
  and `KSPMonitorLGTrueResidualNorm*()`
- Add `KSPMonitorError()`, used by `-ksp_monitor_error`
- Add arguments to `KSPMonitorSetFromOptions()` to allow line graphs
  to be configured
- Deprecate `KSP{Set|Get}MatSolveBlockSize()`, use
  `KSP{Set|Get}MatSolveBatchSize()` instead
- Reduce default `KSPView()` ASCII output to a single subdomain's
  KSP/PC information for `PCASM`, resp. `PCBJacobi`. Use
  `-ksp_view ::ascii_info_detail` to output KSP/PC information for all
  subdomains

```{rubric} SNES:
```

- Add `SNESConvergedCorrectPressure()`, which can be selected using
  `-snes_convergence_test correct_pressure`
- Remove `SNESMonitorLGCreate()` and `SNESMonitorLGResidualNorm()` which
  are now handled by the default monitor
- Add `SNESConvergedReasonViewSet()` to set an ADDITIONAL function
  that is to be used at the end of the nonlinear solver to display
  the convergence reason of the nonlinear solver
- Add `SNESConvergedReasonViewCancel()` to remove all user-added
  converged reason view functions
- Add `SNESGetConvergedReasonString()` to retrieve a human readable
  string for snes converged reason
- Add `SNESFASFullSetTotal()` to use total residual restriction and
  total solution interpolation in the initial cycle of full FAS
  multigrid
- Deprecate `-snes_nasm_sub_view`, use `-snes_view ::ascii_info_detail` instead

```{rubric} SNESLineSearch:
```

```{rubric} TS:
```

- Change to `--download-sundials2` to indicate the version of SUNDIALS
  PETSc downloads, which is very old and out-dated
- Add forward and adjoint sensitivity support for cases that involve
  parameterized mass matrices
- Add `TSGetNumEvents()` to retrieve the number of events
- Add `-ts_monitor_cancel`
- Now `-ts_view_solution` respects the TS prefix
- Add `TSSetMatStructure()` to indicate the relationship between the
  nonzero structures of the I Jacobian and the RHS Jacobian
- Automatically set the `MatStructure` flag of TS to
  `SAME_NONZERO_PATTERN` if the RHS matrix is obtained with a
  `MatDuplicate()` from the I Jacobian

```{rubric} TAO:
```

- Add `TaoSetRecycleFlag()` and `TaoGetRecycleFlag()` interfaces to
  enable some Tao algorithms to re-use iterate information from the
  previous `TaoSolve()` call
- Add new Augmented Lagrangian Multiplier Method (`TAOALMM`) for
  solving optimization problems with general nonlinear constraints

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

- Remove unneeded `Vec` argument from `DMPatchZoom()`
- Change `DMDACreatePatchIS()` to collective operation and add an
  extra argument to indicate whether off processor values will be
  returned
- Add `DMComputeError()`, which uses `PetscDS` information for the exact
  solution
- Add `DMShellGetGLobalVector()`
- Add `DMInterpolateSolution()` for interpolating solutions between
  meshes in a potentially nonlinear way
- `DMInterpolationSetUp()` now can drop points outside the domain

```{rubric} DMSwarm:
```

- `DMSwarmViewXDMF()` can now use a full path for the filename
- Add `DMSwarmSetPointCoordinatesRandom()`
- Add `-dm_view_radius` to set size of drawn particles

```{rubric} DMPlex:
```

- Using `-petscpartitioner_simple_node_grid` and
  `-petscpartitioner_simple_process_grid`, the Simple partitioner can
  now make grid partitions
- Add `DMGet/SetFieldAvoidTensor()` to allow fields to exclude tensor
  cells in their definition
- Remove regular refinement and marking from `DMPlexCreateDoublet()`
- Add high order FEM interpolation to `DMInterpolationEvaluate()`

```{rubric} FE/FV:
```

- Add `PetscDualSpaceTransformHessian()`,
  `PetscDualSpacePushforwardHessian()`, and
  `PetscFEPushforwardHessian()`
- Now `PetscFEGetCellTabulation()` and `PetscFEGetFaceTabulation()` ask
  for the number of derivatives
- Add `PetscDualSpaceLagrangeGet/SetUseMoments()` and
  `PetscDualSpaceLagrangeGet/SetMomentOrder()` to allow a moment
  integral for P0

```{rubric} DMNetwork:
```

- Add `DMNetworkAddSubnetwork()` for network of subnetworks
- Add `DMNetworkAdd/GetSharedVertices()`, `DMNetworkIsSharedVertex()`
- Remove `DMNetworkSetEdgeList()`,
  `DMNetworkSet/GetComponentNumVariables()`,
  `DMNetworkSet/Add/GetNumVariables()`,
  `DMNetworkGetComponentKeyOffset()`, `DMNetworkGetVariableOffset()`,
  `DMNetworkGetVariableGlobalOffset()`
- Change the prototypes for `DMNetworkAdd/GetComponent()`
- Rename `DMNetworkSet/GetSizes()` to `DMNetworkSet/GetNumSubNetworks()`
- Rename `DMNetworkGetComponentVariableOffset()` to
  `DMNetworkGetLocalVecOffset()`,
  `DMNetworkGetComponentVariableGlobalOffset()` to
  `DMNetworkGetGlobalVecOffset()`
- Rename `DMNetworkGetSubnetworkInfo()` to `DMNetworkGetSubnetwork()`

```{rubric} DT:
```

- `PetscDSCopyBoundary()` now takes a list of fields for which
  boundary copying is done
- Add `PetscDSGet/SetJetDegree()`, and `-dm_ds_jet_degree` is needed to
  enable it under a DM
- Add `PetscWeakForm` class to manage function pointers for problem
  assembly

```{rubric} Fortran:
```

- Add configure option `--with-mpi-f90module-visibility`
  [default=\`\`1\`\`]. With `0`, `mpi.mod` will not be visible in use code
  (via `petscsys.mod`) - so `mpi_f08` can now be used
- Add `PetscDLAddr()` to get name for a symbol
