summaryrefslogtreecommitdiff
path: root/Dragon/src/MRGLIN.f
blob: 52956dff9ac0884be4035c2b1383df7b1cee8ca7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
*DECK MRGLIN
      SUBROUTINE MRGLIN(IPRINT,IFTRKO,NSOUTO,NVOUTO,IFTRKN,
     >                  IMERGE,NDIM,IFMT,MXSUB,MXSEG)
*
*----------
*
*Purpose:
* Merge volume surface information on track file.
*
*Copyright:
* Copyright (C) 1997 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s):
* G. Marleau
*
*Parameters: input
* IPRINT  print level.
* IFTRKO  old tracking file.
* NSOUTO  old number of surfaces.
* NVOUTO  old number of regions.
* IFTRKN  new tracking file.
* IFMT    file format
* IMERGE  merged position.
* IFMT    track format: =0 short; =1 long.
* MXSUB  maximum number of subtracks in a track.
* MXSEG   maximum number of segments.
*
*----------
*
      IMPLICIT         NONE
      INTEGER          IOUT
      CHARACTER        NAMSBR*6
      PARAMETER       (IOUT=6,NAMSBR='MRGLIN')
*----
*  ROUTINE PARAMETERS
*----
      INTEGER          IPRINT,IFTRKO,NSOUTO,NVOUTO,IFTRKN,
     >                 NDIM,IFMT,MXSUB,MXSEG
      INTEGER          IMERGE(-NSOUTO:NVOUTO)
*----
*  LOCAL VARIABLES
*----
      INTEGER          ITRAK,NLINEO,NLINEN,ILINE,
     >                 ISEG,IVSO,NSUB,IADD(4),IRA,ISU
      DOUBLE PRECISION WEIGHT
*----
*  Allocatable arrays
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: NRSEG,IANGL
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: PATH
      DOUBLE PRECISION , ALLOCATABLE, DIMENSION(:,:) :: DADD
*----
*  LOOP OVER TRACKS
*----
      ALLOCATE(NRSEG(MXSEG),PATH(MXSEG))
      ALLOCATE(IANGL(MXSUB),DADD(NDIM,MXSUB))
      ITRAK=0
 1000 CONTINUE
        IF(IFMT.EQ.1) THEN
          READ (IFTRKO,END=1010) NSUB,NLINEO,WEIGHT,
     >                           (IANGL(IRA),IRA=1,NSUB),
     >                           (NRSEG(ILINE),ILINE=1,NLINEO),
     >                           (PATH(ILINE),ILINE=1,NLINEO),
     >                           (IADD(IRA),IRA=1,4),
     >                          ((DADD(IRA,ISU),IRA=1,NDIM),ISU=1,NSUB)
       ELSE
          READ (IFTRKO,END=1010) NSUB,NLINEO,WEIGHT,
     >                           (IANGL(IRA),IRA=1,NSUB),
     >                           (NRSEG(ILINE),ILINE=1,NLINEO),
     >                           (PATH(ILINE),ILINE=1,NLINEO)
       ENDIF
*----
*  SCAN NRSEG AND RESET TO NEW VOLUME AND SURFACE NUMBER
*----
        ITRAK=ITRAK+1
        IF(IPRINT.GE.1000) THEN
          WRITE(IOUT,6000) ITRAK,NLINEO,WEIGHT,IANGL
          WRITE(IOUT,6010)
     >      (NRSEG(ILINE),PATH(ILINE),ILINE=1,NLINEO)
        ENDIF
        DO 100 ILINE=1,NLINEO
          DO 110 IVSO=-NSOUTO,NVOUTO
            IF(NRSEG(ILINE) .EQ. IVSO ) THEN
              NRSEG(ILINE) = IMERGE(IVSO)
              GO TO 115
            ENDIF
 110      CONTINUE
 115      CONTINUE
 100    CONTINUE
*----
*  COMPRESS REGION OF SUCCESSIVE IDENTICAL REGION
*  EXCEPT FOR SURFACES
*----
        NLINEN=1
        ISEG=NRSEG(NLINEN)
        DO 120 ILINE=2,NLINEO
          IF(NRSEG(ILINE) .EQ. ISEG .AND.
     >       ISEG .GT. 0                  ) THEN
            PATH(NLINEN)=PATH(NLINEN)+PATH(ILINE)
          ELSE
            NLINEN=NLINEN+1
            NRSEG(NLINEN)=NRSEG(ILINE)
            PATH(NLINEN)=PATH(ILINE)
            ISEG=NRSEG(NLINEN)
          ENDIF
 120    CONTINUE
        IF(IFMT.EQ.1) THEN
          WRITE(IFTRKN) NSUB,NLINEN,WEIGHT,
     >                  (IANGL(IRA),IRA=1,NSUB),
     >                  (NRSEG(ILINE),ILINE=1,NLINEN),
     >                  (PATH(ILINE),ILINE=1,NLINEN),
     >                  (IADD(IRA),IRA=1,4),
     >                 ((DADD(IRA,ISU),IRA=1,NDIM),ISU=1,NSUB)
        ELSE
          WRITE(IFTRKN) NSUB,NLINEN,WEIGHT,
     >                  (IANGL(IRA),IRA=1,NSUB),
     >                  (NRSEG(ILINE),ILINE=1,NLINEN),
     >                  (PATH(ILINE),ILINE=1,NLINEN)
        ENDIF
        IF(IPRINT.GE.1000) THEN
          WRITE(IOUT,6001) ITRAK,NLINEN,WEIGHT,IANGL
          WRITE(IOUT,6010)
     >      (NRSEG(ILINE),PATH(ILINE),ILINE=1,NLINEN)
        ENDIF
      GO TO 1000
 1010 CONTINUE
      DEALLOCATE(DADD,IANGL)
      DEALLOCATE(PATH,NRSEG)
*----
*  FORMAT
*----
 6000 FORMAT(' INITIAL LINE = ',I10/
     >       ' PARAMETERS = ',I10,F15.7,10I10)
 6001 FORMAT(' FINAL LINE = ',I10/
     >       ' PARAMETERS = ',I10,F15.7,10I10)
 6010 FORMAT(1P,5(I10,E15.7))
      RETURN
      END