summaryrefslogtreecommitdiff
path: root/Dragon/src/PSPLEG.f
blob: f445106d95d80ee4289b7b0dac27c1d0399e8149 (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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
*DECK PSPLEG
      SUBROUTINE PSPLEG(IPRINT,ISPSP ,ITYPE ,ICOLR ,NSUR  ,NVOL  ,
     >                  NAMLEG,NUNKNO,FLUX  ,NREGT ,
     >                  MATALB,KEYMRG,KEYFLX,COLREG)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Associate a color to a region and print legend.
*
*Copyright:
* Copyright (C) 1999 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.
* ISPSP   PSP file unit.
* ITYPE   type of graphic:
*         =  0 color per region number;
*         =  1 color per material;
*         =  2 color for flux (one group);
*         =  3 color for flux (multigroup);
*         =  4 color per material for homogenization (HMIX).
* ICOLR   color set used:
*         = -4 fill hsb with no-contour;
*         = -3 fill cmyk with no-contour;
*         = -2 fill rgb with no-contour;
*         = -1 fill bw with no-contour;
*         =  0 no fill contour only;
*         =  1 fill bw and contour;
*         =  2 fill rgb and contour;
*         =  3 fill cmyk and contour;
*         =  4 fill hsb and contour.
* NSUR    number of outer surface.
* NVOL    maximum number of regions.
* NAMLEG  legend name.
* NUNKNO  number of unknowns.
* FLUX    unknown vector.
* NREGT   dimension of KEYFLX vector.
* MATALB  albedo-material of regions.
* KEYMRG  merge index.
* KEYFLX  flux location.
* COLREG  region color.
*
*-----------------------------------------------------------------------
*
      IMPLICIT         NONE
      INTEGER          IOUT
      CHARACTER        NAMSBR*6
      REAL             WLINE
      PARAMETER       (IOUT=6,WLINE=0.002,NAMSBR='PSPLEG')
*----
*  ROUTINE PARAMETERS
*----
      INTEGER          IPRINT,ISPSP,ITYPE,ICOLR,NSUR,NVOL,
     >                 NUNKNO,NREGT
      INTEGER          MATALB(NSUR:NVOL),KEYMRG(NSUR:NVOL),
     >                 KEYFLX(NVOL)
      REAL             FLUX(NUNKNO),COLREG(4,NVOL)
      REAL             COLTMP(4)
      CHARACTER        NAMLEG*24
*----
*  LOCAL PARAMETERS
*----
      CHARACTER        COLNAM*4,LEGTXT*48,FLXTXT*80
      INTEGER          MXMIX,MREG,IVOL,IMX,IRG,ICOLA,
     >                 ILEG,IFRM,MXCOL,ICOLF,IKEY
      INTEGER          KMX,ICT
      REAL             XYPOS(2),POSL,POSB,DELX,DELY,DELXC,DELYC,
     >                 XYPTS(2,4),FLXMIN,FLXMAX,DELFLX,COLFLX(4)
      INTEGER          KFS,KFR,KSS,KSR
*----
*  INITIALIZE LEGEND
*----
      KFS=0
      KFR=0
      KSS=0
      KSR=0
      ICOLA=ABS(ICOLR)
      IF(ICOLA .GT. 0) THEN
        KFS=1
        KSR=1
      ENDIF
      IF(ICOLA .GE. 2) THEN
        LEGTXT='Color by '//NAMLEG
      ELSE
        LEGTXT='Graylevel by '//NAMLEG
      ENDIF
      ILEG=1
      IF(IPRINT .LE. 0) THEN
        ILEG=0
      ENDIF
*----
*  GENERATE RANDOM COLOR
*  FOR RGB USE ALL THREE COLORS
*  FOR BW USE ONLY FIRST COLOR
*  SKIP FOR NONE
*----
      IF(ICOLA .GT. 0) THEN
        POSL=0.0
        POSB=10.0
        XYPOS(1)=POSL
        XYPOS(2)=POSB
        IF(ILEG .EQ. 1) THEN
          CALL PSTEXT(ISPSP,6,'Legend',
     >      XYPOS,0.1,0,0.0)
        ENDIF
        IF(ITYPE .EQ. 0) THEN
*----
*  COMPUTE NUMBER OF REGIONS AFTER MERGE
*----
          MREG=0
          DO 100 IVOL=1,NVOL
            MREG=MAX(MREG,KEYMRG(IVOL))
 100      CONTINUE
*----
*  GENERATE ONE COLOR PER REGION
*----
          POSB=POSB-0.2
          XYPOS(2)=POSB
          IF(ILEG .EQ. 1) THEN
            CALL PSTEXT(ISPSP,48,LEGTXT,XYPOS,0.1,0,0.0)
          ENDIF
          POSB=POSB-0.2
          IF(MREG .GT. 10000) THEN
            ILEG=0
          ENDIF
          DELX=0.2
          DELY=DELX/2.0
          DELXC=DELY
          DELYC=DELXC/4.0
          DO 110 IRG=1,MREG
            IFRM=0
            IF(MOD(IRG-1,30) .EQ. 0 .AND. ILEG .EQ. 1) THEN
              POSB=POSB-DELY
            ENDIF
            DO 111 IVOL=1,NVOL
              IF(KEYMRG(IVOL) .EQ. IRG) THEN
                CALL PSPCOL(ICOLA,MREG,IRG,COLREG(1,IVOL))
                IF(IFRM .EQ. 0 .AND. ILEG .EQ.1) THEN
                  IFRM=IFRM+1
                  POSL=MOD(IRG-1,30)*DELX
                  XYPTS(1,1)=POSL
                  XYPTS(2,1)=POSB
                  XYPTS(1,2)=POSL+DELX
                  XYPTS(2,2)=POSB
                  XYPTS(1,3)=POSL+DELX
                  XYPTS(2,3)=POSB+DELY
                  XYPTS(1,4)=POSL
                  XYPTS(2,4)=POSB+DELY
                  CALL PSDREG(ISPSP,4,XYPTS)
                  IF(ICOLA .GT. 0) THEN
                    CALL PSFILL(ISPSP,ICOLA,COLREG(1,IVOL),KFS,KFR)
                  ENDIF
                  CALL PSSTRK(ISPSP,WLINE,KSS,KSR)
                  WRITE(COLNAM,'(I4)') IRG
                  XYPOS(1)=POSL+DELXC
                  XYPOS(2)=POSB+DELYC
                  CALL PSTEXT(ISPSP,4,COLNAM,XYPOS,0.05,1,0.0)
                ENDIF
              ENDIF
 111        CONTINUE
 110      CONTINUE
        ELSE IF(ITYPE .EQ. 1 .OR. ITYPE .EQ. 4) THEN
*----
*  COMPUTE NUMBER OF MIXTURES
*----
          MXMIX=0
          DO 120 IVOL=1,NVOL
            MXMIX=MAX(MXMIX,MATALB(IVOL))
 120      CONTINUE
          POSB=POSB-0.2
          XYPOS(2)=POSB
          IF(ILEG .EQ. 1) THEN
            CALL PSTEXT(ISPSP,32,LEGTXT,XYPOS,0.1,0,0.0)
          ENDIF
          POSB=POSB-0.2
          IF(MXMIX .GT. 10000) THEN
            ILEG=0
          ENDIF
          KMX=0
          DELX=0.2
          DELY=DELX/2.0
          DELXC=DELY
          DELYC=DELXC/4.0
*----
*  GENERATE ONE COLOR PER MIXTURE
*----
          DO 130 IMX=0,MXMIX
            KMX=KMX+1
            IFRM=0
            IF(MOD(KMX-1,30).EQ.0 .AND. ILEG .EQ. 1) THEN
              POSB=POSB-DELY
            ENDIF
            CALL PSPCOL(ICOLA,MXMIX,IMX,COLTMP(1))
            IF (ILEG.EQ.1) THEN
              POSL=MOD(KMX-1,30)*DELX
              XYPTS(1,1)=POSL
              XYPTS(2,1)=POSB
              XYPTS(1,2)=POSL+DELX
              XYPTS(2,2)=POSB
              XYPTS(1,3)=POSL+DELX
              XYPTS(2,3)=POSB+DELY
              XYPTS(1,4)=POSL
              XYPTS(2,4)=POSB+DELY
              CALL PSDREG(ISPSP,4,XYPTS)
              IF(ICOLA .GT. 0) THEN
                 CALL PSFILL(ISPSP,ICOLA,COLTMP(1),KFS,KFR)
              ENDIF
              CALL PSSTRK(ISPSP,WLINE,KSS,KSR)
              WRITE(COLNAM,'(I4)') IMX
              XYPOS(1)=POSL+DELXC
              XYPOS(2)=POSB+DELYC
              CALL PSTEXT(ISPSP,4,COLNAM,XYPOS,0.05,1,0.0)
            ENDIF
*----
*  ASSOCIATE MIXTURE COLOR WITH REGION
*----
            DO 131 IVOL=1,NVOL
              IF(MATALB(IVOL) .EQ. IMX) THEN
                DO 132 ICT=1,4
                  COLREG(ICT,IVOL)=COLTMP(ICT)
 132            CONTINUE
              ENDIF
 131        CONTINUE
 130      CONTINUE
        ELSE IF(ITYPE .EQ. 2 .OR. ITYPE .EQ. 3 .OR.
     >          ITYPE .EQ. 5 .OR. ITYPE .EQ. 6) THEN
*----
*  COMPUTE NUMBER OF REGIONS AFTER MERGE
*----
          POSB=POSB-0.2
          XYPOS(2)=POSB
          IF(ILEG .EQ. 1) THEN
            CALL PSTEXT(ISPSP,32,LEGTXT,XYPOS,0.1,0,0.0)
          ENDIF
          POSB=POSB-0.2
*----
*  FIND MAXIMUM AND MINIMUM FLUX
*----
          FLXMAX=FLUX(KEYFLX(1))
          FLXMIN=FLUX(KEYFLX(1))
          DO 150 IRG=2,NREGT
            IKEY=KEYFLX(IRG)
            FLXMAX=MAX(FLXMAX,FLUX(IKEY))
            FLXMIN=MIN(FLXMIN,FLUX(IKEY))
 150      CONTINUE
          MXCOL=20
          DELFLX=(FLXMAX-FLXMIN)/REAL(MXCOL)
          WRITE(FLXTXT,5000) FLXMIN,DELFLX,FLXMIN,DELFLX
          XYPOS(2)=POSB
          IF(ILEG .EQ. 1) THEN
            CALL PSTEXT(ISPSP,80,FLXTXT,XYPOS,0.1,0,0.0)
          ENDIF
          POSB=POSB-0.2
          DELX=0.2
          DELY=DELX/2.0
          DELXC=DELY
          DELYC=DELXC/4.0
*----
*  GENERATE ONE COLOR PER FLUX LEVEL
*  COLOR I IS GIVEN BY:
*  I=MIN(INT((FLUX-FLXMIN)/DELFLX)+1,MXCOL)
*----
          POSB=POSB-DELY
          DO 160 ICOLF=1,MXCOL
            CALL PSPCOL(ICOLA,MXCOL,ICOLF,COLFLX(1))
            POSL=MOD(ICOLF-1,30)*DELX
            XYPTS(1,1)=POSL
            XYPTS(2,1)=POSB
            XYPTS(1,2)=POSL+DELX
            XYPTS(2,2)=POSB
            XYPTS(1,3)=POSL+DELX
            XYPTS(2,3)=POSB+DELY
            XYPTS(1,4)=POSL
            XYPTS(2,4)=POSB+DELY
            CALL PSDREG(ISPSP,4,XYPTS)
            IF(ICOLA .GT. 0) THEN
              CALL PSFILL(ISPSP,ICOLA,COLFLX(1),KFS,KFR)
            ENDIF
            CALL PSSTRK(ISPSP,WLINE,KSS,KSR)
            WRITE(COLNAM,'(I4)') ICOLF
            XYPOS(1)=POSL+DELXC
            XYPOS(2)=POSB+DELYC
            CALL PSTEXT(ISPSP,4,COLNAM,XYPOS,0.05,1,0.0)
 160      CONTINUE
          DO 170 IRG=1,NREGT
            IKEY=KEYFLX(IRG)
            ICOLF=INT((FLUX(IKEY)-FLXMIN)/DELFLX)+1
            ICOLF=MIN(ICOLF,MXCOL)
            DO 171 IVOL=1,NVOL
              IF(KEYMRG(IVOL) .EQ. IRG) THEN
                CALL PSPCOL(ICOLA,MXCOL,ICOLF,COLREG(1,IVOL))
              ENDIF
 171        CONTINUE
 170      CONTINUE
        ENDIF
      ENDIF
      RETURN
*----
*  FORMAT
*----
 5000 FORMAT(1P,E9.2,'+(i-1)*',E9.2,
     >       ' < Flux(i) <= ',E9.2,'+i*',E9.2)
      END