# MatPtAP
Creates the matrix product C = P^T * A * P 
## Synopsis
```
#include "petscmat.h" 
PetscErrorCode MatPtAP(Mat A, Mat P, MatReuse scall, PetscReal fill, Mat *C)
```
Neighbor-wise Collective on A


## Input Parameters

- ***A -*** the matrix
- ***P -*** the projection matrix
- ***scall -*** either `MAT_INITIAL_MATRIX` or `MAT_REUSE_MATRIX`
- ***fill -*** expected fill as ratio of nnz(C)/(nnz(A) + nnz(P)), use `PETSC_DEFAULT` if you do not have a good estimate
if the result is a dense matrix this is irrelevant



## Output Parameters

- ***C -*** the product matrix



## Notes
C will be created and must be destroyed by the user with `MatDestroy()`.

An alternative approach to this function is to use `MatProductCreate()` and set the desired options before the computation is done


## Developer Note
For matrix types without special implementation the function fallbacks to `MatMatMult()` followed by `MatTransposeMatMult()`.




## See Also
 `MatProductCreate()`, `MatMatMult()`, `MatRARt()`

## Level
intermediate

## Location
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/mat/interface/matrix.c.html#MatPtAP">src/mat/interface/matrix.c</A>

## Examples
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/ksp/ksp/tutorials/ex76.c.html">src/ksp/ksp/tutorials/ex76.c.html</A><BR>
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/tao/pde_constrained/tutorials/elliptic.c.html">src/tao/pde_constrained/tutorials/elliptic.c.html</A><BR>


---
[Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/src/mat/interface/matrix.c)


[Index of all Mat routines](index.md)  
[Table of Contents for all manual pages](/docs/manualpages/index.md)  
[Index of all manual pages](/docs/manualpages/singleindex.md)  
