summaryrefslogtreecommitdiff
path: root/Dragon/src/MRGVOL.f
blob: 1ff11525575789cf3fa5578cbb1f03f357c2c3d4 (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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
*DECK MRGVOL
      SUBROUTINE MRGVOL(IUPD  ,NSOUTO,NVOUTO,NSOUTN,NVOUTN,NUNN  ,
     >                  IMERGE,MIXN  ,MATO  ,VOLO  ,MATN  ,VOLN  ,
     >                  KEYN  ,MATRTO,MATRTN,MAXMN ,NETVOL,NETSUR,
     >                  MATRO ,KEYRO ,MATRN ,KEYRN )
*
*----------
*
*Purpose:
* Merge information on data structure.
*
*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
* IUPD    type of merge required:
*         IUPD(1) for region merge;
*         IUPD(2) for surface merge;
*         IUPD(3) for material merge;
*         IUPD(4) for albedo merge.
* NSOUTO  old number of surfaces.
* NVOUTO  old number of regions.
* NSOUTN  new number of surfaces.
* NVOUTN  new number of regions.
* NUNN    new number of unknowns.
* IMERGE  merged position.
* MIXN    new material for old regions.
* MATO    old material per region.
* VOLO    old volumes.
* MATRTO  old B.C. conditions.
* NETVOL  number of original regions.
* NETSUR  number of original surfaces.
* MATRO   old regional MATALB.
* KEYRO   old regional KEYMRG.
*
*Parameters: output
* MATN    new material per region.
* VOLN    new volumes.
* KEYN    new keyflux.
* MATRTN  new B.C. conditions.
* MAXMN   new maximum number of mixture.
* MATRN   new regional MATALB.
* KEYRN   new regional KEYMRG.
*
*----------
*
      IMPLICIT         NONE
      INTEGER          IOUT
      CHARACTER        NAMSBR*6
      PARAMETER       (IOUT=6,NAMSBR='MRGVOL')
*----
*  ROUTINE PARAMETERS
*----
      INTEGER          IUPD(4),NSOUTO,NVOUTO,NSOUTN,NVOUTN,NUNN,
     >                 MAXMN,NETVOL,NETSUR
      INTEGER          IMERGE(-NSOUTO:NVOUTO),MIXN(NVOUTO),
     >                 MATO(NVOUTO),MATN(NVOUTN),KEYN(NUNN),
     >                 MATRTO(NSOUTO),MATRTN(NSOUTN),
     >                 MATRO(-NETSUR:NETVOL),KEYRO(-NETSUR:NETVOL),
     >                 MATRN(-NSOUTN:NVOUTN),KEYRN(-NSOUTN:NVOUTN)
      REAL             VOLO(NVOUTO),VOLN(NVOUTN)
*----
*  LOCAL VARIABLES
*----
      INTEGER          IVSN,IVSO
      DOUBLE PRECISION DVOL
*----
*  TRANSFER OLD KEYMRG AND MATALB TO NEW VECTOR
*----
      DO 90 IVSN=-NETSUR,NETVOL
        KEYRN(IVSN)=KEYRO(IVSN)
        MATRN(IVSN)=MATRO(IVSN)
 90   CONTINUE
*----
*  CHANGE ORIGINAL MATERIAL IF REQUESTED
*----
      IF(IUPD(3) .GT. 0) THEN
        DO 100 IVSN=1,IUPD(3)
          MATO(IVSN)=MIXN(IVSN)
          DO 101 IVSO=1,NETVOL
            IF(KEYRO(IVSO) .EQ. IVSN) THEN
              MATRN(IVSO)=MATO(IVSN)
            ENDIF
 101      CONTINUE
 100    CONTINUE
      ENDIF
      IF(IUPD(1) .GT. 0) THEN
*----
*  MERGE MATERIAL VOLUME AND KEY
*----
        DO 110 IVSN=1,NVOUTN
          MATN(IVSN)=0
          DVOL=0.0D0
          DO 111 IVSO=1,NVOUTO
           IF(IMERGE(IVSO) .EQ. IVSN) THEN
             IF(MATN(IVSN) .EQ. 0) THEN
               MATN(IVSN)=MATO(IVSO)
             ELSE IF(MATN(IVSN) .NE. MATO(IVSO))THEN
               WRITE(IOUT,6000) NAMSBR,IVSN,MATN(IVSN),IVSO,MATO(IVSO)
               CALL XABORT(NAMSBR//
     >           ': MATERIAL INCOMPATIBLE FOR MERGE')
             ENDIF
             DVOL=DVOL+DBLE(VOLO(IVSO))
           ENDIF
 111      CONTINUE
          VOLN(IVSN)=REAL(DVOL)
          KEYN(IVSN)=IVSN
 110    CONTINUE
        DO 112 IVSN=NVOUTN+1,NUNN
          KEYN(IVSN)=0
 112    CONTINUE
        DO 113 IVSO=1,NVOUTO
          DO 114 IVSN=1,NETVOL
            IF(KEYRO(IVSN) .EQ. IVSO) THEN
              KEYRN(IVSN)=IMERGE(IVSO)
            ENDIF
 114      CONTINUE
 113    CONTINUE
      ELSE
*----
*  NO MERGE TRANSFER INFORMATION TO NEW VECTORS
*----
        DO 120 IVSO=1,NVOUTO
          MATN(IVSO)=MATO(IVSO)
          VOLN(IVSO)=VOLO(IVSO)
 120    CONTINUE
      ENDIF
*----
*  CHANGE FINAL MATERIAL IF REQUESTED
*----
      IF(IUPD(3) .LT. 0) THEN
        DO 130 IVSN=1,-IUPD(3)
          MATN(IVSN)=MIXN(IVSN)
          DO 131 IVSO=1,NETVOL
            IF(KEYRO(IVSO) .EQ. IVSN) THEN
              MATRN(IVSO)=MIXN(IVSN)
            ENDIF
 131      CONTINUE
 130    CONTINUE
      ENDIF
*----
*  FIND NEW MAXIMUM NUMBER OF MIXTURE
*----
      MAXMN=0
      DO 140 IVSN=1,NVOUTN
        MAXMN=MAX(MAXMN,MATN(IVSN))
 140  CONTINUE
*----
*  MERGE REFLECTION/TRANSMISSION MATRIX
*----
      IF(IUPD(2).EQ.0) THEN
        DO 150 IVSN=1,NSOUTO
          MATRTN(IVSN)=MATRTO(IVSN)
 150    CONTINUE
      ELSE
        DO 160 IVSN=-NSOUTN,-1,1
          DO 161 IVSO=-NSOUTO,-1,1
            IF(IMERGE(IVSO).EQ.IVSN) THEN
              MATRTN(-IVSN)=-IMERGE(-MATRTO(-IVSO))
              GO TO 165
            ENDIF
 161      CONTINUE
 165      CONTINUE
 160    CONTINUE
*----
*  TEST IF MATRTN IS COHERENT
*----
        DO 162 IVSN=1,NSOUTN
          IVSO=MATRTN(IVSN)
          IF(MATRTN(IVSO).NE.IVSN) THEN
            CALL XABORT(NAMSBR//
     >           ': SURFACES BC INCOMPATIBLE FOR MERGE')
          ENDIF
 162    CONTINUE
        DO 163 IVSO=-1,-NSOUTO,-1
          DO 164 IVSN=-1,-NETSUR,-1
            IF(KEYRO(IVSN) .EQ. IVSO) THEN
              KEYRN(IVSN)=IMERGE(IVSO)
            ENDIF
 164      CONTINUE
 163    CONTINUE
      ENDIF
      RETURN
*----
*  ABORT FORMATS
*----
 6000 FORMAT(' ------ ABORT IN ROUTINE ',A6,'  ------'/
     >       ' MATERIAL INCOMPATIBLE FOR MERGE '/
     >       ' NEW REGION = ',I10,5X,'MATERIAL =',I10/
     >       ' OLD REGION = ',I10,5X,'MATERIAL =',I10/
     >       ' ----------------------------------------')
      END