* Matrix to vector index

*Compute the index i of a vector element from the indexes p,q of a
matrix element*

Lower diagonal matrix (p,q), p > q -> vector (i)

If a matrix is antisymmetric it can be reshaped as a vector. And the
vector can be reshaped as an antisymmetric matrix

\begin{align*}
\begin{pmatrix}
0 & -1 & -2 & -4 \\
1 & 0  & -3 & -5 \\
2 & 3 & 0  & -6  \\
4 & 5 & 6 & 0
\end{pmatrix}
\Leftrightarrow
\begin{pmatrix}
1 & 2 & 3 & 4 & 5 & 6
\end{pmatrix}
\end{align*}

!!! Here the algorithm only work for the lower diagonal !!!

Input:
| p,q | integer | indexes of a matrix element in the lower diagonal |
|     |         | p > q, q -> column                                |
|     |         | p -> row,                                         |
|     |         | q -> column                                       |

Input:
| i | integer | corresponding index in the vector |

#+BEGIN_SRC f90 :comments org :tangle mat_to_vec_index.irp.f
subroutine mat_to_vec_index(p,q,i)

  include 'pi.h'

  implicit none
  
  ! Variables
  
  ! in
  integer, intent(in) :: p,q
  
  ! out
  integer, intent(out) :: i 

  ! internal
  integer :: a,b
  double precision :: da

  ! Calculation
 
  a = p-1
  b = a*(a-1)/2
  
  i = q+b

end subroutine
#+END_SRC

