summaryrefslogtreecommitdiff
path: root/Donjon/src/MCCCPY.f
blob: 92d7119005c103d06031bda72acd8946c6380800 (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
*DECK MCCCPY
      SUBROUTINE MCCCPY(IMPX,IPMAP,IPMAP2,NPARAM,NCH,NB,REC1,REC2)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Modification of the data stored in the PARAM folder of a fuel map
*
*Copyright:
* Copyright (C) 2012 Ecole Polytechnique de Montreal.
*
*Author(s): 
* M. Cordiez
*
*Parameters: input
* IMPX    printing index (=0 for no print).
* IPMAP   pointer of the fuel map 1
* IPMAP2  pointer of the fuel map 2
* NPARAM  number of parameters in the PARAM folder
* NCH     number of fuel channels
* NB      number of fuel bundles per channel
* REC1    record to be updated
* REC2    record to be copied
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER IMPX,NPARAM,NCH,NB
      CHARACTER REC1*40,REC2*40
      TYPE(C_PTR) IPMAP,IPMAP2
*----
*  LOCAL VARIABLES
*----
      PARAMETER(NSTATE=40)
      INTEGER ISTATE2(NSTATE)
      INTEGER VALSIZE,PTYPE
      INTEGER PTYPE2,NPARAM2,NCH2,NB2,VALSIZE2
      CHARACTER PNAME*12,PNAME2*12
      REAL, ALLOCATABLE, DIMENSION(:) :: VALMOD,VALCOP
      TYPE(C_PTR) JPMAP,KPMAP,JPMAP2,KPMAP2
*----
*  RECOVER L_MAP 2 STATE-VECTOR
*----
      CALL LCMGET(IPMAP2,'STATE-VECTOR',ISTATE2)
      NB2=ISTATE2(1)
      NCH2=ISTATE2(2)
      NPARAM2=ISTATE2(8)
      IF(NB.NE.NB2) CALL XABORT('@MCCCCPY: THE NUMBER OF FUEL'
     >            //' BUNDLES PER CHANNEL IS DIFFERENT BETWEEN'
     >            //' FLMAP1 AND FLMAP2.')
      IF(NCH.NE.NCH2) CALL XABORT('@MCCCCPY: THE NUMBER OF FUEL'
     >            //' CHANNELS IS DIFFERENT BETWEEN'
     >            //' FLMAP1 AND FLMAP2.')
*----
*  RECOVERY OF L_MAP PARAMETERS
*----
* L_MAP1 (to be updated)
      JPMAP=LCMGID(IPMAP,'PARAM')
      DO IPAR=1,NPARAM,1
        KPMAP=LCMGIL(JPMAP,IPAR)
        CALL LCMGTC(KPMAP,'P-NAME',12,PNAME)
        CALL LCMGET(KPMAP,'P-TYPE',PTYPE)
        IF(PNAME.EQ.REC1) THEN
          IF(IMPX.GE.3) CALL LCMLIB(KPMAP)
          EXIT
        ENDIF
      ENDDO
* L_MAP2 (to be copied)
      JPMAP2=LCMGID(IPMAP2,'PARAM')
      DO IPAR=1,NPARAM2,1
        KPMAP2=LCMGIL(JPMAP2,IPAR)
        CALL LCMGTC(KPMAP2,'P-NAME',12,PNAME2)
        CALL LCMGET(KPMAP2,'P-TYPE',PTYPE2)
        IF(PNAME2.EQ.REC2) THEN
          IF(IMPX.GE.3) CALL LCMLIB(KPMAP2)
          EXIT
        ENDIF
      ENDDO
*
* Checking of the type (local or global) of REC1
      IF(PTYPE.EQ.1) THEN
        IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME,' IS GLOBAL'
        VALSIZE=1
        ALLOCATE(VALMOD(VALSIZE))
      ELSE IF(PTYPE.EQ.2) THEN
        IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME,' IS LOCAL'
        VALSIZE=NCH*NB
        ALLOCATE(VALMOD(VALSIZE))
      ELSE 
        CALL XABORT('@MCCCPY: '//PNAME//'IS NEITHER LOCAL NOR GLOBAL'
     >         //'AND THAT IS IMPOSSIBLE.') 
      ENDIF
* Checking of the type (local or global) of REC2
      IF((PTYPE2.NE.1).AND.(PTYPE2.NE.2)) THEN
        CALL XABORT('@MCCCPY: '//PNAME2//'IS NEITHER LOCAL NOR GLOBAL'
     >         //'AND THAT IS IMPOSSIBLE.') 
      ENDIF
      IF(PTYPE2.EQ.1) THEN
        IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME2,' IS GLOBAL'
        VALSIZE2=1
        ALLOCATE(VALCOP(VALSIZE2))
        CALL LCMGET(KPMAP2,'P-VALUE',VALCOP)
      ELSE
        IF(IMPX.GE.1) WRITE(6,210) 'PARAMETER ',PNAME2,' IS LOCAL'
        VALSIZE2=NCH2*NB2
        ALLOCATE(VALCOP(VALSIZE2))
        CALL LCMGET(KPMAP2,'P-VALUE',VALCOP)
      ENDIF
      IF(PTYPE.EQ.1.AND.PTYPE2.EQ.2) CALL XABORT('@MCCCPY: '//PNAME
     >         //'IS GLOBAL ON THE CORE AND '//PNAME2//'IS LOCAL.')
      IF(PTYPE.EQ.2.AND.PTYPE2.EQ.1) CALL XABORT('@MCCCPY: '//PNAME
     >         //'IS LOCAL ON THE CORE AND '//PNAME2//'IS GLOBAL.')
*
* Modification of REC1

      VALMOD(:)=VALCOP(:)

      CALL LCMPUT(KPMAP,'P-VALUE',VALSIZE,2,VALMOD)

      IF(IMPX.GT.0.AND.C_ASSOCIATED(IPMAP,IPMAP2)) THEN
        WRITE(6,220) 'EVERY VALUE OF THE RECORD ',REC1,' HAS BEEN '
     >             //'UPDATED WITH THE ONES FROM ',REC2,' (SAME '
     >             //'FUEL MAP).'
      ELSEIF(IMPX.GT.0.AND.C_ASSOCIATED(IPMAP,IPMAP2)) THEN
        WRITE(6,220) 'EVERY VALUE OF THE RECORD ',REC1,' HAS BEEN '
     >             //'UPDATED WITH THE ONES FROM ',REC2,' (FUEL '
     >             //'MAP FLMAP2).'
      ENDIF

* Array deallocation
      DEALLOCATE(VALMOD)
      DEALLOCATE(VALCOP)

      RETURN

  210 FORMAT(1X,A,A6,A/)
  220 FORMAT(1X,A,A6,A,A6,A/)
      END