       program main
       implicit none
       real*8 a(3),b(3),c(3),d(3,3),scal,angle,pi
       real*8 scalp,norm,anorm,bnorm,angdeg
       integer i,j,dim

       data a /1.2,3.0, 7.6/
       data b /2.3,1.0, 0.9/

       dim=3

       write(6,*) ' vecteur A intial :',(a(i),i=1,dim)
       write(6,*) ' vecteur B intial :',(b(i),i=1,dim)
       write(6,*)

       scal=scalp(a,b,dim)
       write(6,*) ' produit scalaire :',scal
       write(6,*)
       call vecprod(a,b,c)
       write(6,*) ' produit vectoriel :',(c(i),i=1,3)
       write(6,*)
       call tensprod(a,b,d,dim)
       write(6,*) ' produit tensoriel :'
       write(6,9901) ((d(j,i),i=1,3),j=1,3)
 9901  format(3F12.3)
       write(6,*)

       anorm=norm(a,dim)
       bnorm=norm(b,dim)

       angle=acos(scalp(a,b,3)/anorm/bnorm)
       write(6,*) ' angle est de ',angle
       pi=2.*acos(0.D0)
       angdeg=angle*180./pi
       write(6,*) '    ( en degres :',angdeg,')'
       write(6,*)

       write(6,*) ' verification produit vectoriel '
       write(6,*) ' avec a :',scalp(c,a,dim)
       write(6,*) ' avec b :',scalp(c,b,dim)

       end


       real*8 function scalp(x,y,n)
       implicit none
       integer i,n
       real*8 x(n),y(n)
       scalp=0.
       do i=1,n
        scalp=scalp+x(i)*y(i)
       end do

       return
       end

       real*8 function norm(x,n)
       implicit none
       integer n
       real*8 x(n),scalp

       norm=sqrt(scalp(x,x,n))

       return
       end

       subroutine vecprod(x,y,z)
       implicit none
       real*8 x(3),y(3),z(3)

       z(1)=x(2)*y(3)-x(3)*y(2)
       z(2)=x(3)*y(1)-x(1)*y(3)
       z(3)=x(1)*y(2)-x(2)*y(1)

       return
       end

       subroutine tensprod(x,y,res,n)
       implicit none
       integer i,j,n
       real*8 x(n),y(n),res(n,n)

       do i=1,n
        do j=1,n
         res(i,j)=x(i)*y(j)
        end do
       end do
       
       return
       end

