C DDOTPW SOURCE PV 13/10/23 21:15:06 7848 function ddotpw(lon,val1,val2,imasq,idep) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC CCHOLE logical nul dimension val1(*),val2(*),imasq(*) resu1=0.d0 if (lon.le.0) goto 100 jini=idep/masdim * 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,(idep+lon-1)/masdim 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=-jm/masdim+1 if (jinio.gt.j+3) then jini=jinio goto 6 endif 10 continue nul=.true. 20 continue nmasq=min(imasq(j-1+1),-(j-1)*masdim) do jj=jinii,j-1 if (imasq(j+1).le.nmasq) goto 22 imasq(jj+1)=nmasq enddo 22 continue 21 continue * tous les masques nuls if (nul) goto 100 jini=j jfines=jini+1 jfin=jfines if (jfines.gt.(idep+lon-1)/masdim) 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,(idep+lon-1)/masdim 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=jm/masdim+1 if (jfineo.gt.jfin+3) then jfines=jfineo goto 31 endif 30 continue 40 continue nmasq=max(imasq(jfin-1+1),(jfin-1)*masdim) 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,jini*masdim-idep+1) ifin=min((jfin+1)*masdim-idep,lon) * write (6,*) ' ddotpw ideb ifin lon ',ideb,ifin,lon,jini,jfines, * > jfin ** do i=ideb,ifin ** resu1=resu1+val1(i)*val2(i) ** enddo resu2=0.d0 resu3=0.d0 resu4=0.d0 lonl=ifin-ideb+1 if (lonl.gt.0) then do 210 i=ideb-1,ifin-4,4 resu1=resu1+val1(i+1)*val2(i+1) resu2=resu2+val1(i+2)*val2(i+2) resu3=resu3+val1(i+3)*val2(i+3) resu4=resu4+val1(i+4)*val2(i+4) 210 continue indeb=ideb+(lonl/4)*4 do 220 i=indeb,ifin resu1=resu1+val1(i)*val2(i) 220 continue resu1=resu1+resu2+resu3+resu4 endif if (ifin.ge.lon) goto 100 jini=jfin+1 goto 5 100 continue ddotpw=resu1 return end