! Rotation matrix in a subspace to rotation matrix in the full space

! Usually, we are using a list of MOs, for exemple the active ones. When
! we compute a rotation matrix to rotate the MOs, we just compute a
! rotation matrix for these MOs in order to reduce the size of the
! matrix which has to be computed. Since the computation of a rotation
! matrix scale in $O(N^3)$ with $N$ the number of MOs, it's better to
! reuce the number of MOs involved.
! After that we replace the rotation matrix in the full space by
! building the elements of the rotation matrix in the full space from
! the elements of the rotation matrix in the subspace and adding some 0
! on the extradiagonal elements and some 1 on the diagonal elements,
! for the MOs that are not involved in the rotation.

! Provided:
! | mo_num      | integer | Number of MOs                 |

! Input:
! | m           | integer          | Size of tmp_list, m <= mo_num   |
! | tmp_list(m) | integer          | List of MOs                     |
! | tmp_R(m,m)  | double precision | Rotation matrix in the space of |
! |             |                  | the MOs containing by tmp_list  |

! Output:
! | R(mo_num,mo_num | double precision | Rotation matrix in the space |
! |                 |                  | of all the MOs               |

! Internal:
! | i,j         | integer | indexes in the full space |
! | tmp_i,tmp_j | integer | indexes in the subspace   |


subroutine sub_to_full_rotation_matrix(m,tmp_list,tmp_R,R)

  BEGIN_DOC
  ! Compute the full rotation matrix from a smaller one
  END_DOC
  
  implicit none

  ! in
  integer, intent(in)           :: m, tmp_list(m)
  double precision, intent(in)  :: tmp_R(m,m)
  
  ! out
  double precision, intent(out) :: R(mo_num,mo_num)
 
  ! internal
  integer                       :: i,j,tmp_i,tmp_j

  ! tmp_R to R, subspace to full space
  R = 0d0
  do i = 1, mo_num
    R(i,i) = 1d0 ! 1 on the diagonal because it is a rotation matrix, 1 = nothing change for the corresponding orbital
  enddo
  do tmp_j = 1, m
    j = tmp_list(tmp_j)
    do tmp_i = 1, m
      i = tmp_list(tmp_i)
      R(i,j) = tmp_R(tmp_i,tmp_j)
    enddo
  enddo
 
end
