(S|D|C|Z)TRMM
=============
Single, double, single complex, and double complex TRMM.

Description
-----------
Computes a matrix-matrix product with triangular matrix A.

.. math::

    B \assign \alpha A*B

or

.. math::

    B \assign \alpha B*A

BLAS Interface
--------------
.. code-block:: c

    void strmm(const char *SIDE, const char *UPLO, const char *TRANSA,
               const char *DIAG, const qml_long *M, const qml_long *N,
               const float *ALPHA, const float *A, const qml_long *LDA,
               float *B, const qml_long *LDB);

    void dtrmm(const char *SIDE, const char *UPLO, const char *TRANSA,
               const char *DIAG, const qml_long *M, const qml_long *N,
               const double *ALPHA, const double *A, const qml_long *LDA,
               double *B, const qml_long *LDB);

    void ctrmm(const char *SIDE, const char *UPLO, const char *TRANSA,
               const char *DIAG, const qml_long *M, const qml_long *N,
               const qml_single_complex *ALPHA, const qml_single_complex *A,
               const qml_long *LDA, qml_single_complex *B,
               const qml_long *LDB);

    void ztrmm(const char *SIDE, const char *UPLO, const char *TRANSA,
               const char *DIAG, const qml_long *M, const qml_long *N,
               const qml_double_complex *ALPHA, const qml_double_complex *A,
               const qml_long *LDA, qml_double_complex *B,
               const qml_long *LDB);

CBLAS Interface
---------------
.. code-block:: c

    void cblas_strmm(const CBLAS_ORDER ORDER, const CBLAS_SIDE SIDE,
                     const CBLAS_UPLO UPLO, const CBLAS_TRANSPOSE TRANSA,
                     const CBLAS_DIAG DIAG, const qml_long M, const qml_long N,
                     const float ALPHA, const float *A, const qml_long LDA,
                     float *B, const qml_long LDB);

    void cblas_dtrmm(const CBLAS_ORDER ORDER, const CBLAS_SIDE SIDE,
                     const CBLAS_UPLO UPLO, const CBLAS_TRANSPOSE TRANSA,
                     const CBLAS_DIAG DIAG, const qml_long M, const qml_long N,
                     const double ALPHA, const double *A, const qml_long LDA,
                     double *B, const qml_long LDB);

    void cblas_ctrmm(const CBLAS_ORDER ORDER, const CBLAS_SIDE SIDE,
                     const CBLAS_UPLO UPLO, const CBLAS_TRANSPOSE TRANSA,
                     const CBLAS_DIAG DIAG, const qml_long M, const qml_long N,
                     const qml_single_complex *ALPHA, const qml_single_complex *A,
                     const qml_long LDA, qml_single_complex *B,
                     const qml_long LDB);

    void cblas_ztrmm(const CBLAS_ORDER ORDER, const CBLAS_SIDE SIDE,
                     const CBLAS_UPLO UPLO, const CBLAS_TRANSPOSE TRANSA,
                     const CBLAS_DIAG DIAG, const qml_long M, const qml_long N,
                     const qml_double_complex *ALPHA, const qml_double_complex *A,
                     const qml_long LDA, qml_double_complex *B,
                     const qml_long LDB);

Arguments
---------
======   =====================================================================
SIDE     Specify which side of the product matrix A should be
\        For left, computes: :math:`B \assign \alpha A*B`
\        For right, computes: :math:`B \assign \alpha B*A`
UPLO     Specify whether the upper or lower triangle of matrix A will be read
TRANSA   Specifies how to read matrix A
\        Possible values: Non-Transpose, Tranpose, Complex Conjugate Transpose
DIAG     Whether the diagonal is unit or not
M        Number of rows of matrix B
N        Number of columns of matrix B
ALPHA    Scalar multiplied with the matrix-matrix product
A        Input matrix A
LDA      Leading dimension of matrix A
B        Result matrix B
LDB      Leading dimension of matrix B
======   =====================================================================
