summaryrefslogtreecommitdiff
path: root/Dragon/src/PSPMCP.f
blob: 16c2df35f0c7fc63f51a4c524b9dcfbcf8b4338c (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
*DECK PSPMCP
      SUBROUTINE PSPMCP(ISPSP,OFFC,FACT,N,COORD,REGI,EVENT)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Add MC: neutron paths to the graphics of a 2-D NXT geometry.
*
*Copyright:
* Copyright (C) 2008 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): R. Le Tellier
*
*Parameters: input
* ISPSP   pointer to the POSTSCRIPT file.
* OFFC    offset vector. 
* FACT    scaling factor.
* N       number of points.
* COORD   points coordinates.
* REGI    regions indexes.
* EVENT   event indexes.
* 
*-----------------------------------------------------------------------
* 
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER ISPSP,N,REGI(N),EVENT(N)
      DOUBLE PRECISION COORD(3,N),OFFC(2),FACT
*----
*  LOCAL VARIABLES
*----
      REAL WLINE,HTEX,HCRO
      PARAMETER(WLINE=0.002,HTEX=0.11,HCRO=0.03)
      INTEGER I,IDIR,NCHAR,IREG
      REAL POS(2),POSO(2),SEG(2,2),CENTER(2),RADANG(2,2)
      CHARACTER TEXT*5,FORM*4
      LOGICAL START
      INTEGER IORDER(2)
      DATA IORDER /-2,-1 /
*
      START=.TRUE.
      DO I=1,N
*        CALCULATE POSITION IN GRAPHICS COORDINATES
         POS(1)=REAL(FACT*(COORD(1,I)-OFFC(1)))
         POS(2)=REAL(FACT*(COORD(2,I)-OFFC(2)))
         IF (START) THEN
*        STARTING POINT: DRAW A CIRCLE
            CALL PSMOVE(ISPSP,POS,-3)
            RADANG(1,1)=HCRO
            RADANG(2,1)=0.0
            RADANG(1,2)=HCRO
            RADANG(2,2)=6.30
            CALL PSDRAI(ISPSP,2,IORDER,POS,RADANG)
            CALL PSSTRK(ISPSP,WLINE,0,0)
            CENTER(1)=-POS(1)
            CENTER(2)=-POS(2)
            CALL PSMOVE(ISPSP,CENTER,-3)
         ELSE
*        DRAW A SEGMENT FROM PREVIOUS POINT TO THIS ONE
            DO IDIR=1,2
               SEG(IDIR,1)=POSO(IDIR)
               SEG(IDIR,2)=POS(IDIR)
            ENDDO
            CALL PSDREG(ISPSP,2,SEG)
            CALL PSSTRK(ISPSP,WLINE,0,0)           
         ENDIF
         IF (REGI(I).GT.0) THEN
            IREG=REGI(I)
            START=.FALSE.
         ELSE
            IREG=-REGI(I)
*           ENDING POINT: DRAW A CROSS
            DO IDIR=1,2
               SEG(IDIR,1)=POS(IDIR)-HCRO
               SEG(IDIR,2)=POS(IDIR)+HCRO
            ENDDO
            CALL PSDREG(ISPSP,2,SEG)
            CALL PSSTRK(ISPSP,WLINE,0,0)
            SEG(1,1)=SEG(1,1)+2.0*HCRO
            SEG(1,2)=SEG(1,2)-2.0*HCRO
            CALL PSDREG(ISPSP,2,SEG)
            CALL PSSTRK(ISPSP,WLINE,0,0)
            START=.TRUE.
         ENDIF
*        SAVE PREVIOUS POSITION
         POSO(1)=POS(1)
         POSO(2)=POS(2)
*        INDICATE REGION/SURFACE INDEX
         NCHAR=1
         IF ((IREG.GE.10.).AND.(IREG.LT.100)) THEN
            NCHAR=2
         ELSEIF ((IREG.GE.100.).AND.(IREG.LT.1000)) THEN
            NCHAR=3
         ELSEIF ((IREG.GE.1000.).AND.(IREG.LT.10000)) THEN
            NCHAR=4
         ELSEIF ((IREG.GE.10000.).AND.(IREG.LT.100000)) THEN
            NCHAR=5
         ENDIF
*        WHICH EVENT TOOK PLACE? 
         IF (EVENT(I).LT.0) THEN
*        ENCOUNTERING A SURFACE: indicated by a minus in front of the
*        region index
            NCHAR=NCHAR+1
            IREG=-IREG
            IF (EVENT(I).EQ.-1) THEN
*           X- surface
            POS(1)=POS(1)-0.5*NCHAR*HTEX
            POS(2)=POS(2)-0.5*HTEX
            ELSEIF (EVENT(I).EQ.-2) THEN
*           X+ surface
            POS(1)=POS(1)+0.5*NCHAR*HTEX
            POS(2)=POS(2)-0.5*HTEX
            ELSEIF (EVENT(I).EQ.-3) THEN
*           Y- surface
            POS(2)=POS(2)-1.2*HTEX
            ELSEIF (EVENT(I).EQ.-4) THEN
*           Y+ surface
            POS(2)=POS(2)+0.2*HTEX
            ENDIF
         ELSE
*        INTERACTION IN REGION
*
*        etc ...
*
            POS(2)=POS(2)+0.2*HTEX
         ENDIF
         WRITE(FORM,'(1H(,A1,I1,1H))') 'I',NCHAR
         WRITE(TEXT,FORM) IREG
         CALL PSTEXT(ISPSP,NCHAR,TEXT(1:NCHAR),POS,HTEX,1,0)
      ENDDO
*
      RETURN
      END