summaryrefslogtreecommitdiff
path: root/Dragon/src/COMGEP.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/COMGEP.f')
-rw-r--r--Dragon/src/COMGEP.f383
1 files changed, 383 insertions, 0 deletions
diff --git a/Dragon/src/COMGEP.f b/Dragon/src/COMGEP.f
new file mode 100644
index 0000000..7a0cb81
--- /dev/null
+++ b/Dragon/src/COMGEP.f
@@ -0,0 +1,383 @@
+*DECK COMGEP
+ SUBROUTINE COMGEP(IPCPO,IPDEPL,IPLB1,IPLB2,IPEDIT,IMPX,ITIM,NORIG,
+ 1 NPAR,NLOC,NMIL,MUPLET,LGNEW)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Recover remaining global and local parameters. Update the parameter
+* tree (in each mixture) for a new elementary calculation.
+*
+*Copyright:
+* Copyright (C) 2002 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): A. Hebert
+*
+*Parameters: input
+* IPCPO pointer to the multicompo.
+* IPDEPL pointer to the burnup object.
+* IPLB1 pointer to the first microlib object.
+* IPLB2 pointer to the second (optional) microlib object.
+* IPEDIT pointer to the edition object.
+* IMPX print parameter.
+* ITIM index of the current burnup step.
+* NORIG index of the elementary calculation associated to the
+* father node in the parameter tree.
+* NPAR number of global parameters.
+* NLOC number of local parameters.
+* NMIL number of homogenized mixtures.
+* MUPLET tuple of indices associated to each global parameter of the
+* elementary calculation.
+* LGNEW parameter modification flag (=.true. if the I-th global
+* parameter has changed in the new elementary calculation).
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPCPO,IPDEPL,IPLB1,IPLB2,IPEDIT
+ INTEGER IMPX,ITIM,NORIG,NPAR,NLOC,NMIL,MUPLET(NPAR)
+ LOGICAL LGNEW(NPAR)
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER (NSTATE=40,MAXPAR=50)
+ TYPE(C_PTR) JPCPO,KPCPO,IPLB3
+ INTEGER ISTATE(NSTATE),PARMIL(MAXPAR),PARCAD(MAXPAR+1),
+ 1 PARPAD(MAXPAR+1),NVPO(2)
+ CHARACTER PARKEY(MAXPAR)*12,PARCHR(MAXPAR)*8,PARTYP(MAXPAR)*4,
+ 1 PARBIB(MAXPAR)*12,TEXT4*4,TEXT8*8,TEXT12*12,NAMLCM*12,NAMMY*12
+ LOGICAL LGERR,EMPTY,LCM,COMTRE,LAST
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IDEBAR,IARBVA,JDEBAR,JARBVA,
+ 1 IORIGI
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MUPL2
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: RVALO
+ LOGICAL, ALLOCATABLE, DIMENSION(:,:) :: LGNE2
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(MUPL2(NPAR+NLOC,NMIL),LGNE2(NPAR+NLOC,NMIL))
+*----
+* RECOVER INFORMATION FROM THE 'STATE-VECTOR' PARAMETER LIST
+*----
+ CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE)
+ IF(NPAR.NE.ISTATE(5)) CALL XABORT('COMGEP: WRONG VALUE OF NPAR.')
+ IF(NLOC.NE.ISTATE(6)) CALL XABORT('COMGEP: WRONG VALUE OF NLOC.')
+ NMIL=ISTATE(1)
+ NG=ISTATE(2)
+ NCAL=ISTATE(3)
+ MAXCAL=ISTATE(4)
+ NPCHR=ISTATE(7)
+ NPPNT=ISTATE(8)
+ NPCHRL=ISTATE(9)
+*----
+* RECOVER INFORMATION FROM THE 'GLOBAL' DIRECTORY
+*----
+ CALL LCMSIX(IPCPO,'GLOBAL',1)
+ IF(NPAR.GT.0) CALL LCMGTC(IPCPO,'PARKEY',12,NPAR,PARKEY)
+ IF(NPAR.GT.0) CALL LCMGTC(IPCPO,'PARTYP',4,NPAR,PARTYP)
+ CALL LCMGET(IPCPO,'PARCAD',PARCAD)
+ CALL LCMGET(IPCPO,'PARPAD',PARPAD)
+ IF(NPCHR.GT.0) CALL LCMGTC(IPCPO,'PARCHR',8,NPCHR,PARCHR)
+ IF(NPPNT.GT.0) CALL LCMGET(IPCPO,'PARMIL',PARMIL)
+ IF(NPPNT.GT.0) CALL LCMGTC(IPCPO,'PARBIB',12,NPPNT,PARBIB)
+ CALL LCMSIX(IPCPO,' ',2)
+*----
+* RECOVER REMAINING GLOBAL PARAMETERS
+*----
+ DO 10 IPAR=1,NPAR
+ IF(PARTYP(IPAR).EQ.'VALU') THEN
+ GO TO 10
+ ELSE IF(LGNEW(IPAR)) THEN
+ CALL XABORT('COMGEP: PARAMETER '//PARTYP(IPAR)//' IS ALREADY D'
+ 1 //'EFINED (REMOVE THE '//PARKEY(IPAR)//' KEYWORD).')
+ ELSE IF((PARTYP(IPAR).EQ.'IRRA').OR.(PARTYP(IPAR).EQ.'TIME').OR.
+ 1 (PARTYP(IPAR).EQ.'POWR').OR.(PARTYP(IPAR).EQ.'FLUB').OR.
+ 2 (PARTYP(IPAR).EQ.'FLUX').OR.(PARTYP(IPAR).EQ.'MASL')) THEN
+*
+* RECOVER GLOBAL PARAMETER VALUES FROM THE BURNUP OBJECT.
+ IF(.NOT.C_ASSOCIATED(IPDEPL)) THEN
+ CALL XABORT('COMGEP: NO DEPLETION OBJECT AVAILABLE AMONG T'
+ 1 //'HE RHS LCM OBJECTS.')
+ ENDIF
+ CALL LCMGET(IPDEPL,'STATE-VECTOR',ISTATE)
+ NBURN=ISTATE(3)
+ NBISO=ISTATE(4)
+ NREAC=ISTATE(6)
+ NVAR=ISTATE(7)
+ NBMIX=ISTATE(8)
+ CALL COMGEM(IPDEPL,ITIM,PARTYP(IPAR),0,NBURN,NBMIX,NBISO,
+ 1 NREAC,NVAR,VALPAR)
+ ELSE IF((PARTYP(IPAR).EQ.'TEMP').OR.(PARTYP(IPAR).EQ.'CONC'))
+ 1 THEN
+*
+* RECOVER GLOBAL PARAMETER VALUES FROM A MICROLIB OBJECT.
+ IF(.NOT.C_ASSOCIATED(IPLB1)) THEN
+ CALL XABORT('COMGEP: MICROLIB EXPECTED AT RHS.')
+ ENDIF
+ IPCAD=PARCAD(IPAR+1)-PARCAD(IPAR)
+ IPPAD=PARPAD(IPAR+1)-PARPAD(IPAR)
+ IF(IPCAD.EQ.1) IPCAD=PARCAD(IPAR+1)-PARCAD(1)
+ IF(IPPAD.EQ.1) IPPAD=PARPAD(IPAR+1)-PARPAD(1)
+ TEXT8=' '
+ TEXT12=' '
+ IMILI=0
+ IF(IPCAD.GT.0) TEXT8=PARCHR(IPCAD)
+ IF(IPPAD.GT.0) TEXT12=PARBIB(IPPAD)
+ IF(IPPAD.GT.0) IMILI=PARMIL(IPPAD)
+ CALL LCMGET(IPLB1,'STATE-VECTOR',ISTATE)
+ MAXNBI=ISTATE(2)
+ IF(C_ASSOCIATED(IPLB2)) THEN
+ CALL LCMGET(IPLB2,'STATE-VECTOR',ISTATE)
+ MAXNBI=MAX(MAXNBI,ISTATE(2))
+ ENDIF
+ CALL COMBIB(IPLB1,IPLB2,PARTYP(IPAR),IMILI,TEXT12,TEXT8,MAXNBI,
+ 1 VALPAR)
+ ELSE
+ CALL XABORT('COMGEP: '//PARTYP(IPAR)//' IS AN UNKNOWN PARAM'//
+ 1 'ETER TYPE.')
+ ENDIF
+ IF(IMPX.GT.0) WRITE(6,100) PARKEY(IPAR),VALPAR
+*
+ CALL LCMSIX(IPCPO,'GLOBAL',1)
+ TEXT8='REAL'
+ CALL COMPAV(IPCPO,IPAR,NPAR,TEXT8,VALPAR,NITMA,TEXT12,
+ 1 MUPLET(IPAR),LGNEW(IPAR))
+ CALL LCMSIX(IPCPO,' ',2)
+ 10 CONTINUE
+ DO 25 IBM=1,NMIL
+ DO 20 IPAR=1,NPAR
+ MUPL2(IPAR,IBM)=MUPLET(IPAR)
+ LGNE2(IPAR,IBM)=LGNEW(IPAR)
+ 20 CONTINUE
+ 25 CONTINUE
+ IF(NLOC.EQ.0) GO TO 50
+*----
+* RECOVER INFORMATION FROM THE 'LOCAL' DIRECTORY
+*----
+ CALL LCMSIX(IPCPO,'LOCAL',1)
+ CALL LCMGTC(IPCPO,'PARKEY',12,NLOC,PARKEY)
+ CALL LCMGTC(IPCPO,'PARTYP',4,NLOC,PARTYP)
+ CALL LCMGET(IPCPO,'PARCAD',PARCAD)
+ IF(NPCHRL.GT.0) CALL LCMGTC(IPCPO,'PARCHR',8,NPCHRL,PARCHR)
+ CALL LCMSIX(IPCPO,' ',2)
+*----
+* RECOVER LOCAL PARAMETERS
+*----
+ CALL LCMGTC(IPEDIT,'LAST-EDIT',12,TEXT12)
+ ALLOCATE(RVALO(NLOC,NMIL))
+ DO 45 IPAR=1,NLOC
+ IF((PARTYP(IPAR).EQ.'IRRA').OR.(PARTYP(IPAR).EQ.'TIME').OR.
+ 1 (PARTYP(IPAR).EQ.'POWR').OR.(PARTYP(IPAR).EQ.'FLUG').OR.
+ 2 (PARTYP(IPAR).EQ.'FLUB').OR.(PARTYP(IPAR).EQ.'FLUX').OR.
+ 3 (PARTYP(IPAR).EQ.'MASL')) THEN
+*
+* RECOVER LOCAL PARAMETERS FROM THE BURNUP OBJECT.
+ CALL LCMGET(IPDEPL,'STATE-VECTOR',ISTATE)
+ NBURN=ISTATE(3)
+ NBISO=ISTATE(4)
+ NREAC=ISTATE(6)
+ NVAR=ISTATE(7)
+ NBMIX=ISTATE(8)
+ IF(.NOT.C_ASSOCIATED(IPDEPL)) THEN
+ CALL XABORT('COMGEP: NO DEPLETION OBJECT AVAILABLE AMONG T'
+ 1 //'HE RHS LCM OBJECTS.')
+ ENDIF
+ CALL LCMGET(IPEDIT,'STATE-VECTOR',ISTATE)
+ NREG=ISTATE(17)
+ CALL COMGEN(IPDEPL,IPEDIT,NREG,NMIL,ITIM,PARTYP(IPAR),NBURN,
+ 1 NBMIX,NBISO,NREAC,NVAR,IPAR,NLOC,RVALO)
+ ELSE IF((PARTYP(IPAR).EQ.'TEMP').OR.(PARTYP(IPAR).EQ.'CONC'))
+ 1 THEN
+*
+* RECOVER LOCAL PARAMETERS FROM THE MICROLIB IN EDIT OBJECT.
+ IPCAD=PARCAD(IPAR+1)-PARCAD(IPAR)
+ IF(IPCAD.EQ.1) IPCAD=PARCAD(IPAR+1)-PARCAD(1)
+ TEXT8=' '
+ IF(IPCAD.GT.0) TEXT8=PARCHR(IPCAD)
+ CALL LCMSIX(IPEDIT,TEXT12,1)
+ CALL LCMGET(IPEDIT,'STATE-VECTOR',ISTATE)
+ MAXNBI=ISTATE(2)
+ CALL LCMINF(IPEDIT,NAMLCM,NAMMY,EMPTY,ILONG,LCM)
+ IPLB3=C_NULL_PTR
+ DO 30 IBM=1,NMIL
+ CALL COMBIB(IPEDIT,IPLB3,PARTYP(IPAR),IBM,NAMLCM,TEXT8,MAXNBI,
+ 1 VALPAR)
+ RVALO(IPAR,IBM)=VALPAR
+ 30 CONTINUE
+ CALL LCMSIX(IPEDIT,' ',2)
+ ELSE
+ CALL XABORT('COMGEP: '//PARTYP(IPAR)//' IS AN UNKNOWN LOCAL'//
+ 1 ' PARAMETER TYPE.')
+ ENDIF
+ IF(IMPX.GT.1) THEN
+ WRITE(6,120) PARKEY(IPAR),(RVALO(IPAR,IBM),IBM=1,NMIL)
+ ENDIF
+ JPCPO=LCMLID(IPCPO,'MIXTURES',NMIL)
+ DO 40 IBM=1,NMIL
+ KPCPO=LCMDIL(JPCPO,IBM)
+ CALL LCMSIX(KPCPO,'TREE',1)
+ FLOTT=RVALO(IPAR,IBM)
+ TEXT8='REAL'
+ CALL COMPAV(KPCPO,IPAR,NLOC,TEXT8,FLOTT,NITMA,TEXT12,
+ 1 MUPL2(NPAR+IPAR,IBM),LGNE2(NPAR+IPAR,IBM))
+ CALL LCMSIX(KPCPO,' ',2)
+ 40 CONTINUE
+ 45 CONTINUE
+ DEALLOCATE(RVALO)
+*----
+* UPDATE THE PARAMETER TREE IN EACH MIXTURE COMPONENT
+*----
+ 50 JPCPO=LCMLID(IPCPO,'MIXTURES',NMIL)
+ DO 90 IBM=1,NMIL
+ IF(IMPX.GT.4) THEN
+ WRITE(6,'(/17H COMGEP: MIXTURE=,I6)') IBM
+ WRITE(6,110) (MUPL2(I,IBM),I=1,NPAR+NLOC)
+ WRITE(6,'(/)')
+ ENDIF
+ DO 55 I=1,NPAR+NLOC
+ IF(MUPL2(I,IBM).EQ.0) THEN
+ WRITE(6,'(/17H COMGEP: MIXTURE=,I6,23H, UNDEFINED MUPLET ELEM,
+ 1 4HENT=,I6)') IBM,I
+ CALL XABORT('COMGEP: A MUPLET ELEMENT IS NOT ASSIGNED.')
+ ENDIF
+ 55 CONTINUE
+ KPCPO=LCMDIL(JPCPO,IBM)
+**
+** Parameter tree: this tree has a number of stages equal to the
+** number of parameters. For each value of the i-th parameter, we
+** find the position in the tree corresponding to the value of the
+** (i+1)-th parameter.
+** NCALAR Number of elementary calculations stored in the tree.
+** NVPO(1) Number of nodes in the parameter tree, including the root.
+** The value corresponding to the root is not used.
+** DEBARB - If the node does not correspond to the last parameter:
+** index in DEBARB of the first daughter of the node.
+** - If the node correspond to the last parameter: index in
+** DEBARB where we recover the index of an elementary
+** calculation.
+** ARBVAL Index of the corresponding parameter in the 'pval'//n
+** record.
+*
+** EXEMPLE: dn = value in DEBARB, (m) = value in ARBVAL
+**
+** Root *(0)
+** !
+** Param. Nb 1 d2(1)
+** -------------------
+** ! !
+** Param. Nb 2 d3(1) 4(2)
+** --------- ---------
+** ! ! ! ! !
+** Param. Nb 3 d5(1) 6(3) d7(1) 8(2) 9(3) d10
+**
+** Calculation Nb: 4 5 1 2 3
+**
+** DEBARB: 2 3 5 7 10 4 5 1 2 3
+** ARBVAL: 0 1 1 2 1 3 1 2 3
+*
+ CALL LCMSIX(KPCPO,'TREE',1)
+ CALL LCMLEN(KPCPO,'NVP',ILONG,ITYLCM)
+ IF(ILONG.EQ.0) THEN
+ MAXNVP=20*(NPAR+NLOC+1)
+ ALLOCATE(IDEBAR(MAXNVP+1),IARBVA(MAXNVP))
+ IDEBAR(:MAXNVP+1)=0
+ IARBVA(:MAXNVP)=0
+ IARBVA=0
+ DO 60 I=1,NPAR+NLOC
+ IDEBAR(I)=I+1
+ IARBVA(I+1)=1
+ 60 CONTINUE
+ IDEBAR(NPAR+NLOC+1)=NPAR+NLOC+2
+ IDEBAR(NPAR+NLOC+2)=1
+ NCALAR=1
+ NVPNEW=NPAR+NLOC+1
+ ELSE
+*
+* Find position of the new point and create new PARBRE.
+*
+* "II" is the order number of first parameter which recives a
+* "brand new" value.
+* COMTRE returns .TRUE. if the sweep throught the tree reaches
+* its bottom, otherwise it returns "KK" value: level of the
+* first new node to be introduced.
+*
+ CALL LCMGET(KPCPO,'NVP',NVPO)
+ MAXNVP=NVPO(2)
+ ALLOCATE(JDEBAR(NVPO(1)+1),JARBVA(NVPO(1)))
+ CALL LCMGET(KPCPO,'NCALS',NCALAR)
+ CALL LCMGET(KPCPO,'DEBARB',JDEBAR)
+ CALL LCMGET(KPCPO,'ARBVAL',JARBVA)
+ DO 70 IPAR=1,NPAR+NLOC
+ IF(LGNE2(IPAR,IBM)) THEN
+ II=IPAR
+ GO TO 80
+ ENDIF
+ 70 CONTINUE
+ II=NPAR+NLOC+1
+ 80 LGERR=COMTRE(NPAR+NLOC,NVPO(1),JARBVA,JDEBAR,
+ 1 MUPL2(1,IBM),KK,I0,IORD,JJ,LAST)
+ IF((II.GT.NPAR+NLOC).AND.LGERR) THEN
+ WRITE(TEXT4,'(I4)') IORD
+ CALL XABORT('COMGEP: ELEMENTARY CALCULATION HAS THE SAME'//
+ 1 ' PARAMETERS AS ELEMENTARY CALCULATION NB '//TEXT4)
+ ENDIF
+*
+* Size of the new tree.
+*
+ NVPNEW=NVPO(1)+NPAR+NLOC+1-MIN(II,KK)
+ IF(NVPNEW.GT.MAXNVP) MAXNVP=NVPNEW+MAXNVP
+ ALLOCATE(IDEBAR(MAXNVP+1),IARBVA(MAXNVP))
+ IDEBAR(:MAXNVP+1)=0
+ IARBVA(:MAXNVP)=0
+*
+* Update values and suppress old PARBRE.
+*
+ CALL COMARB(NPAR+NLOC,NVPO(1),NVPNEW,JDEBAR,JARBVA,
+ 1 LGNE2(1,IBM),MUPL2(1,IBM),NCALAR,IDEBAR,IARBVA)
+ DEALLOCATE(JARBVA,JDEBAR)
+ ENDIF
+ IF(NCALAR.NE.NCAL) CALL XABORT('COMGEP: INVALID NCALAR.')
+ NVPO(1)=NVPNEW
+ NVPO(2)=MAXNVP
+ CALL LCMPUT(KPCPO,'NVP',2,1,NVPO)
+ CALL LCMPUT(KPCPO,'NCALS',1,1,NCALAR)
+ CALL LCMPUT(KPCPO,'DEBARB',NVPNEW+1,1,IDEBAR)
+ CALL LCMPUT(KPCPO,'ARBVAL',NVPNEW,1,IARBVA)
+ DEALLOCATE(IARBVA,IDEBAR)
+ IF(NCALAR.EQ.1) THEN
+ ALLOCATE(IORIGI(MAXCAL))
+ IORIGI(:MAXCAL)=0
+ ELSE
+ CALL LCMLEN(KPCPO,'ORIGIN',MAXOLD,ITYLCM)
+ IF(MAXOLD.GT.MAXCAL) CALL XABORT('COMGEP: ORIGIN OVERFLOW(1).')
+ ALLOCATE(IORIGI(MAXCAL))
+ IORIGI(:MAXCAL)=0
+ CALL LCMGET(KPCPO,'ORIGIN',IORIGI)
+ ENDIF
+ IF(NCALAR.GT.MAXCAL) CALL XABORT('COMGEP: ORIGIN OVERFLOW(2).')
+ IORIGI(NCALAR)=NORIG
+ CALL LCMPUT(KPCPO,'ORIGIN',NCALAR,1,IORIGI)
+ DEALLOCATE(IORIGI)
+ CALL LCMSIX(KPCPO,' ',2)
+ 90 CONTINUE
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(LGNE2,MUPL2)
+ RETURN
+*
+ 100 FORMAT(31H COMGEP: SET GLOBAL PARAMETER ',A,3H' =,1P,E12.4)
+ 110 FORMAT(17H COMGEP: MUPLET =,10I6:/(17X,10I6))
+ 120 FORMAT(30H COMGEP: SET LOCAL PARAMETER ',A,3H' =,1P,5E12.4/(37X,
+ 1 5E12.4))
+ END