* Vector to matrix indexes
  
*Compute the indexes p,q of a matrix element with the vector index i*

Vector (i) -> lower diagonal matrix (p,q), p > q

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:
| i | integer | index in the vector |

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

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

  include 'pi.h'

  BEGIN_DOC
  ! Compute the indexes (p,q) of the element in the lower diagonal matrix knowing
  ! its index i a vector
  END_DOC

  implicit none

  ! Variables

  ! in
  integer,intent(in)   :: i
  
  ! out
  integer, intent(out) :: p,q
  
  ! internal 
  integer              :: a,b
  double precision     :: da

  da = 0.5d0*(1+ sqrt(1d0+8d0*DBLE(i)))
  a = INT(da) 
  if ((a*(a-1))/2==i) then
    p = a-1
  else
    p = a
  endif
  b = p*(p-1)/2
 
  ! Matrix element indexes
  p = p + 1
  q = i - b 

end subroutine
#+END_SRC
