Millepede-II  V04-00-00
 All Classes Files Functions Variables Enumerator
vertpr.f90
Go to the documentation of this file.
00001 
00002 ! Code converted using TO_F90 by Alan Miller
00003 ! Date: 2012-03-16  Time: 11:09:42
00004 
00007 
00014 
00015 SUBROUTINE pzvert(n,x)
00016     IMPLICIT NONE
00017     INTEGER :: i
00018     INTEGER :: i1
00019     INTEGER :: i2
00020     INTEGER :: ia
00021     INTEGER :: ij
00022     INTEGER :: im
00023     INTEGER :: in
00024     INTEGER :: iz
00025     INTEGER :: j
00026     INTEGER :: jl
00027     INTEGER :: jm
00028     INTEGER :: ke
00029     INTEGER :: kl
00030     INTEGER :: kn
00031     INTEGER :: lc
00032     INTEGER :: m
00033     INTEGER :: mx
00034     REAL :: fac
00035     REAL :: xm
00036     !
00037 
00038     INTEGER, INTENT(IN)                      :: n
00039     REAL, INTENT(IN)                         :: x(n)
00040     INTEGER, PARAMETER :: nn=6
00041 
00042     CHARACTER (LEN=66):: px(10)
00043     CHARACTER (LEN=66)::ch(10)*1
00044     SAVE
00045     DATA ch/'0','1','2','3','4','5','6','7','8','9'/
00046     !     ...
00047     IF(n <= 0) RETURN
00048     jm=0
00049     DO i=1,10
00050         px(i)=' '
00051     END DO
00052 
00053     m=MIN(60,n)
00054     jl=0
00055     xm=0.0
00056     DO j=1,m
00057         IF(ABS(x(j)) > xm) THEN
00058             xm=ABS(x(j))
00059             mx=j                             ! index of max
00060         END IF
00061         IF(x(j) < 0.0) px(1)(6+j:6+j)='-'  ! negative columns
00062         IF(x(j) /= 0.0) jl=j                ! last non-zero column
00063     END DO
00064     IF(xm == 0.0.OR.jl <= 0) RETURN      ! empty array
00065     jl=60
00066 
00067     kn=MIN(6,MAX(2,IABS(nn)))
00068     ke=INT(ALOG10(xm*1.0001))
00069     IF(xm < 1.0) ke=ke-1
00070 22  fac=10.0**(kn-1-ke)
00071     ij=INT(fac*xm+0.5)
00072     IF(ij >= 10**kn) THEN
00073         ke=ke+1
00074         GO TO 22
00075     END IF
00076     ia=2+kn
00077 
00078     DO j=1,jl
00079         ij=INT(fac*ABS(x(j))+0.5)   ! convert to integer
00080         im=0
00081         IF(ij /= 0) THEN
00082             DO i=1,kn
00083                 IF(ij /= 0) THEN
00084                     in=MOD(ij,10)   ! last digit
00085                     ij=ij/10        ! reduce
00086                     IF(in /= 0.AND.im == 0) im=ia-i+1
00087                     px(ia-i)(6+j:6+j)=ch(in+1)
00088                 END IF
00089             END DO
00090         END IF
00091         jm=MAX(im,jm)
00092     END DO
00093 
00094     kl=ke
00095 50  IF(ke >= kn) THEN
00096         ke=ke-3
00097         GO TO 50
00098     END IF
00099 55  IF(ke < 0) THEN
00100         ke=ke+3
00101         GO TO 55
00102     END IF
00103 
00104     in=ke+2                          ! exponent
00105     iz=kl-ke
00106     px(in)(6:6)='.'
00107     px(in)(1:1)='E'
00108     IF(iz < 0) THEN
00109         px(in)(2:2)='-'
00110         iz=-iz
00111     END IF
00112     i1=iz/10                         ! insert exponent
00113     i2=MOD(iz,10)
00114     px(in)(3:3)=ch(i1+1)
00115     px(in)(4:4)=ch(i2+1)
00116     jm=MIN(2+kn,jm)
00117     jm=MAX(in+1,jm)
00118     DO j=1,jl    ! '0' for small nonzero values
00119         IF(x(j) /= 0.0.AND.px(jm-1)(6+j:6+j) == ' ') px(jm-1)(6+j:6+j)='0'
00120     END DO
00121     DO i=jm,8
00122         px(i)=' '
00123     END DO
00124 
00125     DO j=1,((jl+9)/10)*10            ! index line below
00126         IF(px(jm-1)(6+j:6+j) == ' ') px(jm-1)(6+j:6+j)='_'
00127         IF(MOD(j,2) /= 1) THEN
00128             i=MOD(j,10)+1
00129             px(jm+1)(6+j:6+j)=ch(i)      ! last digit of even bin numbers
00130             IF(i == 1) THEN              ! ten'th column
00131                 i=MOD(j/10,10)+1
00132                 px(jm)(6+j:6+j)=ch(i)
00133       
00134             END IF
00135         END IF
00136     END DO
00137 
00138     DO j=1,jl
00139         IF(x(j) == x(mx)) THEN
00140             px(jm)(6+j:6+j)='*'          ! * in max bin
00141         END IF
00142     END DO
00143 
00144     jm=jm+1
00145     IF(nn < 0) jm=jm-2              ! no index line
00146     lc=((jl+9)/10)*10+6
00147     DO j=1,jm
00148         WRITE(*,*)  px(j)(1:lc)       ! print
00149     !       WRITE(*,101)  PX(J)(1:LC)       ! print
00150     END DO
00151     RETURN
00152 !  101 FORMAT(A)
00153 END SUBROUTINE pzvert
00154 
00161 
00162 SUBROUTINE pivert(n,list)                  !
00163     IMPLICIT NONE
00164     INTEGER :: i
00165     INTEGER :: l
00166     INTEGER :: ll
00167     INTEGER :: m
00168     INTEGER :: nhist
00169 
00170     INTEGER, INTENT(IN)                      :: n
00171     INTEGER, INTENT(IN)                      :: list(n)
00172 
00173     
00174     REAL :: y(60)
00175     
00176     SAVE
00177     !     ...
00178     ll=(n+59)/60 ! compression factor
00179     m=0
00180     i=0
00181 10  nhist=0
00182     DO l=1,ll
00183         IF(i+l <= n) nhist=nhist+list(i+l)
00184     END DO
00185     i=i+ll
00186     m=m+1
00187     y(m)=nhist
00188     IF(i < n) GO TO 10
00189     CALL pzvert(m,y)
00190     RETURN
00191 END SUBROUTINE pivert
00192 
00199 
00200 SUBROUTINE pfvert(n,x)                       ! vert. print fltpt data
00201     IMPLICIT NONE
00202     REAL :: dsum
00203     INTEGER :: i
00204     INTEGER :: l
00205     INTEGER :: ll
00206     INTEGER :: m
00207     REAL :: y(60)
00208 
00209     INTEGER, INTENT(IN)                      :: n
00210     INTEGER, INTENT(IN)                      :: x(n)
00211 
00212     ll=(n+59)/60 ! compression factor
00213     m=0
00214     i=0
00215 20  dsum=0.0
00216     DO l=1,ll
00217         IF(i+l <= n) dsum=dsum+x(i+l)
00218     END DO
00219     i=i+ll
00220     m=m+1
00221     y(m)=REAL(dsum)
00222     IF(i < n) GO TO 20
00223     CALL pzvert(m,y)
00224     RETURN
00225 END SUBROUTINE pfvert
00226 
00231 
00232 SUBROUTINE psvert(xa,xb)                     ! print scale
00233     IMPLICIT NONE
00234     INTEGER:: i
00235     REAL:: xc
00236     !     print scale from XA ... XB
00237 
00238 
00239     REAL, INTENT(IN)                         :: xa
00240     REAL, INTENT(IN)                         :: xb
00241     REAL:: sc(7)
00242     xc=xb
00243     DO i=1,7
00244         sc(i)=(FLOAT(7-i)*xa+FLOAT(i-1)*xc)/6.0
00245     END DO
00246     WRITE(*,101) sc
00247 101 FORMAT(3X,7G10.3)
00248     RETURN
00249 END SUBROUTINE psvert
00250