C ++******************************************************************** C * C * C * C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (at your option) any later version. * C=* * C=* This program is distributed in the hope that it will be useful, * C=* but WITHOUT ANY WARRANTY; without even the implied warranty of * C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * C=* General Public License for more details. * C=* * C=* You should have received a copy of the GNU General Public License * C=* along with this program; if not, write to the * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C ********************************************************************** C * C VPROP * C * C PURPOSE: * C * C PARAMETERS: * C * C C Double precision version 10/21/96 PP C====================================================================== SUBROUTINE VPROP( NDIM, N, W, D, S, KODE ) DIMENSION W(NDIM,N) , D(N) , S(N) DATA SEUIL / 1.0E-7 / DOUBLE PRECISION Q,H,T,U,V,P,B KODE = 0 CALL TRIDI (NDIM,N,W,D,S) IF (N .EQ. 1) GO TO 140 DO I = 2,N S(I-1)= S(I) ENDDO S(N) = 0.0 DO 90 K = 1,N M = 0 20 DO J = K,N IF (J .EQ. N) GO TO 40 ABJ = ABS(S(J)) EPS = SEUIL*(ABS(D(J)) + ABS(D(J+1))) IF (ABJ .LE. EPS) GO TO 40 ENDDO 40 H = D(K) IF (J .EQ. K) GO TO 90 IF (M .EQ. 30) GO TO 130 M = M + 1 Q = (D(K+1) - H) / (2.0*S(K)) T = DSQRT (Q*Q + 1.0) Q = D(J) - H + S(K) / (Q + DSIGN(T,Q)) U = 1.0 V = 1.0 H = 0.0 JK = J - K DO IJK = 1,JK I = J - IJK P = U * S(I) B = V * S(I) IF (ABS(P).LT.ABS(Q))GO TO 50 V = Q / P T = DSQRT (V*V + 1.0) S(I+1)= P * T U = 1.0 / T V = V * U GO TO 60 50 U = P / Q T = DSQRT (U*U + 1.0) S(I+1)= Q * T V = 1.0 / T U = U * V 60 Q = D(I+1) - H T = (D(I) - Q)*U + 2.0*V*B H = U * T D(I+1)= Q + H Q = V*T - B DO L = 1,N P = W(L,I+1) W(L,I+1)= U*W(L,I) + V*P W(L,I)= V*W(L,I) - U*P ENDDO ENDDO D(K) = D(K) - H S(K) = Q S(J) = 0.0 GO TO 20 90 CONTINUE DO 120 IJ = 2,N I = IJ - 1 L = I H = D(I) DO 100 M = IJ,N IF (D(M) .LE. H) GO TO 100 L = M H = D(M) 100 CONTINUE IF (L .EQ. I) GO TO 120 D(L) = D(I) D(I) = H DO M = 1,N H = W(M,I) W(M,I)= W(M,L) W(M,L)= H ENDDO 120 CONTINUE GO TO 140 130 KODE = K 140 RETURN END