C DDOTPV    SOURCE    PV090527  24/04/16    21:15:03     11902          
      function ddotpv(lon,val1,val2)
*
*  unrolling pour ameliorer la performance
*  et ameliorer la precision
*  

      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)
      dimension val1(*),val2(*),resu(8)
      if (lon.eq.0) then
       ddotpv=0.d0
       return
      endif
      resu(1)=0.d0
      resu(2)=0.d0
      resu(3)=0.d0
      resu(4)=0.d0
      resu(5)=0.d0
      resu(6)=0.d0
      resu(7)=0.d0
      resu(8)=0.d0
      do  i=0,lon-8,8
       resu(1)=resu(1)+val1(i+1)*val2(i+1)
       resu(2)=resu(2)+val1(i+2)*val2(i+2)
       resu(3)=resu(3)+val1(i+3)*val2(i+3)
       resu(4)=resu(4)+val1(i+4)*val2(i+4)
       resu(5)=resu(5)+val1(i+5)*val2(i+5)
       resu(6)=resu(6)+val1(i+6)*val2(i+6)
       resu(7)=resu(7)+val1(i+7)*val2(i+7)
       resu(8)=resu(8)+val1(i+8)*val2(i+8)
      enddo     
      if (i.le.lon-4) then
       resu(1)=resu(1)+val1(i+1)*val2(i+1)
       resu(2)=resu(2)+val1(i+2)*val2(i+2)
       resu(3)=resu(3)+val1(i+3)*val2(i+3)
       resu(4)=resu(4)+val1(i+4)*val2(i+4)
       i=i+4
      endif
      if (i.le.lon-2) then
       resu(1)=resu(1)+val1(i+1)*val2(i+1)
       resu(2)=resu(2)+val1(i+2)*val2(i+2)
       i=i+2
      endif
      if (i.le.lon-1) then
       resu(1)=resu(1)+val1(i+1)*val2(i+1)
      endif
      ddotpv=resu(1)+resu(2)+resu(3)+resu(4)+
     > resu(5)+resu(6)+resu(7)+resu(8)
      return
      end

 
 
 
