diff options
Diffstat (limited to 'Donjon/src/AFM.f')
| -rw-r--r-- | Donjon/src/AFM.f | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/Donjon/src/AFM.f b/Donjon/src/AFM.f new file mode 100644 index 0000000..a835024 --- /dev/null +++ b/Donjon/src/AFM.f @@ -0,0 +1,261 @@ +*DECK AFM + SUBROUTINE AFM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Generate a macrolib using the AFM feedback model +* +*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): +* M.T. Sissaoui +* +*Update(s): +* E. Varin, B. Dionne +* +*Parameters: input +* NENTRY number of data structures transfered to this module. +* HENTRY name of the data structures. +* IENTRY data structure type where: +* IENTRY=1 for LCM memory object; +* IENTRY=2 for XSM file; +* IENTRY=3 for sequential binary file; +* IENTRY=4 for sequential ASCII file. +* JENTRY access permission for the data structure where: +* JENTRY=0 for a data structure in creation mode; +* JENTRY=1 for a data structure in modifications mode; +* JENTRY=2 for a data structure in read-only mode. +* KENTRY data structure pointer. +* +*Reference: +* M. T. Sissaoui, G. Marleau and D. Rozon, "CANDU Reactor Simulations +* Using the Feedback Model with Actinide Burnup History," Nucl. +* Technology, 125, 197 (1999). +* +*Comments: +* The AFM: calling specifications are: +* MACRO := AFM: [ MACRO ] DBASE [ MAPFL ] :: (descafm) ; +* where +* MACRO : name of the extended \emph{macrolib} +* DBASE : name of the \emph{database} object containing fuel properties with +* respect to local parameters. +* MAPFL : name of the \emph{map} object containing fuel regions description +* and burnupinformations. This file is only required when a \emph{MACRO is +* created for fuel area. +* (descafm) : structure containing the data to module AFM:. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + CHARACTER TEXT12*12,HSMG*131,HSIGN*12,TEXT*5,CTITRE*72,TINFO*72 + LOGICAL LMCR,LMAP + DOUBLE PRECISION DFLOTT + INTEGER IPAR(NSTATE),IDATA(NSTATE) + TYPE(C_PTR) IPLIST +* + LMCR=.FALSE. + LMAP=.FALSE. + MSFT=0 +* +* PARAMETER VALIDATION. + IF(NENTRY.LE.1) CALL XABORT('AFM: 2 PARAMETER EXPECTED.') + IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('AFM:' + 1 //' MACROLIB LINKED LIST OR XSM FILE EXPECTED AT LHS.') +* + IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2)) CALL XABORT('AFM:' + 1 //' DATABASE LINKED LIST OR XSM FILE EXPECTED AT RHS.') + IF(JENTRY(2).NE.2) CALL XABORT('AFM: DATABASE IN READ-ONLY ' + 1 //'MODE EXPECTED AT RHS.') +* + CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'MCR') THEN + LMCR=.TRUE. + WRITE(6,'(A37)') 'AFM: GENERATION OF A SINGLE MACROLIB' + CALL REDGET (INDIC,MXSH,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('AFM: INTEGER DATA EXPECTED.') + ELSEIF(TEXT.EQ.'MAP') THEN + LMAP=.TRUE. + IF((IENTRY(3).NE.1).AND.(IENTRY(3).NE.2)) CALL XABORT('AFM:' + 1 //' FUEL MAP LINKED LIST OR XSM FILE EXPECTED AT RHS.') + IF(JENTRY(3).NE.2) CALL XABORT('AFM: COMPO IN READ-ONLY ' + 1 //'MODE EXPECTED AT RHS.') + ELSE + CALL XABORT('AFM: MAP OR MCR KEY WORD EXPECTED') + ENDIF +* + ITYPE=JENTRY(1) + IPLIST=KENTRY(1) + MMIX=1 +*---------------------------------------------------------------* +* CHECK THE SIGNTURE OF THE LINKED LIST OR XSM FILE + CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'REACTOR_XSDB') THEN + TEXT12=HENTRY(2) + CALL XABORT('AFM: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. REACTOR_XSDB EXPECTED.') + ENDIF +*---------------------------------------------------------------* +* IF L_MAP IS NOT AVAILABLE AFM GENERATE ONLY A TABLE + IF(LMAP) THEN + CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN) + IF(HSIGN.NE.'L_MAP') THEN + TEXT12=HENTRY(3) + CALL XABORT('AFM: SIGNATURE OF '//TEXT12//' IS '//HSIGN// + 1 '. L_MAP EXPECTED.') + ENDIF + WRITE(6,'(A42)') 'AFM: GENARATION OF A MACROLIB USING L_MAP' + ENDIF +*---------------------------------------------------------------* +* READ THE INFORMATION TITLE. + CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + IF(TEXT.EQ.'INFOR') THEN + CALL REDGET(INDIC,NITMA,FLOTT,TINFO,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + ELSE + CALL XABORT('AFM:KEY WORD INFOR EXPECTED.') + ENDIF +* +* RECOVER SOME INFORMATIONS FROM THE DATABASE. + TEXT12='INFORMATION' + CALL LCMLEN(KENTRY(2),TEXT12,LENGT,ITYLCM) + IF(LENGT.GT.0) THEN + CALL LCMGTC(KENTRY(2),'INFORMATION',72,CTITRE) + WRITE(6,*)'INFORMATION TITLE ',TINFO +* + IF(CTITRE.NE.TINFO) THEN + CALL XABORT('AFM: INCONSISTENT TITLES '//CTITRE// + 1 ' EXPECTED. INSTEAD OF ' //TINFO// ' ') + ENDIF + ELSE + CALL XABORT('AFM: DATA BASE TITLE IS NOT PROVIDED ') + ENDIF +*---------------------------------------------------------------* +* CHECK THE NAMES OF THE DIFFERENTS DIRECTORIES + CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + IF(TEXT.NE.'DNAME') CALL XABORT('AFM:KEY WORD DNAME EXPECTED.') + CALL REDGET(INDIC,NUT,FLOTT,TEXT,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('AFM: INTEGER DATA EXPECTED.') + IF(NUT.GT.1.AND.LMCR) CALL XABORT('AFM: INVALID NUMBER.') + DO 100 IJ=1,NUT + CALL REDGET (INDIC,NITMA,FLOTT,TEXT12,DFLOTT) + IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.') + CALL LCMLEN(KENTRY(2),TEXT12,LENGT,ITYLCM) + IF(LENGT.EQ.0) THEN + CALL XABORT('AFM: DATA NAME '//TEXT12// + 1 ' DO NOT EXIST ') + ENDIF + 100 CONTINUE +*---------------------------------------------------------------* +* RECOVER SOME INFORMATIONS FROM DATABASE. +* TEXT12='SIGNATURE' + CALL LCMSIX(KENTRY(2),TEXT12,1) +* RECOVER THE TITLE. + CALL LCMLEN(KENTRY(2),'TITLE',LENGT,ITYLCM) + IF(LENGT.GT.0) THEN + CALL LCMGTC(KENTRY(2),'TITLE',72,CTITRE) + ELSE + CTITRE='*** NO TITLE PROVIDED ***' + ENDIF +* READ PARAMETERS DANS L_FBM + CALL LCMGET(KENTRY(2),'PARAM',IPAR) + CALL LCMSIX(KENTRY(2),' ',2) + NGRP =IPAR(1) + NISO =IPAR(2) + NL =IPAR(3) + NBURN=IPAR(4) + IXYZ =IPAR(5) +*---------------------------------------------------------------* + IF(LMCR) THEN + NBCH=MXSH + NCCO=1 + NCZO=1 + ISC=4 + MMIX=NBCH*NCCO + MSFT =0 + ELSEIF (LMAP) THEN +* RECOVER INFORMATIONS FROM L_MAP. +* READ PARAMETERS + CALL LCMGET(KENTRY(3),'STATE-VECTOR',IPAR) + NBCH =IPAR(1) + NCCO =IPAR(2) + NCZO =IPAR(3) + ISC =IPAR(5) + MSFT =IPAR(6) + NPARM =IPAR(8) + MMIX=NBCH*NCCO +C HISTORY PARAMETER + IF(IPAR(4).NE.NGRP) THEN + WRITE(HSMG,'(A40,I5,A18,I5)') 'AFM: INCONSISTENT NB OF ' + 1 //'GROUPS. IN MAP =',IPAR(4),' IN REACTOR_XSDB =',NGRP + CALL XABORT(HSMG) + ENDIF + ENDIF +* MSFT IS THE TOTAL NUMBER OF SHIFT + MNPS=MSFT+2 +* READ THE INPUT DATA. +* TO USE THE SAME VECTOR TO GET THE REFERENCE LOCAL PARAMETER +* IF(NISO.LT.8) THEN +* NISM=8 + IF(NISO.LT.7) THEN + NISM=7 + ELSE + NISM=NISO + ENDIF + IF(ITYPE.NE.0) THEN + CALL LCMGET(IPLIST,'STATE-VECTOR',IDATA) + IF(NGRP.NE.IDATA(1)) CALL XABORT('WRONG NUMBER OF ENERGY' + 1 //' GROUPS IN UPDATED MACROLIB') + IF(MMIX.NE.IDATA(2)) CALL XABORT('WRONG NUMBER OF MATER' + 1 //'IAL MIXTURES IN UPDATED MACROLIB') + IF(NL.NE.IDATA(3)) CALL XABORT('WRONG ORDER OF ANISOTROPY' + 1 //'IN UPDATED MACROLIB') + ENDIF +*---------------------------------------------------------------* +* NTYP TYPE OF CROSS-SECTIONS CONSIDERED + NTYP=5+NL+IXYZ*2 +*---------------------------------------------------------------* +* DRIVER TO COMPUTE THE FEEDBACK COEFFICIENTS. +*---------------------------------------------------------------* + CALL AFMDRV(KENTRY,NENTRY,NPARM,ITYPE,NBURN,NGRP,NISO,ISC,MNPS, + 1 NL,ILEAK,NTYP,NBCH,NCCO,NCZO,NUT,CTITRE,LMCR,IXYZ,MMIX,MSFT, + 2 NISM) +*---------------------------------------------------------------* + IF(JENTRY(1).EQ.0) THEN + IDATA(:NSTATE)=0 + HSIGN='L_MACROLIB' + CALL LCMPTC(IPLIST,'SIGNATURE',12,HSIGN) + IDATA(1)=NGRP + IDATA(2)=MMIX + IDATA(3)=NL + IDATA(4)=1 + IDATA(9)=ILEAK + CALL LCMPUT(IPLIST,'STATE-VECTOR',NSTATE,1,IDATA) + ELSE + IDATA(1)=NGRP + IDATA(2)=MMIX + IDATA(3)=1 + IDATA(4)=1 + IDATA(9)=ILEAK + CALL LCMPUT(IPLIST,'STATE-VECTOR',NSTATE,1,IDATA) + ENDIF + RETURN + END |
