Millepede-II  V04-00-00_preview
 All Classes Files Functions Variables Enumerator Pages
mptext.f90
Go to the documentation of this file.
1 
2 ! Code converted using TO_F90 by Alan Miller
3 ! Date: 2012-03-16 Time: 11:09:16
4 
7 
9 MODULE mptext
10  IMPLICIT NONE
11  SAVE
12  INTEGER:: keya !< start (position) of keyword
13  INTEGER:: keyb !< end (position) of keyword
14 
15 END MODULE mptext
16 
25 
26 SUBROUTINE ratext(text,nums,dnum)
27  USE mptext
28 
29  IMPLICIT NONE
30  INTEGER :: i
31  INTEGER :: ia
32  INTEGER :: ib
33  INTEGER :: ic
34  INTEGER :: ich
35  INTEGER :: icl
36  INTEGER :: icode
37  INTEGER :: j
38  INTEGER :: k
39 
40  INTEGER :: lent
41  INTEGER :: num
42 
43  CHARACTER (LEN=*), INTENT(IN) :: text
44  INTEGER, INTENT(OUT) :: nums
45  DOUBLE PRECISION, INTENT(OUT) :: dnum(*)
46 
47  INTEGER :: last ! last non-blank character
48  INTEGER, PARAMETER :: ndim=1000
49  INTEGER, DIMENSION(2,ndim):: icd
50  CHARACTER (LEN=16) :: keywrd
51  CHARACTER (LEN=1) :: ch
52  DOUBLE PRECISION :: dic(ndim)
53  DOUBLE PRECISION :: dumber
54  INTEGER :: icdt(ndim)
55  SAVE
56  ! ...
57  nums=0
58  last=0
59  keya=0
60  keyb=0
61  IF(text(1:1) == '*') return
62  num=ichar('0')
63  lent=0
64  last=0
65  DO i=1,len(text) ! find comment and end
66  IF(lent == 0.AND.(text(i:i) == '!'.OR.text(i:i) == '%')) lent=i
67  IF(text(i:i) /= ' ') last=i
68  END DO
69  IF(lent == 0) lent=last+1
70  icd(1,1)=lent
71 
72  j=1
73  icdt(1)=0
74  icl=0
75  DO i=1,lent-1
76  ch =text(i:i)
77  ich=ichar(ch)
78  ic=0
79  IF(ch == '.') ic=1
80  IF(ch == '+') ic=2
81  IF(ch == '-') ic=3
82  IF(ch == 'E') ic=4
83  IF(ch == 'D') ic=4
84  IF(ch == 'e') ic=4
85  IF(ch == 'd') ic=4
86  IF(ic > 0) THEN
87  j=j+1
88  icd(1,j)=i
89  icd(2,j)=i
90  icdt(j)=ic
91  ELSE
92  ic=6
93  IF(ich >= num.AND.ich <= num+9) ic=5 ! digit
94  IF(ic /= icl) THEN
95  j=j+1
96  icd(1,j)=i
97  icdt(j)=ic
98  END IF
99  icd(2,j)=i
100  END IF
101  icl=ic ! previous IC
102  END DO
103  icdt(j+1)=0
104 
105  DO i=1,j ! define number
106  IF(icdt(i) == 5) THEN
107  dumber=0.0d0
108  DO k=icd(1,i),icd(2,i)
109  dumber=10.d0*dumber+dfloat(ichar(text(k:k))-num)
110  END DO
111  dic(i)=dumber
112  END IF
113  END DO
114  icdt(j+1)=0
115 
116  DO i=2,j ! get dots
117  IF(icdt(i) == 1) THEN
118  icode=0
119  IF(icdt(i-1) == 5.AND.icd(2,i-1)+1 == icd(1,i)) icode=1
120  IF(icdt(i+1) == 5.AND.icd(1,i+1)-1 == icd(2,i)) icode=icode+2
121  IF(icode == 1) THEN ! 123.
122  icd(2,i-1)=icd(2,i)
123  icdt(i)=0
124  ELSE IF(icode == 2) THEN ! .456
125  dic(i)=10.0d0**(icd(1,i+1)-icd(2,i+1)-1)*dic(i+1)
126  icdt(i)=5
127  icd(2,i)=icd(2,i+1)
128  icdt(i+1)=0
129  ELSE IF(icode == 3) THEN ! 123.456
130  dic(i-1)=dic(i-1)+ 10.0d0**(icd(1,i+1)-icd(2,i+1)-1)*dic(i+1)
131  icd(2,i-1)=icd(2,i+1)
132  icdt(i)=0
133  icdt(i+1)=0
134  END IF
135  END IF
136  END DO
137 
138  k=1 ! remove blanks, compress
139  DO i=2,j
140  IF(icdt(i) == 6.AND.text(icd(1,i):icd(2,i)) == ' ') icdt(i)=0
141  IF(icdt(i) /= 0) THEN
142  k=k+1
143  icd(1,k)=icd(1,i)
144  icd(2,k)=icd(2,i)
145  icdt(k)=icdt(i)
146  dic(k)=dic(i)
147  END IF
148  END DO
149  j=k
150 
151  DO i=2,j-1
152  IF(icdt(i) == 2.OR.icdt(i) == 3) THEN ! +-
153  IF(icdt(i+1) == 5) THEN
154  icd(1,i+1)=icd(1,i)
155  IF(icdt(i) == 3) dic(i+1)=-dic(i+1)
156  icdt(i)=0
157  END IF
158  END IF
159  END DO
160 
161  k=1 ! compress
162  DO i=2,j
163  IF(icdt(i) == 6.AND.text(icd(1,i):icd(2,i)) == ' ') icdt(i)=0
164  IF(icdt(i) /= 0) THEN
165  k=k+1
166  icd(1,k)=icd(1,i)
167  icd(2,k)=icd(2,i)
168  icdt(k)=icdt(i)
169  dic(k)=dic(i)
170  END IF
171  END DO
172  j=k
173 
174  DO i=2,j-1
175  IF(icdt(i) == 4) THEN ! E or D
176  IF(icdt(i-1) == 5.AND.icdt(i+1) == 5) THEN
177  icd(2,i-1)=icd(2,i+1)
178  dic(i-1)=dic(i-1)*10.0d0**dic(i+1)
179  icdt(i)=0
180  icdt(i+1)=0
181  END IF
182  END IF
183  END DO
184 
185  nums=0 ! compress
186  DO i=1,j
187  IF(icdt(i) == 5) THEN
188  nums=nums+1
189  icd(1,nums)=icd(1,i)
190  icd(2,nums)=icd(2,i)
191  dnum(nums)=dic(i)
192  END IF
193  END DO
194 
195  keywrd=' ' ! assemble keyword
196  ia=0
197  ib=-1
198  DO i=1,icd(1,1)-1
199  IF(ia == 0.AND.text(i:i) /= ' ') ia=i
200  IF(text(i:i) /= ' ') ib=i
201  END DO
202  IF(ib >= 0) keywrd=text(ia:ib)
203  keya=ia
204  keyb=max(0,ib)
205 END SUBROUTINE ratext
206 
213 
214 SUBROUTINE rltext(text,ia,ib,nab)
215  IMPLICIT NONE
216  INTEGER :: i
217  INTEGER :: lim
218 
219  CHARACTER (LEN=*), INTENT(IN) :: text
220  INTEGER, INTENT(OUT) :: ia
221  INTEGER, INTENT(OUT) :: ib
222  INTEGER, INTENT(OUT) :: nab
223 
224  SAVE
225  ! ...
226  ia=0
227  ib=0
228  nab=0
229  lim=0
230  DO i=1,len(text)
231  IF(text(i:i) /= ' ') nab=i
232  IF((i == 1.AND.text(1:1) == '*').OR.text(i:i) == '!') THEN
233  IF(lim == 0) lim=i
234  END IF
235  END DO
236  IF(lim == 0) THEN
237  lim=nab
238  ELSE
239  lim=lim-1
240  END IF
241  DO i=1,lim
242  IF(ia == 0.AND.text(i:i) /= ' ') ia=i
243  IF(text(i:i) /= ' ') ib=i
244  END DO
245 END SUBROUTINE rltext
246 
264 
265 INTEGER FUNCTION matint(pat,text,npat,ntext)
266  IMPLICIT NONE
267  INTEGER :: i
268  INTEGER :: ic
269  INTEGER :: ideq
270  INTEGER :: ip
271  INTEGER :: ipa
272  INTEGER :: ipb
273  INTEGER :: ita
274  INTEGER :: itb
275  INTEGER :: j
276  INTEGER :: jc
277  INTEGER :: jot
278  INTEGER :: jt
279  INTEGER :: npatma
280 
281  CHARACTER (LEN=*), INTENT(IN) :: pat
282  CHARACTER (LEN=*), INTENT(IN) :: text
283  INTEGER, INTENT(OUT) :: npat
284  INTEGER, INTENT(OUT) :: ntext
285 
286  !GF
287  ! INTEGER ID(0:100,2)
288  parameter(npatma=512)
289  INTEGER :: id(0:npatma,2)
290  ! end GF
291  LOGICAL :: start ! for case conversion
292  CHARACTER (LEN=26) :: chu
293  CHARACTER (LEN=26) :: chl
294  INTEGER :: nj(0:255)
295  SAVE
296  DATA chu/'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/
297  DATA chl/'abcdefghijklmnopqrstuvwxyz'/
298  DATA start/.true./
299  DATA nj/256*0/
300  ! ...
301  IF(start) THEN
302  start=.false.
303  DO j=0,255
304  nj(j)=j
305  END DO
306  DO i=1,26
307  nj(ichar(chl(i:i)))=ichar(chu(i:i))
308  END DO
309  END IF
310  ! ...
311  matint=0
312  ntext=0
313  DO i=1,len(text) ! find indices ITA...ITB
314  IF(text(i:i) /= ' ') go to 10
315  END DO
316  go to 15
317 10 ita=i
318  DO i=ita,len(text)
319  IF(text(i:i) /= ' ') itb=i
320  END DO
321  ntext=itb-ita+1 ! number of charcaters in TEXT
322 
323 15 npat=0
324  DO i=1,len(pat) ! find indices IPA...IPB
325  IF(pat(i:i) /= ' ') go to 20
326  END DO
327  return
328 20 ipa=i
329  DO i=ipa,len(pat)
330  IF(pat(i:i) /= ' ') ipb=i
331  END DO
332  npat=ipb-ipa+1
333  !GF IF(NPAT.GT.100) STOP 'MATINT: string PAT too long! '
334  IF(npat > npatma) THEN
335  WRITE(*,*) 'too long PAT (', pat,'):', npat, ' >', npatma
336  stop 'MATINT: string PAT too long! '
337  END IF
338  !GF end
339  id(0,1)=0
340  DO i=0,npat
341  id(i,2)=i
342  END DO
343  jot=2
344 
345  DO j=1,ntext
346  jot=3-jot
347  jt=j+ita-1
348  jc=nj(ichar(text(jt:jt)))
349  DO i=1,npat
350  ip=i+ipa-1
351  ideq=id(i-1,3-jot)
352  ic=nj(ichar(pat(ip:ip)))
353  IF(ic /= jc) ideq=ideq+1
354  id(i,jot)=min(ideq,id(i,3-jot)+1,id(i-1,jot)+1)
355  END DO
356  matint=max(matint,npat-id(npat,jot))
357  END DO
358 END FUNCTION matint
359 
360