# Moving partitions¶

## SlidePartitionUp¶

Simultaneously slide and merge the partition

$\begin{split}A = \left(\begin{array}{c} A_0 \\ A_1 \\ \hline A_2 \end{array}\right),\end{split}$

into

$\begin{split}\left(\begin{array}{c} A_T \\ \hline A_B \end{array}\right) = \left(\begin{array}{c} A_0 \\ \hline A_1 \\ A_2 \end{array}\right).\end{split}$
void SlidePartitionUp(Matrix<T> &AT, Matrix<T> &A0, Matrix<T> &A1, Matrix<T> &AB, Matrix<T> &A2)
void SlideLockedPartitionUp(Matrix<T> &AT, const Matrix<T> &A0, const Matrix<T> &A1, Matrix<T> &AB, const Matrix<T> &A2)

Templated over the datatype, T.

void SlidePartitionUp(DistMatrix<T, U, V> &AT, DistMatrix<T, U, V> &A0, DistMatrix<T, U, V> &A1, DistMatrix<T, U, V> &AB, DistMatrix<T, U, V> &A2)
void SlideLockedPartitionUp(DistMatrix<T, U, V> &AT, const DistMatrix<T, U, V> &A0, const DistMatrix<T, U, V> &A1, DistMatrix<T, U, V> &AB, const DistMatrix<T, U, V> &A2)

Templated over the datatype, T, and distribution scheme, (U,V).

Note that each of the above routines is meant to be used in a manner similar to the following:

SlidePartitionUp( AT,  A0,
/**/ /**/
A1,
AB,  A2 );


## SlidePartitionDown¶

Simultaneously slide and merge the partition

$\begin{split}A = \left(\begin{array}{c} A_0 \\ \hline A_1 \\ A_2 \end{array}\right),\end{split}$

into

$\begin{split}\left(\begin{array}{c} A_T \\ \hline A_B \end{array}\right) = \left(\begin{array}{c} A_0 \\ A_1 \\ \hline A_2 \end{array}\right).\end{split}$
void SlidePartitionDown(Matrix<T> &AT, Matrix<T> &A0, Matrix<T> &A1, Matrix<T> &AB, Matrix<T> &A2)
void SlideLockedPartitionDown(Matrix<T> &AT, const Matrix<T> &A0, const Matrix<T> &A1, Matrix<T> &AB, const Matrix<T> &A2)

Templated over the datatype, T.

void SlidePartitionDown(DistMatrix<T, U, V> &AT, DistMatrix<T, U, V> &A0, DistMatrix<T, U, V> &A1, DistMatrix<T, U, V> &AB, DistMatrix<T, U, V> &A2)
void SlideLockedPartitionDown(DistMatrix<T, U, V> &AT, const DistMatrix<T, U, V> &A0, const DistMatrix<T, U, V> &A1, DistMatrix<T, U, V> &AB, const DistMatrix<T, U, V> &A2)

Templated over the datatype, T, and distribution scheme, (U,V).

Note that each of the above routines is meant to be used in a manner similar to the following:

SlidePartitionDown( AT,  A0,
A1,
/**/ /**/
AB,  A2 );


## SlidePartitionLeft¶

Simultaneously slide and merge the partition

$A = \left(\begin{array}{cc|c} A_0 & A_1 & A_2 \end{array}\right)$

into

$\left(\begin{array}{c|c} A_L & A_R \end{array}\right) = \left(\begin{array}{c|cc} A_0 & A_1 & A_2 \end{array}\right).$
void SlidePartitionLeft(Matrix<T> &AL, Matrix<T> &AR, Matrix<T> &A0, Matrix<T> &A1, Matrix<T> &A2)
void SlidePartitionLeft(DistMatrix<T, U, V> &AL, DistMatrix<T, U, V> &AR, DistMatrix<T, U, V> &A0, DistMatrix<T, U, V> &A1, DistMatrix<T, U, V> &A2)

Templated over the datatype, T.

void SlideLockedPartitionLeft(Matrix<T> &AL, Matrix<T> &AR, const Matrix<T> &A0, const Matrix<T> &A1, const Matrix<T> &A2)
void SlideLockedPartitionLeft(DistMatrix<T, U, V> &AL, DistMatrix<T, U, V> &AR, const DistMatrix<T, U, V> &A0, const DistMatrix<T, U, V> &A1, const DistMatrix<T, U, V> &A2)

Templated over the datatype, T, and distribution scheme, (U,V).

Note that each of the above routines is meant to be used in a manner similar to the following:

SlidePartitionLeft( AL, /**/ AR,
A0, /**/ A1, A2 );


## SlidePartitionRight¶

Simultaneously slide and merge the partition

$A = \left(\begin{array}{c|cc} A_0 & A_1 & A_2 \end{array}\right)$

into

$\left(\begin{array}{c|c} A_L & A_R \end{array}\right) = \left(\begin{array}{cc|c} A_0 & A_1 & A_2 \end{array}\right).$
void SlidePartitionRight(Matrix<T> &AL, Matrix<T> &AR, Matrix<T> &A0, Matrix<T> &A1, Matrix<T> &A2)
void SlidePartitionRight(DistMatrix<T, U, V> &AL, DistMatrix<T, U, V> &AR, DistMatrix<T, U, V> &A0, DistMatrix<T, U, V> &A1, DistMatrix<T, U, V> &A2)

Templated over the datatype, T.

void SlideLockedPartitionRight(Matrix<T> &AL, Matrix<T> &AR, const Matrix<T> &A0, const Matrix<T> &A1, const Matrix<T> &A2)
void SlideLockedPartitionRight(DistMatrix<T, U, V> &AL, DistMatrix<T, U, V> &AR, const DistMatrix<T, U, V> &A0, const DistMatrix<T, U, V> &A1, const DistMatrix<T, U, V> &A2)

Templated over the datatype, T, and distribution scheme, (U,V).

Note that each of the above routines is meant to be used in a manner similar to the following:

SlidePartitionRight( AL,     /**/ AR,
A0, A1, /**/ A2 );


## SlidePartitionUpDiagonal¶

Simultaneously slide and merge the partition

$\begin{split}A = \left(\begin{array}{cc|c} A_{00} & A_{01} & A_{02} \\ A_{10} & A_{11} & A_{12} \\ \hline A_{20} & A_{21} & A_{22} \end{array}\right)\end{split}$

into

$\begin{split}\left(\begin{array}{c|c} A_{TL} & A_{TR} \\ \hline A_{BL} & A_{BR} \end{array}\right) = \left(\begin{array}{c|cc} A_{00} & A_{01} & A_{02} \\ \hline A_{10} & A_{11} & A_{12} \\ A_{20} & A_{21} & A_{22} \end{array}\right).\end{split}$

Note that the above routines are meant to be used as:

SlidePartitionUpDiagonal( ATL, /**/ ATR,  A00, /**/ A01, A02,
/*************/ /******************/
/**/       A10, /**/ A11, A12,
ABL, /**/ ABR,  A20, /**/ A21, A22 );


## SlidePartitionDownDiagonal¶

Simultaneously slide and merge the partition

$\begin{split}A = \left(\begin{array}{c|cc} A_{00} & A_{01} & A_{02} \\ \hline A_{10} & A_{11} & A_{12} \\ A_{20} & A_{21} & A_{22} \end{array}\right)\end{split}$

into

$\begin{split}\left(\begin{array}{c|c} A_{TL} & A_{TR} \\ \hline A_{BL} & A_{BR} \end{array}\right) = \left(\begin{array}{cc|c} A_{00} & A_{01} & A_{02} \\ A_{10} & A_{11} & A_{12} \\ \hline A_{20} & A_{21} & A_{22} \end{array}\right).\end{split}$

Note that the above routines are meant to be used as:

SlidePartitionDownDiagonal( ATL, /**/ ATR,  A00, A01, /**/ A02,
/**/       A10, A11, /**/ A12,
/*************/ /******************/
ABL, /**/ ABR,  A20, A21, /**/ A22 );