function matrix_inverse(matrix) result(inverse)
! from fortran-wiki! search there for "matrix+inversion"
real(dp), intent(in) :: matrix(:,:)
real(dp) :: inverse(size(matrix,1),size(matrix,2))
character(*), parameter :: this_routine = "matrix_inverse"
real(dp) :: work(size(matrix,1))
integer :: ipiv(size(matrix,1))
integer :: n, info
inverse = matrix
n = size(matrix,1)
call dgetrf(n,n,inverse,n,ipiv,info)
if (info /= 0) call stop_all(this_routine, "matrix singular!")
call dgetri(n, inverse, n, ipiv, work, n, info)
if (info /= 0) call stop_all(this_routine, "matrix inversion failed!")
end function matrix_inverse