C DDOTPW    SOURCE    PV090527  26/01/19    21:15:13     12456          
      function ddotpw(lon,val1,val2,imasq,idep,nbo)
*
*  produit scalaire utilisant imasq pour savoir quand operer
* 
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)
-INC CCHOLE
      logical nul
      dimension val1(*),val2(*),imasq(*)
      if (lon.le.0) then
        ddotpw=0.d0
        return
      endif
      pt=0.d0
       jini=masqa(idep)-1
*      write (6,*) ' entree dans ddotpw ',idep,lon
   5   continue
*      write (6,*) ' apres 5 dans ddotpw',jini,imasq(jini+1)
       jinii=jini
       nul=.false.
***    if (imasq(jini+1).lt.0) jini=-imasq(jini+1)/masdim+1
   6   continue
       j=jini
       do 10 j=jini,masqa(idep+lon-1)-1
        jm=imasq(j+1)
        if (jm.gt.0) goto 20
        if (jm.eq.0) goto 10
*       write (6,*) ' acc 1 ',jini,-imasq(j+1)/masdim+1
        jinio=masqa(-jm)
        if (jinio.gt.j+jacc) then
**       if (j-jini.gt.100) write (6,*) ' rien trouve 2 jini ',jini,j
         jini=jinio
         goto 6
        endif
  10   continue
**       if (j-jini.gt.100) write (6,*) ' rien trouve jini ',jini,j
       nul=.true.
  20   continue
        nmasq=min(imasq(j-1+1),-masqi(j))
        do jj=jinii,j-1
           if (imasq(jj+1).le.nmasq) goto 22
           imasq(jj+1)=nmasq
        enddo
  22    continue
*  tous les masques nuls
       if (nul) goto 100
       jini=j
       jfines=jini+1
       jfin=jfines
       if (jfines.gt.masqa(idep+lon-1)-1) goto 32
*      write (6,*) ' apres 21 dans ddotpw ',j,imasq(jfines+1)
***    if (imasq(jfines+1).gt.1) jfines=imasq(jfines+1)/masdim+1
  31   continue
       jfin=jfines
       do 30 jfin=jfines,masqa(idep+lon-1)
        jm=imasq(jfin+1)
        if (jm.le.0) goto 40
        if (jm.eq.1) goto 30
*        write (6,*) ' acc 2 ',idep,jfines,imasq(jfin+1)/masdim+1
         jfineo=masqa(jm)
         if (jfineo.gt.jfin+jacc) then
          jfines=jfineo
          goto 31
         endif
  30   continue
**       if (jfin-jfines.gt.10) write (6,*) 'rien trouve jfin ',
**     >       jfin,jfines
  40   continue
        nmasq=max(imasq(jfin-1+1),masqi(jfin))
        do jj=j,jfin-1
          if (imasq(jj+1).ge.nmasq) goto 33
          imasq(jj+1)=nmasq
        enddo
  33    continue
  32   continue
       jfin=jfin-1
       ideb=max(1,masqi(jini+1)-idep+1)
       ifin=min(masqi(jfin+2)-idep,lon)
*      write (6,*) ' ddotpw ideb ifin lon ',ideb,ifin,lon,jini,jfines,
*    >   jfin
**     do i=ideb,ifin
**        pt=pt+val1(i)*val2(i)
**     enddo

      lonl=ifin-ideb+1
      if (lonl.gt.0) then
      pt=pt+ddotpv(lonl,val1(ideb),val2(ideb))
      nbo=nbo+lonl
      if (indeb.gt.ifin+100000) write (6,*) ' ddotpw indeb ifin ',
     >      ideb,ifin
      endif
       if (ifin.ge.lon) goto 100
       jini=jfin+1
       goto 5
 100  continue
      ddotpw=pt
      return
      end












 
 
 
 
 
 
 
 
 
 
 
 
