summaryrefslogtreecommitdiff
path: root/Dragon/src/XCGDIM.f
blob: a28fb9864e49dd6ce70927faf15d03ead2696039 (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
*DECK XCGDIM
      SUBROUTINE XCGDIM(IPGEOM,MREGIO,NSOUT,IROT,IAPP,MAXJ,NVOL,
     >                  NBAN,MNAN,NRT,MSROD,MAROD,NSURF)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Initialize dimension for 2-D cluster geometry.
*
*Copyright:
* Copyright (C) 2007 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
* IPGEOM  pointer to the geometry.
* MREGIO  maximum number of regions.
* NSOUT   number of surface for outer region.
* IROT    type of PIJ reconstruction:
*         =0  CP calculations;
*         =1 direct JPM reconstruction;
*         =2 rot2 type reconstruction.
* IAPP    type of surface conditions
*         level of dp approximation for jpm:
*         =1 DP0 all;
*         =2 DP1 all (default);
*         =3 DP1 inside DP0 outside symmetry conditions for CP.
* MAXJ    maximum number of currents.
*         Unused for CP calculations.
*
*Parameters: output
* NVOL    number of regions.
* NBAN    number of concentric regions.
* MNAN    maximum nunber of radius to read.
* NRT     number of rod types.
* MSROD   maximum number of subrods per rods.
* MAROD   maximum number of rods an annulus.
* NSURF   maximum number real surfaces.
*         Unused for CP calculation.
*
*----------------------------------------------------------------------
*
      USE         GANLIB
      PARAMETER  (NSTATE=40)
      TYPE(C_PTR) IPGEOM
      INTEGER     MREGIO,NSOUT,IROT,IAPP,MAXJ,NVOL,
     >            NBAN,MNAN,NRT,MSROD,MAROD,NSURF,ISTATE(NSTATE)
      CHARACTER   CMSG*131,TEXT12*12
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: JSPLIT,JGEOM
*----
*  CHECK FOR VALID IROT AND GEOMETRY
*----
      IF(IROT.GT.2.OR.IROT.LT.0)
     >  CALL XABORT('XCGDIM: UNABLE TO PROCESS THE GEOMETRY.')
      ISTATE(:NSTATE)=0
      CALL LCMGET(IPGEOM,'STATE-VECTOR',ISTATE)
*----
*  CHECK FOR INVALID GEOMETRY OPTIONS
*  ISTATE( 8) -> CELL IS INVALID
*  ISTATE(10) -> MERGE IS INVALID
*  ISTATE(11) -> SPLIT IS INVALID FOR CLUSTER ANNULUS
*----
      IF ( (ISTATE(8).NE.0).OR.(ISTATE(10).NE.0) )
     >     CALL XABORT('XCGDIM: UNABLE TO PROCESS THE GEOMETRY.')
      IF(ISTATE(11).EQ.0) THEN
        NVOL=ISTATE(6)
      ELSE
        CALL LCMLEN(IPGEOM,'SPLITR',NSPLIT,ITYPE)
        IF(ITYPE.NE.1)
     >    CALL XABORT('XCGDIM: SPLIT RECORD ON LCM IS NOT INTEGER')
        ALLOCATE(JSPLIT(NSPLIT))
        CALL LCMGET(IPGEOM,'SPLITR',JSPLIT)
        IF(NSOUT.GT.1) THEN
          NVOL=1
        ELSE
          NVOL=0
        ENDIF
        DO 135 ISPLIT=1,NSPLIT
          NVOL=NVOL+ABS(JSPLIT(ISPLIT))
 135    CONTINUE
        DEALLOCATE(JSPLIT)
      ENDIF
      NBAN=NVOL
      MNAN=NBAN+1
      IF(NSOUT.EQ.4) THEN
        MNAN=MNAN+3
      ENDIF
      IF(NSOUT.EQ.4) THEN
        NSURF=2*NVOL+2
      ELSE IF(NSOUT.EQ.6) THEN
        NSURF=2*NVOL+4
      ELSE
        NSURF=2*NVOL-1
      ENDIF
*----
*  COUNT NUMBER OF ROD TYPES IN CLUSTER
*----
      CALL LCMLEN(IPGEOM,'CLUSTER',ILONG,ITYPE)
      IF(ITYPE.NE.3)
     >   CALL XABORT('XCGDIM: CLUSTER RECORD ON LCM IS NOT CHARACTER')
      NRT=ILONG/3
      IF(ISTATE(9).LT.NRT) THEN
        WRITE(CMSG,9001) ISTATE(9),NRT
        CALL XABORT(CMSG)
      ENDIF
      ALLOCATE(JGEOM(ILONG))
      IPOS=1
      MSROD=1
      MAROD=1
      CALL LCMGET(IPGEOM,'CLUSTER',JGEOM)
*----
*  FOR EACH ROD TYPE FIND NUMBER OF SUBRODS AND NUMBER OF PINS
*----
      DO 120 IRT=1,NRT
        WRITE(TEXT12(1:4),'(A4)')  JGEOM(IPOS)
        WRITE(TEXT12(5:8),'(A4)')  JGEOM(IPOS+1)
        WRITE(TEXT12(9:12),'(A4)') JGEOM(IPOS+2)
        IPOS=IPOS+3
        CALL LCMSIX(IPGEOM,TEXT12,1)
        ISTATE(:NSTATE)=0
        CALL LCMGET(IPGEOM,'STATE-VECTOR',ISTATE)
        CALL LCMGET(IPGEOM,'RPIN',RPIN)
        CALL LCMGET(IPGEOM,'NPIN',NPIN)
        MAROD=MAX(MAROD,NPIN)
        IF(RPIN.EQ.0.0) THEN
          IROTS=1
        ELSE
          IROTS=IROT
        ENDIF
        IF(ISTATE(1).NE.3) THEN
          WRITE(CMSG,9002) ISTATE(1)
          CALL XABORT(CMSG)
        ENDIF
        IF(ISTATE(11).EQ.0) THEN
          NVOL=NVOL+ISTATE(6)
          NMSROD=ISTATE(6)
          IF(IROT.GT.0) NSURF=NSURF+2*IROTS*ISTATE(6)
        ELSE
          CALL LCMLEN(IPGEOM,'SPLITR',NSPLIT,ITYPE)
          IF(ITYPE.NE.1)
     >      CALL XABORT('XCGDIM: SPLIT RECORD ON LCM IS NOT INTEGER')
          ALLOCATE(JSPLIT(NSPLIT))
          CALL LCMGET(IPGEOM,'SPLITR',JSPLIT)
          NMSROD=0
          DO 130 ISPLIT=1,NSPLIT
            NMSROD=NMSROD+ABS(JSPLIT(ISPLIT))
            NVOL=NVOL+ABS(JSPLIT(ISPLIT))
 130      CONTINUE
          IF(IROT.GT.0) NSURF=NSURF+2*IROTS*NMSROD
          DEALLOCATE(JSPLIT)
        ENDIF
        MSROD=MAX(MSROD,NMSROD)
        CALL LCMSIX(IPGEOM,' ',2)
 120  CONTINUE
      MNAN=MAX(MNAN,MSROD+1)
      DEALLOCATE(JGEOM)
*----
*  CHECK IF NUMBER OF REGIONS IS ADEQUATE
*----
      IF (NVOL.GT.MREGIO) THEN
        WRITE(CMSG,9003) MREGIO,NVOL
        CALL XABORT(CMSG)
      ENDIF
      IF(IROT.GT.0) THEN
        IF(IAPP.EQ.3) THEN
          IAPPR=2
        ELSE
          IAPPR=IAPP
        ENDIF
        IF(NSOUT.EQ.4) THEN
          NSURF=NSURF*IAPPR+4
        ELSE IF(NSOUT.EQ.6) THEN
          NSURF=NSURF*IAPPR+6
        ELSE
        NSURF=NSURF*IAPPR
        ENDIF
        IF(MAXJ.LT.NSURF) THEN
          WRITE(CMSG,9004) NSURF,MAXJ
          CALL XABORT(CMSG)
        ENDIF
      ELSE
        NSURF=1
        IF(NSOUT.EQ.6) THEN
          CALL LCMGET(IPGEOM,'IHEX',IHEX)
          IF(IHEX.EQ.1) THEN
            IAPP=12
          ELSE IF(IHEX.EQ.3) THEN
            IAPP=6
          ENDIF
        ENDIF
      ENDIF
      RETURN
*----
*  ERROR MESSAGES FORMATS
*----
 9001 FORMAT('XCGDIM: ONLY ',I10,5X,'SUB GEOMETRIES ON LCM WHILE ',5X,
     >       I10,5X,'SUB GEOMETRIES ARE REQUIRED BY CLUSTER')
 9002 FORMAT('XCGDIM: ',I10,5X,'IS AN ILLEGAL GEOMETRY INSIDE CLUSTER')
 9003 FORMAT('XCGDIM: MAXIMUM NUMBER OF REGION ALLOCATED =',I10,
     >       5X,'NUMBER OF REGION REQUIRED =',I10)
 9004 FORMAT('XCGDIM: NUMBER OF CURRENT=',I10,5X,'IS LARGER THAN ',
     >'ALLOWED MAXIMUM VALUE MAXJ=',I10)
      END