
!================================================================
!       vecteur
!================================================================

         SUBROUTINE vecteur(n1,n2,x,y,z,vx,vy,vz,norm)

        use Path_module, only : NAt, KINT, KREAL


        integer(KINT) :: n1,n2
        real(KREAL) ::  x(Nat),y(Nat),z(Nat)
        real(KREAL) ::  vx,vy,vz,norm

        vx=x(n2)-x(n1)
        vy=y(n2)-y(n1)
        vz=z(n2)-z(n1)

        !norm=dsqrt( vx*vx + vy*vy + vz*vz )
            norm=sqrt( vx*vx + vy*vy + vz*vz )

!       write(6,*)
!       write(6,*) vx,vy,vz,norm
!       write(6,*)

      RETURN
      END

!================================================================
!       angle
!================================================================

         FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)


        use Path_module, only :  Pi,KINT, KREAL

        real(KREAL) ::  v1x,v1y,v1z,norm1
        real(KREAL) ::  v2x,v2y,v2z,norm2
        real(KREAL) ::  angle,ps

!       write(6,*)
!       write(6,*) v1x,v1y,v1z,norm1
!       write(6,*) v2x,v2y,v2z,norm2
!       write(6,*)
        IF (abs(norm1) .LT. 1.D-4) THEN
            STOP 'norm1 egale 0'
        ELSE IF (abs(norm2) .LT. 1.D-4) THEN
            STOP 'norm2 egale 0'
        ELSE
          ps=v1x*v2x+v1y*v2y+v1z*v2z
          angle=dacos(ps/(norm1*norm2))*180./Pi
        ENDIF

      RETURN
      END


!================================================================
!       angle oriente (dihedre)
!================================================================

         FUNCTION angle_d(v1x,v1y,v1z,norm1, &
                          v2x,v2y,v2z,norm2, &
                          v3x,v3y,v3z,norm3)

        use Path_module, only :  Pi,KINT, KREAL

        real(KREAL) ::  v1x,v1y,v1z,norm1
        real(KREAL) ::  v2x,v2y,v2z,norm2
        real(KREAL) ::  v3x,v3y,v3z,norm3
        real(KREAL) ::  angle_d,ca,sa

!       write(6,*)
!       write(6,*) v1x,v1y,v1z,norm1
!       write(6,*) v2x,v2y,v2z,norm2
!       write(6,*) v3x,v3y,v3z,norm3
!       write(6,*)
        !Print *, 'Inside angle_d'
        IF (abs(norm1) .LT. 1.D-4) THEN
            STOP 'norm1 egale 0'
         ELSE IF (abs(norm2) .LT. 1.D-4) THEN
            STOP 'norm2 egale 0'
        ELSE IF (abs(norm3) .LT. 1.D-4) THEN
            STOP 'norm3 egale 0'
        ELSE
          ca=(v1x*v2x+v1y*v2y+v1z*v2z)/(norm1*norm2)
          sa=(v1x*(v2y*v3z-v2z*v3y) &
             -v1y*(v2x*v3z-v2z*v3x) &
             +v1z*(v2x*v3y-v2y*v3x)) &
             /(norm1*norm2*norm3)
           angle_d=datan2(sa,ca)*180./Pi
!         write(*,*) sa,ca,angle_d,norm1,norm2,norm3
        ENDIF
        !Print *, 'End of angle_d'
      RETURN
      END

!================================================================
!       produit vectoriel
!================================================================

       SUBROUTINE produit_vect(v1x,v1y,v1z,norm1, &
                               v2x,v2y,v2z,norm2, &
                               v3x,v3y,v3z,norm3)

        use Path_module, only :  Pi,KINT, KREAL

        real(KREAL) ::  v1x,v1y,v1z,norm1 ! what do you do with norm1, norm2???
        real(KREAL) ::  v2x,v2y,v2z,norm2
        real(KREAL) ::  v3x,v3y,v3z,norm3

        v3x= v1y*v2z-v1z*v2y
        v3y=-v1x*v2z+v1z*v2x
            v3z= v1x*v2y-v1y*v2x

        norm3=dsqrt( v3x*v3x + v3y*v3y + v3z*v3z )


      RETURN
      END

!================================================================
!       rotation suivant l axe x de phi tq a11=cos(phi) a12=sin(phi)
!================================================================

       SUBROUTINE rota_x(v1x,v1y,v1z,a11,a12)

        use Path_module, only :  KINT, KREAL

        real(KREAL) ::  v1x,v1y,v1z
        real(KREAL) ::  v2x,v2y,v2z
        real(KREAL) ::  a11,a12

        v2x=  v1x
        v2y=  a11*v1y - a12*v1z
        v2z=  a12*v1y + a11*v1z


        v1x=v2x
        v1y=v2y
        v1z=v2z


      RETURN
      END


!================================================================
!       rotation suivant l axe y de phi tq a11=cos(phi) a12=sin(phi)
!================================================================

       SUBROUTINE rota_y(v1x,v1y,v1z,a11,a12)

        use Path_module, only :  KINT, KREAL

        real(KREAL) ::  v1x,v1y,v1z
        real(KREAL) ::  v2x,v2y,v2z
        real(KREAL) ::  a11,a12

        v2x=  a11*v1x - a12*v1z
        v2y=  v1y
        v2z=  a12*v1x + a11*v1z


        v1x=v2x
        v1y=v2y
        v1z=v2z


        RETURN
        END


!================================================================
!       rotation suivant l axe z de phi tq a11=cos(phi) a12=sin(phi)
!================================================================

       SUBROUTINE rota_z(v1x,v1y,v1z,a11,a12)

        use Path_module, only :  KINT, KREAL

        real(KREAL) ::  v1x,v1y,v1z
        real(KREAL) ::  v2x,v2y,v2z
        real(KREAL) ::  a11,a12

        v2x=  a11*v1x - a12*v1y
        v2y=  a12*v1x + a11*v1y
        v2z=  v1z


        v1x=v2x
        v1y=v2y
        v1z=v2z

        RETURN
        END
