Millepede-II  V04-00-00
 All Classes Files Functions Variables Enumerator
mptext.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:16
00004 
00007 
00009 MODULE mptext
00010     IMPLICIT NONE
00011     SAVE
00012     INTEGER:: keya   !< start (position) of keyword
00013     INTEGER:: keyb   !< end (position) of keyword
00014 
00015 END MODULE mptext
00016 
00025 
00026 SUBROUTINE ratext(text,nums,dnum)
00027     USE mptext
00028 
00029     IMPLICIT NONE
00030     INTEGER :: i
00031     INTEGER :: ia
00032     INTEGER :: ib
00033     INTEGER :: ic
00034     INTEGER :: ich
00035     INTEGER :: icl
00036     INTEGER :: icode
00037     INTEGER :: j
00038     INTEGER :: k
00039 
00040     INTEGER :: lent
00041     INTEGER :: num
00042 
00043     CHARACTER (LEN=*), INTENT(IN)            :: text
00044     INTEGER, INTENT(OUT)                     :: nums
00045     DOUBLE PRECISION, INTENT(OUT)            :: dnum(*)
00046 
00047     INTEGER :: last ! last non-blank character
00048     INTEGER, PARAMETER :: ndim=1000
00049     INTEGER, DIMENSION(2,ndim):: icd
00050     CHARACTER (LEN=16) :: keywrd
00051     CHARACTER (LEN=1) :: ch
00052     DOUBLE PRECISION :: dic(ndim)
00053     DOUBLE PRECISION :: dumber
00054     INTEGER :: icdt(ndim)
00055     SAVE
00056     !     ...
00057     nums=0
00058     last=0
00059     keya=0
00060     keyb=0
00061     IF(text(1:1) == '*') RETURN
00062     num=ICHAR('0')
00063     lent=0
00064     last=0
00065     DO i=1,LEN(text)        ! find comment and end
00066         IF(lent == 0.AND.(text(i:i) == '!'.OR.text(i:i) == '%')) lent=i
00067         IF(text(i:i) /= ' ') last=i
00068     END DO
00069     IF(lent == 0) lent=last+1
00070     icd(1,1)=lent
00071 
00072     j=1
00073     icdt(1)=0
00074     icl=0
00075     DO i=1,lent-1
00076         ch =text(i:i)
00077         ich=ICHAR(ch)
00078         ic=0
00079         IF(ch == '.') ic=1
00080         IF(ch == '+') ic=2
00081         IF(ch == '-') ic=3
00082         IF(ch == 'E') ic=4
00083         IF(ch == 'D') ic=4
00084         IF(ch == 'e') ic=4
00085         IF(ch == 'd') ic=4
00086         IF(ic > 0) THEN
00087             j=j+1
00088             icd(1,j)=i
00089             icd(2,j)=i
00090             icdt(j)=ic
00091         ELSE
00092             ic=6
00093             IF(ich >= num.AND.ich <= num+9) ic=5  ! digit
00094             IF(ic /= icl) THEN
00095                 j=j+1
00096                 icd(1,j)=i
00097                 icdt(j)=ic
00098             END IF
00099             icd(2,j)=i
00100         END IF
00101         icl=ic ! previous IC
00102     END DO
00103     icdt(j+1)=0
00104 
00105     DO i=1,j                  ! define number
00106         IF(icdt(i) == 5) THEN
00107             dumber=0.0D0
00108             DO k=icd(1,i),icd(2,i)
00109                 dumber=10.d0*dumber+dfloat(ICHAR(text(k:k))-num)
00110             END DO
00111             dic(i)=dumber
00112         END IF
00113     END DO
00114     icdt(j+1)=0
00115 
00116     DO i=2,j                  ! get dots
00117         IF(icdt(i) == 1) THEN
00118             icode=0
00119             IF(icdt(i-1) == 5.AND.icd(2,i-1)+1 == icd(1,i)) icode=1
00120             IF(icdt(i+1) == 5.AND.icd(1,i+1)-1 == icd(2,i)) icode=icode+2
00121             IF(icode == 1) THEN            ! 123.
00122                 icd(2,i-1)=icd(2,i)
00123                 icdt(i)=0
00124             ELSE IF(icode == 2) THEN       ! .456
00125                 dic(i)=10.0D0**(icd(1,i+1)-icd(2,i+1)-1)*dic(i+1)
00126                 icdt(i)=5
00127                 icd(2,i)=icd(2,i+1)
00128                 icdt(i+1)=0
00129             ELSE IF(icode == 3) THEN       ! 123.456
00130                 dic(i-1)=dic(i-1)+ 10.0D0**(icd(1,i+1)-icd(2,i+1)-1)*dic(i+1)
00131                 icd(2,i-1)=icd(2,i+1)
00132                 icdt(i)=0
00133                 icdt(i+1)=0
00134             END IF
00135         END IF
00136     END DO
00137 
00138     k=1                         ! remove blanks, compress
00139     DO i=2,j
00140         IF(icdt(i) == 6.AND.text(icd(1,i):icd(2,i)) == ' ') icdt(i)=0
00141         IF(icdt(i) /= 0) THEN
00142             k=k+1
00143             icd(1,k)=icd(1,i)
00144             icd(2,k)=icd(2,i)
00145             icdt(k)=icdt(i)
00146             dic(k)=dic(i)
00147         END IF
00148     END DO
00149     j=k
00150 
00151     DO i=2,j-1
00152         IF(icdt(i) == 2.OR.icdt(i) == 3) THEN   !  +-
00153             IF(icdt(i+1) == 5) THEN
00154                 icd(1,i+1)=icd(1,i)
00155                 IF(icdt(i) == 3) dic(i+1)=-dic(i+1)
00156                 icdt(i)=0
00157             END IF
00158         END IF
00159     END DO
00160 
00161     k=1                         ! compress
00162     DO i=2,j
00163         IF(icdt(i) == 6.AND.text(icd(1,i):icd(2,i)) == ' ') icdt(i)=0
00164         IF(icdt(i) /= 0) THEN
00165             k=k+1
00166             icd(1,k)=icd(1,i)
00167             icd(2,k)=icd(2,i)
00168             icdt(k)=icdt(i)
00169             dic(k)=dic(i)
00170         END IF
00171     END DO
00172     j=k
00173 
00174     DO i=2,j-1
00175         IF(icdt(i) == 4) THEN        ! E or D
00176             IF(icdt(i-1) == 5.AND.icdt(i+1) == 5) THEN
00177                 icd(2,i-1)=icd(2,i+1)
00178                 dic(i-1)=dic(i-1)*10.0D0**dic(i+1)
00179                 icdt(i)=0
00180                 icdt(i+1)=0
00181             END IF
00182         END IF
00183     END DO
00184 
00185     nums=0                         ! compress
00186     DO i=1,j
00187         IF(icdt(i) == 5) THEN
00188             nums=nums+1
00189             icd(1,nums)=icd(1,i)
00190             icd(2,nums)=icd(2,i)
00191             dnum(nums)=dic(i)
00192         END IF
00193     END DO
00194 
00195     keywrd=' '                     ! assemble keyword
00196     ia=0
00197     ib=-1
00198     DO i=1,icd(1,1)-1
00199         IF(ia == 0.AND.text(i:i) /= ' ') ia=i
00200         IF(text(i:i) /= ' ') ib=i
00201     END DO
00202     IF(ib >= 0) keywrd=text(ia:ib)
00203     keya=ia
00204     keyb=MAX(0,ib)
00205 END SUBROUTINE ratext
00206 
00213 
00214 SUBROUTINE rltext(text,ia,ib,nab)
00215     IMPLICIT NONE
00216     INTEGER :: i
00217     INTEGER :: lim
00218 
00219     CHARACTER (LEN=*), INTENT(IN)            :: text
00220     INTEGER, INTENT(OUT)                     :: ia
00221     INTEGER, INTENT(OUT)                     :: ib
00222     INTEGER, INTENT(OUT)                     :: nab
00223 
00224     SAVE
00225     !     ...
00226     ia=0
00227     ib=0
00228     nab=0
00229     lim=0
00230     DO i=1,LEN(text)
00231         IF(text(i:i) /= ' ') nab=i
00232         IF((i == 1.AND.text(1:1) == '*').OR.text(i:i) == '!') THEN
00233             IF(lim == 0) lim=i
00234         END IF
00235     END DO
00236     IF(lim == 0) THEN
00237         lim=nab
00238     ELSE
00239         lim=lim-1
00240     END IF
00241     DO i=1,lim
00242         IF(ia == 0.AND.text(i:i) /= ' ') ia=i
00243         IF(text(i:i) /= ' ') ib=i
00244     END DO
00245 END SUBROUTINE rltext
00246 
00264 
00265 INTEGER FUNCTION matint(pat,text,npat,ntext)
00266     IMPLICIT NONE
00267     INTEGER :: i
00268     INTEGER :: ic
00269     INTEGER :: ideq
00270     INTEGER :: ip
00271     INTEGER :: ipa
00272     INTEGER :: ipb
00273     INTEGER :: ita
00274     INTEGER :: itb
00275     INTEGER :: j
00276     INTEGER :: jc
00277     INTEGER :: jot
00278     INTEGER :: jt
00279     INTEGER :: npatma
00280 
00281     CHARACTER (LEN=*), INTENT(IN) :: pat
00282     CHARACTER (LEN=*), INTENT(IN) :: text
00283     INTEGER, INTENT(OUT) :: npat
00284     INTEGER, INTENT(OUT) :: ntext
00285 
00286     !GF
00287     !      INTEGER ID(0:100,2)
00288     PARAMETER (npatma=512)
00289     INTEGER :: id(0:npatma,2)
00290     ! end GF
00291     LOGICAL :: start                        ! for case conversion
00292     CHARACTER (LEN=26) :: chu
00293     CHARACTER (LEN=26) :: chl
00294     INTEGER :: nj(0:255)
00295     SAVE
00296     DATA  chu/'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
00297     DATA  chl/'abcdefghijklmnopqrstuvwxyz'/
00298     DATA  start/.TRUE./
00299     DATA nj/256*0/
00300     !     ...
00301     IF(start) THEN
00302         start=.FALSE.
00303         DO j=0,255
00304             nj(j)=j
00305         END DO
00306         DO i=1,26
00307             nj(ICHAR(chl(i:i)))=ICHAR(chu(i:i))
00308         END DO
00309     END IF
00310     !     ...
00311     matint=0
00312     ntext=0
00313     DO i=1,LEN(text)               ! find indices ITA...ITB
00314         IF(text(i:i) /= ' ') GO TO 10
00315     END DO
00316     GO TO 15
00317 10  ita=i
00318     DO i=ita,LEN(text)
00319         IF(text(i:i) /= ' ') itb=i
00320     END DO
00321     ntext=itb-ita+1               ! number of charcaters in TEXT
00322 
00323 15  npat=0
00324     DO i=1,LEN(pat)               ! find indices IPA...IPB
00325         IF(pat(i:i) /= ' ') GO TO 20
00326     END DO
00327     RETURN
00328 20  ipa=i
00329     DO i=ipa,LEN(pat)
00330         IF(pat(i:i) /= ' ') ipb=i
00331     END DO
00332     npat=ipb-ipa+1
00333     !GF      IF(NPAT.GT.100) STOP 'MATINT: string PAT too long!   '
00334     IF(npat > npatma) THEN
00335         WRITE(*,*) 'too long PAT (', pat,'):', npat, ' >', npatma
00336         STOP 'MATINT: string PAT too long!   '
00337     END IF
00338     !GF end
00339     id(0,1)=0
00340     DO i=0,npat
00341         id(i,2)=i
00342     END DO
00343     jot=2
00344 
00345     DO j=1,ntext
00346         jot=3-jot
00347         jt=j+ita-1
00348         jc=nj(ICHAR(text(jt:jt)))
00349         DO i=1,npat
00350             ip=i+ipa-1
00351             ideq=id(i-1,3-jot)
00352             ic=nj(ICHAR(pat(ip:ip)))
00353             IF(ic /= jc) ideq=ideq+1
00354             id(i,jot)=MIN(ideq,id(i,3-jot)+1,id(i-1,jot)+1)
00355         END DO
00356         matint=MAX(matint,npat-id(npat,jot))
00357     END DO
00358 END FUNCTION matint
00359 
00360