summaryrefslogtreecommitdiff
path: root/Donjon/src/RESHID.f
blob: 81ed496e02f87e079d1c2f9419c76f4f4f60f701 (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
*DECK RESHID
      SUBROUTINE RESHID(IPMAP,IPMTX,NX,NZ,LX,LZ,MIX,NFUEL,IMPX)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Update material index, it will store the negative fuel mixtures.
*
*Copyright:
* Copyright (C) 2007 Ecole Polytechnique de Montreal.
*
*Author(s): 
* V. Descotes
*
*Parameters: input/output
* IPMAP  pointer to fuel-map information.
* IPMTX  pointer to matex information.
* NX     number of elements along x-axis in fuel map.
* NZ     number of elements along z-axis in fuel map.
* LX     number of elements along x-axis in geometry.
* LZ     number of elements along z-axis in geometry.
* MIX    renumbered index over the fuel-map geometry.
* NFUEL  number of fuel types.
* IMPX   printing index (=0 for no print).
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPMAP,IPMTX
      INTEGER NX,NZ,LX,LZ,MIX(NX*NZ),NFUEL,IMPX
*----
*  LOCAL VARIABLES
*----
      PARAMETER(IOUT=6)
      INTEGER ISPLTY(1),NCODE(6)
      REAL    MTXSIDE,MAPSIDE
      TYPE(C_PTR) JPMAP
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IMAT,ISPLTX,ISPLTZ,INDX,
     1 FTOT,DPP,MX
      REAL, ALLOCATABLE, DIMENSION(:) :: MAPZZ,GEOZZ
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(ISPLTX(LX),ISPLTZ(LZ),INDX(LX*LZ),FTOT(NFUEL))
      ALLOCATE(MAPZZ(NZ+1),GEOZZ(LZ+1))
*----
*  RECOVER GEOMETRY AND FUELMAP INFORMATION
*----
      CALL LCMGET(IPMTX,'SIDE',MTXSIDE)
      CALL LCMGET(IPMTX,'MESHZ',GEOZZ)
      JPMAP=LCMGID(IPMAP,'GEOMAP')
      CALL LCMGET(JPMAP,'IHEX',IHEX)
      CALL LCMGET(JPMAP,'SIDE',MAPSIDE)
      CALL LCMGET(JPMAP,'MESHZ',MAPZZ)
      ISPLTL=0
      CALL LCMLEN(JPMAP,'SPLITL',ILONG,ITYLCM)
      IF(ILONG.NE.0) CALL LCMGET(JPMAP,'SPLITL',ISPLTL)
*----
*  UNFOLD GEOMETRY IF HEXAGONAL IN LOZENGES
*----
      IF((ISPLTL.GT.0).AND.(IHEX.NE.9)) THEN
         MAXPTS=LX*LZ
         ALLOCATE(DPP(MAXPTS),MX(NX*NZ))
         DO 10 I=1,NX*NZ
         MX(I)=MIX(I)
   10    CONTINUE
         NXOLD=NX
         CALL BIVALL(MAXPTS,IHEX,NXOLD,NX,DPP)
         DO 30 KZ=1,NZ
         DO 20 KX=1,NX
         KEL=DPP(KX)+(KZ-1)*NXOLD
         INDX(KX+(KZ-1)*NX)=MX(KEL)
   20    CONTINUE
   30    CONTINUE
         DEALLOCATE(DPP,MX)
         IHEX=9
      ELSE
         INDX(:NX*NZ)=MIX(:NX*NZ)
      ENDIF
*----
*  FUELMAP INFORMATION SPLITTING
*----
      NY=1
      ITYPE=9
      ISPLTX(:NX)=1
      ISPLTY(:NY)=1
      IZ=1
      DO KM=1,NZ
        ISPLTZ(KM)=0
        DO JZ=IZ,LZ
          IF(GEOZZ(JZ+1).LE.MAPZZ(KM+1)) THEN
            ISPLTZ(KM)=ISPLTZ(KM)+1
          ELSE
            IZ=JZ
            EXIT
          ENDIF
        ENDDO
      ENDDO
      MAXPTS=LX*LZ
      LX1=LX
      LY1=1
      LZ1=LZ
      CALL SPLIT0 (MAXPTS,ITYPE,NCODE,NX,NY,NZ,ISPLTX,ISPLTY,ISPLTZ,
     1 0,ISPLTL,NMBLK,LX1,LY1,LZ1,MAPSIDE,XXX,YYY,ZZZ,INDX,.FALSE.,
     2 IMPX)
      IF(ISPLTL.GT.0) MAPSIDE=MAPSIDE/REAL(ISPLTL)
      IF(ABS(MAPSIDE-MTXSIDE).GT.1.0E-6) CALL XABORT('RESHID: INVALID '
     1 //'SIDE.')
*     CHECK TOTAL NUMBER
      ITOT=0
      DO 40 IEL=1,LX*LZ
      IF(INDX(IEL).NE.0)ITOT=ITOT+1
   40 CONTINUE
      NTOT=0
      CALL LCMGET(IPMTX,'FTOT',FTOT)
      DO 50 IFUEL=1,NFUEL
      NTOT=NTOT+FTOT(IFUEL)
   50 CONTINUE
      IF(ITOT.NE.NTOT) THEN
         WRITE(IOUT,'(/15H @RESHID: ITOT=,I8,6H NTOT=,I8)') ITOT,NTOT
         CALL XABORT('@RESHID: FOUND DIFFERENT TOTAL NUMBER OF FUEL MI'
     1   //'XTURES IN FUEL-MAP AND MATEX.')
      ENDIF
*     STORE NEGATIVE FUEL MIXTURES
      CALL LCMLEN(IPMTX,'MAT',LENGT,ITYP)
      ALLOCATE(IMAT(LENGT))
      IMAT(:LENGT)=0
      CALL LCMGET(IPMTX,'MAT',IMAT)
      DO 60 IEL=1,LX*LZ
      IF(INDX(IEL).NE.0)IMAT(IEL)=-INDX(IEL)
   60 CONTINUE
      CALL LCMPUT(IPMTX,'MAT',LENGT,1,IMAT)
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(IMAT,GEOZZ,MAPZZ,FTOT,INDX,ISPLTZ,ISPLTX)
      RETURN
      END