      subroutine orientation(orb)
      use mod_dolo
      implicit real(8) (a-h,o-x,z),logical(1)(y)
      character(*) orb
      character(20) orb1
      character(4) c1,c2,c3
      common/orcom/ o1(3),o2(3),o3(3),norient
      common/sym/ nsym,isym(maxsym),isymt(0:maxsym)
      integer virgule(2),multcent(8)
      yw=.false.
      if(yes)print*,'entree orientation'
      write(ifilpr,*)' '
      write(ifilpr,*)'================================================='
      long=len_trim(orb)
      if(yw)print*,'long',long
!
! On cherche les strings "PARA" ou "ORTH"
!
      !print*,'entree orientation'
      !print*,trim(orb)
      norient=0
      jj=index(orb,'PARA')
      if(jj/=0)orient='PARA'
      if(jj==0) then
         jj=index(orb,'ORTH')
         if(jj/=0)orient='ORTH'
      endif
      !print*,'jj',jj
      if(jj==0) then
         if(yes)print*,'sortie orientation'
         return
      endif
!
! Trouve !
!
      if(yw)print*,trim(orb)
      if(yw)print*,'123456789012345678901234567890123456789'//
     *'01234567890123456789012345678901234567890'
      if(yw)print*,'jj',jj
!
! Dechiffrage des centres donnant l'orientation
!
      ! Mise a blanc de "PARA(" ou "ORTH("
      l=len_trim(orb)
      l1=index(orb(jj:l),')')
      orb1=orb(jj:jj+l1-1)
      !orb(jj:jj+4)=' '
      orb1(1:5)=' '
      if(yw) print*,'orb1 ',trim(orb1)
      ! Recherche de ")"
      !kk=index(orb(jj:long),')')+jj-1
      kk=index(orb1,')')
      if(yw)print*,'kk',kk
      ! Mise a blanc de ")"
      !orb1(kk:kk)=' '
      orb1(kk:kk)=' '
      !if(yw)print*,orb(1:long)
      if(yw)print*,orb1(1:kk)
      ! jj+4,kk est la plage ou les centres donnant l'orientation
      ! sont ecrits  ex : "C4,C6"
      ! on va compter le nb de virgules, il y a un centre de plus (il
      ! y a en fait 3 ou 4 centres)
      norient=1
      virgule=0
      !do k=jj+4,kk
      do k=1,kk
         if(orb1(k:k)==',') then
            virgule(norient)=k
            norient=norient+1
            orb1(k:k)=' '
         endif
      enddo
      if(virgule(2)==0) virgule(2)=kk
      if(yw)print*,'virgule',virgule
      if(yw)print*,'norient',norient
      if(norient/=2.and.norient/=3) then
         print*,'erreur pour' ,orient
         stop
      endif
      print*,trim(orb)
      print*,trim(orb1)
      if(yw)print*,'natom',natom
      do k=1,natom1
      if(yw)print'(a12,3f12.8)',atom(k),coor(:,k)
      enddo
!
! On cherche les coordonnees des centres
!
      c1=' '
      c2=' '
      c3=' '
      if(yw)print*,'jj+4',jj+4,kk
      !c1=orb(jj+4:virgule(1)-1)
      !c2=orb(virgule(1)+1:virgule(2))
      !if(norient==3) c3=orb(virgule(2)+1:kk)
      c1=orb1(5:virgule(1)-1)
      c2=orb1(virgule(1)+1:virgule(2))
      if(norient==3) c3=orb1(virgule(2)+1:kk)
!      if(norient==2) read(orb(jj+4:kk),'(2a)') c1,c2
!      if(norient==3) read(orb(jj+4:kk),'(3a)') c1,c2,c3
      c1=adjustl(c1)
      c2=adjustl(c2)
      c3=adjustl(c3)
      if(yw)print*,'c1,c2,c3 ',c1,c2,c3
      if(yw)print*,'c1 ',c1,'..'
      ! 1er centre
      if(c1=='0') then
         o1=0.d0
      else
         ytrouve=.false.
         do k=1,natom
            if(yw)print*,atom(k)
            if(c1==atom(k)) then
               ytrouve=.true.
               o1=coor(:,k)
               exit
            endif
         enddo
         if(.not.ytrouve) then
            print*,'centre non trouve ',c1
            stop
         endif
      endif
      if(yw)print*,'c2 ',c2,'..'
      if(yw)print*,'l',len_trim(c2)
      ! 2eme centre
      if(c2=='0') then
         o2=0.d0
      else
         ! on cherche tous les centres de nom c2,
         ! puis on garde celui plus pres de c1
         nmultcent=0
         ytrouve=.false.
         do k=1,natom1
            if(yw)print*,atom(k),len_trim(atom(k))
            if(c2==atom(k)) then
               o2=coor(:,k)
               if(yw)print*,'o2',o2
               if(yw)print*,'o1',o1
               if(all(o2==o1)) cycle
               if(yw)print*,'coucou'
               ytrouve=.true.
               nmultcent=nmultcent+1
               multcent(nmultcent)=k
            endif
         enddo
         if(.not.ytrouve) then
            print*,'centre non trouve ',c2
            stop
         endif
         if(nmultcent>1) then
            d0=1.d10
            i=0
            do k=1,nmultcent
               j=multcent(k)
               d=dsqrt((o1(1)-coor(1,j))**2
     *         +(o1(2)-coor(2,j))**2
     *         +(o1(3)-coor(3,j))**2)
               if(yw)print*,'k,d',k,d
               if(yw)  print*,'k,d',coor(:,j)
               if(d<d0) then
                  d0=d
                  i=j
               endif
            enddo
            o2=coor(:,i)
         endif
      endif
      if(yw)print*,c3,'c3 ','..'
      if(c3/=' ') then
         ytrouve=.false.
         if(c3=='0') then
            o3=0.d0
         else
            do k=1,natom
               if(yw)print*,atom(k)
               if(c3==atom(k)) then
                  ytrouve=.true.
                  o3=coor(:,k)
                  exit
               endif
            enddo
            if(.not.ytrouve) then
               print*,'centre non trouve ',c3
               stop
            endif
         endif
      endif
      print*,'Orientation obligatoire des orbitales'
      if(in_progress/='BOND') then
         print*,'Donnee ',orient
         if(norient==2) then
                 print*,'Axe defini en donnee par'
         else
                 print*,'Plan defini en donnee par'
         endif
         print'(a,3f12.8)',c1,o1
         print'(a,3f12.8)',c2,o2
         if(norient==3)print'(a,3f12.8)',c3,o3
      endif
!
! vecteur(s) d'orientation
!
      if(in_progress/='BOND') print*,'vecteur(s) d''orientation'
      o1=o2-o1
      ! normalisation
      o1=o1/dsqrt(dot_product(o1,o1))
      if(in_progress/='BOND') print'(2a,3f12.8)',c1,c2,o1
      if(c3/=' ') then
         o2=o3-o2
         ! orthogonalisation par projection
         o2=o2-dot_product(o1,o2)*o1
         anorm=dot_product(o2,o2)
         if(anorm<1.d-8) then
            print*,c1//'- '//c2//'  et  '//c2//' - '//c3//
     *      ' sont paralleles'
            stop
         endif
         ! normalisation
         o2=o2/dsqrt(anorm)
         if(in_progress/='BOND') print'(2a,3f12.8)',c2,c3,o2
      endif
!
! orient='ORTH'
!
      if(orient=='ORTH') then
         if(norient==2) then
            print*,'plan des orbitales defini par les vecteurs :'
            ! on construit 2 vecteurs orthogonaux a o1
            o3=o1
            if(abs(o3(1))>1.d-1.or.abs(o3(2))>1.d-1) then
               o1(3)=0.d0
               o1(1)=o3(2)
               o1(2)=-o3(1)
            else
               o1(1)=0.d0
               o1(2)=o3(3)
               o1(3)=-o3(2)
            endif
            ! normalisation
            o1=o1/dsqrt(dot_product(o1,o1))
            ! o2 obtenu par produit vectoriel
            o2(1)=o1(2)*o3(3)-o1(3)-o3(2)
            o2(2)=o1(1)*o3(3)-o1(3)-o3(1)
            o2(3)=o1(2)*o3(1)-o1(1)-o3(2)
            ! o2 est orthogonalise a o1
            o2=o2-dot_product(o1,o2)*o1
            o2=o2/dsqrt(dot_product(o2,o2))
            print'(3f12.8)',o1
            print'(3f12.8)',o2
            norient=3
         else
            print*,'axe des orbitales defini par le vecteur :'
            ! on construit 1 vecteur orthogonal a o1 et o2
            o3=o1
            o1(1)=o2(3)*o3(2)-o2(2)*o3(3)
            o1(2)=o2(1)*o3(3)-o2(3)*o3(1)
            o1(3)=o2(2)*o3(1)-o2(1)*o3(2)
            print'(3f12.8)',o1
            norient=2
         endif
      endif
 
!
! Y a-t-il des centres avec des p manquantes ?
!
      if(norient==3) then
         kk=0
         yx=.true.
         yy=.true.
         yz=.true.
         if(yz) then
            do is=1,nsym
               do k=1,isym(is)
                  kk=kk+1
                  if(yw)
     *            print'(a,3i6,a)','orientation',is,k,kk,trim(orbi(kk))
                  if(orbi(kk)(5:6)=='2p') then
!                    Correction de 2 lignes : orbi(kk+1) introduit une
!                    erreur sur certans compilos, si kk==valeur max
!                    idem pour orbi(kk-1) si kk==1
!                    if((kk==isym(is).or.orbi(kk+1)(1:6)/=orbi(kk)(1:6))
!    *               .and.(kk==1.or.orbi(kk-1)(1:6)/=orbi(kk)(1:6)))then
!
!                    on est sur une OA "2p"
!                    on calcule y_2p_seule.
!                    Y_2p_seule=t ==> l'OA 2p est seule,
!                    cad l'OA precedente et l'OA suivante sont toutes
!                    deux differentes de "2p"
                     y_2p_seule1=k==isym(is)
                     if(.not.y_2p_seule1) y_2p_seule1=
     *               orbi(kk+1)(1:6)/=orbi(kk)(1:6)
                     y_2p_seule2=kk==1
                     if(.not.y_2p_seule2) y_2p_seule2=
     *               orbi(kk-1)(1:6)/=orbi(kk)(1:6)
                     y_2p_seule=y_2p_seule1.and.y_2p_seule2
                     if(y_2p_seule) then
!                    fin de la correction
                        if(yw)print*,'p seule'
                        ! rotation o1/o2
                        if(orbi(kk)(7:7)=='x') then
                           if(yw)print*,'axe 2pz'
                           if(yx) then
                              yx=.false.
                              if(abs(o1(1)-1.d0)>1.d-8) then
                                 o3=o1
                                 o1=o2
                                 o2=o3
                              endif
                              o1(3)=0.d0
                              o1=o1/dsqrt(dot_product(o1,o1))
                              o2=o2-dot_product(o1,o2)*o1
                              o2=o2/dsqrt(dot_product(o2,o2))
                           endif
                        else if(orbi(kk)(7:7)=='y') then
                           if(yw)print*,'axe 2pz'
                           if(yy) then
                              yy=.false.
                              if(abs(o1(2)-1.d0)>1.d-8) then
                                 o3=o1
                                 o1=o2
                                 o2=o3
                              endif
                              o1(3)=0.d0
                              o1=o1/dsqrt(dot_product(o1,o1))
                              o2=o2-dot_product(o1,o2)*o1
                              o2=o2/dsqrt(dot_product(o2,o2))
                           endif
                        else if(orbi(kk)(7:7)=='z') then
                           if(yw)print*,'axe 2pz'
                           if(yz) then
                              yz=.false.
                              if(abs(o1(1)-1.d0)>1.d-8) then
                                 o3=o1
                                 o1=o2
                                 o2=o3
                              endif
                              o1(1)=0.d0
                              o1=o1/dsqrt(dot_product(o1,o1))
                              o2=o2-dot_product(o1,o2)*o1
                              o2=o2/dsqrt(dot_product(o2,o2))
                           endif
                        endif
                     endif
                  endif
               enddo
            enddo
            print*,'vecteurs reorientes suivant les axes'
            print'(3f12.8)',o1
            print'(3f12.8)',o2
         endif
      endif
!      print*,' '
!      print*,'Orientation obligatoire : '
!      print*,'les orbitales eliminees sont remplacees par des '//
!     *'orbitales nulles d''occupation 1.'
!      print*,' '
      write(ifilpr,*)'================================================='
      write(ifilpr,*)' '
      if(yes)print*,'sortie orientation'
      return
      end
!**********************************************************************
!**********************************************************************
!**********************************************************************
!**********************************************************************
