summaryrefslogtreecommitdiff
path: root/Donjon/src/DEVDRV.f
diff options
context:
space:
mode:
Diffstat (limited to 'Donjon/src/DEVDRV.f')
-rw-r--r--Donjon/src/DEVDRV.f154
1 files changed, 154 insertions, 0 deletions
diff --git a/Donjon/src/DEVDRV.f b/Donjon/src/DEVDRV.f
new file mode 100644
index 0000000..bbe4f20
--- /dev/null
+++ b/Donjon/src/DEVDRV.f
@@ -0,0 +1,154 @@
+*DECK DEVDRV
+ SUBROUTINE DEVDRV(IPDEV,IPMTX,IGEO,NMIX,NTOT,LIMIT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Read specifications for the rod-devices from the input file.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki and A. Hebert
+*
+*Parameters: input
+* IPDEV pointer to device information.
+* IPMTX pointer to matex information.
+* IGEO index related to the reactor geometry.
+* NMIX old maximum number of material mixtures.
+* NTOT old total number of all mixtures.
+* LIMIT core limiting coordinates.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPDEV,IPMTX
+ INTEGER IGEO,NMIX,NTOT
+ REAL LIMIT(6)
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(NSTATE=40,IOUT=6,MAXPRT=10)
+ CHARACTER TEXT*12,HSMG*131
+ TYPE(C_PTR) JPDEV,KPDEV
+ INTEGER ISTATE(NSTATE),NRGRP,DMIX(2,MAXPRT)
+ DOUBLE PRECISION DFLOT
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX
+*----
+* CORE LIMITS
+*----
+ CALL LCMPUT(IPDEV,'CORE-LIMITS',6,2,LIMIT)
+*----
+* READ INPUT DATA
+*----
+ IMPX=1
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@DEVDRV: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT.NE.'EDIT')GOTO 10
+* PRINTING INDEX
+ CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@DEVDRV: INTEGER FOR EDIT EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@DEVDRV: CHARACTER DATA EXPECTED(2).')
+ 10 IF(TEXT.NE.'NUM-ROD')CALL XABORT('@DEVDRV: KEYWORD NUM-ROD EX'
+ 1 //'PECTED.')
+* TOTAL NUMBER OF RODS
+ CALL REDGET(ITYP,NROD,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@DEVDRV: INTEGER TOTAL NUMBER OF ROD'
+ 1 //'S EXPECTED.')
+ IF(NROD.LT.1)CALL XABORT('@DEVDRV: WRONG TOTAL NUMBER OF RODS <1')
+ IF(IMPX.GT.1)WRITE(IOUT,1003) LIMIT(1),LIMIT(3),LIMIT(5),LIMIT(2),
+ 1 LIMIT(4),LIMIT(6)
+ IF(IMPX.GT.0)WRITE(IOUT,1000) NROD
+*
+ MAXTOT=NTOT+NROD*2*MAXPRT
+ ALLOCATE(MIX(MAXTOT))
+ MIX(:MAXTOT)=0
+ CALL LCMGET(IPMTX,'MAT',MIX)
+*----
+* READ OPTION
+*----
+ NRGRP=0
+ IMODE=1
+ JPDEV=LCMLID(IPDEV,'DEV_ROD',NROD)
+ 30 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.EQ.'ROD')THEN
+* READ INDIVIDUAL ROD DATA
+ CALL DEVGET(JPDEV,NROD,LIMIT,IMODE,IMPX)
+ ELSE IF(TEXT.EQ.'CREATE')THEN
+* CREATE ROD-GROUPS
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'ROD-GR') CALL XABORT('@DEVDRV: KEYWORD ROD-GR EX'
+ 1 //'PECTED.')
+ CALL REDGET(ITYP,NRGRP,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1) CALL XABORT('@DEVDRV: INTEGER NUMBER OF ROD-GR'
+ 1 //'OUPS EXPECTED.')
+ IF(NRGRP.LT.1) CALL XABORT('@DEVDRV: WRONG NUMBER OF GROUPS <1')
+ CALL DEVDGD(IPDEV,NROD,NRGRP,IMPX)
+ GO TO 40
+ ELSE IF(TEXT.EQ.'FADE')THEN
+ IMODE=1
+ ELSE IF(TEXT.EQ.'MOVE')THEN
+ IMODE=2
+ ELSE IF(TEXT.EQ.';') THEN
+ GOTO 40
+ ELSE
+ WRITE(HSMG,'(26H@DEVDRV: INVALID KEYWORD (,A,2H).)') TEXT
+ CALL XABORT(HSMG)
+ ENDIF
+ GOTO 30
+*----
+* VALIDATE ROD DATA AND SET MIXTURE INDICES
+*----
+ 40 IOFSET=0
+ DO 60 ID=1,NROD
+ CALL LCMLEL(JPDEV,ID,LENGT,ITYLCM)
+ IF(LENGT.EQ.0) THEN
+ WRITE(HSMG,'(18H@DEVDRV: ROD INDEX,I5,16H IS NOT DEFINED.)') ID
+ CALL XABORT(HSMG)
+ ENDIF
+ KPDEV=LCMGIL(JPDEV,ID)
+ CALL LCMGET(KPDEV,'ROD-PARTS',NPART)
+ IF(NPART.GT.MAXPRT) CALL XABORT('@DEVDRV: MAXPRT OVERFLOW.')
+ CALL LCMGET(KPDEV,'ROD-MIX',DMIX)
+ DO 55 IPART=1,NPART
+ DO 50 I=1,2
+ IOFSET=IOFSET+1
+ IF(IOFSET.GT.MAXTOT) CALL XABORT('@DEVDRV: MAXTOT OVERFLOW.')
+ MIX(NTOT+IOFSET)=DMIX(I,IPART)
+ DMIX(I,IPART)=NMIX+IOFSET
+ 50 CONTINUE
+ 55 CONTINUE
+ CALL LCMPUT(KPDEV,'ROD-MIX',2*NPART,1,DMIX)
+ 60 CONTINUE
+*----
+* STATE-VECTORS
+*----
+ ISTATE(:NSTATE)=0
+ ISTATE(1)=IGEO
+ ISTATE(2)=NROD
+ ISTATE(3)=NRGRP
+ ISTATE(6)=IMODE
+ CALL LCMPUT(IPDEV,'STATE-VECTOR',NSTATE,1,ISTATE)
+ IF(IMPX.GT.1)CALL LCMLIB(IPDEV)
+* UPDATE MATEX
+ ISTATE(:NSTATE)=0
+ CALL LCMGET(IPMTX,'STATE-VECTOR',ISTATE)
+ ISTATE(2)=NMIX+IOFSET
+ ISTATE(5)=NTOT+IOFSET
+ CALL LCMPUT(IPMTX,'MAT',NTOT+IOFSET,1,MIX)
+ CALL LCMPUT(IPMTX,'STATE-VECTOR',NSTATE,1,ISTATE)
+ DEALLOCATE(MIX)
+ IF(IMPX.GT.4) CALL LCMLIB(IPMTX)
+ RETURN
+*
+ 1000 FORMAT(/1X,'DEVDRV: GIVEN TOTAL NUMBER OF ROD-DEVICES:',
+ 1 I5//' ** READING INPUT DATA FOR RODS **')
+ 1003 FORMAT(//5X,'--- REACTOR CORE LIMITS ---'//
+ 1 1X,'Xmin',F10.4,5X,'Ymin',F10.4,5X,'Zmin',F10.4/
+ 2 1X,'Xmax',F10.4,5X,'Ymax',F10.4,5X,'Zmax',F10.4/)
+ END