~maddevelopers/mg5amcnlo/2.9.4

« back to all changes in this revision

Viewing changes to Template/NLO/MCatNLO/srcCommon/mcatnlo_int.f

pass to v2.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
c ************************************************************************* 
 
2
c
 
3
c This file contains the routines used by the MC@NLO to integrate the
 
4
c NLO cross sections, and to generate weighted/unweighted events.
 
5
c Most of these routines are identical to those of the original
 
6
c package BASES/SPRING. They have been modified in order to treat
 
7
c the case of functions with arbitrary sign. The user should be
 
8
c only interested in the two wrappers
 
9
c     RUN_BASES
 
10
c     RUN_SPRING
 
11
c which perform the integration and generate unweighted events respectively.
 
12
c See the comments at the beginning of the bodies of these routines.
 
13
c
 
14
c ------------------------------ SIDE EFFECTS -----------------------------
 
15
c
 
16
c When the user is interested in generating weighted events, he can access 
 
17
c the Vegas weight by inserting in the integrand function the following
 
18
c common block:
 
19
c      COMMON /CBSWGT/BSEWGT
 
20
c This common block is filled by BASES on event-by-event basis. BSEWGT
 
21
c is actually the Vegas weight, divided by a normalization factor equal
 
22
c to the number of Vegas calls per iteration, times the number of iterations
 
23
c in the integration step; BSEWGT can thus be used to fill histograms,
 
24
c with no further normalization.
 
25
c
 
26
c It is possible to generate unweighted events with an integrand function
 
27
c of arbitrary sign. Suppose the integrand function is FF0; then one has
 
28
c to define FF=ABS(FF0), and give FF as input to BASES/SPRING. The
 
29
c information on the sign of FF0 must be passed by the user to BASES/SPRING
 
30
c by inserting the common block
 
31
c      COMMON /CBSSGN/BSFSGN
 
32
c in the body of FF, where BSFSGN is such that FF0=BSFSGN*FF (thus,
 
33
c BSFSGN is either +1 or -1). Tipically, the definition of BSFSGN is 
 
34
c the last line of code in the body of the function. 
 
35
c
 
36
c ------------------------------ EVENT RECORD -----------------------------
 
37
c
 
38
c After SPRING successfully generates an event, it calls (from RUN_OF_SPRING) 
 
39
c the routine 
 
40
c      SPRFIN
 
41
c The user must use this routine to finalize his computation: selecting 
 
42
c (on statistical basis) a given flavour/color/kinematics configuration,
 
43
c if the event corresponds to several configurations, and writing the
 
44
c event on file. It must be stressed that SPRFIN is called
 
45
c immediately after SPRING has gone through the input function FF in
 
46
c the generation of an event: thus, FF must pass all the relevant
 
47
c quantities to SPRFIN through common blocks.
 
48
 
49
c ************************************************************************* 
 
50
 
51
 
52
 
53
c
 
54
      subroutine run_bases(ff,prefix,ndim,nwild,ncall,it1,it2,ac1,ac2,
 
55
     #                    res,sig,resneg,signeg,ctime,itd1,itd2,iseed,
 
56
     #                    iwrite,ircall)
 
57
c Master routine to integrate a real*8 function using bases. The entries are:
 
58
c
 
59
c  ff:     the integrand
 
60
c  prefix: bases will write the relevant information on prefix_bs.data
 
61
c  ndim:   the dimension of the space that contains the support of ff
 
62
c  nwild:  the number of wild variables
 
63
c  ncall:  the number of sampling points per iteration (user's input)
 
64
c  it1:    the maximum number of iterations in the grid optimization step
 
65
c  it2:    the maximum number of iterations in the integration step
 
66
c  ac1:    the relative accuracy required in the grid optimization step
 
67
c  ac2:    the relative accuracy required in the integration step
 
68
c  res:    the result of the integration of ff
 
69
c  sig:    its standard deviation
 
70
c  resneg: the result of the integration of ff0, where ff=abs(ff0)
 
71
c  signeg: its standard deviation
 
72
c  ctime:  the computing time used in the integration step
 
73
c  itd1:   iterations performed in the grid optimization step
 
74
c  itd2:   iterations performed in the integration step
 
75
c  iseed:  the initial seed for random number generation
 
76
c  iwrite: if equal to zero, bases does NOT write prefix_bs.data
 
77
c  ircall: the actual number of sampling points per iteration (bases output)
 
78
c
 
79
c ******************************** WARNING ******************************** 
 
80
c Resneg and signeg return sensible results only if the common block
 
81
c      COMMON /CBSSGN/BSFSGN
 
82
c is inserted in the body of the integrand function ff
 
83
c ******************************** WARNING ******************************** 
 
84
c Bases has been modified in order to output weighted events, thus
 
85
c avoiding the use of spring. For this option to work, the common block
 
86
c      COMMON /CBSWGT/BSEWGT
 
87
c must be intserted in the body of the integrand function ff
 
88
c
 
89
c In the case of the wild variables, bases saves the probability
 
90
c information for each hypercube associated to those variables;
 
91
c this is crucial when spring is attached. If a variable is not
 
92
c wild, the information on the shape of the integrand is lost 
 
93
c during the phase of event generation.
 
94
c Bases also leaves to the user the choice of whether a variable
 
95
c is optimized (i.e., the grid is iteratively adjusted), or not.
 
96
c This option is controlled by the value of IG(i) (1=optimization,
 
97
c 0=no optimization). In the present interface, we always set IG(i)=1
 
98
      implicit none
 
99
      real*8 ff,ac1,ac2,res,sig,resneg,signeg,ctime
 
100
      integer ndim,nwild,ncall,it1,it2,itd1,itd2,iseed,iwrite,ircall
 
101
      integer ing,inpg,insp
 
102
      common/brcall/ing,inpg,insp
 
103
      character * 60 prefix,fname
 
104
      integer isunit
 
105
      parameter (isunit=23)
 
106
      logical verbose
 
107
      data verbose/.false./
 
108
      external ff
 
109
c
 
110
      call init_of_bases(ndim,nwild,ncall,it1,it2,iseed,ac1,ac2)
 
111
      call bases(ff,res,sig,resneg,signeg,ctime,itd1,itd2)
 
112
      ircall=insp*inpg
 
113
      if(iwrite.ne.0)then
 
114
        call fk88strcat(prefix,'_bs.data',fname)
 
115
        open(unit=isunit,file=fname,
 
116
     #       form='unformatted',status='unknown')
 
117
        call bswrit(isunit)
 
118
        close(isunit)
 
119
      endif
 
120
      if(verbose)then
 
121
        write(6,*)'integral: ',res,' +- ',sig
 
122
        write(6,*)'elapsed time: ',ctime
 
123
        write(6,*)'itns: ',itd1,itd2
 
124
      endif
 
125
      return
 
126
      end
 
127
 
 
128
 
 
129
      subroutine run_spring(ff,prefix,mxevts,mxtrls,nevts,ntrls,
 
130
     #                      ndim,nwild,iseed)
 
131
c Master routine to generate events using spring. The entries are:
 
132
c
 
133
c  ff:     the function previously integrated by bases
 
134
c  prefix: spring will read the relevant information from prefix_bs.data
 
135
c  mxevts: the required number of generated events
 
136
c  mxtrls: the maximum number of trials to generate mxevts
 
137
c  nevts:  the number of generated events
 
138
c  ntrls:  the number of trials
 
139
c  ndim:   the dimension of the space that contains the support of ff
 
140
c  nwild:  the number of wild variables
 
141
c  iseed:  the initial seed for random number generation
 
142
c
 
143
c ******************************** WARNING ******************************** 
 
144
c For the event to be finalised (for example, written on file), 
 
145
c the routine 
 
146
c      SPRFIN
 
147
c must be written by the user; the relevant information is passed
 
148
c from FF to SPRFIN by means of common blocks
 
149
      implicit none
 
150
      real*8 ff,dum
 
151
      integer mxevts,mxtrls,nevts,ntrls,ndim,nwild,iseed,idum
 
152
      character * 60 prefix
 
153
      parameter (dum=-1.d0)
 
154
      parameter (idum=-1)
 
155
      external ff
 
156
c
 
157
      if(mxevts.eq.0)return
 
158
      call init_of_spring(prefix)
 
159
      call init_of_bases(ndim,nwild,idum,idum,idum,iseed,dum,dum)
 
160
      if(mxtrls.le.0)then
 
161
        write(6,*)'no events will be generated'
 
162
        return
 
163
      endif
 
164
      if(mxtrls.lt.mxevts)then
 
165
        write(6,*)
 
166
     #   'SPRING warning: the required number of events cannot be'
 
167
        write(6,*)
 
168
     #   'generated: mxevts, mxtrls=',mxevts,mxtrls
 
169
      endif
 
170
      call run_of_spring(ff,mxevts,mxtrls,nevts,ntrls)
 
171
      if(nevts.ne.mxevts.and.ntrls.ne.mxtrls)then
 
172
        write(6,*)'SPRING: fatal error'
 
173
        write(6,*)mxevts,nevts
 
174
        write(6,*)mxtrls,ntrls
 
175
        stop
 
176
      endif
 
177
      return
 
178
      end
 
179
 
 
180
c
 
181
c
 
182
c Begin of BASES routines
 
183
c
 
184
c
 
185
      subroutine init_of_bases(mdim,mwild,mcall,it1,it2,iseed,ac1,ac2)
 
186
c This subroutine is called in order to initialize bases parameters;
 
187
c it has been obtained by getting together bsdims.f, bsgrid.f, and
 
188
c bsparm.f of the original package (BASES50/SPRING50). When the last
 
189
c four entries are set to negative values, default values (defined
 
190
c in bsinit) are used
 
191
      implicit none
 
192
      integer mdim,mwild,mcall,it1,it2,iseed
 
193
      real * 8 ac1,ac2
 
194
      integer mxdim,mxwl
 
195
      parameter (mxdim = 50)
 
196
      parameter (mxwl = 15)
 
197
* NDIM   : The number of dimension of integral                     *
 
198
* NWILD  : The number of wild variables                            *
 
199
* NCALL  : The number of sample points per iteration.              *
 
200
*          This actual number is to be determined by taking the    *
 
201
*          number of dimensions into account.                      *
 
202
* XL(i)  : The lower value of the i-th integral variable           *
 
203
* XU(i)  : The upper value of the i-th integral variable           *
 
204
* IG(i)  : The flag switches whether the grid of i-th variable     *
 
205
*          is to be optimized ( 1 ) or kept uniform ( 0 ).         *
 
206
      real * 8 xl(mxdim),xu(mxdim)
 
207
      integer ndim,nwild,ncall,ig(mxdim)
 
208
      common/bparm1/xl,xu,ndim,nwild,ig,ncall
 
209
* ACC1   : The required accuracy at the grid optimization step     *
 
210
* ACC2   : The required accuracy at the integration step.          *
 
211
* ITMX1  : The max. number of iteration at the grid opt. step.     *
 
212
* ITMX2  : The max. number of iteration at the integration step.   *
 
213
      real*8 acc1,acc2
 
214
      integer itmx1,itmx2
 
215
      common/bparm2/acc1,acc2,itmx1,itmx2
 
216
      integer jflag,ibases
 
217
      common/base0/jflag,ibases
 
218
      integer i
 
219
      logical lhisto
 
220
      common/bfxlhisto/lhisto
 
221
      data lhisto/.false./
 
222
c
 
223
      if(mdim.gt.mxdim.or.mwild.gt.mxwl)then
 
224
        write(6,*)'just kidding....'
 
225
        stop
 
226
      endif
 
227
      ibases=0
 
228
      call bsinit
 
229
      call drnset(iseed)
 
230
      ndim=mdim
 
231
      nwild=mwild
 
232
      ncall=mcall
 
233
      do i=1,ndim
 
234
        xl(i)=0.d0
 
235
        xu(i)=1.d0
 
236
        ig(i)=1
 
237
      enddo
 
238
      if(it1.ge.0)itmx1=it1
 
239
      if(it2.ge.0)itmx2=it2
 
240
      if(ac1.ge.0.d0)acc1=ac1
 
241
      if(ac2.ge.0.d0)acc2=ac2
 
242
      return
 
243
      end
 
244
 
 
245
 
 
246
************************************************************************
 
247
*    ====================================================              *
 
248
      SUBROUTINE BASES(FXN,S,SIGMA,SNEG,SIGMANEG,CTIME,IT1,IT2 )
 
249
*    ====================================================              *
 
250
*      Subroutine BASES for the Numerical integration.                 *
 
251
*      In terms of this program Integration can be done, furthermore   *
 
252
*      a probability distribution can be made for the event generation.*
 
253
*      The event with weight one is generated by program SPRING.       *
 
254
* ((Input))                                                            *
 
255
*    from the arguement                                                *
 
256
*      FXN    : Name of function program                               *
 
257
*    from the labeled common /BASE1/                                   *
 
258
*      XL(50) : Lower limits of the integration variabels              *
 
259
*      XU(50) : upper limits of the integration variabels              *
 
260
*      NDIM   : Dimension of the integration                           *
 
261
*      NCALL  : Number of sampling points per iteration                *
 
262
*    from the lebeled common /BASE2/                                   *
 
263
*      ITMX*  : Number of iteration                                    *
 
264
*      ACC*   : Required accuracies                                    *
 
265
* ((Output))                                                           *
 
266
*      S      : Estimate of the integral                               *
 
267
*      SIGMA  : Standard deviation of the estimate                     *
 
268
*      SNEG   : Estimate of the integral with sign (see run_bases)     *
 
269
*      SIGMANEG: Standard deviation of the estimate for sneg           *
 
270
*      CTIME  : Computing time required for integration                *
 
271
*      IT1    : Number of iterations for the grid defining step        *
 
272
*      IT2    : Number of iterations for the integration step          *
 
273
C*                                                                     *
 
274
C*       Coded by S.Kawabata         April '94                         *
 
275
C*                                                                     *
 
276
C* Modified by S. Frixione (sneg, sigmaneg, and common block brsneg    *
 
277
C* have been added)                                                    *
 
278
C***********************************************************************
 
279
C
 
280
C
 
281
      IMPLICIT REAL*8 (A-H,O-Z)
 
282
      EXTERNAL FXN
 
283
      PARAMETER (MXDIM = 50)
 
284
*
 
285
*     JFLAG =  0 : First trial for defining grids.
 
286
*     JFLAG =  1 : First trial for event accumulation.
 
287
*     JFLAG =  2 : Second or more trial for defining grids.
 
288
*     JFLAG =  3 : Second or more trial for accumulation.
 
289
*                                                                      *
 
290
      COMMON /BASE0/ JFLAG,IBASES
 
291
      COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
292
     .               IG(MXDIM),NCALL
 
293
      COMMON /BASE2/ ACC1,ACC2,ITMX1,ITMX2
 
294
      REAL*4 STIME
 
295
      COMMON /BSRSLT/AVGI,SD,CHI2A,STIME,ITG,ITF
 
296
      COMMON /BSRNEG/AVGINEG,SDNEG
 
297
      CHARACTER*80 ERROR
 
298
      COMMON /BWARN1/ NERROR
 
299
      COMMON /BWARN2/ ERROR(3,3)
 
300
*        INTV = ( 0 / 1 / any ) = ( Batch / Batch(Unix) / Interactive )
 
301
*        IPNT = ( 0 / any ) = ( IBM Type / Ascii printer )
 
302
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
303
 
 
304
       COMMON/NINFO/ NODEID, NUMNOD
 
305
       COMMON /BDATE/ IDATE(3),ITIME(2)
 
306
*            IDATE(1) : year        ITIME(1) : hour
 
307
*            IDATE(2) : month       ITIME(2) : minute
 
308
*            IDATE(3) : day
 
309
      REAL*4 TIMEBS,TIMINT,TIMESP,TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
310
      COMMON /BTIME1/ TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
311
      COMMON /BTIME2/ TIMEBS(0:2),TIMINT,TIMESP(0:2)
 
312
 
 
313
*-------------------------------------------------
 
314
*     Check the parameters defined by user
 
315
*------------------------------------------------------
 
316
 
 
317
      CALL BSCHCK
 
318
 
 
319
* ---------------------------------------------------------------
 
320
*          Initialize timer
 
321
* ---------------------------------------------------------------
 
322
 
 
323
       CALL BSDATE
 
324
 
 
325
       JFLAG  = 0
 
326
       LU     = 6
 
327
       IF( INTV .GT. 1 ) THEN
 
328
           CALL BSPRNT( LU, 1, IDUM1, IDUM2 )
 
329
       ENDIF
 
330
 
 
331
C  -----------------------------------------------------
 
332
C     Defining grids
 
333
C  -----------------------------------------------------
 
334
*
 
335
       DO 100 I = 1, NWILD
 
336
          IG(I) = 1
 
337
  100  CONTINUE
 
338
 
 
339
       CALL BSETGU
 
340
 
 
341
       IF( INTV .GT. 1 ) THEN
 
342
           CALL BSPRNT( LU, 4, IDUM1, IDUM2 )
 
343
       ENDIF
 
344
 
 
345
       CALL BSUTIM( 0, 2 )
 
346
 
 
347
*     ===================
 
348
       CALL BSINTG( FXN )
 
349
*     ===================        For a parallel computer
 
350
C                                      CALL BSCAST( JFLAG, 1 )
 
351
 
 
352
*  ----------------------------------------------------
 
353
*     Accumulation to make probability distribution
 
354
*  ----------------------------------------------------
 
355
*     ===================
 
356
       CALL BSINTG( FXN )
 
357
*     ===================        For a parallel computer
 
358
C                                      CALL BSCAST( JFLAG, 1 )
 
359
       S     = AVGI
 
360
       SIGMA = SD
 
361
       CTIME = STIME
 
362
       IT1   = ITG
 
363
       IT2   = ITF
 
364
       SNEG     = AVGINEG
 
365
       SIGMANEG = SDNEG
 
366
 
 
367
       CALL BSUTIM( 0, 2 )
 
368
       TIMEB2 = RTIME
 
369
 
 
370
       IF( NERROR .GT. 0 ) THEN
 
371
           WRITE(6,9900)
 
372
 9900      FORMAT(1X,'****************************************',
 
373
     .               '***************************************',
 
374
     .           /1X,'* (((( Warning in the integration step ',
 
375
     .               '))))                                   *',
 
376
     .           /1X,'*                                      ',
 
377
     .               '                                       *')
 
378
           DO 990 J = 1,NERROR
 
379
           DO 990 I = 1,3
 
380
              WRITE(6,9901) ERROR(I,J)
 
381
 9901         FORMAT(1X,A79)
 
382
  990      CONTINUE
 
383
           WRITE(6,9902)
 
384
 9902      FORMAT(1X,'*                                      ',
 
385
     .               '                                       *',
 
386
     .           /1X,'*(( Suggestion ))                      ',
 
387
     .               '                                       *',
 
388
     .           /1X,'* (1) Try integration again with larger ',
 
389
     .               'number of sample points than this job.*',
 
390
     .           /1X,'* or                                   ',
 
391
     .               '                                       *',
 
392
     .           /1X,'* (2) The integral variables are not sui',
 
393
     .               'ted for the function.                 *',
 
394
     .           /1X,'*     Take another integral variables !!',
 
395
     .               '                                      *',
 
396
     .           /1X,'*                                       ',
 
397
     .               '                                      *',
 
398
     .           /1X,'****************************************',
 
399
     .               '***************************************')
 
400
       ENDIF
 
401
 
 
402
       IF( INTV .GT. 1 ) THEN
 
403
           CALL BSPRNT( LU, 2, IDUM1, IDUM2 )
 
404
       ENDIF
 
405
 
 
406
       RETURN
 
407
       END
 
408
 
 
409
 
 
410
************************************************************************
 
411
*    ===================                                               *
 
412
      SUBROUTINE BSCHCK
 
413
*    ===================                                               *
 
414
* ((Purpose))                                                          *
 
415
*     To check user's initialization parameters.                       *
 
416
*                                                                      *
 
417
*        Coded by S.Kawabata        Oct. '85                           *
 
418
*                                                                      *
 
419
************************************************************************
 
420
 
 
421
      IMPLICIT REAL*8 (A-H,O-Z)
 
422
      PARAMETER ( MXDIM = 50)
 
423
      COMMON /BPARM1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
424
     .               IG(MXDIM),NCALL
 
425
      COMMON /BPARM2/ ACC1,ACC2,ITMX1,ITMX2
 
426
 
 
427
      COMMON /BASE0/ JFLAG,IBASES
 
428
      COMMON /BASE1/ XLT(MXDIM),XUT(MXDIM),NDIMT,NWILDT,
 
429
     .               IGT(MXDIM),NCALLT
 
430
      COMMON /BASE2/ ACC1T,ACC2T,ITMX1T,ITMX2T
 
431
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
432
      COMMON /XHCNTL/ LOCK
 
433
 
 
434
      LOCK  = 1
 
435
 
 
436
      IF( IBASES .NE.  1 ) THEN
 
437
          WRITE(6,9000)
 
438
 9000     FORMAT(
 
439
     .     5X,'*************************************************',
 
440
     .    /5X,'*                                               *',
 
441
     .    /5X,'*   BSINIT was not called before calling BASES  *',
 
442
     .    /5X,'*                                               *',
 
443
     .    /5X,'*   Process was terminated due to this error.   *',
 
444
     .    /5X,'*                                               *',
 
445
     .    /5X,'*************************************************')
 
446
          STOP
 
447
      ENDIF
 
448
 
 
449
 
 
450
      IF( NDIM .LT. 1) THEN
 
451
          WRITE(6,9100)
 
452
 9100     FORMAT(
 
453
     .     5X,'*************************************************',
 
454
     .    /5X,'*                                               *',
 
455
     .    /5X,'*   NDIM was not set before calling BASES.      *',
 
456
     .    /5X,'*                                               *',
 
457
     .    /5X,'*   Process was terminated due to this error.   *',
 
458
     .    /5X,'*                                               *',
 
459
     .    /5X,'*************************************************')
 
460
          STOP
 
461
      ENDIF
 
462
 
 
463
      NDIMT = NDIM
 
464
 
 
465
      DO 200 I = 1,NDIM
 
466
         IF( XU(I) .LE. -1.0D37) THEN
 
467
             WRITE(6,9200) I,I
 
468
 9200        FORMAT(
 
469
     .        5X,'*************************************************',
 
470
     .       /5X,'*                                               *',
 
471
     .       /5X,'*   XL(',I6,' ).  XU(',I6,' ) were not set      *',
 
472
     .       /5X,'*    before calling BASES.                      *',
 
473
     .       /5X,'*   Process was terminated due to this error.   *',
 
474
     .       /5X,'*                                               *',
 
475
     .       /5X,'*************************************************')
 
476
             STOP
 
477
         ENDIF
 
478
 
 
479
         IGT(I)  = IG(I)
 
480
         XLT(I)  = XL(I)
 
481
         XUT(I)  = XU(I)
 
482
 
 
483
  200 CONTINUE
 
484
C
 
485
C  Change the maximum number of the wild variables
 
486
C 10 ===> 15
 
487
      IF( NWILD .LT.  0) THEN
 
488
          NWILD = MIN( NDIM, 15)
 
489
          WRITE(6,9300) NWILD
 
490
 9300     FORMAT(
 
491
     .     5X,'*************************************************',
 
492
     .    /5X,'*                                               *',
 
493
     .    /5X,'*   NWILD was not set before calling BASES.     *',
 
494
     .    /5X,'*                                               *',
 
495
     .    /5X,'*   NWILD is set equal to the value(',I6,' ).   *',
 
496
     .    /5X,'*                                               *',
 
497
     .    /5X,'*************************************************')
 
498
      ELSE
 
499
     .IF( NWILD .GT. 15) THEN
 
500
          NWILDO = NWILD
 
501
          NWILD  = MIN( NDIM, 15)
 
502
          WRITE(6,9400) NWILDO, NWILD
 
503
 9400     FORMAT(
 
504
     .     5X,'*************************************************',
 
505
     .    /5X,'*                                               *',
 
506
     .    /5X,'*   NWILD(',I6,' ) was too large number.        *',
 
507
     .    /5X,'*                                               *',
 
508
     .    /5X,'*   NWILD is set equal to the value(',I6,' ).   *',
 
509
     .    /5X,'*                                               *',
 
510
     .    /5X,'*************************************************')
 
511
      ENDIF
 
512
 
 
513
      NWILDT = NWILD
 
514
      NCALLT = NCALL
 
515
 
 
516
      ITMX1T = ITMX1
 
517
      ITMX2T = ITMX2
 
518
      ACC1T  = ACC1
 
519
      ACC2T  = ACC2
 
520
C
 
521
      RETURN
 
522
      END
 
523
 
 
524
 
 
525
C***********************************************************************
 
526
C*                                                                     *
 
527
C*========================                                             *
 
528
C*    SUBROUTINE BSETGU                                                *
 
529
C*========================                                             *
 
530
C*((Function))                                                         *
 
531
C*     Initialization of Bases progam                                  *
 
532
C*     This is called only when IFLAG=0.                               *
 
533
C*     ( IFLAG = 0 ; First Trial of Defining Grid step )               *
 
534
C*                                                                     *
 
535
C*    Changed by S.Kawabata    Aug. 1984 at Nagoya Univ.               *
 
536
C*    Last update              Oct. 1985 at KEK                        *
 
537
C*                                                                     *
 
538
C* Modified by S. Frixione (common block brcall has been added in      *
 
539
C* order to pass npg, ng, and nsp without using base4)                 *
 
540
C***********************************************************************
 
541
C
 
542
      SUBROUTINE BSETGU
 
543
C
 
544
      IMPLICIT REAL*8 (A-H,O-Z)
 
545
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
546
      COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
547
     .               IG(MXDIM),NCALL
 
548
      COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
549
     .               ND,NG,NPG,MA(MXDIM)
 
550
      COMMON /BASE6/ D(NDMX,MXDIM),
 
551
     .               ALPH,XSAVE(NDMX,MXDIM),XTI,XTSI,XACC,ITSX
 
552
      COMMON /BRCALL/ING,INPG,INSP
 
553
 
 
554
      DIMENSION  XIN(NDMX)
 
555
      DATA  ONE/ 1.0D0/
 
556
C
 
557
C---------------------------------------------------------------
 
558
C           Define the number of grids and sub-regions
 
559
C---------------------------------------------------------------
 
560
C==> Determine NG : Number of grids
 
561
          NG    = (NCALL/2.)**(1./NWILD)
 
562
         IF(NG .GT. 25) NG  = 25
 
563
  100    IF(NG .LT.  2) NG  =  1
 
564
         IF(NG**NWILD .GT. LENG) THEN
 
565
            NG  = NG - 1
 
566
            GO TO 100
 
567
         ENDIF
 
568
C
 
569
C==> Determine ND : Number of sub-regions
 
570
          M     = NDMX/NG
 
571
          ND    = M*NG
 
572
C
 
573
C==> Determine NPG: Number of sampling points per subhypercube
 
574
          NSP   = NG**NWILD
 
575
          NPG   = NCALL/NSP
 
576
 
 
577
          ING    = NG
 
578
          INPG   = NPG
 
579
          INSP   = NSP
 
580
 
 
581
          XI(1,1)= ONE
 
582
          MA(1)  = 1
 
583
          DX(1)  = XU(1)-XL(1)
 
584
 
 
585
          IF( NDIM .GT. 1 ) THEN
 
586
              DO 130 J = 2,NDIM
 
587
                 XI(1,J)= ONE
 
588
                 DX(J)  = XU(J)-XL(J)
 
589
                 IF( J .LE. NWILD ) THEN
 
590
                    MA(J)  = NG*MA(J-1)
 
591
                 ENDIF
 
592
  130         CONTINUE
 
593
          ENDIF
 
594
C
 
595
C---------------------------------------------------------------
 
596
C           Set size of subregions uniform
 
597
C---------------------------------------------------------------
 
598
          NDM   = ND-1
 
599
          RC    = ONE/ND
 
600
          DO 155 J =1,NDIM
 
601
             K     = 0
 
602
             XN    = 0.D0
 
603
             DR    = XN
 
604
             I     = K
 
605
  140        K     = K+1
 
606
             DR    = DR+ONE
 
607
             XO    = XN
 
608
             XN    = XI(K,J)
 
609
  145       IF(RC .GT. DR) GO TO 140
 
610
             I     = I+1
 
611
             DR    = DR-RC
 
612
             XIN(I)= XN-(XN-XO)*DR
 
613
            IF(I .LT. NDM) GO TO 145
 
614
             DO 150 I  = 1,NDM
 
615
                XI(I,J)= XIN(I)
 
616
  150        CONTINUE
 
617
             XI(ND,J)  = ONE
 
618
  155     CONTINUE
 
619
********************************************* Updated Feb.08 '94
 
620
          IF( ITSX .GT. 0 ) THEN
 
621
              IPSAVE = 1
 
622
              XACC    = 1.0D37
 
623
              XTI     = 0.0D0
 
624
              XTSI    = XACC
 
625
              ITSX    = 1
 
626
              DO 200 J = 1, NDIM
 
627
              DO 200 I = 1, ND
 
628
                 XSAVE(I,J) = XI(I,J)
 
629
  200         CONTINUE
 
630
          ENDIF
 
631
C
 
632
      RETURN
 
633
      END
 
634
 
 
635
 
 
636
C***********************************************************************
 
637
C*                                                                     *
 
638
C*========================                                             *
 
639
C*    SUBROUTINE BSETGV( IFLAG )                                       *
 
640
C*========================                                             *
 
641
C*((Function))                                                         *
 
642
C*    Refine the grid sizes                                            *
 
643
C*                                                                     *
 
644
C*    Coded   by S.Kawabata    Aug. 1984 at Nagoya Univ.               *
 
645
C*    Last update              Oct. 1985 at KEK                        *
 
646
C*                                                                     *
 
647
C***********************************************************************
 
648
C
 
649
      SUBROUTINE BSETGV( IFLAG )
 
650
C
 
651
      IMPLICIT REAL*8 (A-H,O-Z)
 
652
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
653
      COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
654
     .               IG(MXDIM),NCALL
 
655
      COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
656
     .               ND,NG,NPG,MA(MXDIM)
 
657
      COMMON /BASE3/ SCALLS,WGT,TI,TSI,TACC,IT
 
658
      COMMON /BASE6/ D(NDMX,MXDIM),
 
659
     .               ALPH,XSAVE(NDMX,MXDIM),XTI,XTSI,XACC,ITSX
 
660
      REAL*4 STIME
 
661
      COMMON /BSRSLT/AVGI,SD,CHI2A,STIME,ITG,ITF
 
662
*
 
663
 
 
664
      DIMENSION  XIN(NDMX),R(NDMX),DT(MXDIM),DDX(NDMX)
 
665
      DATA  ONE/1.0D0/,ZERO/0.0D0/,N0/0/,N1/1/
 
666
*
 
667
*========= Save the grid information for the best accuracy ===========
 
668
*
 
669
      IF( ITSX .GT. 0 ) THEN
 
670
          IF( IFLAG .EQ. 0 ) THEN
 
671
              IF( IT .GE. 5 ) THEN
 
672
                  IF( ( TI .GT. AVGI+SD) .AND. TSI .LT. XTSI ) THEN
 
673
                      DO 400 J = 1, NDIM
 
674
                      DO 400 I = 1, ND
 
675
                         XSAVE(I,J) = XI(I,J)
 
676
  400                 CONTINUE
 
677
                      XACC         = TACC
 
678
                      ITSX         = IT
 
679
                      XTI          = TI
 
680
                      XTSI         = TSI
 
681
                  ENDIF
 
682
              ENDIF
 
683
          ELSE
 
684
              IF( ( XTI .GT. TI) .AND. XTSI .LT. TSI ) THEN
 
685
                  DO 500 J = 1, NDIM
 
686
                  DO 500 I = 1, ND
 
687
                     XI(I,J) = XSAVE(I,J)
 
688
  500             CONTINUE
 
689
*                ==========
 
690
                   RETURN
 
691
*                ==========
 
692
              ENDIF
 
693
          ENDIF
 
694
      ENDIF
 
695
 
 
696
C======= SMOOTHING THE FUNCTION D(I,J)
 
697
C
 
698
        CLOGE   = 1.0D0/LOG(10.0D0)
 
699
 
 
700
        NDM     = ND-1
 
701
        DO 780 J= N1,NDIM
 
702
         IF( IG(J) .EQ. 1 ) THEN
 
703
          DDX(1)= 0.5D0*(D(1,J) + D(2,J))
 
704
          DO 710 I=2,NDM
 
705
            DDX(I)= (D(I+1,J) + D(I,J) + D(I-1,J))/3.D0
 
706
  710     CONTINUE
 
707
          DDX(ND) = 0.5D0*(D(NDM,J) + D(ND,J))
 
708
          DT(J) = 0.D0
 
709
          DO 720 I = 1, ND
 
710
             D(I,J) = DDX(I)
 
711
             DT(J)  = DT(J)+D(I,J)
 
712
  720     CONTINUE
 
713
C
 
714
C=========== REDEFINE THE GRID
 
715
C
 
716
 
 
717
          DTLOG   = LOG(DT(J))
 
718
          DT10    = CLOGE*DTLOG
 
719
          RC    = ZERO
 
720
          DO 730 I= N1,ND
 
721
            R(I)  = ZERO
 
722
            IF(D(I,J) .GT. ZERO) THEN
 
723
               DILOG = LOG(D(I,J))
 
724
               IF( DT10 - CLOGE*DILOG  .LE. 70.0D0 ) THEN
 
725
                   XO    = DT(J)/D(I,J)
 
726
                   R(I)  = ((XO-ONE)/(XO*(DTLOG-DILOG)))**ALPH
 
727
               ELSE
 
728
C                  XO    = DT(J)/D(I,J)
 
729
                   R(I)  = (DTLOG-DILOG)**(-ALPH)
 
730
               ENDIF
 
731
            ENDIF
 
732
            RC    = RC+R(I)
 
733
  730     CONTINUE
 
734
          RC    = RC/ND
 
735
          K     = N0
 
736
          XN    = N0
 
737
          DR    = XN
 
738
          I     = K
 
739
  740  K     = K + N1
 
740
          DR    = DR+R(K)
 
741
          XO    = XN
 
742
          XN    = XI(K,J)
 
743
  750 IF(RC.GT.DR)GO TO 740
 
744
          I     = I + N1
 
745
          DR    = DR-RC
 
746
          XIN(I)= XN-(XN-XO)*DR/R(K)
 
747
      IF(I.LT.NDM)GO TO 750
 
748
          DO 760 I= N1,NDM
 
749
            XI(I,J)= XIN(I)
 
750
  760     CONTINUE
 
751
          XI(ND,J)= ONE
 
752
         ENDIF
 
753
  780   CONTINUE
 
754
C
 
755
      RETURN
 
756
      END
 
757
 
 
758
 
 
759
C***********************************************************************
 
760
C*                                                                     *
 
761
C*========================                                             *
 
762
C*    SUBROUTINE BSGETW( WEIGHT )                                      *
 
763
C*========================                                             *
 
764
C*((Function))                                                         *
 
765
C*    Get Weight                                                       *
 
766
C*                                                                     *
 
767
C*    Coded   by T.Ishikawa    Jun. 1995 at KEK                        *
 
768
C*    Last update              Jun. 1995 at KEK                        *
 
769
C*                                                                     *
 
770
C***********************************************************************
 
771
C
 
772
      SUBROUTINE BSGETW( WEIGHT )
 
773
C
 
774
      IMPLICIT REAL*8 (A-H,O-Z)
 
775
      COMMON /BASE3/ SCALLS,WGT,TI,TSI,TACC,IT
 
776
*
 
777
*========= Save the grid information for the best accuracy ===========
 
778
*
 
779
      WEIGHT = WGT
 
780
C
 
781
      RETURN
 
782
      END
 
783
 
 
784
 
 
785
***********************************************************************
 
786
*============================                                         *
 
787
      SUBROUTINE BSINFO( LU )
 
788
*============================                                         *
 
789
*((Purpose))                                                          *
 
790
*    Print the information for                                        *
 
791
*        (1) BASES parameters                                         *
 
792
*        (2) Computer time information                                *
 
793
*        (3) Convergency behavior of the Grid optimization step       *
 
794
*        (4) Convergency behavior of the integration step             *
 
795
*(( Input ))                                                          *
 
796
*    LU  :  Logical unit number of printer                            *
 
797
*                                                                     *
 
798
*           by S.Kawabata    March 1994 at KEK
 
799
*                                                                     *
 
800
***********************************************************************
 
801
 
 
802
      IMPLICIT REAL*8 (A-H,O-Z)
 
803
      REAL*4 STIME
 
804
      COMMON /BSRSLT/AVGI,SD,CHI2A,STIME,ITG,ITF
 
805
 
 
806
*  Print Title
 
807
 
 
808
      CALL BSPRNT( LU, 1, IDUM1, IDUM2 )
 
809
 
 
810
*  Print Bases parameters
 
811
 
 
812
      CALL BSPRNT( LU, 4, IDUM1, IDUM2 )
 
813
 
 
814
*  Print Computing time information
 
815
 
 
816
      CALL BSPRNT( LU, 3, IDUM1, IDUM2 )
 
817
 
 
818
*  Print Convergency Behaviors
 
819
 
 
820
      DO 100 ISTEP = 0, 1
 
821
         ITX  = ITG
 
822
         IF( ISTEP .EQ. 1 ) ITX = ITF
 
823
 
 
824
      IF( ITX .GT. 0 ) THEN
 
825
 
 
826
         CALL BSPRNT( LU, 8, ITX, ISTEP )
 
827
 
 
828
      ENDIF
 
829
  100 CONTINUE
 
830
 
 
831
      RETURN
 
832
      END
 
833
 
 
834
 
 
835
************************************************************************
 
836
*    ===================                                               *
 
837
      SUBROUTINE BSINIT
 
838
*    ===================                                               *
 
839
* ((Purpose))                                                          *
 
840
*     Initialization of BASE50/SPRING50.                               *
 
841
*     Function of this routine is                                      *
 
842
*       (0) Set the size of histogram and scatter plot buffers         *
 
843
*       (1) Set the parameters INTV and IPNT                           *
 
844
*             INTV = ( 0 / 1 / any )                                   *
 
845
*                  = ( Batch / Batch(Unix) / Interactive )             *
 
846
*             IPNT = ( 0 / any )                                       *
 
847
*                  = ( IBM Type / Ascii printer )                      *
 
848
*       (2) Set the acceleration factor ALPHA by 1.5                   *
 
849
*            The range of this value is from 0.0 to 2.0.               *
 
850
*            ALPHA = 0.0 results in no grid-optimization.              *
 
851
*       (3) Set the grid-optimization flag IGOPT ( Default value 0 )   *
 
852
*             IGOPT = 0  :  The grid is optimized by VEGAS algorithm   *
 
853
*             IGOPT = 1  :  The grid is optimized so that the accuracy *
 
854
*                           of each iteration be minimized.            *
 
855
*       (4) Set Node-ID number NODEID and the number of nodes NUMNOD   *
 
856
*       (5) Set seed of radom number                                   *
 
857
*       (6) Set the values of BASES paremeters with default ones.      *
 
858
*       (7) Set the values of parameters with non-sense values,        *
 
859
*            which should be set again with the true values by User    *
 
860
*            before running BASES.                                     *
 
861
*                                                                      *
 
862
*        Coded by S.Kawabata         March '94                         *
 
863
*                                                                      *
 
864
* Modified by S. Frixione in order to exclude the built-in             *
 
865
* histogramming package. The common block bfxlhisto has been added     *
 
866
************************************************************************
 
867
 
 
868
      IMPLICIT REAL*8 (A-H,O-Z)
 
869
      PARAMETER (MXDIM = 50, NDMX = 50 )
 
870
      COMMON /BPARM1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
871
     .               IG(MXDIM),NCALL
 
872
      COMMON /BPARM2/ ACC1,ACC2,ITMX1,ITMX2
 
873
 
 
874
      COMMON /BASE0/ JFLAG,IBASES
 
875
      COMMON /BASE6/ D(NDMX,MXDIM),
 
876
     .               ALPH,XSAVE(NDMX,MXDIM),XTI,XTSI,XACC,IGOPT
 
877
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
878
       COMMON/NINFO/ NODEID, NUMNOD
 
879
       COMMON /BDATE/ IDATE(3),ITIME(2)
 
880
*            IDATE(1) : year        ITIME(1) : hour
 
881
*            IDATE(2) : month       ITIME(2) : minute
 
882
*            IDATE(3) : day
 
883
      REAL*4 TIMEBS,TIMINT,TIMESP,TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
884
      COMMON /BTIME1/ TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
885
      COMMON /BTIME2/ TIMEBS(0:2),TIMINT,TIMESP(0:2)
 
886
      LOGICAL LHISTO
 
887
      COMMON/BFXLHISTO/LHISTO
 
888
*=========================================================
 
889
* (0) Initialization of timer and Histogram buffer
 
890
*     Timer initialization
 
891
       CALL BSTIME( TIME0, 0 )
 
892
       TIMEB1 = TIME0
 
893
       TIMINT = 0
 
894
 
 
895
*     Histogram buffer initialization
 
896
       IF(LHISTO)THEN
 
897
         LU  = 6
 
898
         CALL BHINIT( LU )
 
899
       ENDIF
 
900
 
 
901
*=========================================================
 
902
 
 
903
* (1) Set the parameters INTV and IPNT
 
904
       INTV  = 2
 
905
       IPNT  = 1
 
906
* (2) Set the acceleration factor ALPHA by 1.5
 
907
       ALPH  = 1.5D0
 
908
* (3) Set the grid-optimization flag IGOPT
 
909
       IGOPT = 0
 
910
* (4) Set Node-ID number NODEID and the number of nodes NUMNOD
 
911
*      IF( INTV .EQ. 0 ) THEN
 
912
           NODEID = 0
 
913
           NUMNOD = 1
 
914
*      ELSE
 
915
*          NODEID = 0
 
916
*          NUMNOD = 1
 
917
*      ENDIF
 
918
 
 
919
C---------------------------------------------------------------
 
920
C (5)  Set initial seeds of random number generator
 
921
c Modified by SF: this is now in init_of_bases
 
922
C---------------------------------------------------------------
 
923
c       ISEED = 12345
 
924
C
 
925
c       CALL DRNSET( ISEED )
 
926
C ---------------------------------------------------------------
 
927
C (6),(7)  Set BASES parameters equal to default values
 
928
C ---------------------------------------------------------------
 
929
C
 
930
       NDIM   = -1
 
931
       NWILD  =  1
 
932
       ITMX1  = 15
 
933
       ITMX2  = 100
 
934
       NCALL  = 1000
 
935
       ACC1   = 0.2D0
 
936
       ACC2   = 0.01D0
 
937
       DO 100 I = 1,MXDIM
 
938
          IG(I) = 1
 
939
          XU(I)  = -1.0D37
 
940
  100  CONTINUE
 
941
 
 
942
*    Initialization of computing time table of BASES
 
943
       DO 200 I = 0, 2
 
944
          TIMEBS(I) = 0.0
 
945
  200  CONTINUE
 
946
 
 
947
*-------------------------------------------
 
948
*      Don't change IBASES from this value
 
949
*-------------------------------------------
 
950
       IBASES =  1
 
951
 
 
952
       RETURN
 
953
       END
 
954
 
 
955
 
 
956
***********************************************************************
 
957
*                                                                     *
 
958
*    ==========================                                       *
 
959
      SUBROUTINE BSINTG( FXN )
 
960
*    ==========================                                       *
 
961
*((Function))                                                         *
 
962
*    Subroutine performs N-dimensional Monte Carlo integration        *
 
963
*    for four vector generation of simulated events                   *
 
964
*                                                                     *
 
965
*       JFLAG = 0 ; First Trial of Defining Grid                      *
 
966
*       JFLAG = 1 ; First Trial of Data Accumulation                  *
 
967
*       JFLAG = 2 ; Second Trial of Defining Grid                     *
 
968
*       JFLAG = 3 ; Second Trial of Data Accumulation                 *
 
969
*                                                                     *
 
970
*    Coded   by S.Kawabata    July 1980 at DESY, Hamburg              *
 
971
*    Last update              March 1994                              *
 
972
*                                                                     *
 
973
* Modified by S. Frixione in order to exclude the built-in            *
 
974
* histogramming package. The common block bfxlhisto has been added    *
 
975
* The common block bsrneg and CBSSGN have been added to treat         *
 
976
* functions with sign; CBSSGN must mandatorily be inserted also in    *
 
977
* in the integrand function. The commond block CBSWGT has been        *
 
978
* added in order to deal with weighted events; it must be inserted    *
 
979
* also in the integrand function.                                     *
 
980
***********************************************************************
 
981
 
 
982
      IMPLICIT REAL*8 (A-H,O-Z)
 
983
 
 
984
      EXTERNAL FXN
 
985
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
986
      COMMON /BASE0/ JFLAG,IBASES
 
987
      COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
988
     .               IG(MXDIM),NCALL
 
989
      COMMON /BASE2/ ACC1,ACC2,ITMX1,ITMX2
 
990
      COMMON /BASE3/ SCALLS,WGT,TI,TSI,TACC,IT
 
991
      COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
992
     .               ND,NG,NPG,MA(MXDIM)
 
993
      PARAMETER (ITM = 50)
 
994
      REAL*4 TIME, EFF, WRONG, TRSLT, TSTD, PCNT
 
995
      COMMON /BASE5/ ITRAT(ITM,0:1),TIME(ITM,0:2),EFF(ITM,0:1),
 
996
     .               WRONG(ITM,0:1),RESLT(ITM,0:1),ACSTD(ITM,0:1),
 
997
     .               TRSLT(ITM,0:1),TSTD(ITM,0:1),PCNT(ITM,0:1)
 
998
      COMMON /BASE6/ D(NDMX,MXDIM),
 
999
     .               ALPH,XSAVE(NDMX,MXDIM),XTI,XTSI,XACC,ITSX
 
1000
      REAL*4 STIME
 
1001
      COMMON /BSRSLT/AVGI,SD,CHI2A,STIME,ITG,ITF
 
1002
      COMMON /BSRNEG/AVGINEG,SDNEG
 
1003
      COMMON /BRCALL/ING,INPG,INSP
 
1004
      COMMON /CBSSGN/BSFSGN
 
1005
      COMMON /CBSWGT/BSEWGT
 
1006
      CHARACTER*80 ERROR
 
1007
      COMMON /BWARN1/ NERROR
 
1008
      COMMON /BWARN2/ ERROR(3,3)
 
1009
*
 
1010
*        INTV = ( 0 / 1 / any ) = ( Batch / Batch(Unix) / Interactive )
 
1011
*        IPNT = ( 0 / any ) = ( IBM Type / Ascii printer )
 
1012
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
1013
 
 
1014
      REAL*8  X(MXDIM)
 
1015
      INTEGER KG(MXDIM),IA(MXDIM)
 
1016
 
 
1017
      COMMON/NINFO/ NODEID, NUMNOD
 
1018
      REAL*4 TIMEBS,TIMINT,TIMESP,TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
1019
      COMMON /BTIME1/ TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
1020
      COMMON /BTIME2/ TIMEBS(0:2),TIMINT,TIMESP(0:2)
 
1021
C     REAL*8  TX(2)
 
1022
      INTEGER NCNODE(2,512),NPNODE(2,512)
 
1023
C     INTEGER NEFF(2)
 
1024
      LOGICAL LHISTO
 
1025
      COMMON/BFXLHISTO/LHISTO
 
1026
*
 
1027
*     Parameters for checking convergency
 
1028
*
 
1029
      DATA ACLMT,FC / 25.0D0, 5.0D0 /
 
1030
 
 
1031
 
 
1032
      DATA  ONE/ 1.0D0/, ZERO/0.0D0/, LU / 6/
 
1033
      DATA  N0/0/, N1/1/, HUNDRT/100.0D0/
 
1034
 
 
1035
************************************************************************
 
1036
*                       Initialization Part
 
1037
************************************************************************
 
1038
*=======================================================================
 
1039
*          Determine the number of hypercubes NSP
 
1040
*=======================================================================
 
1041
 
 
1042
      XND     = ND
 
1043
      NSP     = NG**NWILD
 
1044
      XJAC    = 1.0D0
 
1045
      DO  5 I = 1, NDIM
 
1046
         XJAC = XJAC*DX(I)
 
1047
    5 CONTINUE
 
1048
      CALLS   = NSP*NPG
 
1049
      DXG     = 1.0D0/NG
 
1050
      DV2G    = DXG**(2*NWILD)/NPG/NPG/(NPG-1)
 
1051
      DXG     = DXG*XND
 
1052
 
 
1053
      IF( NSP .EQ. 1 ) THEN
 
1054
*=======================================================================
 
1055
*           Determination of the number of sampling points
 
1056
*               per node in the single hypercube case
 
1057
*=======================================================================
 
1058
          MEX     = MOD(NPG,NUMNOD)
 
1059
          NPERCP  = NPG/NUMNOD
 
1060
          NPGT    = 0
 
1061
          DO  12 NODEX = 1,NUMNOD
 
1062
             NPGS  = NPGT + 1
 
1063
             NPGT  = NPGT + NPERCP
 
1064
             IF( NODEX .LE. MEX ) NPGT = NPGT + 1
 
1065
             NCNODE(1,NODEX) = 1
 
1066
             NCNODE(2,NODEX) = 1
 
1067
             NPNODE(1,NODEX) = NPGS
 
1068
             NPNODE(2,NODEX) = NPGT
 
1069
   12     CONTINUE
 
1070
      ELSE
 
1071
*=======================================================================
 
1072
*          Determination of the number of hypercubes
 
1073
*              per node in many hypercubes case
 
1074
*=======================================================================
 
1075
          MEX     = MOD(NSP,NUMNOD)
 
1076
          NPERCP  = NSP/NUMNOD
 
1077
          NSPT    = 0
 
1078
          DO  15 NODEX = 1,NUMNOD
 
1079
             NSPS  = NSPT + 1
 
1080
             NSPT  = NSPT + NPERCP
 
1081
             IF( NODEX .LE. MEX ) NSPT = NSPT + 1
 
1082
             NCNODE(1,NODEX) = NSPS
 
1083
             NCNODE(2,NODEX) = NSPT
 
1084
             NPNODE(1,NODEX) = 1
 
1085
             NPNODE(2,NODEX) = NPG
 
1086
   15     CONTINUE
 
1087
      ENDIF
 
1088
*=======================================================================
 
1089
      NEND    = N0
 
1090
      ATACC   = ZERO
 
1091
      NERROR  = N0
 
1092
      NER1    = N0
 
1093
      NER2    = N0
 
1094
      NER3    = N0
 
1095
      SUMTI   = ZERO
 
1096
      SUMTSI  = ZERO
 
1097
 
 
1098
      IF(JFLAG .EQ. N0 .OR. JFLAG .EQ. N1 ) THEN
 
1099
*-----------------------------------------------------------------------
 
1100
*        JFLAG = 0  : The first trial of the grid optim. step
 
1101
*        JFLAG = 1  : The first trial of the integration step
 
1102
*-----------------------------------------------------------------------
 
1103
         DO 10 J  = N1,NSP
 
1104
           DXD(J) = ZERO
 
1105
           DXP(J) = ZERO
 
1106
   10    CONTINUE
 
1107
*       -----------------
 
1108
         ISTEP   = JFLAG
 
1109
*       -----------------
 
1110
         IT1   = N1
 
1111
         SI    = ZERO
 
1112
         SI2   = ZERO
 
1113
         SWGT  = ZERO
 
1114
         SCHI  = ZERO
 
1115
         SINEG    = ZERO
 
1116
         SI2NEG   = ZERO
 
1117
         SWGTNEG  = ZERO
 
1118
         SCHINEG  = ZERO
 
1119
*       =============
 
1120
         IF(LHISTO)THEN
 
1121
           CALL BHRSET
 
1122
         ENDIF
 
1123
*       =============
 
1124
         NSU     = N0
 
1125
         SCALLS= ZERO
 
1126
      ELSE
 
1127
*-----------------------------------------------------------------------
 
1128
*        JFLAG = 2  : The continuation of the grid optim. step
 
1129
*        JFLAG = 3  : The continuation of the integration step
 
1130
*-----------------------------------------------------------------------
 
1131
C        IF( JFLAG .EQ. 2 ) THEN
 
1132
*           -------------
 
1133
C            ISTEP  = N0
 
1134
*           -------------
 
1135
C        ELSE
 
1136
C    .   IF( JFLAG .EQ. 3 ) THEN
 
1137
*           -------------
 
1138
C            ISTEP  = N1
 
1139
*           -------------
 
1140
C        ELSE
 
1141
C                *****************
 
1142
C                      STOP
 
1143
C                *****************
 
1144
C         ENDIF
 
1145
C
 
1146
C         IT1   = IT + 1
 
1147
      ENDIF
 
1148
 
 
1149
*------- Set the expected accuracy and the max. iteration number -------
 
1150
 
 
1151
      ITMX   = ITMX1
 
1152
      ACC    = ACC1*0.01D0
 
1153
      IF( ISTEP .EQ. N1 ) THEN
 
1154
         ITMX = ITMX2
 
1155
         ACC  = ACC2*0.01D0
 
1156
      ENDIF
 
1157
 
 
1158
*-------- Print the title of the convergency behavior table -----------
 
1159
*                  in the interactive mode
 
1160
      IF( INTV .GT. 1 ) THEN
 
1161
*         -----------------------------------
 
1162
           CALL BSPRNT( LU, 5, ISTEP, IDUM2 )
 
1163
*         -----------------------------------
 
1164
      ENDIF
 
1165
      NEGFLG     = 0
 
1166
 
 
1167
*    =====================
 
1168
      CALL BSUTIM( 0, 2 )
 
1169
*    =====================
 
1170
 
 
1171
*********************************************************************
 
1172
*               Main Integration Loop
 
1173
*********************************************************************
 
1174
*    ========
 
1175
      DO 500  IT = IT1,ITMX
 
1176
*    ========
 
1177
*=======================================================================
 
1178
*                 Initialization for the iteration
 
1179
*=======================================================================
 
1180
 
 
1181
         SCALLS  = SCALLS + CALLS
 
1182
         NGOOD   = N0
 
1183
         NEGTIV  = N0
 
1184
         TI      = ZERO
 
1185
         TSI     = TI
 
1186
         TINEG   = ZERO
 
1187
         TSINEG  = TINEG
 
1188
 
 
1189
         IF( ISTEP .EQ. N0 ) THEN
 
1190
             DO 200 J= N1,NDIM
 
1191
             DO 200 I=1,ND
 
1192
                D(I,J)= TI
 
1193
  200        CONTINUE
 
1194
         ENDIF
 
1195
 
 
1196
         NODEX  = NODEID
 
1197
         IF( NODEID .EQ. 0 )  NODEX = NUMNOD
 
1198
 
 
1199
*---------------------------------------------------------------------
 
1200
*        Distributing hyper cubes to NumNode nodes
 
1201
*           NCNODE(1,NODEX)   : 1st cube number for the node NODEX
 
1202
*           NCNODE(2,NODEX)   : Last cube number for the node NODEX
 
1203
*                    NODEX    : node number 1 => NumNode(=0)
 
1204
*                    NODEX    : node number 1 => NumNode(=0)
 
1205
*---------------------------------------------------------------------
 
1206
 
 
1207
         NSP1  = NCNODE(1,NODEX)
 
1208
         NSP2  = NCNODE(2,NODEX)
 
1209
*                                 Dummy loopfor a parallel processor
 
1210
C                                 IF( NSP1 .GT. 1 ) THEN
 
1211
C                                     CALL DRLOOP( NDIM*NPG*(NSP1-1) )
 
1212
C                                 ENDIF
 
1213
 
 
1214
*=====================================================================
 
1215
*      Loop for hypercube from NSP1 to NSP2 in the NodeX-th node
 
1216
*=====================================================================
 
1217
*       ========
 
1218
         DO 400 NCB = NSP1, NSP2
 
1219
*       ========
 
1220
            FB      = 0.0
 
1221
            F2B     = 0.0
 
1222
            FBNEG   = 0.0
 
1223
            F2BNEG  = 0.0
 
1224
            NP      = NCB - 1
 
1225
            IF( NWILD .GT. 1 ) THEN
 
1226
                DO 210 J = 1,NWILD-1
 
1227
                   NUM   = MOD(NP,MA(J+1))
 
1228
                   KG(J) = NUM/MA(J) + 1
 
1229
  210           CONTINUE
 
1230
            ENDIF
 
1231
            KG(NWILD)     = NP/MA(NWILD) + 1
 
1232
 
 
1233
*---------------------------------------------------------------------
 
1234
*       If number of hypercubes is only one,
 
1235
*        Distributing sampling points to NumNode nodes
 
1236
*           NPNODE(1,NODEX)   : 1st sample point for the node NODEX
 
1237
*           NPNODE(2,NODEX)   : Last sample point for the node NODEX
 
1238
*                    NODEX    : node number 1 => NumNode(=0)
 
1239
*---------------------------------------------------------------------
 
1240
 
 
1241
            NPG1  = NPNODE(1,NODEX)
 
1242
            NPG2  = NPNODE(2,NODEX)
 
1243
*                                 Dummy loop for a parallel processor
 
1244
C                                 IF( NPG1 .GT. 1 ) THEN
 
1245
C                                     CALL DRLOOP( NDIM*(NPG1-1) )
 
1246
C                                 ENDIF
 
1247
 
 
1248
*=====================================================================
 
1249
*          Loop for sampling points from NPG1 to NPG2
 
1250
*                in the single hypercube case
 
1251
*=====================================================================
 
1252
*          ========
 
1253
            DO 300 NTY = NPG1,NPG2
 
1254
*          ========
 
1255
*---------------------------------------------------------------------
 
1256
*        Determine the integration variables by random numbers
 
1257
*---------------------------------------------------------------------
 
1258
 
 
1259
               WGT   = XJAC
 
1260
               DO 250 J= 1,NDIM
 
1261
                  IF( J .LE. NWILD ) THEN
 
1262
                      XN  = (KG(J)-DRN(IDUMY))*DXG+1.D0
 
1263
                  ELSE
 
1264
                      XN  = ND*DRN(IDUMY)+1.D0
 
1265
                  ENDIF
 
1266
                  IA(J)   = XN
 
1267
                  IAJ     = IA(J)
 
1268
                  IF( IAJ .EQ. 1) THEN
 
1269
                      XO  = XI(IAJ,J)
 
1270
                      RC  = (XN-IA(J))*XO
 
1271
                  ELSE
 
1272
                      XO  = XI(IAJ,J)-XI(IAJ-1,J)
 
1273
                      RC  = XI(IAJ-1,J)+(XN-IAJ)*XO
 
1274
                  ENDIF
 
1275
                  X(J)    = XL(J)+RC*DX(J)
 
1276
                  WGT     = WGT*XO*XND
 
1277
  250          CONTINUE
 
1278
*-----------------------------------------------------------------------
 
1279
*                     =======
 
1280
c The Vegas weight passed to the integrand function is zero in
 
1281
c the grid optimisation step
 
1282
               BSEWGT = 0.D0
 
1283
               IF(JFLAG.EQ.1)BSEWGT = WGT/(ITMX2*INSP*INPG)
 
1284
               FXG  =  FXN(X)*WGT
 
1285
               FXGNEG  =  FXG*BSFSGN
 
1286
*                     =======
 
1287
*-----------------------------------------------------------------------
 
1288
*             Check the value of the integrand
 
1289
*-----------------------------------------------------------------------
 
1290
 
 
1291
               IF( FXG .NE. 0.0 ) THEN
 
1292
                   NGOOD = NGOOD + 1
 
1293
                   IF( ISTEP .EQ. 1 ) THEN
 
1294
                       DXD(NCB) = DXD(NCB) + FXG
 
1295
                       IF( FXG .GT. DXP(NCB) ) DXP(NCB) = FXG
 
1296
                   ENDIF
 
1297
                   IF( FXG .LT. 0.0 ) THEN
 
1298
                       NEGTIV= NEGTIV+ 1
 
1299
                       IF( NEGFLG .EQ. 0 ) THEN
 
1300
                          WRITE(6,9200) IT,NODEID
 
1301
 9200                     FORMAT(1X,
 
1302
     .                       '******* WARNING FROM BASES ********',
 
1303
     .                       '***********',
 
1304
     .                       /1X,'*  Negative FUNCTION at IT =',I3,1X,
 
1305
     .                       ', node = ',I3,1X,'*',
 
1306
     .                       /1X,'***********************************',
 
1307
     .                       '***********')
 
1308
                          NEGFLG  = 1
 
1309
                       ENDIF
 
1310
                   ENDIF
 
1311
               ENDIF
 
1312
 
 
1313
*-----------------------------------------------------------------------
 
1314
*              Accumulation of FXG and FXG*FXG
 
1315
*-----------------------------------------------------------------------
 
1316
 
 
1317
               F2    = FXG*FXG
 
1318
               FB    = FB + FXG
 
1319
               F2B   = F2B + F2
 
1320
               F2NEG    = FXGNEG*FXGNEG
 
1321
               FBNEG    = FBNEG + FXGNEG
 
1322
               F2BNEG   = F2BNEG + F2NEG
 
1323
               IF( ISTEP .EQ. 0 ) THEN
 
1324
                   DO 260  J = 1,NDIM
 
1325
                      D(IA(J),J)= D(IA(J),J)+F2
 
1326
  260              CONTINUE
 
1327
               ENDIF
 
1328
*======
 
1329
  300       CONTINUE
 
1330
*======
 
1331
*------------------------------------------- for a parallel processor
 
1332
*                                 Dummy loop for a parallel processor
 
1333
C                                 IF( NPG2 .LT. NPG ) THEN
 
1334
C                                     CALL DRLOOP(NDIM*(NPG-NPG1))
 
1335
C                                 ENDIF
 
1336
*                                 Global sum of FB and F2B
 
1337
C                                 IF( NSP .EQ. 1 ) THEN
 
1338
C                                     CALL BSDSUM(  FB, 1 )
 
1339
C                                     CALL BSDSUM( F2B, 1 )
 
1340
C                                 ENDIF
 
1341
*-----------------------------------------------------------------------
 
1342
 
 
1343
*-----------------------------------------------------------------------
 
1344
*         Calculate the estimate and variance in the hypercube
 
1345
*-----------------------------------------------------------------------
 
1346
 
 
1347
            F2B   = DSQRT(F2B*NPG)
 
1348
            F2S   = (F2B-FB)*(F2B+FB)
 
1349
            TI    = TI+FB
 
1350
            TSI   = TSI + F2S
 
1351
            F2BNEG   = DSQRT(F2BNEG*NPG)
 
1352
            F2SNEG   = (F2BNEG-FBNEG)*(F2BNEG+FBNEG)
 
1353
            TINEG    = TINEG+FBNEG
 
1354
            TSINEG   = TSINEG + F2SNEG
 
1355
*======
 
1356
  400    CONTINUE
 
1357
*======
 
1358
*------------------------------------------- for a parallel processor
 
1359
*                                 Dummy loop
 
1360
C                                 IF( NSP2 .LT. NSP ) THEN
 
1361
C                                     CALL DRLOOP(NDIM*NPG*(NSP-NSP2))
 
1362
C                                 ENDIF
 
1363
 
 
1364
*                                 Global sum of efficiency and frequency
 
1365
*                                     of negative valued function
 
1366
C                                 NEFF(1) = NGOOD
 
1367
C                                 NEFF(2) = NEGTIV
 
1368
C                                 CALL BSISUM( NEFF, 2 )
 
1369
 
 
1370
C                                 TX(1) = TI
 
1371
C                                 TX(2) = TSI
 
1372
C                                 IF( NSP .EQ. 1 ) THEN
 
1373
C                                     CALL BSDSUM(   TX, 2 )
 
1374
C                                 ENDIF
 
1375
 
 
1376
*                                 Global sum of grid information
 
1377
C                                 IF( ISTEP .EQ. 0 ) THEN
 
1378
C                                     NOWORK = NDMX*NDIM
 
1379
C                                     CALL BSDSUM(    D, NOWORK )
 
1380
C                                 ENDIF
 
1381
 
 
1382
*=====================================================================
 
1383
*           Compute Result of this Iteration
 
1384
*=====================================================================
 
1385
*--------------------------------------------------------------------
 
1386
*           Accumulate the histogram entries
 
1387
*--------------------------------------------------------------------
 
1388
*       -------------
 
1389
         IF(LHISTO)THEN
 
1390
           CALL BHSAVE
 
1391
         ENDIF
 
1392
*       -------------
 
1393
*--------------------------------------------------------------------
 
1394
 
 
1395
C        TI     = TX(1)
 
1396
C        TSI    = TX(2)
 
1397
C        NGOOD  = NEFF(1)
 
1398
C        NEGTIV = NEFF(2)
 
1399
 
 
1400
         TI    = TI/CALLS
 
1401
         TSI   = TSI*DV2G
 
1402
         TINEG    = TINEG/CALLS
 
1403
         TSINEG   = TSINEG*DV2G
 
1404
**
 
1405
         IF( TSI .LE. 1.0D-37 ) TSI = 1.0D-37
 
1406
         IF( TSINEG .LE. 1.0D-37 ) TSINEG = 1.0D-37
 
1407
**
 
1408
         TI2   = TI*TI
 
1409
         TI2NEG   = TINEG*TINEG
 
1410
 
 
1411
         IF( NGOOD .LE. 10 ) THEN
 
1412
*           --------------------------------
 
1413
             CALL BSPRNT( LU, 9, IDUM1, IDUM2 )
 
1414
*           --------------------------------
 
1415
*            *****************
 
1416
                   STOP
 
1417
*            *****************
 
1418
 
 
1419
         ENDIF
 
1420
 
 
1421
*--------------------------------------------------------------------
 
1422
*               Calculate the cumulative result
 
1423
*--------------------------------------------------------------------
 
1424
         WGT   = ONE/TSI
 
1425
         SI    = SI+TI*WGT
 
1426
         SWGT  = SWGT+WGT
 
1427
         SCHI  = SCHI+TI2*WGT
 
1428
         AVGI  = SI/SWGT
 
1429
         CHI2A = ZERO
 
1430
         IF(IT .GT. N1 ) CHI2A = (SCHI - SI*AVGI)/(IT-.999D0)
 
1431
         SD    = DSQRT(ONE/SWGT)
 
1432
         WGTNEG   = ONE/TSINEG
 
1433
         SINEG    = SINEG+TINEG*WGTNEG
 
1434
         SWGTNEG  = SWGTNEG+WGTNEG
 
1435
         SCHINEG  = SCHINEG+TI2NEG*WGTNEG
 
1436
         AVGINEG  = SINEG/SWGTNEG
 
1437
         SDNEG    = DSQRT(ONE/SWGTNEG)
 
1438
 
 
1439
*---------------------------------------------------------------------
 
1440
*             Save the results in the buffer
 
1441
*---------------------------------------------------------------------
 
1442
 
 
1443
         TSI   = DSQRT(TSI)
 
1444
         ITX         = MOD( IT, ITM)
 
1445
         IF( ITX .EQ. 0 ) ITX = ITM
 
1446
         ITRAT(ITX,ISTEP)  = IT
 
1447
         EFF  (ITX,ISTEP)  = NGOOD/CALLS*HUNDRT
 
1448
         WRONG(ITX,ISTEP)  = NEGTIV/CALLS*HUNDRT
 
1449
         RESLT(ITX,ISTEP)  = AVGI
 
1450
         ACSTD(ITX,ISTEP)  = SD
 
1451
         TRSLT(ITX,ISTEP)  = TI
 
1452
         TACC              = ABS(TSI/TI*HUNDRT)
 
1453
         TSTD (ITX,ISTEP)  = TACC
 
1454
         PCNT (ITX,ISTEP)  = ABS(SD/AVGI*HUNDRT)
 
1455
 
 
1456
*----------------------------------------------------------------------
 
1457
*                  Check cumulative accuracy
 
1458
*----------------------------------------------------------------------
 
1459
 
 
1460
         IF( NODEID .EQ. 0 ) THEN
 
1461
 
 
1462
*-------------------  Check cumulative accuracy -----------------------
 
1463
 
 
1464
             SDAV  = SD/AVGI
 
1465
             IF((ABS(SDAV) .LE. ACC)) NEND = N1
 
1466
 
 
1467
             IF( ISTEP .EQ. N1 ) THEN
 
1468
                 IF( TACC .GT. ACLMT ) THEN
 
1469
                     IF( NER1 .EQ. 0 ) THEN
 
1470
                         NERROR = NERROR + 1
 
1471
                         WRITE(ERROR(1,NERROR),9900) NERROR,IT,ACLMT
 
1472
 9900                    FORMAT('* (',I1,') Temp. accuracy of it-#',
 
1473
     .                         I3,' is too large comparing to',
 
1474
     .                         F6.2,' percent.',6X,'*')
 
1475
                         WRITE(ERROR(2,NERROR),9901) TACC,ACLMT 
 
1476
 9901                    FORMAT('*',8X,'Temp. accuracy (',
 
1477
     .                         F7.4,' % )  >>   (',
 
1478
     .                         F7.4,' % )',23X,'*')
 
1479
                         WRITE(ERROR(3,NERROR),9902)
 
1480
 9902                    FORMAT('*',77X,'*')
 
1481
                         NER1  = 1
 
1482
                     ENDIF
 
1483
                 ENDIF
 
1484
                 IF( IT .GT. 1 ) THEN
 
1485
                     IF(( TI .GT. AVTI+FDEVI ) .OR.
 
1486
     .                  ( TI .LT. AVTI-FDEVI )      ) THEN
 
1487
                          IF( NER2 .EQ. 0 ) THEN
 
1488
                              NERROR = NERROR + 1
 
1489
                              WRITE(ERROR(1,NERROR),9910) NERROR,IT,FC
 
1490
 9910                         FORMAT('* (',I1,') Temp. estimate of ',
 
1491
     .                        'it-#',I3,' fluctuates more than ',
 
1492
     .                               F4.1,'*average-sigma.',6X,'*')
 
1493
                              RE = TI
 
1494
*patch TI:1995/08/25
 
1495
                              ARE = ABS(RE)
 
1496
*old                          CALL BSORDR( RE, FX2, ORDER, IORDR )
 
1497
                              CALL BSORDR( ARE, FX2, ORDER, IORDR )
 
1498
*patch end
 
1499
                              RE = TI/ORDER
 
1500
                              RE1 = AVTI
 
1501
                              AC  = FDEVI 
 
1502
*patch TI:1995/08/25
 
1503
                              ARE1 = ABS(AVTI)
 
1504
                              AAC  = ABS(FDEVI)
 
1505
                              IF( ARE1 .GE. AAC ) THEN
 
1506
                                  CALL BSORDR( ARE1, FX2, ORDR1, IORDR1)
 
1507
                              ELSE
 
1508
                                  CALL BSORDR( AAC, FX2, ORDR1, IORDR1)
 
1509
                              ENDIF
 
1510
*                             IF( RE1 .GE. AC ) THEN
 
1511
*                                 CALL BSORDR( RE1, FX2, ORDR1, IORDR1)
 
1512
*                             ELSE
 
1513
*                                 CALL BSORDR( AC, FX2, ORDR1, IORDR1)
 
1514
*                             ENDIF
 
1515
*patch end
 
1516
                              RE1 = AVTI/ORDR1
 
1517
                              AC  = AC/ORDR1
 
1518
                              WRITE(ERROR(2,NERROR),9911) RE,IORDR, 
 
1519
     .                                          RE1,AC,IORDR1 
 
1520
 9911                         FORMAT('*        Temp. Estimate (',
 
1521
     .                         F10.6,' E',I3,')  >  (',F10.6,'+',F8.6,
 
1522
     .                         ' ) E',I3,', or',1X,'*')
 
1523
                              WRITE(ERROR(3,NERROR),9912) RE,IORDR, 
 
1524
     .                                          RE1,AC,IORDR1 
 
1525
 9912                         FORMAT('*        Temp. Estimate (',
 
1526
     .                         F10.6,' E',I3,')  <  (',F10.6,'-',F8.6,
 
1527
     .                         ' ) E',I3,5X,'*')
 
1528
                              NER2 = 1
 
1529
                          ENDIF
 
1530
                     ENDIF
 
1531
                     IF( TSI .GT. FDEVI ) THEN
 
1532
                         IF( NER3 .EQ. 0 ) THEN
 
1533
                             NERROR = NERROR + 1
 
1534
                             WRITE(ERROR(1,NERROR),9920) NERROR,IT,FC
 
1535
 9920                        FORMAT('* (',I1,') Error of it-#',
 
1536
     .                              I3,' fluctuates more than',F4.1,
 
1537
     .                              '*average-sigma.',16X,'*')
 
1538
                             RE1 = TSI
 
1539
*patch TI:1995/08/25
 
1540
                             ARE1 = ABS(TSI)
 
1541
*                            CALL BSORDR( RE1, FX2, ORDER, IORDR)
 
1542
                             CALL BSORDR( ARE1, FX2, ORDER, IORDR)
 
1543
*patch end;
 
1544
                             RE1 = TSI/ORDER
 
1545
                             AC  = FDEVI 
 
1546
*patch TI:1995/08/25
 
1547
                             AAC  = ABS(FDEVI)
 
1548
*                            CALL BSORDR( AC, FX2, ORDR1, IORDR1)
 
1549
                             CALL BSORDR( AAC, FX2, ORDR1, IORDR1)
 
1550
*patch end;
 
1551
                             AC  = AC/ORDR1
 
1552
                             WRITE(ERROR(2,NERROR),9921) RE1,IORDR, 
 
1553
     .                                         AC,IORDR1 
 
1554
 9921                        FORMAT('*        Temp. Error (',
 
1555
     .                         F10.6,' E',I3,')  >  (',F10.6,
 
1556
     .                         ' E',I3,')',18X,'*')
 
1557
                             WRITE(ERROR(3,NERROR),9902)
 
1558
                             NER3  = 1
 
1559
                         ENDIF
 
1560
                     ENDIF
 
1561
                 ENDIF
 
1562
                 SUMTSI = SUMTSI + TSI
 
1563
                 SUMTI  = SUMTI  + TI
 
1564
                 AVTSI  = SUMTSI/FLOAT(IT)
 
1565
                 AVTI   = SUMTI/FLOAT(IT)
 
1566
                 FDEVI  = FC*AVTSI
 
1567
             ENDIF
 
1568
         ENDIF
 
1569
 
 
1570
*------------------------------------------- for a parallel processor
 
1571
 
 
1572
*                                  Broadcast
 
1573
C                                  CALL BSCAST( NEND, 1 )
 
1574
 
 
1575
*----------------------------------------------------------------------
 
1576
*        Smoothing the Distribution D(I,J) and refine the grids
 
1577
*----------------------------------------------------------------------
 
1578
 
 
1579
         IF( ISTEP .LE. N0 ) THEN
 
1580
             IF( IT .EQ. ITMX ) NEND = N1
 
1581
*           ---------------------
 
1582
             CALL BSETGV( NEND )
 
1583
*           ---------------------
 
1584
         ENDIF
 
1585
*       ==========================
 
1586
         CALL BSUTIM( 0, ISTEP )
 
1587
*       ==========================
 
1588
 
 
1589
         TIME (ITX,ISTEP)  = TIMINT
 
1590
         STIME             = TIMINT
 
1591
 
 
1592
*---- Print the convergency behavior table in the interactive mode ----
 
1593
         IF( INTV .GT. 1 ) THEN
 
1594
*            ---------------------------------
 
1595
              CALL BSPRNT ( LU, 6, ISTEP, IDUM2 )
 
1596
*            ---------------------------------
 
1597
         ENDIF
 
1598
 
 
1599
         IF( NEND .EQ. N1 ) GO TO 600
 
1600
 
 
1601
*       ======================
 
1602
         CALL BSUTIM( 0, 2 )
 
1603
*       ======================
 
1604
*======
 
1605
  500 CONTINUE
 
1606
*======
 
1607
      IT    = IT - N1
 
1608
      NEND  = N1
 
1609
 
 
1610
***********************************************************************
 
1611
*                   Termination of BASES
 
1612
***********************************************************************
 
1613
*======
 
1614
  600 CONTINUE
 
1615
*======
 
1616
*---------------------------------------------- For a parallel computer
 
1617
 
 
1618
*                                 Global sum of histograms
 
1619
C                                 CALL BHSUM
 
1620
*                                 Global sum of probabilities
 
1621
C                                 CALL BSDSUM(  DXD, NSP )
 
1622
*                                 Global sum of the max.value in each HC
 
1623
C                                 CALL BSDSUM(  DXP, NSP )
 
1624
 
 
1625
 
 
1626
*======================= End of the step ? ============================
 
1627
 
 
1628
      IF( NEND .EQ. N1 ) THEN
 
1629
          IF( INTV .GT. 1 ) THEN
 
1630
*            ---------------------------------
 
1631
              CALL BSPRNT ( LU, 7, IDUM1, IDUM2 )
 
1632
*            ---------------------------------
 
1633
          ENDIF
 
1634
          IF( ISTEP .EQ. N0) THEN
 
1635
              JFLAG   = N1
 
1636
              ITG     = IT
 
1637
          ELSE
 
1638
              JFLAG   = N0
 
1639
              ITF     = IT
 
1640
          ENDIF
 
1641
      ENDIF
 
1642
*    ======================
 
1643
       CALL BSUTIM( 0, 2 )
 
1644
*    ======================
 
1645
 
 
1646
      RETURN
 
1647
      END
 
1648
 
 
1649
 
 
1650
***********************************************************************
 
1651
*    ===================================                              *
 
1652
      SUBROUTINE BSLIST( LU, I, ISTEP )
 
1653
*    ===================================                              *
 
1654
* ((purpose))                                                         *
 
1655
*     Print out results of each iteration and cumulative result       *
 
1656
* ((Argument))                                                        *
 
1657
*  (Input)                                                            *
 
1658
*     LU      : Logical unit number for the printer                   *
 
1659
*     I       : Address in the arrays of common /BASE5/               *
 
1660
*     ISTEP   : The Set-Identifier                                    *
 
1661
*               ISTEP = ( 0 / 1 ) = ( Grid opt. / Integration step )  *
 
1662
*                                                                     *
 
1663
*     S. Kawabata   March '94                                         *
 
1664
***********************************************************************
 
1665
 
 
1666
      IMPLICIT REAL*8 (A-H,O-Z)
 
1667
      PARAMETER (ITM = 50)
 
1668
      REAL*4 TIME, EFF, WRONG, TRSLT, TSTD, PCNT
 
1669
      COMMON /BASE5/ ITRAT(ITM,0:1),TIME(ITM,0:2),EFF(ITM,0:1),
 
1670
     .               WRONG(ITM,0:1),RESLT(ITM,0:1),ACSTD(ITM,0:1),
 
1671
     .               TRSLT(ITM,0:1),TSTD(ITM,0:1),PCNT(ITM,0:1)
 
1672
 
 
1673
      CALL BSTCNV( TIME(I,ISTEP), IH, MN, IS1, IS2 )
 
1674
 
 
1675
      RE  = RESLT(I,ISTEP)
 
1676
      AC  = ABS(ACSTD(I,ISTEP))
 
1677
      ARE = ABS(RE)
 
1678
      IF( ARE .GE. AC) THEN
 
1679
          CALL BSORDR( ARE, F2, ORDER, IORDR)
 
1680
      ELSE
 
1681
          CALL BSORDR(  AC, F2, ORDER, IORDR )
 
1682
      ENDIF
 
1683
      RE  = RE/ORDER
 
1684
      AC  = AC/ORDER
 
1685
      IEFF = EFF(I,ISTEP)
 
1686
      WRITE(LU,9631) ITRAT(I,ISTEP),IEFF,WRONG(I,ISTEP),
 
1687
     .              TRSLT(I,ISTEP),TSTD(I,ISTEP),
 
1688
     .              RE,AC,IORDR,PCNT(I,ISTEP),IH,MN,IS1,IS2
 
1689
 9631 FORMAT(I4,I4,F6.2,1P,E11.3, 0P,1X,F6.3,
 
1690
     .              F10.6,'(+-',F8.6,')E',I3.2,1X,F6.3,
 
1691
     .          1X,I3,':',I2,':',I2,'.',I2.2)
 
1692
 
 
1693
 
 
1694
      RETURN
 
1695
      END
 
1696
 
 
1697
 
 
1698
C***********************************************************************
 
1699
C*                                                                     *
 
1700
C*=============================================                        *
 
1701
C*    SUBROUTINE BSORDR( VAL, F2, ORDER, IORDR)                        *
 
1702
C*=============================================                        *
 
1703
C*((Function))                                                         *
 
1704
C*    To resolve the real number VAL into mantester and exponent parts.*
 
1705
C*  When VAL = 1230.0 is given, output are                             *
 
1706
C*        F2 = 1.2  and ORDER = 4.0.                                   *
 
1707
C*((Input))                                                            *
 
1708
C*  VAL  : Real*8 value                                                *
 
1709
C*((Output))                                                           *
 
1710
C*  F2   : The upper two digits is given                               *
 
1711
C*  ORDER: Order is given                                              *
 
1712
C*  IORDR: Exponent is given                                           *
 
1713
C*((Author))                                                           *
 
1714
C*  S.Kawabata                                                         *
 
1715
C*                                                                     *
 
1716
C***********************************************************************
 
1717
 
 
1718
      SUBROUTINE BSORDR(VAL, F2, ORDER, IORDR)
 
1719
      IMPLICIT REAL*8 (A-H,O-Z)
 
1720
 
 
1721
      IF( VAL .NE. 0.0 ) THEN
 
1722
          ORDER    =  LOG10( VAL )
 
1723
          IORDR    =  INT( ORDER )
 
1724
          IF( ORDER .LT. 0.0D0 ) IORDR = IORDR - 1
 
1725
          ORDER  = 10.D0**IORDR
 
1726
          F2     = VAL/ORDER
 
1727
      ELSE
 
1728
          IORDR  = 0
 
1729
          ORDER  = 1.0D0
 
1730
          F2    = 0.0D0
 
1731
      ENDIF
 
1732
 
 
1733
      RETURN
 
1734
      END
 
1735
 
 
1736
 
 
1737
***********************************************************************
 
1738
*    =======================================                          *
 
1739
      SUBROUTINE BSPRNT( LU, ID, IP1, IP2 )
 
1740
*    =======================================                          *
 
1741
* ((purpose))                                                         *
 
1742
*     Print out routine of BASES.                                     *
 
1743
*  (Argument)                                                         *
 
1744
*     ID  : Identity number of printouts.                             *
 
1745
*     IP1... IP2 : Integer                                            *
 
1746
*  (Author)                                                           *
 
1747
*     S. Kawabata   May 1992                                          *
 
1748
*     Last update   March 1994                                        *
 
1749
***********************************************************************
 
1750
 
 
1751
      IMPLICIT REAL*8 (A-H,O-Z)
 
1752
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
1753
      COMMON /BASE0/ JFLAG,IBASES
 
1754
      COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
1755
     .               IG(MXDIM),NCALL
 
1756
      COMMON /BASE2/ ACC1,ACC2,ITMX1,ITMX2
 
1757
      COMMON /BASE3/ SCALLS,WGT,TI,TSI,TACC,IT
 
1758
      COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
1759
     .               ND,NG,NPG,MA(MXDIM)
 
1760
      PARAMETER (ITM = 50)
 
1761
      REAL*4 TIME, EFF, WRONG, TRSLT, TSTD, PCNT
 
1762
      COMMON /BASE5/ ITRAT(ITM,0:1),TIME(ITM,0:2),EFF(ITM,0:1),
 
1763
     .               WRONG(ITM,0:1),RESLT(ITM,0:1),ACSTD(ITM,0:1),
 
1764
     .               TRSLT(ITM,0:1),TSTD(ITM,0:1),PCNT(ITM,0:1)
 
1765
      REAL*4 STIME
 
1766
      COMMON /BSRSLT/AVGI,SD,CHI2A,STIME,IT1,ITF
 
1767
      CHARACTER*51 ICH(0:1)
 
1768
      CHARACTER*1 CN
 
1769
*        INTV = ( 0 / 1 / any ) = ( Batch / Batch(Unix) / Interactive )
 
1770
*        IPNT = ( 0 / any ) = ( IBM Type / Ascii printer )
 
1771
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
1772
*
 
1773
       COMMON /BDATE/ IDATE(3),ITIME(2)
 
1774
*            IDATE(1) : year        ITIME(1) : hour
 
1775
*            IDATE(2) : month       ITIME(2) : minute
 
1776
*            IDATE(3) : day
 
1777
      REAL*4 TIMEBS,TIMINT,TIMESP,TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
1778
      COMMON /BTIME1/ TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
1779
      COMMON /BTIME2/ TIMEBS(0:2),TIMINT,TIMESP(0:2)
 
1780
      REAL*4 XTIME
 
1781
*
 
1782
       COMMON/NINFO/ NODEID, NUMNOD
 
1783
*
 
1784
      DATA  ICH / 'Convergency Behavior for the Grid Optimization Step',
 
1785
     .            'Convergency Behavior for the Integration Step      '/
 
1786
 
 
1787
      IF( NODEID .NE. 0 ) RETURN
 
1788
      CN = CHAR(12)
 
1789
 
 
1790
      GO TO ( 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 ), ID
 
1791
C----------------------------------------------------------- BSMAIN
 
1792
 
 
1793
  100 IF( IPNT .EQ. 0 ) THEN
 
1794
          WRITE(LU,9600)
 
1795
 9600     FORMAT(/1H1,/1H )
 
1796
      ELSE
 
1797
          WRITE(LU,9610) CN
 
1798
 9610     FORMAT(A1)
 
1799
      ENDIF
 
1800
      WRITE(LU,9620) (IDATE(I),I=1,3),(ITIME(J),J=1,2)
 
1801
 9620 FORMAT(55X,'Date: ',I2,'/',I2,'/',I2,2X,I2.2,':',I2.2)
 
1802
      WRITE(LU,9050)
 
1803
 9050 FORMAT(
 
1804
     . 8X,'**********************************************************',
 
1805
     ./8X,'*                                                        *',
 
1806
     ./8X,'*     BBBBBBB     AAAA     SSSSSS   EEEEEE   SSSSSS      *',
 
1807
     ./8X,'*     BB    BB   AA  AA   SS    SS  EE      SS    SS     *',
 
1808
     ./8X,'*     BB    BB  AA    AA  SS        EE      SS           *',
 
1809
     ./8X,'*     BBBBBBB   AAAAAAAA   SSSSSS   EEEEEE   SSSSSS      *',
 
1810
     ./8X,'*     BB    BB  AA    AA        SS  EE            SS     *',
 
1811
     ./8X,'*     BB    BB  AA    AA  SS    SS  EE      SS    SS     *',
 
1812
     ./8X,'*     BBBB BB   AA    AA   SSSSSS   EEEEEE   SSSSSS      *',
 
1813
     ./8X,'*                                                        *',
 
1814
     ./8X,'*                   BASES Version 5.1                    *',
 
1815
     ./8X,'*           coded by S.Kawabata KEK, March 1994          *',
 
1816
     ./8X,'**********************************************************')
 
1817
 
 
1818
          RETURN
 
1819
C----------------------------------------------------------- BSMAIN
 
1820
 
 
1821
  200     IF( IPNT .EQ. 0 ) THEN
 
1822
              WRITE(LU,9600)
 
1823
          ELSE
 
1824
              WRITE(LU,9610) CN
 
1825
          ENDIF
 
1826
          WRITE(LU,9300)
 
1827
 9300     FORMAT(20X,
 
1828
     .         '****** END OF BASES *********')
 
1829
 
 
1830
C----------------------------------------------------------- BSMAIN
 
1831
 
 
1832
  300 CONTINUE
 
1833
      WRITE(LU,9305)
 
1834
 9305 FORMAT(
 
1835
     .//5X,'<<   Computing Time Information   >>')
 
1836
 
 
1837
*     WRITE(LU,9310) (IDATE(I),I=1,3),(ITIME(J),J=1,2)
 
1838
*9310 FORMAT(/15X,'Start at: ',I2,'/',I2,'/',I2,2X,I2.2,':',I2.2)
 
1839
*     CALL BSDATE
 
1840
*     WRITE(LU,9320) (IDATE(I),I=1,3),(ITIME(J),J=1,2)
 
1841
*9320 FORMAT(15X,'End   at: ',I2,'/',I2,'/',I2,2X,I2.2,':',I2.2)
 
1842
      WRITE(LU,9330)
 
1843
 9330 FORMAT(/15X,'(1) For BASES              H: M:  Sec')
 
1844
      CALL BSTCNV(TIMEBS(2),IH,MN,IS1,IS2)
 
1845
      WRITE(LU,9340) IH, MN, IS1, IS2
 
1846
 9340 FORMAT(19X,'Overhead           : ',I3,':',I2,':',I2,'.',I2.2)
 
1847
      CALL BSTCNV(TIMEBS(0),IH,MN,IS1,IS2)
 
1848
      WRITE(LU,9350) IH, MN, IS1, IS2
 
1849
 9350 FORMAT(19X,'Grid Optim. Step   : ',I3,':',I2,':',I2,'.',I2.2)
 
1850
      CALL BSTCNV(TIMEBS(1),IH,MN,IS1,IS2)
 
1851
      WRITE(LU,9360) IH, MN, IS1, IS2
 
1852
 9360 FORMAT(19X,'Integration Step   : ',I3,':',I2,':',I2,'.',I2.2)
 
1853
      XTIME = TIMEB2 - TIMEB1
 
1854
      CALL BSTCNV(XTIME,IH,MN,IS1,IS2)
 
1855
      WRITE(LU,9365) IH, MN, IS1, IS2
 
1856
 9365 FORMAT(19X,'Go time for all    : ',I3,':',I2,':',I2,'.',I2.2)
 
1857
      EXTIM  = TIMEBS(1)*1000.0/SCALLS/0.7
 
1858
      WRITE(LU,9375)
 
1859
 9375 FORMAT(/15X,'(2) Expected event generation time')
 
1860
      WRITE(LU,9376) EXTIM
 
1861
 9376 FORMAT(19X,'Expected time for 1000 events :',F10.2,' Sec')
 
1862
      RETURN
 
1863
 
 
1864
C----------------------------------------------------------- BASES
 
1865
 
 
1866
  400 NSP   = NG**NWILD
 
1867
      MCALL = NSP*NPG
 
1868
      WRITE(LU,9400) NDIM,NWILD,MCALL,NCALL,ND,NG,NSP
 
1869
 9400 FORMAT(
 
1870
     .//5X,'<<   Parameters for BASES    >>',
 
1871
     .//5X,' (1) Dimensions of integration etc.',
 
1872
     . /5X,'     # of dimensions :    Ndim    =',I9,3X,'( 50 at max.)',
 
1873
     . /5X,'     # of Wilds      :    Nwild   =',I9,3X,'( 15 at max.)',
 
1874
     . /5X,'     # of sample points : Ncall   =',I9,'(real)',
 
1875
     .                                         I9,'(given)',
 
1876
     . /5X,'     # of subregions    : Ng      =',I9,' / variable',
 
1877
     . /5X,'     # of regions       : Nregion =',I9,' / variable',
 
1878
     . /5X,'     # of Hypercubes    : Ncube   =',I9,
 
1879
     .//5X,' (2) About the integration variables')
 
1880
      WRITE(LU,9405)
 
1881
 9405 FORMAT(10X,'------',2('+---------------'),'+-------+-------')
 
1882
      WRITE(LU,9410)
 
1883
 9410 FORMAT(10X,'    i       XL(i)           XU(i)     ',
 
1884
     .           '  IG(i)   Wild')
 
1885
      WRITE(LU,9405)
 
1886
       DO 450 I = 1,NDIM
 
1887
          IF( I .LE. NWILD ) THEN
 
1888
          WRITE(LU,9420) I,XL(I),XU(I),IG(I)
 
1889
 9420     FORMAT(10X,I5,1P,2('  ',E14.6),'  ',3X,0P,I1,3X,
 
1890
     .                       '   yes')
 
1891
          ELSE
 
1892
          WRITE(LU,9421) I,XL(I),XU(I),IG(I)
 
1893
 9421     FORMAT(10X,I5,1P,2('  ',E14.6),'  ',3X,0P,I1,3X,
 
1894
     .                        '    no')
 
1895
          ENDIF
 
1896
  450  CONTINUE
 
1897
       WRITE(LU,9405)
 
1898
       WRITE(LU,9450) ITMX1,ACC1,ITMX2,ACC2
 
1899
 9450  FORMAT(
 
1900
     . /5X,' (3) Parameters for the grid optimization step',
 
1901
     . /5X,'     Max.# of iterations: ITMX1 =',I9,
 
1902
     . /5X,'     Expected accuracy  : Acc1  =',F9.4,' %',
 
1903
     .//5X,' (4) Parameters for the integration step',
 
1904
     . /5X,'     Max.# of iterations: ITMX2 =',I9,
 
1905
     . /5X,'     Expected accuracy  : Acc2  =',F9.4,' %')
 
1906
 
 
1907
          RETURN
 
1908
C----------------------------------------------------------- BASES
 
1909
 
 
1910
  500    IF( INTV .LE. 1 )    RETURN
 
1911
         ISTEP  = IP1
 
1912
         IF( IPNT .EQ. 0 ) THEN
 
1913
             WRITE(LU,9600)
 
1914
         ELSE
 
1915
             WRITE(LU,9610) CN
 
1916
         ENDIF
 
1917
         WRITE(LU,9620) (IDATE(I),I=1,3),(ITIME(J),J=1,2)
 
1918
         WRITE(LU,9500) ICH(ISTEP)
 
1919
 9500    FORMAT(15X,A)
 
1920
         WRITE(LU,9570)
 
1921
         WRITE(LU,9550)
 
1922
 9550    FORMAT(1X,'<- Result of  each iteration ->',
 
1923
     .          2X,'<-     Cumulative Result     ->',
 
1924
     .          1X,'< CPU  time >',
 
1925
     .         /1X,' IT Eff R_Neg   Estimate  Acc %',
 
1926
     .          2X,'Estimate(+- Error )order  Acc %',
 
1927
     .          1X,'( H: M: Sec )')
 
1928
         WRITE(LU,9570)
 
1929
 9570    FORMAT(1X,7('----------'),'--------')
 
1930
         RETURN
 
1931
 
 
1932
C----------------------------------------------------------- BASES
 
1933
 
 
1934
  600    IF( INTV .LE. 1 ) RETURN
 
1935
         ISTEP  = IP1
 
1936
         ITX = MOD( IT, ITM)
 
1937
         IF( ITX .EQ. 0 ) ITX = ITM
 
1938
 
 
1939
         CALL BSLIST( LU, ITX, ISTEP )
 
1940
 
 
1941
         RETURN
 
1942
 
 
1943
  700    IF( INTV .LE. 1 ) RETURN
 
1944
         WRITE(LU,9570)
 
1945
 
 
1946
         RETURN
 
1947
C----------------------------------------------------------- BASES
 
1948
 
 
1949
  800    ITJ    = IP1
 
1950
         ISTEP  = IP2
 
1951
         ITX  = MOD( ITJ, ITM )
 
1952
         IF( ITX .EQ. 0 ) ITX = ITM
 
1953
 
 
1954
         IF( ITRAT(1,ISTEP) .EQ. 1 ) THEN
 
1955
             NDEV   = 1
 
1956
         ELSE
 
1957
             NDEV   = 2
 
1958
             ITFN   = ITM
 
1959
             ITMN   = 10000
 
1960
             DO 610 I = 1,ITM
 
1961
                IF( ITRAT(I,ISTEP) .LT. ITMN ) THEN
 
1962
                    ITST = I
 
1963
                    ITMN = ITRAT(I,ISTEP)
 
1964
                ENDIF
 
1965
  610        CONTINUE
 
1966
             IF( ITST .EQ. 1 ) NDEV = 1
 
1967
         ENDIF
 
1968
 
 
1969
         IF( IPNT .EQ. 0 ) THEN
 
1970
             WRITE(LU,9600)
 
1971
         ELSE
 
1972
             WRITE(LU,9610) CN
 
1973
         ENDIF
 
1974
         WRITE(LU,9620) (IDATE(I),I=1,3),(ITIME(J),J=1,2)
 
1975
         WRITE(LU,9500) ICH(ISTEP)
 
1976
         WRITE(LU,9570)
 
1977
         WRITE(LU,9550)
 
1978
         WRITE(LU,9570)
 
1979
 
 
1980
  625    IF( NDEV .EQ. 1 ) THEN
 
1981
             ITST = 1
 
1982
             ITFN = ITX
 
1983
         ENDIF
 
1984
 
 
1985
         DO 650 I = ITST, ITFN
 
1986
 
 
1987
            CALL BSLIST( LU, I, ISTEP )
 
1988
 
 
1989
  650    CONTINUE
 
1990
         NDEV  = NDEV - 1
 
1991
         IF( NDEV .GT. 0 ) GO TO 625
 
1992
         WRITE(LU,9570)
 
1993
 
 
1994
      RETURN
 
1995
 
 
1996
C----------------------------------------------------------- BASES
 
1997
 
 
1998
  900 WRITE(LU,9950)
 
1999
 9950 FORMAT(1X,'******** FATAL ERROR IN BASES **************',
 
2000
     .      /1X,'There are no enough good points in this iteration.',
 
2001
     .      /1X,'Process was terminated due to this error.')
 
2002
 
 
2003
      RETURN
 
2004
 
 
2005
C-----------------------------------------------------------------
 
2006
 1000 LOOP = IP1
 
2007
      IF( IP2 .NE. 0 ) THEN
 
2008
          IF( IPNT .EQ. 0 ) THEN
 
2009
              WRITE(LU,9600)
 
2010
           ELSE
 
2011
              WRITE(LU,9610) CN
 
2012
           ENDIF
 
2013
           WRITE(LU,9620) (IDATE(I),I=1,3),(ITIME(J),J=1,2)
 
2014
           WRITE(LU,9650)
 
2015
 9650      FORMAT(
 
2016
     .      20X,'Results of Integration',
 
2017
     .     /10X,5('----------'),'------',
 
2018
     .     /10X,' Loop#  Estimate(+- Error )order',
 
2019
     .                     '  It1  It2 ( H: M: Sec )',
 
2020
     .     /10X,5('----------'),'------')
 
2021
      ENDIF
 
2022
 
 
2023
      RE  = AVGI
 
2024
      AC  = ABS(SD)
 
2025
      ARE = ABS(RE)
 
2026
      IF( ARE .GE. AC) THEN
 
2027
          CALL BSORDR( ARE, F2, ORDER, IORDR)
 
2028
      ELSE
 
2029
          CALL BSORDR(  AC, F2, ORDER, IORDR )
 
2030
      ENDIF
 
2031
      RE  = RE/ORDER
 
2032
      AC  = AC/ORDER
 
2033
      CALL BSTCNV( STIME, IH, MN, IS1, IS2)
 
2034
      WRITE(LU,9660) LOOP,RE,AC,IORDR,IT1,IT,IH,MN,IS1,IS2
 
2035
 9660 FORMAT(10X,I6,F10.6,'(+-',F8.6,')E',I3.2,2I5,
 
2036
     .        1X,I3,':',I2,':',I2,'.',I2.2,
 
2037
     .      /10X,5('----------'),'------')
 
2038
 
 
2039
      RETURN
 
2040
      END
 
2041
 
 
2042
 
 
2043
C***********************************************************************
 
2044
C*                                                                     *
 
2045
C*========================                                             *
 
2046
C*    SUBROUTINE BSPUTW( WEIGHT )                                      *
 
2047
C*========================                                             *
 
2048
C*((Function))                                                         *
 
2049
C*    Put Weight                                                       *
 
2050
C*                                                                     *
 
2051
C*    Coded   by T.Ishikawa    Jun. 1995 at KEK                        *
 
2052
C*    Last update              Jun. 1995 at KEK                        *
 
2053
C*                                                                     *
 
2054
C***********************************************************************
 
2055
C
 
2056
      SUBROUTINE BSPUTW( WEIGHT )
 
2057
C
 
2058
      IMPLICIT REAL*8 (A-H,O-Z)
 
2059
      COMMON /BASE3/ SCALLS,WGT,TI,TSI,TACC,IT
 
2060
*
 
2061
*========= Save the grid information for the best accuracy ===========
 
2062
*
 
2063
      WGT = WEIGHT
 
2064
C
 
2065
      RETURN
 
2066
      END
 
2067
 
 
2068
 
 
2069
************************************************************************
 
2070
*                                                                      *
 
2071
*    ==========================                                        *
 
2072
      SUBROUTINE BSREAD( LUN )
 
2073
*    ==========================                                        *
 
2074
* ((Function))                                                         *
 
2075
*     Read temporary result from the logocal unit LUN                  *
 
2076
* ((Auther))                                                           *
 
2077
*     S.Kawabata    June '90 at KEK                                    *
 
2078
*                                                                      *
 
2079
************************************************************************
 
2080
 
 
2081
 
 
2082
      IMPLICIT REAL*8 (A-H,O-Z)
 
2083
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
2084
      COMMON /BASE1/ ND1(5*MXDIM+3)
 
2085
*     COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
2086
*    .               IG(MXDIM),NCALL
 
2087
C     COMMON /BASE2/ ND2(6)
 
2088
*     COMMON /BASE2/ ACC1,ACC2,ITMX1,ITMX2
 
2089
      COMMON /BASE3/ ND3(11)
 
2090
*     COMMON /BASE3/ SCALLS,WGT,TI,TSI,TACC,IT
 
2091
      COMMON /BASE4/ ND4(2*MXDIM*(NDMX+1)+4*LENG+MXDIM+3)
 
2092
*     COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
2093
*    .               ND,NG,NPG,MA(MXDIM)
 
2094
      PARAMETER (ITM  = 50 )
 
2095
*     COMMON /BASE5/ ND5(22*ITM)
 
2096
      COMMON /BASE5/ ND5(23*ITM)
 
2097
*     REAL*4 TIME, EFF, WRONG, TRSLT, TSTD, PCNT
 
2098
*     COMMON /BASE5/ ITRAT(ITM,0:1),TIME(ITM,0:2),EFF(ITM,0:1),
 
2099
*    .               WRONG(ITM,0:1),RESLT(ITM,0:1),ACSTD(ITM,0:1),
 
2100
*    .               TRSLT(ITM,0:1),TSTD(ITM,0:1),PCNT(ITM,0:1)
 
2101
      COMMON /RANDM/ ND6(45)
 
2102
 
 
2103
      PARAMETER ( NHS = 50, NSC = 50 )
 
2104
      COMMON /PLOTH/ NPH(18*(NHS+NSC)+29),NW
 
2105
      COMMON /PLOTB/ IBUF( 281*NHS + 2527*NSC )
 
2106
*     INTEGER*4 XHASH,DHASH,NHIST,MAPL,IFBASE,NSCAT,MAPD
 
2107
*     COMMON/PLOTH/ XHASH(NHS+1,13),DHASH(NSC+1,14),IFBASE(NHS),
 
2108
*    .              NHIST, MAPL(4,NHS),
 
2109
*    .              NSCAT, MAPD(4,NSC),
 
2110
*    .              NW
 
2111
 
 
2112
      COMMON/NINFO/ NODEID, NUMNOD
 
2113
 
 
2114
      IF( NODEID .NE. 0 ) RETURN
 
2115
 
 
2116
      REWIND LUN
 
2117
      READ(LUN) ND1,ND3,ND4,ND5,ND6,NPH
 
2118
C     READ(LUN) ND1,ND2,ND3,ND4,ND5,ND6,NPH
 
2119
 
 
2120
      READ(LUN) NW,(IBUF(I),I=1,NW)
 
2121
C
 
2122
      RETURN
 
2123
      END
 
2124
 
 
2125
 
 
2126
************************************************************************
 
2127
*=================================================
 
2128
      SUBROUTINE BSTCNV( TIME, IH, MN, IS1, IS2 )
 
2129
*=================================================
 
2130
* (Purpose)
 
2131
*    Resolve TIME in second into IH, MN, IS1, IS2
 
2132
* (Input)
 
2133
*    TIME : in the unit of second
 
2134
* (Output)
 
2135
*    IH   : Hours
 
2136
*    MN   : Minute
 
2137
*    IS1  : Second
 
2138
*    IS2  : 0.xx Second
 
2139
* (Author)
 
2140
*    S.Kawabata 1992 June 15
 
2141
************************************************************************
 
2142
 
 
2143
      IMPLICIT REAL*8 (A-H,O-Z)
 
2144
      REAL*4 TIME
 
2145
      INTEGER  HOUR
 
2146
      DATA HOUR, MINUT, N100/ 360000, 6000, 100 /
 
2147
 
 
2148
      ISEC  = TIME*N100
 
2149
      IH    = 0
 
2150
      MN    = IH
 
2151
      IF( ISEC .GE. MINUT ) THEN
 
2152
          ITIME = ISEC
 
2153
          IF( ISEC .GE. HOUR ) THEN
 
2154
              IH    = ITIME/HOUR
 
2155
              IHX   = IH*HOUR
 
2156
              ITIME = ITIME - IHX
 
2157
              ISEC  = ISEC - IHX
 
2158
          ENDIF
 
2159
          MN    = ITIME/MINUT
 
2160
          ISEC  = ISEC - MN*MINUT
 
2161
      ENDIF
 
2162
      IS1  = ISEC/N100
 
2163
      IS2  = MOD( ISEC, N100)
 
2164
 
 
2165
      RETURN
 
2166
      END
 
2167
 
 
2168
 
 
2169
      SUBROUTINE BSUTIM( JOB, ID )
 
2170
 
 
2171
C     COMMON/NINFO/ NODEID, NUMNOD
 
2172
      COMMON /BTIME1/ TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
2173
      COMMON /BTIME2/ TIMEBS(0:2),TIMINT,TIMESP(0:2)
 
2174
 
 
2175
*  Prior to call thisroutine, BSTIME( TIME0, 1 ) should be called
 
2176
*  for initialize the time offset TIME0.
 
2177
*
 
2178
*     print *,'bsutim .. job, id ',job,id
 
2179
      CALL BSTIME( RTIME, 1)
 
2180
      DTIME      = RTIME - TIME0
 
2181
 
 
2182
      IF( JOB .EQ. 0 ) THEN
 
2183
*       For BASES computing time
 
2184
*         ID  = 0  : Grid defining step
 
2185
*               1  : Integration step
 
2186
*               2  : Others
 
2187
 
 
2188
          TIMEBS(ID) = TIMEBS(ID) + DTIME
 
2189
 
 
2190
          IF( ID .LE. 1 ) THEN
 
2191
              TIMINT = TIMINT + DTIME
 
2192
          ENDIF
 
2193
      ELSE
 
2194
*       For SPRING computing time
 
2195
*         ID  = 0  : Event generation
 
2196
*               1  : Overhead
 
2197
*               2  : Others
 
2198
 
 
2199
          TIMESP(ID) = TIMESP(ID) + DTIME
 
2200
 
 
2201
      ENDIF
 
2202
 
 
2203
      TIME0      = RTIME
 
2204
 
 
2205
      RETURN
 
2206
      END
 
2207
 
 
2208
 
 
2209
************************************************************************
 
2210
*                                                                      *
 
2211
*    ==========================                                        *
 
2212
      SUBROUTINE BSWRIT( LUN )
 
2213
*    =====================                                             *
 
2214
* ((Purpose))                                                          *
 
2215
*     Read temporary result from disk file.                            *
 
2216
* ((Auther))                                                           *
 
2217
*     S.Kawabata  June '90 at KEK                                      *
 
2218
*                                                                      *
 
2219
************************************************************************
 
2220
 
 
2221
      IMPLICIT REAL*8 (A-H,O-Z)
 
2222
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
2223
      COMMON /BASE1/ ND1(5*MXDIM+3)
 
2224
*     COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
2225
*    .               IG(MXDIM),NCALL
 
2226
C     COMMON /BASE2/ ND2(6)
 
2227
*     COMMON /BASE2/ ACC1,ACC2,ITMX1,ITMX2
 
2228
      COMMON /BASE3/ ND3(11)
 
2229
*     COMMON /BASE3/ SCALLS,WGT,TI,TSI,TACC,IT
 
2230
      COMMON /BASE4/ ND4(2*MXDIM*(NDMX+1)+4*LENG+MXDIM+3)
 
2231
*     COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
2232
*    .               ND,NG,NPG,MA(MXDIM)
 
2233
      PARAMETER (ITM  = 50 )
 
2234
*     COMMON /BASE5/ ND5(22*ITM)
 
2235
      COMMON /BASE5/ ND5(23*ITM)
 
2236
*     REAL*4 TIME, EFF, WRONG, TRSLT, TSTD, PCNT
 
2237
*     COMMON /BASE5/ ITRAT(ITM,0:1),TIME(ITM,0:2),EFF(ITM,0:1),
 
2238
*    .               WRONG(ITM,0:1),RESLT(ITM,0:1),ACSTD(ITM,0:1),
 
2239
*    .               TRSLT(ITM,0:1),TSTD(ITM,0:1),PCNT(ITM,0:1)
 
2240
      COMMON /RANDM/ ND6(45)
 
2241
 
 
2242
      PARAMETER ( NHS = 50, NSC = 50 )
 
2243
      COMMON /PLOTH/ NPH(18*(NHS+NSC)+29),NW
 
2244
      COMMON /PLOTB/ IBUF( 281*NHS + 2527*NSC )
 
2245
*     INTEGER*4 XHASH,DHASH,NHIST,MAPL,IFBASE,NSCAT,MAPD
 
2246
*     COMMON/PLOTH/ XHASH(NHS+1,13),DHASH(NSC+1,14),IFBASE(NHS),
 
2247
*    .              NHIST, MAPL(4,NHS),
 
2248
*    .              NSCAT, MAPD(4,NSC),
 
2249
*    .              NW
 
2250
 
 
2251
      COMMON/NINFO/ NODEID, NUMNOD
 
2252
 
 
2253
      IF( NODEID .NE. 0 ) RETURN
 
2254
 
 
2255
      REWIND LUN
 
2256
      WRITE(LUN) ND1,ND3,ND4,ND5,ND6,NPH
 
2257
C     WRITE(LUN) ND1,ND2,ND3,ND4,ND5,ND6,NPH
 
2258
      IF(NW .EQ. 0 ) NW = 281
 
2259
      WRITE(LUN) NW,(IBUF(I),I=1,NW)
 
2260
C
 
2261
      RETURN
 
2262
      END
 
2263
 
 
2264
 
 
2265
C**********************************************************************
 
2266
C*======================                                              *
 
2267
C* FUNCTION DRN( ISEED)                                               *
 
2268
C*======================                                              *
 
2269
C*  Machine-independent Random number generator                       *
 
2270
C*     General purpose Version,  OK as long as >= 32 bits             *
 
2271
C*((Arguement))                                                       *
 
2272
C*  ISEED: Seed                                                       *
 
2273
C*                                                                    *
 
2274
C**********************************************************************
 
2275
 
 
2276
*     REAL FUNCTION DRN*8(ISEED)
 
2277
      DOUBLE PRECISION FUNCTION DRN(ISEED)
 
2278
 
 
2279
      COMMON/RANDM/RDM(31),RM1,RM2,IA1,IC1,M1,IX1,
 
2280
     .                             IA2,IC2,M2,IX2,
 
2281
     .                             IA3,IC3,M3,IX3
 
2282
 
 
2283
C Generate Next number in sequence
 
2284
 
 
2285
      IX1    = MOD( IA1*IX1+IC1, M1 )
 
2286
      IX2    = MOD( IA2*IX2+IC2, M2 )
 
2287
      IX3    = MOD( IA3*IX3+IC3, M3 )
 
2288
      J      = 1 + (31*IX3)/M3
 
2289
      DRN    = RDM(J)
 
2290
      RDM(J) = ( FLOAT(IX1)+FLOAT(IX2)*RM2 )*RM1
 
2291
 
 
2292
C Omit following statement if function arguement passed by value:
 
2293
 
 
2294
      ISEED = IX1
 
2295
      RETURN
 
2296
      END
 
2297
 
 
2298
 
 
2299
C**********************************************************************
 
2300
C*============================                                        *
 
2301
C* Subroutine DRNSET( ISEED )                                         *
 
2302
C*============================                                        *
 
2303
C*((Purpose))                                                         *
 
2304
C*  Initialization routine of                                         *
 
2305
C*         Machine-independent Random number generator                *
 
2306
C*         General purpose Version,  OK as long as >= 32 bits         *
 
2307
C*((Arguement))                                                       *
 
2308
C*  ISEED: SEED                                                       *
 
2309
C*                                                                    *
 
2310
C**********************************************************************
 
2311
 
 
2312
      SUBROUTINE DRNSET( ISEED )
 
2313
 
 
2314
      COMMON/RANDM/RDM(31),RM1,RM2,IA1,IC1,M1,IX1,
 
2315
     .                             IA2,IC2,M2,IX2,
 
2316
     .                             IA3,IC3,M3,IX3
 
2317
 
 
2318
      IA1 =    1279
 
2319
      IC1 =  351762
 
2320
      M1  = 1664557
 
2321
      IA2 =    2011
 
2322
      IC2 =  221592
 
2323
      M2  = 1048583
 
2324
      IA3 =   15091
 
2325
      IC3 =    6171
 
2326
      M3  =   29201
 
2327
 
 
2328
C Initialization
 
2329
 
 
2330
      IX1  = MOD( ISEED, M1 )
 
2331
      IX1  = MOD( IA1*IX1+IC1, M1 )
 
2332
      IX2  = MOD( IX1, M2 )
 
2333
      IX1  = MOD( IA1*IX1+IC1, M1 )
 
2334
      IX3  = MOD( IX1,M3)
 
2335
      RM1  = 1./FLOAT(M1)
 
2336
      RM2  = 1./FLOAT(M2)
 
2337
      DO 100 J = 1,31
 
2338
         IX1   = MOD( IA1*IX1+IC1, M1 )
 
2339
         IX2   = MOD( IA2*IX2+IC2, M2 )
 
2340
         RDM(J)= ( FLOAT(IX1)+FLOAT(IX2)*RM2 )*RM1
 
2341
  100 CONTINUE
 
2342
 
 
2343
      RETURN
 
2344
      END
 
2345
c
 
2346
c
 
2347
c End of BASES routines
 
2348
c
 
2349
c
 
2350
c
 
2351
c
 
2352
c Begin of SPRING routines
 
2353
c
 
2354
c
 
2355
      subroutine init_of_spring(prefix)
 
2356
c This subroutine is called in order to initialize spring parameters
 
2357
      implicit none
 
2358
      integer ispring
 
2359
      common/sprng0/ispring
 
2360
      character * 60 prefix,fname
 
2361
      integer isunit
 
2362
      parameter (isunit=23)
 
2363
c
 
2364
      call fk88strcat(prefix,'_bs.data',fname)
 
2365
      open(unit=isunit,file=fname,
 
2366
     #     form='unformatted',status='old')
 
2367
      call bsread(isunit)
 
2368
      close(isunit)
 
2369
      ispring=1
 
2370
      return
 
2371
      end
 
2372
 
 
2373
 
 
2374
      subroutine run_of_spring(ff,mxevts,mxtrls,nevts,ntrls)
 
2375
      implicit none
 
2376
      real * 8 ff
 
2377
      integer mxevts,mxtrls,nevts,ntrls
 
2378
      integer mxtry
 
2379
      parameter (mxtry=50)
 
2380
      integer iounit
 
2381
      parameter (iounit=6)
 
2382
      integer mxtryp,nevent,ntrial,miss
 
2383
      common/sprng2/mxtryp,nevent,ntrial,miss
 
2384
      external ff
 
2385
c
 
2386
      nevent=0
 
2387
      ntrial=0
 
2388
      dowhile(ntrial.lt.mxtrls.and.nevent.lt.mxevts)
 
2389
        call spring(ff,mxtry,mxevts)
 
2390
        call sprfin()
 
2391
      enddo
 
2392
      call spinfo(iounit)
 
2393
      nevts=nevent
 
2394
      ntrls=ntrial
 
2395
      return
 
2396
      end
 
2397
 
 
2398
 
 
2399
c It appears that the main unweighting routine is sprgen; spring
 
2400
c seems only to be a wrapper for the former. In sprgen the information
 
2401
c is available on the values of xx(i) when the event is accepted.
 
2402
c
 
2403
c There is a serious logical mistake in spring: the initialization
 
2404
c is performed only if ibases is different from zero. Ibases is
 
2405
c a flag which is set to 1 in bsinit, and it is connected to bases,
 
2406
c and not to spring. Thus, if one runs spring by using the bases data
 
2407
c files saved at a earlier stage, spring is initialized only the first
 
2408
c time, and this could force the code to crash, but it could also
 
2409
c lead to incorrect results without notice.
 
2410
c
 
2411
c A new common block /sprng0/ispring has therefore been introduced,
 
2412
c which controls the initialization of spring. 
 
2413
************************************************************************
 
2414
*    ==================================                                *
 
2415
      SUBROUTINE SPRING(FUNC, MXTRY, MXEVTS )
 
2416
*    ==================================                                *
 
2417
*         Main Program for the Event generation program SPRING.        *
 
2418
*                                                                      *
 
2419
*        Coded by S.Kawabata        September '84                      *
 
2420
*                                                                      *
 
2421
* Modified by S. Frixione in order to exclude the built-in             *
 
2422
* histogramming package. The common block bfxlhisto has been added     *
 
2423
* The common block SPRNG0 has been added, to correct the logical       *
 
2424
* flaw pointed out in the comments above. A further modification       *
 
2425
* occurred on 6/4/2005. Entry MXEVTS has been added to this routine,   *
 
2426
* in order to modify the warning relevant to the number of             *
 
2427
* mis-generations, now issued only after the mis-generations are       *
 
2428
* than 1% of the total number events to be generated                   *
 
2429
************************************************************************
 
2430
 
 
2431
      IMPLICIT REAL*8 (A-H,O-Z)
 
2432
      EXTERNAL FUNC
 
2433
      COMMON/SPRNG0/ISPRING
 
2434
      COMMON /BASE0/ NDUM,IBASES
 
2435
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
2436
      COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
2437
     .               IG(MXDIM),NCALL
 
2438
      COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
2439
     .               ND,NG,NPG,MA(MXDIM)
 
2440
      COMMON /BDATE/ IDATE(3),ITIME(2)
 
2441
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
2442
 
 
2443
      COMMON /SPRNG1/ XND, DXG, XJAC, DXMAX, NSP
 
2444
      COMMON /SPRNG2/ MXTRYP,NEVENT, NTRIAL,MISS
 
2445
 
 
2446
      REAL*4 TIMEBS,TIMINT,TIMESP,TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
2447
      COMMON /BTIME1/ TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
2448
      COMMON /BTIME2/ TIMEBS(0:2),TIMINT,TIMESP(0:2)
 
2449
      LOGICAL LHISTO
 
2450
      COMMON/BFXLHISTO/LHISTO
 
2451
*                                                                      *
 
2452
*----------------------------- Entry point ----------------------------*
 
2453
*                                                                      *
 
2454
*======================================================================*
 
2455
*                  Initialization of the program                       *
 
2456
*======================================================================*
 
2457
*----------------------------------------------------------------------*
 
2458
*                     initialize timer etc.                            *
 
2459
*----------------------------------------------------------------------*
 
2460
*                                                                      *
 
2461
c       IF( IBASES .GT. 0 ) THEN
 
2462
       IF( ISPRING .GT. 0 ) THEN
 
2463
 
 
2464
           CALL SPCHCK
 
2465
 
 
2466
           CALL BSTIME( TIME0, 0 )
 
2467
           TIMES1 = TIME0
 
2468
 
 
2469
           MXTRYP = MXTRY
 
2470
           INTV   = 0
 
2471
c           IBASES = 0
 
2472
           ISPRING = 0
 
2473
           MISFLG = 0
 
2474
 
 
2475
           CALL BSDATE
 
2476
 
 
2477
           DO 10 I = 0,2
 
2478
              TIMESP(I) = 0.0
 
2479
   10      CONTINUE
 
2480
*                                                                      *
 
2481
            IF( MXTRY .LT. 10 ) MXTRY = 50
 
2482
            NBIN    = MXTRY
 
2483
            IF( MXTRY .GT. 50) NBIN = 50
 
2484
            MXTRY1  = MXTRY + 1
 
2485
            MISS    = 0
 
2486
            NEVENT  = 0
 
2487
            NTRIAL  = 0
 
2488
 
 
2489
 
 
2490
            IF(LHISTO)THEN
 
2491
              CALL SHINIT( MXTRY1 )
 
2492
              CALL SHRSET
 
2493
            ENDIF
 
2494
*----------------------------------------------------------------------*
 
2495
*             Make the cumulative probability distribution             *
 
2496
*----------------------------------------------------------------------*
 
2497
*                                                                      *
 
2498
            XND     = ND
 
2499
            DXG     = XND/NG
 
2500
            NSP     = NG**NWILD
 
2501
 
 
2502
*///// DEBUG
 
2503
*       MCALL   = NSP*NPG
 
2504
*       CALL BSPRNT( 4, MCALL, IDUM2, IDUM3, IDUM4 )
 
2505
*
 
2506
            XJAC    = 1.0
 
2507
            DO 50 I = 1, NDIM
 
2508
               XJAC = XJAC*DX(I)
 
2509
   50       CONTINUE
 
2510
            DXMAX   = 0.0D0
 
2511
            DO 100  I = 1,NSP
 
2512
               IF( DXD( I ) .LT. 0.0D0 ) THEN
 
2513
                   WRITE(6,9100) I
 
2514
 9100              FORMAT(
 
2515
     .             /5X,'********** FATAL ERROR IN SPRING **********',
 
2516
     .             /5X,'*     Negative probability was found      *',
 
2517
     .             /5X,'*        in the ',I6,'-th Hypercube.      *',
 
2518
     .             /5X,'*******************************************')
 
2519
                   STOP
 
2520
               ENDIF
 
2521
               DXMAX    = DXMAX + DXD( I )
 
2522
               DXD(I)   = DXMAX
 
2523
  100       CONTINUE
 
2524
*        =====================
 
2525
          CALL BSUTIM( 1, 1 )
 
2526
*        =====================
 
2527
      ENDIF
 
2528
*     =====================
 
2529
       CALL BSUTIM( 1, 2 )
 
2530
*     =====================
 
2531
c      IF( IBASES .EQ. 1 ) THEN
 
2532
      IF( ISPRING .EQ. 1 ) THEN
 
2533
          WRITE(6,9000)
 
2534
 9000     FORMAT(
 
2535
     .      1X,'**************************************************',
 
2536
     .     /1X,'*    Flag ISPRING was not equal to "0".          *',
 
2537
     .     /1X,'*                                                *',
 
2538
     .     /1X,'*   Process was terminated by this error.        *',
 
2539
     .     /1X,'*   Call S.Kawabata.                             *',
 
2540
     .     /1X,'**************************************************')
 
2541
           STOP
 
2542
       ENDIF
 
2543
*                                                                      *
 
2544
*======================================================================*
 
2545
*                       Event generation                               *
 
2546
*======================================================================*
 
2547
*     =====================
 
2548
  500  CALL BSUTIM( 1, 1 )
 
2549
*     =====================
 
2550
 
 
2551
*     ==================================
 
2552
        CALL SPRGEN( FUNC, MXTRY, IRET)
 
2553
*     ==================================
 
2554
 
 
2555
*     =====================
 
2556
       CALL BSUTIM( 1, 0 )
 
2557
*     =====================
 
2558
 
 
2559
      IF(LHISTO)THEN
 
2560
        CALL SHFILL( IRET )
 
2561
      ENDIF
 
2562
 
 
2563
      IF( IRET .LE. MXTRY ) THEN
 
2564
          NTRIAL =NTRIAL + IRET
 
2565
          NEVENT = NEVENT + 1
 
2566
          IF(LHISTO)THEN
 
2567
            CALL SHUPDT
 
2568
          ENDIF
 
2569
      ELSE
 
2570
          NTRIAL =NTRIAL + IRET - 1
 
2571
          MISS = MISS + 1
 
2572
          IF( MISFLG .EQ. 0 .AND. MISS .GT. INT(0.01*MXEVTS) ) THEN
 
2573
              WRITE(6,9600) MXTRY
 
2574
 9600         FORMAT(1X,'****************************************',
 
2575
     .                  '****************************************',
 
2576
     .              /1X,'* (((( Warning ))))                     ',
 
2577
     .                  '                                       *',
 
2578
     .              /1X,'*                                       ',
 
2579
     .                  '                                       *',
 
2580
     .              /1X,'*  The number of mis-generations is foun',
 
2581
     .                  'd more than',I3,' times.                  *')
 
2582
              WRITE(6,9610)
 
2583
 9610         FORMAT(1X,'*                                       ',
 
2584
     .                  '                                       *',
 
2585
     .              /1X,'*(( Suggestion ))                       ',
 
2586
     .                  '                                       *',
 
2587
     .              /1X,'* (1) Try integration again with larger ',
 
2588
     .                  'number of sample points than this job. *',
 
2589
     .              /1X,'* or                                    ',
 
2590
     .                  '                                       *',
 
2591
     .              /1X,'* (2) The integral variables are not sui',
 
2592
     .                  'ted for the function.                  *',
 
2593
     .              /1X,'*     Take another integral variables !!',
 
2594
     .                  '                                       *',
 
2595
     .              /1X,'*                                       ',
 
2596
     .                  '                                       *',
 
2597
     .              /1X,'****************************************',
 
2598
     .                  '****************************************')
 
2599
            MISFLG = 1
 
2600
          ENDIF
 
2601
          GO TO 500
 
2602
      ENDIF
 
2603
*     =====================
 
2604
  600  CALL BSUTIM( 1, 1 )
 
2605
*     =====================
 
2606
 
 
2607
      RETURN
 
2608
      END
 
2609
 
 
2610
 
 
2611
************************************************************************
 
2612
*    ===================                                               *
 
2613
      SUBROUTINE SPCHCK
 
2614
*    ===================                                               *
 
2615
* ((Purpose))                                                          *
 
2616
*     To check user's initialization parameters.                       *
 
2617
*                                                                      *
 
2618
*        Coded by S.Kawabata      April  '94                           *
 
2619
*                                                                      *
 
2620
************************************************************************
 
2621
 
 
2622
      IMPLICIT REAL*8 (A-H,O-Z)
 
2623
      PARAMETER ( MXDIM = 50)
 
2624
      COMMON /BPARM1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
2625
     .               IG(MXDIM),NCALL
 
2626
      COMMON /BPARM2/ ACC1,ACC2,ITMX1,ITMX2
 
2627
 
 
2628
      COMMON /BASE0/ JFLAG,IBASES
 
2629
      COMMON /BASE1/ XLT(MXDIM),XUT(MXDIM),NDIMT,NWILDT,
 
2630
     .               IGT(MXDIM),NCALLT
 
2631
      COMMON /BASE2/ ACC1T,ACC2T,ITMX1T,ITMX2T
 
2632
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
2633
 
 
2634
      IF( NDIM .NE. NDIMT ) THEN
 
2635
          WRITE(6,9100) NDIM,NDIMT
 
2636
 9100     FORMAT(
 
2637
     .     5X,'*************************************************',
 
2638
     .    /5X,'*                                               *',
 
2639
     .    /5X,'*   Given NDIM(',I6,' ) does not match          *',
 
2640
     .    /5X,'*      to NDIM(',I6,' ) in BASES.               *',
 
2641
     .    /5X,'*                                               *',
 
2642
     .    /5X,'*   Process was terminated due to this error.   *',
 
2643
     .    /5X,'*                                               *',
 
2644
     .    /5X,'*************************************************')
 
2645
          STOP
 
2646
      ENDIF
 
2647
 
 
2648
      IF( NWILD .NE. NWILDT ) THEN
 
2649
          WRITE(6,9110) NWILD,NWILDT
 
2650
 9110     FORMAT(
 
2651
     .     5X,'*************************************************',
 
2652
     .    /5X,'*                                               *',
 
2653
     .    /5X,'*   Given NWILD(',I6,' ) does not match         *',
 
2654
     .    /5X,'*      to NWILD(',I6,' ) in BASES.              *',
 
2655
     .    /5X,'*                                               *',
 
2656
     .    /5X,'*   Process was terminated due to this error.   *',
 
2657
     .    /5X,'*                                               *',
 
2658
     .    /5X,'*************************************************')
 
2659
          STOP
 
2660
      ENDIF
 
2661
 
 
2662
      DO 200 I = 1,NDIM
 
2663
         IF( XL(I) .NE. XLT(I) ) THEN
 
2664
             WRITE(6,9200) I,XL(I),I,XLT(I)
 
2665
 9200        FORMAT(
 
2666
     .     5X,'*************************************************',
 
2667
     .    /5X,'*                                               *',
 
2668
     .    /5X,'*   Given XL(',I3,' ) = ',D15.8,'            *',
 
2669
     .    /5X,'*      does not match to                        *',
 
2670
     .    /5X,'*      to XL(',I3,' ) = ',D15.8,' in BASES   *',
 
2671
     .    /5X,'*                                               *',
 
2672
     .    /5X,'*   Process was terminated due to this error.   *',
 
2673
     .    /5X,'*                                               *',
 
2674
     .    /5X,'*************************************************')
 
2675
             STOP
 
2676
         ENDIF
 
2677
         IF( XU(I) .NE. XUT(I) ) THEN
 
2678
             WRITE(6,9210) I,XU(I),I,XUT(I)
 
2679
 9210        FORMAT(
 
2680
     .     5X,'*************************************************',
 
2681
     .    /5X,'*                                               *',
 
2682
     .    /5X,'*   Given XU(',I3,' ) = ',D15.8,'            *',
 
2683
     .    /5X,'*      does not match to                        *',
 
2684
     .    /5X,'*      to XU(',I3,' ) = ',D15.8,' in BASES   *',
 
2685
     .    /5X,'*                                               *',
 
2686
     .    /5X,'*   Process was terminated due to this error.   *',
 
2687
     .    /5X,'*                                               *',
 
2688
     .    /5X,'*************************************************')
 
2689
             STOP
 
2690
         ENDIF
 
2691
  200 CONTINUE
 
2692
 
 
2693
      RETURN
 
2694
      END
 
2695
 
 
2696
 
 
2697
***********************************************************************
 
2698
*============================                                         *
 
2699
      SUBROUTINE SPINFO( LU )
 
2700
*============================                                         *
 
2701
*((Purpose))                                                          *
 
2702
*    Print the information for                                        *
 
2703
*        (1) BASES parameters                                         *
 
2704
*        (2) Computer time information                                *
 
2705
*        (3) Convergency behavior of the Grid optimization step       *
 
2706
*        (4) Convergency behavior of the integration step             *
 
2707
*(( Input ))                                                          *
 
2708
*    LU  :  Logical unit number of printer                            *
 
2709
*                                                                     *
 
2710
*           by S.Kawabata    March 1994 at KEK
 
2711
*                                                                     *
 
2712
* Modified by S. Frixione in order to exclude the built-in            *
 
2713
* histogramming package. The common block bfxlhisto has been added    *
 
2714
***********************************************************************
 
2715
 
 
2716
      IMPLICIT REAL*8 (A-H,O-Z)
 
2717
      COMMON /BDATE/ IDATE(3),ITIME(2)
 
2718
      COMMON /BSCNTL/ INTV, IPNT, NLOOP, MLOOP
 
2719
 
 
2720
      COMMON /SPRNG2/ MXTRY,NEVENT, NTRIAL, MISS
 
2721
 
 
2722
      PARAMETER ( NHS = 50, NSC = 50 )
 
2723
      INTEGER*4 XHASH,DHASH,NHIST,MAPL,IFBASE,NSCAT,MAPD
 
2724
*     COMMON/PLOTH/ XHASH(ILH,13),DHASH(IDH,14),IFBASE(ILH),
 
2725
*    .              MAXL, NHIST, MAPL(4,ILH),
 
2726
*    .              MAXD, NSCAT, MAPD(4,IDH),
 
2727
*    .              NW
 
2728
      COMMON/PLOTH/ XHASH(NHS+1,13),DHASH(NSC+1,14),IFBASE(NHS),
 
2729
     .              NHIST, MAPL(4,NHS),
 
2730
     .              NSCAT, MAPD(4,NSC),
 
2731
     .              NW
 
2732
 
 
2733
      REAL*4 TIMEBS,TIMINT,TIMESP,TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
2734
      COMMON /BTIME1/ TIME0,RTIME,TIMEB1,TIMEB2,TIMES1
 
2735
      COMMON /BTIME2/ TIMEBS(0:2),TIMINT,TIMESP(0:2)
 
2736
      REAL*4 XTIME
 
2737
      LOGICAL LHISTO
 
2738
      COMMON/BFXLHISTO/LHISTO
 
2739
 
 
2740
      CHARACTER*1 CN
 
2741
 
 
2742
       IF( IPNT .EQ. 0 ) THEN
 
2743
           WRITE(LU,9300)
 
2744
       ELSE
 
2745
           CN     = CHAR(12)
 
2746
           WRITE(LU,9350) CN
 
2747
       ENDIF
 
2748
 9300  FORMAT(/1H1,////1H )
 
2749
 9350  FORMAT(A1,////1X)
 
2750
       WRITE(LU,9360) (IDATE(I),I=1,3),(ITIME(J),J=1,2)
 
2751
 9360  FORMAT(55X,'Date: ',I2,'/',I2,'/',I2,2X,I2.2,':',I2.2)
 
2752
       WRITE(LU,9400)
 
2753
 9400 FORMAT(
 
2754
     . 8X,'**********************************************************',
 
2755
     ./8X,'*                                                        *',
 
2756
     ./8X,'*    SSSSS   PPPPPP   RRRRRR   IIIII  N    NN   GGGGG    *',
 
2757
     ./8X,'*   SS   SS  PP   PP  RR   RR   III   NN   NN  GG   GG   *',
 
2758
     ./8X,'*   SS       PP   PP  RR   RR   III   NNN  NN  GG        *',
 
2759
     ./8X,'*    SSSSS   PPPPPP   RRRRR     III   NNNN NN  GG  GGGG  *',
 
2760
     ./8X,'*        SS  PP       RR  RR    III   NN NNNN  GG   GG   *',
 
2761
     ./8X,'*   SS   SS  PP       RR   RR   III   NN  NNN  GG   GG   *',
 
2762
     ./8X,'*    SSSSS   PP       RR    RR IIIII  NN   NN   GGGGG    *',
 
2763
     ./8X,'*                                                        *',
 
2764
     ./8X,'*                  SPRING Version 5.1                    *',
 
2765
     ./8X,'*           coded by S.Kawabata KEK, March 1994          *',
 
2766
     ./8X,'**********************************************************')
 
2767
*                                                                      *
 
2768
          EFF   = FLOAT(NEVENT)/FLOAT(NTRIAL)*100.D0
 
2769
          CALL BSTIME( RTIME, 1 )
 
2770
          XTIME = RTIME - TIMES1
 
2771
          WRITE(LU,9500) NEVENT,EFF,(TIMESP(I),I=0,2),XTIME,MXTRY,MISS
 
2772
 9500     FORMAT(/5X,'Number of generated events    =',I10,
 
2773
     .         /5X,'Generation efficiency         =',F10.3,' Percent',
 
2774
     .         /5X,'Computing time for generation =',F10.3,' Seconds',
 
2775
     .         /5X,'               for Overhead   =',F10.3,' Seconds',
 
2776
     .         /5X,'               for Others     =',F10.3,' Seconds',
 
2777
     .         /5X,'GO time for event generation  =',F10.3,' Seconds',
 
2778
     .         /5X,'Max. number of trials MXTRY   =',I10,' per event',
 
2779
     .         /5X,'Number of mis-generations     =',I10,' times')
 
2780
 
 
2781
      IF(LHISTO)THEN
 
2782
        CALL SPHIST( LU )
 
2783
      ENDIF
 
2784
 
 
2785
      RETURN
 
2786
      END
 
2787
 
 
2788
 
 
2789
C***********************************************************************
 
2790
C*====================================                                 *
 
2791
C* SUBROUTINE SPRGEN( F, MXTRY, NTRY )                                 *
 
2792
C*====================================                                 *
 
2793
C*                                                                     *
 
2794
C*     Generation of events according to the probability density       *
 
2795
C*     which is stored in a disk file.                                 *
 
2796
C*                                                                     *
 
2797
C*    Coded   by S.Kawabata   at July,1980                             *
 
2798
C*    Update     S.Kawabata   September '84                            *
 
2799
C*                                                                     *
 
2800
C* Modified by S. Frixione in order to exclude the built-in            *
 
2801
C* histogramming package. The common block bfxlhisto has been added    *
 
2802
C***********************************************************************
 
2803
C
 
2804
       SUBROUTINE SPRGEN(F,MXTRY,NTRY)
 
2805
C
 
2806
      IMPLICIT REAL*8 (A-H,O-Z)
 
2807
C
 
2808
      EXTERNAL F
 
2809
      PARAMETER (MXDIM = 50, NDMX = 50, LENG = 32768)
 
2810
      COMMON /BASE1/ XL(MXDIM),XU(MXDIM),NDIM,NWILD,
 
2811
     .               IG(MXDIM),NCALL
 
2812
      COMMON /BASE4/ XI(NDMX,MXDIM),DX(MXDIM),DXD(LENG),DXP(LENG),
 
2813
     .               ND,NG,NPG,MA(MXDIM)
 
2814
 
 
2815
      COMMON /SPRNG1/ XND, DXG, XJAC, DXMAX, NSP
 
2816
 
 
2817
      LOGICAL LHISTO
 
2818
      COMMON/BFXLHISTO/LHISTO
 
2819
      DIMENSION Y(MXDIM),KG(MXDIM)
 
2820
      DATA ONE/1.0D0/
 
2821
C
 
2822
C
 
2823
      RX    = DRN(IDUMY)*DXMAX
 
2824
C
 
2825
C  -------------- Binary Search  --------------------------------
 
2826
C
 
2827
      IPMIN = 1
 
2828
      IPMAX = NSP
 
2829
C
 
2830
 300  IC    = (IPMIN+IPMAX)/2
 
2831
        IF(RX .LT. DXD(IC)) THEN
 
2832
          IPMAX = IC
 
2833
        ELSE
 
2834
          IPMIN = IC
 
2835
        ENDIF
 
2836
      IF(IPMAX-IPMIN .GT.  2) GO TO 300
 
2837
C
 
2838
      IC    = IPMIN-1
 
2839
 350  IC    = IC+1
 
2840
      IF(DXD(IC) .LT. RX) GO TO 350
 
2841
C
 
2842
C --------------------------------------------------------------------
 
2843
C      Identify the hypecube number from sequential number IC
 
2844
C --------------------------------------------------------------------
 
2845
C
 
2846
       FMAX  = DXP(IC)
 
2847
C
 
2848
       IX    = IC-1
 
2849
 
 
2850
       KG(NWILD) = IX/MA(NWILD) + 1
 
2851
       IF( NWILD .GT. 1 ) THEN
 
2852
           DO 400 J = 1,NWILD-1
 
2853
              NUM   = MOD(IX,MA(J+1))
 
2854
              KG(J) = NUM/MA(J) + 1
 
2855
  400      CONTINUE
 
2856
       ENDIF
 
2857
C
 
2858
C  ------------------------------------------------------------------
 
2859
C                     Sample and test a event
 
2860
C  ------------------------------------------------------------------
 
2861
C
 
2862
      DO 600 NTRY = 1,MXTRY
 
2863
        WGT   = XJAC
 
2864
        DO 550 J=1,NDIM
 
2865
          IF( J .LE. NWILD) THEN
 
2866
             XN    = (KG(J)-DRN(IDUMY))*DXG+ONE
 
2867
          ELSE
 
2868
             XN    = ND*DRN(IDUMY) + ONE
 
2869
          ENDIF
 
2870
          IAJ   = XN
 
2871
          IF(IAJ .EQ. 1) THEN
 
2872
            XO    = XI(IAJ,J)
 
2873
            RC    = (XN-IAJ)*XO
 
2874
          ELSE
 
2875
            XO    = XI(IAJ,J)-XI(IAJ-1,J)
 
2876
            RC    = XI(IAJ-1,J)+(XN-IAJ)*XO
 
2877
          ENDIF
 
2878
          Y(J)  = XL(J) + RC*DX(J)
 
2879
          WGT   = WGT*XO*XND
 
2880
  550   CONTINUE
 
2881
C
 
2882
*       FX    = F(Y)*WGT
 
2883
        FF    = F(Y)
 
2884
        FX    = FF*WGT
 
2885
        FUNCT = FX/FMAX
 
2886
C
 
2887
        IF( FX .GT. 0.0D0 ) THEN
 
2888
*           IF( DRN(IDUMY) .LE. FUNCT ) GO TO 700
 
2889
            XJ = DRN(IDUMY)
 
2890
            IF( XJ .LE. FUNCT ) GO TO 700
 
2891
*           IF( XJ .LE. FUNCT ) THEN
 
2892
*               WRITE(6,9999) NTRY,IC,FF,WGT,XJ,FUNCT
 
2893
*9999           FORMAT(1X,'NTRY,IC,FF,WGT,XJ,FUNCT = ',2I5,4E12.4)
 
2894
*               GO TO 700
 
2895
*           ENDIF
 
2896
        ELSE
 
2897
     .  IF( FX .LT. 0.0D0 ) THEN
 
2898
            WRITE(6,9100) IC
 
2899
 9100       FORMAT(
 
2900
     .      /5X,'********** FATAL ERROR IN SPRING **********',
 
2901
     .      /5X,'* A negative value of function was found  *',
 
2902
     .      /5X,'*        in the ',I6,'-th Hypercube.      *',
 
2903
     .      /5X,'*******************************************')
 
2904
            WRITE(6,9405)
 
2905
 9405       FORMAT(5X,'------',3('+---------------'),'+')
 
2906
            WRITE(6,9410)
 
2907
 9410       FORMAT(5X,'    i       XL(i)             X       ',
 
2908
     .                '     XU(i)')
 
2909
            WRITE(6,9405)
 
2910
            DO 450 I = 1,NDIM
 
2911
                WRITE(6,9420) I,XL(I),Y(I),XU(I)
 
2912
 9420           FORMAT(5X,I5,1P,3('  ',E14.6))
 
2913
  450       CONTINUE
 
2914
            WRITE(6,9405)
 
2915
            STOP
 
2916
        ENDIF
 
2917
C
 
2918
        IF(LHISTO)THEN
 
2919
          CALL SHCLER
 
2920
        ENDIF
 
2921
C
 
2922
  600 CONTINUE
 
2923
 
 
2924
      NTRY  = MXTRY + 1
 
2925
 
 
2926
  700 RETURN
 
2927
      END
 
2928
c
 
2929
c
 
2930
c End of SPRING routines
 
2931
c
 
2932
c
 
2933
c
 
2934
c
 
2935
c Begin of utilities
 
2936
c
 
2937
c
 
2938
      subroutine shinit(mxtry1)
 
2939
      write(6,*)'shinit is not here'
 
2940
      stop
 
2941
      end
 
2942
 
 
2943
 
 
2944
      subroutine shrset
 
2945
      write(6,*)'shrset is not here'
 
2946
      stop
 
2947
      end
 
2948
 
 
2949
 
 
2950
      subroutine shfill(iret)
 
2951
      write(6,*)'shfill is not here'
 
2952
      stop
 
2953
      end
 
2954
 
 
2955
 
 
2956
      subroutine shupdt
 
2957
      write(6,*)'shupdt is not here'
 
2958
      stop
 
2959
      end
 
2960
 
 
2961
 
 
2962
      subroutine sphist(lu)
 
2963
      write(6,*)'sphist is not here'
 
2964
      stop
 
2965
      end
 
2966
 
 
2967
 
 
2968
      subroutine shcler
 
2969
      write(6,*)'shcler is not here'
 
2970
      stop
 
2971
      end
 
2972
 
 
2973
 
 
2974
      subroutine bhinit(lu)
 
2975
      write(6,*)'bhinit is not here'
 
2976
      stop
 
2977
      end
 
2978
 
 
2979
 
 
2980
      subroutine bhrset
 
2981
      write(6,*)'bhrset is not here'
 
2982
      stop
 
2983
      end
 
2984
 
 
2985
 
 
2986
      subroutine bhsave
 
2987
      write(6,*)'bhsave is not here'
 
2988
      stop
 
2989
      end
 
2990
c
 
2991
c
 
2992
c End of utilities
 
2993
c
 
2994
c