diff options
Diffstat (limited to 'Donjon/src/HSTGET.f')
| -rw-r--r-- | Donjon/src/HSTGET.f | 398 |
1 files changed, 398 insertions, 0 deletions
diff --git a/Donjon/src/HSTGET.f b/Donjon/src/HSTGET.f new file mode 100644 index 0000000..6a1238a --- /dev/null +++ b/Donjon/src/HSTGET.f @@ -0,0 +1,398 @@ +*DECK HSTGET + SUBROUTINE HSTGET(IPHST, IPRINT, MAXG, MAXL, NCHA, NBUN, + > ITYPRO, ITYRED, CARRED, IUPDC, IUPDB, + > NAMG, PARAMG, NAML, PARAML, IDCELL, IDFUEL) +* +*---------- +* +*Purpose: +* To read from the input file or send to CLE-2000 variables the +* local and burnup parameters associated with a fuel cell. +* +*Copyright: +* Copyright (C) 2003 Ecole Polytechnique de Montreal. +* +*Author(s): +* G. Marleau +* +*Parameters: input +* IPHST address of the \dds{history} data structure. +* IPRINT print level. +* MAXG maximum number of global parameters. +* MAXL maximum number of local parameters. +* NCHA number of fuel channels. +* NBUN number of bundles per channel. +* ITYPRO type of processing where: +* ITYPRO > 0 if history is in creation or update mode; +* ITYPRO < 0 if history is in read-only mode. +* ITYRED type of the last variable read. +* CARRED last character string read. +* +*Parameters: input/output +* NMAG global parameter names. +* PARAMG values of the global parameters. +* NMAL local parameter names. +* PARAML values of the local parameters. +* IDCELL cell identifier for each fuel bundle in each channel. +* IDFUEL fuel type identifier for each fuel bundle in each channel. +* +*Parameters: output +* IUPDC number of the channel to analyze. +* IUPDB number of the bundle to analyze. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPHST + INTEGER IPRINT,MAXG,MAXL,NCHA,NBUN,ITYPRO + INTEGER ITYRED,IUPDC,IUPDB + CHARACTER CARRED*12 + INTEGER NAMG(3,0:MAXG),NAML(3,0:MAXL) + REAL PARAMG(0:MAXG),PARAML(0:MAXL,2) + INTEGER IDCELL(NBUN,NCHA),IDFUEL(NBUN,NCHA) +*---- +* LOCAL PARAMETERS +*---- + INTEGER IOUT,NTC,ILCMUP,ILCMDN + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NTC=3,ILCMUP=1,ILCMDN=2, + > NAMSBR='HSTGET') +*---- +* INPUT/OUTPUT VARIABLES +* Input data is of the form +* [ GET (hstpar) ] [ PUT (hstpar) ] +* [ CELLID icha ibun [ idfuel ] +* [ GET (hstpar) ] +* [ PUT { BREFL (hsrbrn) (hstpar) +* AREFL (hsrbrn) (hstpar) | +* [ AREFL ] (hsrbrn) (hstpar) } ] ] +* +* HERE: +* (hstpar) = NAMPAR valpar +* where NAMPAR is the name of a local or global +* parameter and valpar its value. +* (hstbrn) = BURN period power +* where period is the burnup time step +* and power the burnup power density in kW/kg. +* For global parameter: +* GET = implies that (hstpar) is transfered to the +* HISTORY file, +* PUT = implies that (hstpar) is transfered to +* CLE-2000 variables. +* For local parameters: +* GET = implies that (hstpar) is transfered to the +* HISTORY file for the case before and +* after refueling. +* PUT = implies that (hstbrn) and (hstpar) +* are transfered to CLE-2000 variables. +* BREFL = Indicates that the information before +* refueling is considered. +* AREFL = Indicates that the information after +* refueling is considered. +* This is the default option is neither +* BREFL nor AREFL is defined. +*---- + INTEGER ITYPLU,INTLIR + CHARACTER CARLIR*12 + REAL REALIR + DOUBLE PRECISION DBLLIR + INTEGER ITYPUT,INTPUT + CHARACTER CARPUT*12 + REAL REAPUT + DOUBLE PRECISION DBLPUT +*---- +* LOCAL VARIABLES +*---- + INTEGER ICONTR,IGP,IFTN,ISREF,IUPDL,IUPDG,IUPDF + INTEGER ITC,INEXT,IB,IC,IPL,IP + INTEGER ICT,IOK + CHARACTER NAMP*12 + REAL TIMPOW(2,2) +*---- +* Initialize input vectors +*---- + PARAML(0:MAXL,:2)=0.0 + TIMPOW(:2,:2)=0.0 +*---- +* Initialize variables +* IUPDC -> channel number to process or update. +* IUPDB -> bundle number to process or update. +* ICONTR -> indicates processing of ITYRED and CARRED +* = 0 processing required. +* = 1 processing has been performed. +* IGP -> indicate if a GET or PUT command is in effect. +* =-1 PUT command in effect +* = 0 no GET or PUT command in effect +* = 1 GET command in effect +* IFTN = new fuel type +* ISREF -> indicate the REFUEL state +* is to be processed +* = 0 no processing +* = 1 processing before refuel +* = 2 processing after refuel +* IUPDL -> indicates local parameters update +* = 0 no update +* > 0 updated +* IUPDG -> indicates global parameters update +* = 0 no update +* > 0 updated +* IUPDF -> Fuel type update +* = 0 no update +* > 0 updated +*---- + IUPDC=0 + IUPDB=0 + ICONTR=0 + IGP =0 + IFTN =0 + ISREF =0 + IUPDL =0 + IUPDG =0 + IUPDF =0 + 100 CONTINUE + IF(ICONTR .EQ. 0) THEN + ITYPLU=ITYRED + CARLIR=CARRED + ICONTR=1 + ELSE + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + ENDIF + 101 CONTINUE + IF(ITYPLU .EQ. 10) GO TO 105 + IF(ITYPLU .NE. 3) CALL XABORT(NAMSBR// + >': Read error -- Character variable expected') + IF(CARLIR .EQ. ';') THEN + GO TO 105 + ELSE IF(CARLIR .EQ. 'CELLID') THEN + IGP=0 +*---- +* Channel number +*---- + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Read error -- integer value for channel number expected.') + IF(INTLIR .LT. 0 ) CALL XABORT(NAMSBR// + > ': Read error -- value for channel number must be > 0.') + IF(IUPDC .NE. 0) CALL XABORT(NAMSBR// + > ': Only one channel can be updated for each call to HST.') + IUPDC=INTLIR +*---- +* Bundle number +*---- + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR// + > ': Read error -- integer value for bundle number expected.') + IF(INTLIR .LT. 0 ) CALL XABORT(NAMSBR// + > ': Read error -- value for bundle number must be > 0') + IF(IUPDB .NE. 0) CALL XABORT(NAMSBR// + > ': Only one bundle can be updated for each call to HST.') + IUPDB=INTLIR +*---- +* Fuel type (optional) +*---- + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IFTN=-1 + IF(ITYPLU .EQ. 1) THEN + IFTN=INTLIR + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + ENDIF +*---- +* IF CELL IS NOT IDENTIFIED ASSOCIATE TO CELL NEXT +* CELL NUMBER AVAILABLE AND TO FUEL TYPE +* VALUE PROVIDED IN IFTN +*---- + IF(IDCELL(IUPDB,IUPDC) .LE. 0) THEN + DO 110 INEXT=1,NBUN*NCHA + DO 111 IB=1,NBUN + DO 112 IC=1,NCHA + IF(IDCELL(IB,IC) .EQ. INEXT) GO TO 115 + 112 CONTINUE + 111 CONTINUE + IDCELL(IUPDB,IUPDC)=INEXT + GO TO 116 + 115 CONTINUE + 110 CONTINUE + CALL XABORT(NAMSBR//': No cell id available') + 116 CONTINUE + IDFUEL(IUPDB,IUPDC)=ABS(IFTN) + ELSE +*---- +* CELL EXIST, READ IF POSSIBLE EXISTING LOCAL +* PARAMETERS VALUES +*---- + ICT=IDCELL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) +*---- +* Get local parameters from cell before refueling +*---- + IOK=-1 + CALL HSTGSL(IPHST ,MAXL ,IOK , + > TIMPOW(1,1) ,PARAML(0,1)) + IF((IPRINT.GT.0).AND.(IOK.NE.0)) THEN + WRITE(IOUT,7000) NAMSBR + WRITE(IOUT,7010) IUPDC,IUPDB,'BEFORE' + ENDIF +*---- +* Get local parameters from cell after refueling +*---- + IOK=-2 + CALL HSTGSL(IPHST ,MAXL ,IOK , + > TIMPOW(1,2) ,PARAML(0,2)) + IF((IPRINT.GT.0).AND.(IOK.NE.0)) THEN + WRITE(IOUT,7000) NAMSBR + WRITE(IOUT,7010) IUPDC,IUPDB,'AFTER ' + ENDIF + CALL LCMSIX(IPHST,NAMP,ILCMDN) + ENDIF + GO TO 101 + ELSE IF(CARLIR .EQ. 'GET') THEN + IF(ITYPRO .LT. 0) CALL XABORT(NAMSBR// + >': Option GET not permitted for history in read only mode') + IGP=1 + ISREF=2 + ELSE IF(CARLIR .EQ. 'PUT') THEN + IGP=-1 + ISREF=2 + ELSE IF(CARLIR .EQ. 'BREFL') THEN + IF(IGP .NE. -1) CALL XABORT(NAMSBR// + >': Option BREFL permitted for PUT only') + ISREF=1 + ELSE IF(CARLIR .EQ. 'AREFL') THEN + IF(IGP .NE. -1) CALL XABORT(NAMSBR// + >': Option AREFL permitted for PUT only') + ISREF=2 + ELSE + IF(IGP .EQ. 0) CALL XABORT(NAMSBR// + > ': GET or PUT must be specified ') + IF(IUPDC*IUPDB .GT. 0) THEN +*---- +* CARLIR contains a local parameter +*---- + IF(CARLIR .EQ. 'BURN') THEN + IF(IGP .EQ. 1) CALL XABORT(NAMSBR// + >': Option GET not permitted for BURN keyword') + IF(ITYPRO .GT. 0) CALL XABORT(NAMSBR// + >': Option BURN permitted only for history in read only mode') + REAPUT=TIMPOW(1,ISREF) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for burnup period expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) +*---- +* The power density expected is in kW/kg. +*---- + REAPUT=TIMPOW(2,ISREF) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for burnup power expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) + ELSE +*---- +* Scan local parameters to see is CARLIR is one of them +*---- + IP=0 + DO 120 IPL=1,MAXL + WRITE(NAMP,'(3A4)') (NAML(ITC,IPL),ITC=1,NTC) + IF(NAMP .EQ. CARLIR) THEN + IP=IPL + GO TO 125 + ELSE IF(NAMP .EQ. ' ') THEN + IP=IPL + READ(CARLIR,'(3A4)') (NAML(ITC,IP),ITC=1,NTC) + GO TO 125 + ENDIF + 120 CONTINUE + CALL XABORT(NAMSBR//': Number of local parameters '// + > 'provided larger than number permitted.') + 125 CONTINUE + IF(IGP .EQ. -1) THEN + REAPUT=PARAML(IP,ISREF) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for local parameter expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) + ELSE IF(IGP .EQ. 1) THEN + IUPDL=IUPDL+1 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR// + > ': Real value for local parameter missing.') + PARAML(IP,ISREF)=REALIR + ENDIF + ENDIF + ELSE +*---- +* CARLIR contains a global parameter +*---- + IF(CARLIR .EQ. 'POWER') THEN + CALL XABORT(NAMSBR// + > ': POWER is a local not global parameter') + ELSE + IP=0 + DO 130 IPL=1,MAXG + WRITE(NAMP,'(3A4)') (NAMG(ITC,IPL),ITC=1,NTC) + IF(NAMP .EQ. CARLIR) THEN + IP=IPL + GO TO 135 + ELSE IF(NAMP .EQ. ' ') THEN + IP=IPL + READ(CARLIR,'(3A4)') (NAMG(ITC,IP),ITC=1,NTC) + GO TO 135 + ENDIF + 130 CONTINUE + CALL XABORT(NAMSBR//': Number of global parameters '// + > 'provided larger than number permitted.') + 135 CONTINUE + IF(IGP .EQ. -1) THEN + REAPUT=PARAMG(IP) + ITYPUT=2 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. -ITYPUT) CALL XABORT(NAMSBR// + >': Real output variable for global parameter expected') + CALL REDPUT(ITYPUT,INTPUT,REAPUT,CARPUT,DBLPUT) + ELSE IF(IGP .EQ. 1) THEN + IUPDG=IUPDG+1 + CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR) + IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR// + > ': Real value for global parameter missing.') + PARAMG(IP)=REALIR + ENDIF + ENDIF + ENDIF + ENDIF + GO TO 100 + 105 CONTINUE +*---- +* Save global parameters if some are updated +*---- + IF(IUPDG .GT. 0) THEN + CALL LCMPUT(IPHST,'NAMEGLOBAL ',3*MAXG,3,NAMG(1,1)) + CALL LCMPUT(IPHST,'PARAMGLOBAL ',MAXG,2,PARAMG(1)) + ENDIF + IF(IUPDL .GT. 0) THEN + CALL LCMPUT(IPHST,'NAMELOCAL ',3*MAXL,3,NAML(1,1)) + ICT=IDCELL(IUPDB,IUPDC) + WRITE(NAMP,'(A4,I8.8)') 'CELL',ICT + CALL LCMSIX(IPHST,NAMP,ILCMUP) + IOK=2 + CALL HSTGSL(IPHST ,MAXL ,IOK , + > TIMPOW(1,2) ,PARAML(0,2)) + CALL LCMSIX(IPHST,NAMP,ILCMDN) + ENDIF + RETURN +*---- +* Formats +* WARNING +*---- + 7000 FORMAT(' ***** WARNING IN ',A6,' *****') + 7010 FORMAT(' Local parameters for channel ',I5,' bundle ',I5, + > ' not available for ',A6,' state'/ + > ' Initialize to 0.0') + END |
