diff options
Diffstat (limited to 'Dragon/src/SAPGEP.f')
| -rw-r--r-- | Dragon/src/SAPGEP.f | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/Dragon/src/SAPGEP.f b/Dragon/src/SAPGEP.f new file mode 100644 index 0000000..45cbbde --- /dev/null +++ b/Dragon/src/SAPGEP.f @@ -0,0 +1,378 @@ +*DECK SAPGEP + SUBROUTINE SAPGEP(IPSAP,IPDEPL,IPLB1,IPLB2,IPEDIT,IMPX,ITIM,NORIG, + 1 NPAR,MUPLET,LGNEW,NVPNEW,NCALAR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* To recover remaining global parameters and local values. Update the +* parameter tree for a new elementary calculation. +* +*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): A. Hebert +* +*Parameters: input +* IPSAP pointer to the Saphyb. +* 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. +* MUPLET tuple of indices associated to each global parameter of the +* elementary calculation. +* LGNEW parameter modification flag (.TRUE. only if the I-th global +* parameter has changed in the new elementary calculation). +* +*Parameters: output +* NVPNEW number of nodes in the global parameter tree. +* NCALAR index of the new elementary calculation. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPSAP,IPDEPL,IPLB1,IPLB2,IPEDIT + INTEGER IMPX,ITIM,NORIG,NPAR,MUPLET(NPAR),NVPNEW,NCALAR + LOGICAL LGNEW(NPAR) +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) IPLB3 + PARAMETER (NDIMSA=50,MAXPAR=50) + INTEGER IDATA(NDIMSA),PARMIL(MAXPAR), + 1 PARCAD(MAXPAR+1),PARPAD(MAXPAR+1),LOCADR(MAXPAR+1) + CHARACTER PARKEY(MAXPAR)*4,PARCHR(MAXPAR)*8,PARTYP(MAXPAR)*4, + 1 PARFMT(MAXPAR)*8,PARBIB(MAXPAR)*12,PARNAM(MAXPAR)*80,TEXT4*4, + 2 TEXT8*8,TEXT12*12,NAMLCM*12,NAMMY*12,HSMG*131 + LOGICAL LGERR,EMPTY,LCM,COMTRE,LAST +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IDEBAR,IARBVA,JDEBAR,JARBVA, + 1 IORIGI + REAL, ALLOCATABLE, DIMENSION(:) :: RVALO +*---- +* RECOVER INFORMATION FROM THE 'DIMSAP' PARAMETER LIST. +*---- + NVPNEW=0 + CALL LCMGET(IPSAP,'DIMSAP',IDATA) + IF(NPAR.NE.IDATA(8)) CALL XABORT('SAPGEP: WRONG VALUE OF NPAR.') + NMIL=IDATA(7) + NPCHR=IDATA(9) + NPPNT=IDATA(10) + NLOC=IDATA(11) + NPCHRL=IDATA(12) + NPPNTL=IDATA(13) + NVPO=IDATA(17) + NCALAR=IDATA(19) + NG=IDATA(20) +*---- +* RECOVER INFORMATION FROM THE 'paramdescrip' DIRECTORY. +*---- + IF(NPAR.EQ.0) GO TO 45 + CALL LCMSIX(IPSAP,'paramdescrip',1) + CALL LCMGTC(IPSAP,'PARKEY',4,NPAR,PARKEY) + CALL LCMGTC(IPSAP,'PARTYP',4,NPAR,PARTYP) + CALL LCMGTC(IPSAP,'PARFMT',8,NPAR,PARFMT) + CALL LCMGET(IPSAP,'PARCAD',PARCAD) + CALL LCMGET(IPSAP,'PARPAD',PARPAD) + IF(NPCHR.GT.0) CALL LCMGTC(IPSAP,'PARCHR',8,NPCHR,PARCHR) + IF(NPPNT.GT.0) CALL LCMGET(IPSAP,'PARMIL',PARMIL) + IF(NPPNT.GT.0) CALL LCMGTC(IPSAP,'PARBIB',12,NPPNT,PARBIB) + CALL LCMSIX(IPSAP,' ',2) +*---- +* RECOVER REMAINING GLOBAL PARAMETERS. +*---- + DO 10 IPAR=1,NPAR + IF(PARTYP(IPAR).EQ.'VALE') THEN + GO TO 10 + ELSE IF((PARTYP(IPAR).EQ.'IRRA').OR.(PARTYP(IPAR).EQ.'TIME').OR. + 1 (PARTYP(IPAR).EQ.'PUIS').OR.(PARTYP(IPAR).EQ.'FLUB').OR. + 2 (PARTYP(IPAR).EQ.'FLUX').OR.(PARTYP(IPAR).EQ.'MASL')) THEN +* +* RECOVER GLOBAL PARAMETER VALUES FROM THE DEPLETION OBJECT. + IF(.NOT.C_ASSOCIATED(IPDEPL)) CALL XABORT('SAPGEP: NO DEPLETI' + 1 //'ON OBJECT AVAILABLE AMONG THE RHS LCM OBJECTS.') + CALL LCMGET(IPDEPL,'STATE-VECTOR',IDATA) + NBURN=IDATA(3) + NBISO=IDATA(4) + NREAC=IDATA(6) + NVAR=IDATA(7) + NBMIX=IDATA(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)) CALL XABORT('SAPGEP: MICROLIB EX' + 1 //'PECTED AT RHS.') + 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',IDATA) + MAXNBI=IDATA(2) + IF(C_ASSOCIATED(IPLB2)) THEN + CALL LCMGET(IPLB2,'STATE-VECTOR',IDATA) + MAXNBI=MAX(MAXNBI,IDATA(2)) + ENDIF + CALL COMBIB(IPLB1,IPLB2,PARTYP(IPAR),IMILI,TEXT12,TEXT8,MAXNBI, + 1 VALPAR) + IF(PARTYP(IPAR).EQ.'TEMP') VALPAR=VALPAR-273.16 + ELSE + CALL XABORT('SAPGEP: '//PARTYP(IPAR)//' IS AN UNKNOWN PARAM'// + 1 'ETER TYPE.') + ENDIF + IF(IMPX.GT.0) WRITE(6,100) PARKEY(IPAR),VALPAR +* + CALL SAPPAV(IPSAP,IPAR,NPAR,'FLOTTANT',VALPAR,NITMA,TEXT12, + 1 MUPLET(IPAR),LGNEW(IPAR)) + 10 CONTINUE + IF(IMPX.GT.2) THEN + WRITE(6,110) (MUPLET(I),I=1,NPAR) + WRITE(6,'(/)') + ENDIF + DO 15 I=1,NPAR + IF(MUPLET(I).EQ.0) THEN + WRITE(HSMG,'(33HSAPGEP: UNDEFINED MUPLET ELEMENT=,I6)') I + CALL XABORT(HSMG) + ENDIF + 15 CONTINUE +*---- +* INTRODUCE VALUES INTO GLOBAL PARAMETER TREE. +*---- +** +** 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. +** NVP 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(IPSAP,'paramarbre',1) + CALL LCMLEN(IPSAP,'ARBVAL',MAXNVP,ITYLCM) + IF(MAXNVP.EQ.0) THEN + MAXNVP=100*(NPAR+1) + ALLOCATE(IDEBAR(MAXNVP+1),IARBVA(MAXNVP)) + IDEBAR(:MAXNVP+1)=0 + IARBVA(:MAXNVP)=0 + IARBVA=0 + DO 20 I=1,NPAR + IDEBAR(I)=I+1 + IARBVA(I+1)=1 + 20 CONTINUE + IDEBAR(NPAR+1)=NPAR+2 + IDEBAR(NPAR+2)=1 + NCALAR=1 + NVPNEW=NPAR+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. +* + ALLOCATE(JDEBAR(MAXNVP+1),JARBVA(MAXNVP)) + CALL LCMGET(IPSAP,'DEBARB',JDEBAR) + CALL LCMGET(IPSAP,'ARBVAL',JARBVA) + DO 30 IPAR=1,NPAR + IF(LGNEW(IPAR)) THEN + II=IPAR + GO TO 40 + ENDIF + 30 CONTINUE + II=NPAR+1 + 40 LGERR=COMTRE(NPAR,NVPO,JARBVA,JDEBAR,MUPLET,KK,I0,IORD,JJ,LAST) + IF((II.GT.NPAR).AND.LGERR) THEN + WRITE(TEXT4,'(I4)') IORD + CALL XABORT('SAPGEP: ELEMENTARY CALCULATION HAS THE SAME'// + 1 ' GLOBAL PARAMETERS AS ELEMENTARY CALCULATION NB '//TEXT4) + ENDIF +* +* Size of the new tree. +* + NVPNEW=NVPO+NPAR+1-MIN(II,KK) + IF(NVPNEW.GT.MAXNVP) MAXNVP=NVPNEW+MAXNVP + ALLOCATE(IDEBAR(MAXNVP+1),IARBVA(MAXNVP)) + IDEBAR(NVPNEW+2:MAXNVP+1)=0 + IARBVA(NVPNEW+1:MAXNVP)=0 +* +* Update values and suppress old PARBRE. +* + CALL COMARB(NPAR,NVPO,NVPNEW,JDEBAR,JARBVA,LGNEW,MUPLET,NCALAR, + 1 IDEBAR,IARBVA) + DEALLOCATE(JARBVA,JDEBAR) + ENDIF + CALL LCMPUT(IPSAP,'NCALS',1,1,NCALAR) + CALL LCMPUT(IPSAP,'DEBARB',NVPNEW+1,1,IDEBAR) + CALL LCMPUT(IPSAP,'ARBVAL',NVPNEW,1,IARBVA) + DEALLOCATE(IARBVA,IDEBAR) + IF(NCALAR.EQ.1) THEN + MAXNCA=1000 + ALLOCATE(IORIGI(MAXNCA)) + IORIGI(:MAXNCA)=0 + ELSE + CALL LCMLEN(IPSAP,'ORIGIN',MAXNCA,ITYLCM) + IF(NCALAR.GT.MAXNCA) MAXNCA=NCALAR+MAXNCA + ALLOCATE(IORIGI(MAXNCA)) + IORIGI(:MAXNCA)=0 + CALL LCMGET(IPSAP,'ORIGIN',IORIGI) + ENDIF + IORIGI(NCALAR)=NORIG + CALL LCMPUT(IPSAP,'ORIGIN',NCALAR,1,IORIGI) + DEALLOCATE(IORIGI) + CALL LCMSIX(IPSAP,' ',2) +*---- +* RECOVER INFORMATION FROM THE 'varlocdescri' DIRECTORY. +*---- + 45 IF(NLOC.EQ.0) RETURN + CALL LCMSIX(IPSAP,'varlocdescri',1) + CALL LCMGTC(IPSAP,'PARNAM',80,NPAR,PARNAM) + CALL LCMGTC(IPSAP,'PARKEY',4,NLOC,PARKEY) + CALL LCMGTC(IPSAP,'PARTYP',4,NLOC,PARTYP) + CALL LCMGTC(IPSAP,'PARFMT',8,NLOC,PARFMT) + CALL LCMGET(IPSAP,'PARCAD',PARCAD) + IF(NPCHRL.GT.0) CALL LCMGTC(IPSAP,'PARCHR',8,NPCHRL,PARCHR) + CALL LCMSIX(IPSAP,' ',2) +* + CALL LCMGTC(IPEDIT,'LAST-EDIT',12,TEXT12) +*---- +* INITIALIZE LOCADR AND ALLOCATE RVALO. +*---- + IADR=1 + LOCADR(1)=1 + DO 50 IPAR=1,NLOC + IF((PARTYP(IPAR).EQ.'EQUI').OR.(PARTYP(IPAR).EQ.'VITE')) THEN + IADR=IADR+NG + ELSE IF(PARTYP(IPAR).EQ.'COUR') THEN + IADR=IADR+2*NG + ELSE + IADR=IADR+1 + ENDIF + LOCADR(IPAR+1)=IADR + 50 CONTINUE + NVLC=LOCADR(NLOC+1)-1 + ALLOCATE(RVALO(NVLC*NMIL)) +*---- +* RECOVER LOCAL VARIABLES. +*---- + DO 70 IPAR=1,NLOC + IF((PARTYP(IPAR).EQ.'IRRA').OR.(PARTYP(IPAR).EQ.'TIME').OR. + 1 (PARTYP(IPAR).EQ.'PUIS').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 VARIABLES FROM THE DEPLETION OBJECT. + IF(.NOT.C_ASSOCIATED(IPDEPL)) CALL XABORT('SAPGEP: NO DEPLET' + 1 //'ION OBJECT AVAILABLE AMONG THE RHS LCM OBJECTS.') + CALL LCMGET(IPDEPL,'STATE-VECTOR',IDATA) + NBURN=IDATA(3) + NBISO=IDATA(4) + NREAC=IDATA(6) + NVAR=IDATA(7) + NBMIX=IDATA(8) + CALL LCMGET(IPEDIT,'STATE-VECTOR',IDATA) + NREG=IDATA(17) + CALL COMGEN(IPDEPL,IPEDIT,NREG,NMIL,ITIM,PARTYP(IPAR),NBURN, + 1 NBMIX,NBISO,NREAC,NVAR,LOCADR(IPAR),NVLC,RVALO) + ELSE IF((PARTYP(IPAR).EQ.'TEMP').OR.(PARTYP(IPAR).EQ.'CONC')) + 1 THEN +* +* RECOVER LOCAL VARIABLES 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',IDATA) + MAXNBI=IDATA(2) + CALL LCMINF(IPEDIT,NAMLCM,NAMMY,EMPTY,ILONG,LCM) + IPLB3=C_NULL_PTR + DO 60 IBM=1,NMIL + CALL COMBIB(IPEDIT,IPLB3,PARTYP(IPAR),IBM,NAMLCM,TEXT8,MAXNBI, + 1 VALPAR) + IF(PARTYP(IPAR).EQ.'TEMP') VALPAR=VALPAR-273.16 + RVALO((IBM-1)*NVLC+LOCADR(IPAR))=VALPAR + 60 CONTINUE + CALL LCMSIX(IPEDIT,' ',2) + ELSE IF(PARTYP(IPAR).EQ.'EQUI') THEN +* RECOVER A SET OF SPH EQUIVALENCE FACTORS. + CALL SAPSPH(IPEDIT,NG,NMIL,LOCADR(IPAR),NVLC,RVALO) + ELSE + CALL XABORT('SAPGEP: '//PARTYP(IPAR)//' IS AN UNKNOWN LOCAL'// + 1 ' VARIABLE TYPE.') + ENDIF + IF(IMPX.GT.1) WRITE(6,120) PARKEY(IPAR), + 1 (RVALO((IBM-1)*NVLC+LOCADR(IPAR)),IBM=1,NMIL) + 70 CONTINUE + WRITE(TEXT12,'(''calc'',I8)') NCALAR + CALL LCMSIX(IPSAP,TEXT12,1) + CALL LCMSIX(IPSAP,'info',1) + CALL LCMPUT(IPSAP,'NLOC',1,1,NLOC) + CALL LCMPTC(IPSAP,'LOCNAM',80,NLOC,PARNAM) + CALL LCMPTC(IPSAP,'LOCKEY',4,NLOC,PARKEY) + CALL LCMPTC(IPSAP,'LOCTYP',4,NLOC,PARTYP) + CALL LCMPUT(IPSAP,'LOCADR',NLOC+1,1,LOCADR) + CALL LCMSIX(IPSAP,' ',2) + DO 80 IBM=1,NMIL + WRITE(TEXT12,'(''mili'',I8)') IBM + CALL LCMSIX(IPSAP,TEXT12,1) + CALL LCMPUT(IPSAP,'RVALOC',NVLC,2,RVALO((IBM-1)*NVLC+1)) + CALL LCMSIX(IPSAP,' ',2) + 80 CONTINUE + CALL LCMSIX(IPSAP,' ',2) + DEALLOCATE(RVALO) + RETURN +* + 100 FORMAT(31H SAPGEP: SET GLOBAL PARAMETER ',A,3H' =,1P,E12.4) + 110 FORMAT(/16H SAPGEP: MUPLET=,10I6:/(16X,10I6)) + 120 FORMAT(29H SAPGEP: SET LOCAL VARIABLE ',A,3H' =,1P,5E12.4/(36X, + 1 5E12.4)) + END |
