c************************************************************************* SUBROUTINE lisse_sum(npt,n,f,x,xt,m,nx,knot) c Lissage par moyennes glissantes intégrées avec sum_n c subroutine PUBLIC du module mod_numerique c !!! ATTENTION le tableau des splines f est modifié !!!! c Auteur: P. Morel, Département J.D. Cassini, O.C.A. c entrées c npt: 2npt+1=nb. de points pour la moyenne glissante c n: nombre de fonctions dans f c f : tableau des splines c m: ordre des splines c nx: nombre d'abscisses c entrées/sorties c knot: dimension du vecteur nodal = knot-m c f: coefficients des splines lissées c xt: vecteur nodal dimension=knot-m c--------------------------------------------------------------------- USE mod_kind IMPLICIT NONE REAL (kind=dp), INTENT(in), DIMENSION(:) :: x INTEGER, INTENT(in) :: m, n, npt, nx REAL (kind=dp), ALLOCATABLE, INTENT(inout), DIMENSION(:,:) :: f REAL (kind=dp), ALLOCATABLE, INTENT(inout), DIMENSION(:) :: xt INTEGER, INTENT(inout) :: knot REAL (kind=dp), DIMENSION(n,nx) :: sum_i REAL (kind=dp), DIMENSION(n) :: fx, f1, fn, dfdx, sum REAL (kind=dp):: bid INTEGER, SAVE :: l=1 INTEGER :: i, imax, imin, j, k c--------------------------------------------------------------------- 2000 FORMAT(8es10.3) c les premier et dernier points sont conservés f1(:)=f(:,1) ; fn(:)=f(:,knot-m) c l'intégrale de la spline est une spline d'ordre m+1 c calcul des ci !!!! mis dans f !!!! algorithme 5.19 de Schumaker DO j=1,n bid=0.d0 DO i=1,knot-m bid=bid+(xt(i+m)-xt(i))*f(j,i) ; f(j,i)=bid ENDDO ENDDO c calcul des intégrales de x(1) à x(i <= nx) sum_i(:,1)=0.d0 DO i=2,nx CALL linf(x(i),xt,knot,l) CALL schu58_n(n,f,x(i),xt,m+1,l,sum) sum_i(:,i)=sum(:)/REAL(m,dp) ENDDO c WRITE(*,2000)sum_i(1,:) ; WRITE(*,2000)sum_i(2,:) ;PAUSE'sum_i' c Allocation de f et xt pour la base de bsp1dn DEALLOCATE(f,xt) ; ALLOCATE(f(n,nx),xt(nx+m)) c calcul des moyennes de lissage DO i=2,nx-1 k=MIN(npt,i-1,nx-i) imin=i-k ; imax=i+k f(:,i)=(sum_i(:,imax)-sum_i(:,imin))/(x(imax)-x(imin)) c WRITE(*,2000)x(imin),x(i),x(imax),f_lisse(:,i) ; PAUSE ENDDO c les extrémités f(:,1)=f1(:) ; f(:,nx)=fn(:) c initialisation de la spline lissée CALL bsp1dn(n,f,x,xt,nx,m,knot,.FALSE.,x(1),l,fx,dfdx) RETURN END SUBROUTINE lisse_sum