summaryrefslogtreecommitdiff
path: root/Donjon/src/LZCGET.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Donjon/src/LZCGET.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Donjon/src/LZCGET.f')
-rw-r--r--Donjon/src/LZCGET.f232
1 files changed, 232 insertions, 0 deletions
diff --git a/Donjon/src/LZCGET.f b/Donjon/src/LZCGET.f
new file mode 100644
index 0000000..bb421c6
--- /dev/null
+++ b/Donjon/src/LZCGET.f
@@ -0,0 +1,232 @@
+*DECK LZCGET
+ SUBROUTINE LZCGET(KPDEV,NTOT,NMIX,NTOT2,MIX,ID,LIMIT,IMPX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Read the specification for a given liquid zone controller.
+*
+*Copyright:
+* Copyright (C) 2007 Ecole Polytechnique de Montreal.
+*
+*Author(s):
+* D. Sekki
+*
+*Parameters: input/output
+* KPDEV pointer to DEV_LZC directory for lzc information.
+* NTOT old total number of all mixtures.
+* NMIX old maximum number of material mixtures.
+* NTOT2 new total number of all mixtures.
+* MIX new mixture index of all mixtures.
+* ID current lzc identification number.
+* LIMIT core limiting coordinates.
+* IMPX printing index (=0 for no print).
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) KPDEV
+ INTEGER NTOT,NMIX,NTOT2,MIX(NTOT2),ID,IMPX
+ REAL LIMIT(6)
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER(IOUT=6)
+ INTEGER EMIX(2),FMIX(2)
+ REAL MAXPOS(6),EMPTPOS(6),FULLPOS(6),LEVEL
+ DOUBLE PRECISION DFLOT
+ CHARACTER TEXT*12,AXIS
+*----
+* REACTOR CORE LIMITS
+*----
+ XMIN=LIMIT(1)
+ XMAX=LIMIT(2)
+ YMIN=LIMIT(3)
+ YMAX=LIMIT(4)
+ ZMIN=LIMIT(5)
+ ZMAX=LIMIT(6)
+*----
+* WHOLE LZC POSITION
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'MAXPOS')CALL XABORT('@LZCGET: KEYWORD MAXPOS EXP'
+ 1 //'ECTED.')
+ DO I=1,6
+ CALL REDGET(ITYP,NITMA,MAXPOS(I),TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR MAXPOS EXPECTED.')
+ ENDDO
+*----
+* CHECK LZC POSITION
+*----
+ IF(MAXPOS(2).LT.MAXPOS(1))CALL XABORT('@LZCGET: WRONG X '
+ 1 //'LZC COORDINATES: X- > X+')
+ IF(MAXPOS(1).LT.XMIN)CALL XABORT('@LZCGET: WRONG X- VALUE.')
+ IF(MAXPOS(2).GT.XMAX)CALL XABORT('@LZCGET: WRONG X+ VALUE.')
+*
+ IF(MAXPOS(4).LT.MAXPOS(3))CALL XABORT('@LZCGET: WRONG Y '
+ 1 //'LZC COORDINATES: Y- > Y+')
+ IF(MAXPOS(3).LT.YMIN)CALL XABORT('@LZCGET: WRONG Y- VALUE.')
+ IF(MAXPOS(4).GT.YMAX)CALL XABORT('@LZCGET: WRONG Y+ VALUE.')
+*
+ IF(MAXPOS(6).LT.MAXPOS(5))CALL XABORT('@LZCGET: WRONG Z '
+ 1 //'LZC COORDINATES: Z- > Z+')
+ IF(MAXPOS(5).LT.ZMIN)CALL XABORT('@LZCGET: WRONG Z- VALUE.')
+ IF(MAXPOS(6).GT.ZMAX)CALL XABORT('@LZCGET: WRONG Z+ VALUE.')
+*----
+* MAX-FULL COORDINATE
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'MAX-FULL')CALL XABORT('@LZCGET: KEYWORD MAX-FULL'
+ 1 //' EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FULMAX,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR MAX-FULL COORDIN'
+ 1 //'ATE EXPECTED.')
+*----
+* LZC FILLING AXIS
+*----
+ HEIGHT=0.
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'AXIS')CALL XABORT('@LZCGET: KEYWORD AXIS EXPECTED.')
+ CALL REDGET(ITYP,NITMA,FLOT,AXIS,DFLOT)
+ IF(AXIS.NE.'X')THEN
+ IF(AXIS.NE.'Y')THEN
+ IF(AXIS.NE.'Z')THEN
+ CALL XABORT('@LZCGET: X, Y OR Z EXPECTED FOR AXIS.')
+ ELSE
+ IAXIS=3
+ IF(FULMAX.GT.MAXPOS(4))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: > Z+.')
+ IF(FULMAX.LT.MAXPOS(3))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: < Z-.')
+ HEIGHT=MAXPOS(6)-FULMAX
+ ENDIF
+ ELSE
+ IAXIS=2
+ IF(FULMAX.GT.MAXPOS(4))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: > Y+.')
+ IF(FULMAX.LT.MAXPOS(3))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: < Y-.')
+ HEIGHT=MAXPOS(4)-FULMAX
+ ENDIF
+ ELSE
+ IAXIS=1
+ IF(FULMAX.GT.MAXPOS(2))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: > X+.')
+ IF(FULMAX.LT.MAXPOS(1))CALL XABORT('@LZCGET: WRONG MAX-FULL VA'
+ 1 //'LUE: < X-.')
+ HEIGHT=MAXPOS(2)-FULMAX
+ ENDIF
+ IF(HEIGHT.EQ.0.)CALL XABORT('@LZCGET: MAX-FULL WATER HEIGHT =0.')
+*----
+* LZC FILLING LEVEL
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(TEXT.NE.'LEVEL')CALL XABORT('@LZCGET: KEYWORD LEVEL EXPECTED.')
+ CALL REDGET(ITYP,NITMA,LEVEL,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR FILLING LEVEL EX'
+ 1 //'PECTED.')
+ IF(LEVEL.GT.1.)CALL XABORT('@LZCGET: WRONG FILLING LEVEL: > 1.')
+ IF(LEVEL.LT.0.)CALL XABORT('@LZCGET: WRONG FILLING LEVEL: < 0.')
+*----
+* LZC FILLING RATE
+*----
+ RATE=0.
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT.NE.'RATE')GOTO 10
+ CALL REDGET(ITYP,NITMA,RATE,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR RATE EXPECTED.')
+ IF(RATE.LT.0.)CALL XABORT('@DEVSET: WRONG RATE VALUE < 0.')
+*----
+* LZC FILLING TIME
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(2).')
+ 10 TIME=0.
+ IF(TEXT.NE.'TIME')GOTO 20
+ CALL REDGET(ITYP,NITMA,TIME,TEXT,DFLOT)
+ IF(ITYP.NE.2)CALL XABORT('@LZCGET: REAL FOR TIME EXPECTED.')
+ IF(TIME.LT.0.)CALL XABORT('@DEVSET: WRONG TIME VALUE < 0.')
+*----
+* LZC MIXTURES
+*----
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(3).')
+* EMPTY PART
+ 20 IF(TEXT.NE.'EMPTY-MIX')CALL XABORT('@LZCGET: KEYWORD EMPTY-MI'
+ 1 //'X EXPECTED.')
+ DO I=1,2
+ CALL REDGET(ITYP,EMIX(I),FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCGET: INTEGER EMPTY-MIX NUMBER'
+ 1 //' EXPECTED.')
+ MIX(NTOT+(ID-1)*4+I)=EMIX(I)
+ EMIX(I)=NMIX+(ID-1)*4+I
+ ENDDO
+ CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.3)CALL XABORT('@LZCGET: CHARACTER DATA EXPECTED(4).')
+* FULL PART
+ IF(TEXT.NE.'FULL-MIX')CALL XABORT('@LZCGET: KEYWORD FULL-MIX '
+ 1 //'EXPECTED.')
+ DO I=1,2
+ CALL REDGET(ITYP,FMIX(I),FLOT,TEXT,DFLOT)
+ IF(ITYP.NE.1)CALL XABORT('@LZCGET: INTEGER FULL-MIX NUMBER '
+ 1 //'EXPECTED.')
+ MIX(NTOT+(ID-1)*4+I+2)=FMIX(I)
+ FMIX(I)=NMIX+(ID-1)*4+I+2
+ ENDDO
+*----
+* CURRENT LZC POSITION
+*----
+ DELH=LEVEL*HEIGHT
+ DO I=1,6
+ EMPTPOS(I)=MAXPOS(I)
+ FULLPOS(I)=MAXPOS(I)
+ ENDDO
+ IF(IAXIS.EQ.1)THEN
+ FULLPOS(1)=MAXPOS(2)-DELH
+ EMPTPOS(2)=FULLPOS(1)
+ ELSEIF(IAXIS.EQ.2)THEN
+ FULLPOS(3)=MAXPOS(4)-DELH
+ EMPTPOS(4)=FULLPOS(3)
+ ELSEIF(IAXIS.EQ.3)THEN
+ FULLPOS(5)=MAXPOS(6)-DELH
+ EMPTPOS(6)=FULLPOS(5)
+ ENDIF
+*----
+* STORE LZC DATA
+*----
+ CALL LCMPUT(KPDEV,'LZC-ID',1,1,ID)
+ CALL LCMPUT(KPDEV,'MAX-POS',6,2,MAXPOS)
+ CALL LCMPUT(KPDEV,'AXIS',1,1,IAXIS)
+ CALL LCMPUT(KPDEV,'HEIGHT',1,2,HEIGHT)
+ CALL LCMPUT(KPDEV,'LEVEL',1,2,LEVEL)
+ CALL LCMPUT(KPDEV,'EMPTY-POS',6,2,EMPTPOS)
+ CALL LCMPUT(KPDEV,'FULL-POS',6,2,FULLPOS)
+ CALL LCMPUT(KPDEV,'EMPTY-MIX',2,1,EMIX)
+ CALL LCMPUT(KPDEV,'FULL-MIX',2,1,FMIX)
+ CALL LCMPUT(KPDEV,'RATE',1,2,RATE)
+ CALL LCMPUT(KPDEV,'TIME',1,2,TIME)
+*
+ IF(IMPX.GT.1)WRITE(IOUT,1000)MAXPOS(1),MAXPOS(3),MAXPOS(5),
+ 1 MAXPOS(2),MAXPOS(4),MAXPOS(6),HEIGHT,AXIS,LEVEL,EMPTPOS(1),
+ 2 EMPTPOS(3),EMPTPOS(5),EMPTPOS(2),EMPTPOS(4),EMPTPOS(6),
+ 3 FULLPOS(1),FULLPOS(3),FULLPOS(5),FULLPOS(2),FULLPOS(4),
+ 4 FULLPOS(6),RATE,TIME
+ RETURN
+*
+ 1000 FORMAT(/5X,'WHOLE POSITION :',
+ 1 4X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
+ 2 37X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
+ 3 /5X,'FIL-HEIGHT =',F9.4/
+ 4 /5X,'FIL-AXIS : ',A1,5X,'FIL-LEVEL =',F8.4/
+ 5 /5X,'EMPTY-PART POSITION :',
+ 6 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
+ 7 32X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
+ 8 /5X,'FULL-PART POSITION :',
+ 9 5X,'X-',F10.4,5X,'Y-',F10.4,5X,'Z-',F10.4/
+ 1 32X,'X+',F10.4,5X,'Y+',F10.4,5X,'Z+',F10.4/
+ 2 /5X,'FIL-RATE =',E11.4,5X,'FIL-TIME =',E11.4/)
+ END