diff options
Diffstat (limited to 'Trivac/src/FLDDRV.f')
| -rwxr-xr-x | Trivac/src/FLDDRV.f | 515 |
1 files changed, 515 insertions, 0 deletions
diff --git a/Trivac/src/FLDDRV.f b/Trivac/src/FLDDRV.f new file mode 100755 index 0000000..affadc8 --- /dev/null +++ b/Trivac/src/FLDDRV.f @@ -0,0 +1,515 @@ +*DECK FLDDRV + SUBROUTINE FLDDRV (CMODUL,IPTRK,IPSYS,REC,NEL,LL4,ITY,NUN,NBMIX, + 1 MAT,VOL,IDL,NGRP,TITR,LREL,IPFLUX) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solution of the neutron flux as an eigenvalue problem. +* +*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): A. Hebert +* +*Parameters: input +* CMODUL name of the assembly door ('BIVAC' or 'TRIVAC'). +* IPTRK L_TRACK pointer to the tracking information. +* IPSYS L_SYSTEM pointer to system matrices. +* REC flux recovery flag: +* .true.: recover the existing solution as initial estimate; +* .false.: use a uniform initial estimate. +* NEL total number of finite elements. +* LL4 order of the system matrices. +* ITY type of solution (2: classical Trivac; 3: Thomas-Raviart). +* NUN total number of unknowns per group. +* NBMIX number of material mixtures. +* MAT index-number of the mixture type assigned to each volume. +* VOL volumes. +* IDL position of the average flux component associated with each +* volume. +* NGRP number of energy groups. +* TITR title. +* LREL flag set to .true. if a RHS estimate of the solution is +* available. +* IPFLUX L_FLUX pointer to the solution. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + CHARACTER CMODUL*12,TITR*72 + TYPE(C_PTR) IPTRK,IPSYS,IPFLUX + INTEGER NEL,LL4,ITY,NUN,NBMIX,MAT(NEL),IDL(NEL),NGRP + REAL VOL(NEL) + LOGICAL REC,LREL +*---- +* GENERIC INTERFACE +*---- + INTERFACE + FUNCTION FLDMX_TEMPLATE(F,N,IBLSZ,ITER,IPTRK,IPSYS,IPFLUX) + 1 RESULT(X) + USE GANLIB + INTEGER, INTENT(IN) :: N,IBLSZ,ITER + COMPLEX(KIND=8), DIMENSION(N,IBLSZ), INTENT(IN) :: F + COMPLEX(KIND=8), DIMENSION(N,IBLSZ) :: X + TYPE(C_PTR) IPTRK,IPSYS,IPFLUX + END FUNCTION FLDMX_TEMPLATE + END INTERFACE + PROCEDURE(FLDMX_TEMPLATE) :: FLDBMX,FLDTMX +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40,IOUT=6) + CHARACTER TEXT4*4,HSMG*131 + DOUBLE PRECISION DFLOTT + LOGICAL ADJ,RAND + INTEGER ISTATE(NSTATE) + REAL EPSCON(5),RELAX + REAL, DIMENSION(:), ALLOCATABLE :: FKEFFV + REAL, DIMENSION(:,:), ALLOCATABLE :: EVECT + REAL, DIMENSION(:,:,:), ALLOCATABLE :: EV,AD + COMPLEX, DIMENSION(:), ALLOCATABLE :: CFKEFFV + COMPLEX, DIMENSION(:,:,:), ALLOCATABLE :: CEV + TYPE(C_PTR) JPFLUX,KPFLUX,MPFLUX,NPFLUX +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(EVECT(NUN,NGRP)) +* +*----------------------------------------------------------------------- +* INFORMATION RECOVERED FROM L_SYSTEM AT IPSYS: +* 'A 1 1' : SYSTEM MATRIX RELATED TO FAST LEAKAGE AND REMOVAL. +* 'A 2 2' : SYSTEM MATRIX RELATED TO THERMAL LEAKAGE AND REMOVAL. +* 'A 1 2' : SYSTEM MATRIX RELATED TO UP-SCATTERING. +* 'A 2 1' : SYSTEM MATRIX RELATED TO DOWN-SCATTERING. +* 'B 1 1' : SYSTEM MATRIX RELATED TO FAST FISSION. +* 'B 1 2' : SYSTEM MATRIX RELATED TO THERMAL FISSION. +*----------------------------------------------------------------------- +* +*---- +* READ THE INPUT DATA +*---- + IMPX=1 + IMPH=0 + RAND=.FALSE. + IF(REC) THEN +* RECOVER EXISTING OPTIONS. + CALL LCMGET(IPFLUX,'STATE-VECTOR',ISTATE) + ADJ=MOD(ISTATE(3)/10,10).EQ.1 + LMOD=ISTATE(4) + ICL1=ISTATE(8) + ICL2=ISTATE(9) + IREBAL=ISTATE(10) + MAXINR=ISTATE(11) + MAXOUT=ISTATE(12) + NADI=ISTATE(13) + IBLSZ=ISTATE(14) + NSTARD=ISTATE(15) + CALL LCMGET(IPFLUX,'EPS-CONVERGE',EPSCON) + EPSINR=EPSCON(1) + EPSOUT=EPSCON(2) + EPSMSR=EPSCON(4) + RELAX=EPSCON(5) + ELSE +* DEFAULT OPTIONS. + ADJ=.FALSE. + LMOD=0 + ICL1=3 + ICL2=3 + MAXINR=0 + IREBAL=0 + MAXOUT=200 + IBLSZ=0 + NSTARD=0 + CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE) + NADI=ISTATE(33) + EPSINR=1.0E-5 + EPSOUT=1.0E-4 + EPSMSR=1.0E-6 + RELAX=1.0 + ENDIF +* + 10 CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.EQ.10) GO TO 50 + 20 IF(INDIC.NE.3) CALL XABORT('FLDDRV: CHARACTER DATA EXPECTED.') + IF(TEXT4.EQ.'EDIT') THEN + CALL REDGET(INDIC,IMPX,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(3).') + ELSE IF((TEXT4.EQ.'VAR1').OR.(TEXT4.EQ.'ACCE')) THEN + CALL REDGET(INDIC,ICL1,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(1).') + CALL REDGET(INDIC,ICL2,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(2).') + ELSE IF(TEXT4.EQ.'IRAM') THEN + CALL REDGET(INDIC,IBLSZ,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(3).') + CALL REDGET(INDIC,LMOD,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(4).') + NADI=MAX(NADI,5) + CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) THEN + IF((ITY.EQ.2).OR.(ITY.EQ.3).OR.(ITY.EQ.11).OR.(ITY.EQ.13)) + 1 NADI=MAX(NADI,20) + GO TO 20 + ENDIF + IF(CMODUL.EQ.'BIVAC') CALL XABORT('FLDDRV: NSTARD OPTION NOT A' + 1 //'VAILABLE WITH BIVAC.') + NSTARD=NITMA + NADI=MAX(NADI,20) + ELSE IF(TEXT4.EQ.'EPSG') THEN + CALL REDGET(INDIC,NITMA,EPSMSR,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('FLDDRV: REAL DATA EXPECTED.') + ELSE IF(TEXT4.EQ.'ADI') THEN + CALL REDGET(INDIC,NADI,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(5).') + ELSE IF(TEXT4.EQ.'ADJ') THEN + ADJ=.TRUE. + ELSE IF(TEXT4.EQ.'EXTE') THEN + 30 CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.EQ.1) THEN + MAXOUT=NITMA + ELSE IF(INDIC.EQ.2) THEN + EPSOUT=FLOTT + ELSE + GO TO 20 + ENDIF + GO TO 30 + ELSE IF(TEXT4.EQ.'THER') THEN + IREBAL=1 + 40 CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT) + IF(INDIC.EQ.1) THEN + MAXINR=NITMA + ELSE IF(INDIC.EQ.2) THEN + EPSINR=FLOTT + ELSE + GO TO 20 + ENDIF + GO TO 40 + ELSE IF(TEXT4.EQ.'MONI') THEN + CALL REDGET(INDIC,LMOD,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(6).') + IF(LMOD.LE.0) CALL XABORT('FLDDRV: INVALID VALUE OF LMOD.') + ELSE IF(TEXT4.EQ.'RAND') THEN + RAND=.TRUE. + ELSE IF(TEXT4.EQ.'HIST') THEN + CALL REDGET(INDIC,IMPH,FLOTT,TEXT4,DFLOTT) + IF(INDIC.NE.1) CALL XABORT('FLDDRV: INTEGER DATA EXPECTED(7).') + ELSE IF(TEXT4.EQ.'RELA') THEN + IF(.NOT.LREL) CALL XABORT('FLDDRV: ENTRY L_FLUX IN MODIFICATIO' + 1 //'N MODE EXPECTED FOR RELAX KEYWORD.') + CALL REDGET(INDIC,NITMA,RELAX,TEXT4,DFLOTT) + IF(INDIC.NE.2) CALL XABORT('FLDDRV: REAL DATA EXPECTED.') + ELSE IF(TEXT4.EQ.';') THEN + GO TO 50 + ELSE + CALL XABORT('FLDDRV: '//TEXT4//' IS AN INVALID KEY WORD.') + ENDIF + GO TO 10 +*---- +* FLUXES INITIALIZATION +*---- + 50 IF(REC.AND.(IMPH.EQ.0)) THEN + CALL LCMLEN(IPFLUX,'FLUX',ILONG,ITYLCM) + IF(ILONG.NE.NGRP) CALL XABORT('FLDDRV: UNABLE TO RECOVER ''FLU' + 1 //'X''.') + JPFLUX=LCMGID(IPFLUX,'FLUX') + DO 60 IGR=1,NGRP + CALL LCMGDL(JPFLUX,IGR,EVECT(1,IGR)) + 60 CONTINUE + ELSE +* INITIAL ESTIMATE OF THE DIRECT FLUXES. + EVECT(:NUN,:NGRP)=1.0 + ENDIF +* + DNORM=1.0 + ANORM=1.0 + IF((LMOD.GT.0).AND.(IBLSZ.EQ.0)) THEN +* BI-ORTHOGONAL HARMONIC CALCULATION. + IF(CMODUL.NE.'TRIVAC') CALL XABORT('FLDDRV: HARMONIC CALCULAT' + 1 //'ION IS ONLY POSSIBLE WITH TRIVAC.') + ALLOCATE(FKEFFV(LMOD),EV(NUN,NGRP,LMOD),AD(NUN,NGRP,LMOD)) + CALL FLDMON(IPTRK,IPSYS,IPFLUX,LL4,ITY,NUN,NGRP,LMOD,ICL1, + 1 ICL2,IMPX,IMPH,TITR,EPSOUT,NADI,MAXOUT,MAXINR,EPSINR,RAND, + 2 FKEFFV,EV,AD) + JPFLUX=LCMLID(IPFLUX,'MODE',LMOD) + DO 90 IMOD=1,LMOD +* CREATE A DIRECTORY AT IMOD-TH LIST ELEMENT. + KPFLUX=LCMDIL(JPFLUX,IMOD) +* PUT NODES IN DIRECTORY KPFLUX. + CALL LCMPUT(KPFLUX,'K-EFFECTIVE',1,2,FKEFFV(IMOD)) + CALL LCMPUT(KPFLUX,'K-INFINITY',1,2,FKEFFV(IMOD)) + MPFLUX=LCMLID(KPFLUX,'FLUX',NGRP) + NPFLUX=LCMLID(KPFLUX,'AFLUX',NGRP) +* STORE FLUX AND ADJOINT FLUX IN THE IGR-TH COMPONENT OF EACH +* LIST. + DO 70 IGR=1,NGRP + CALL FLDTRI(IPTRK,NEL,NUN,EV(1,IGR,IMOD),MAT,VOL,IDL) + CALL FLDTRI(IPTRK,NEL,NUN,AD(1,IGR,IMOD),MAT,VOL,IDL) + 70 CONTINUE + IF(IMOD.EQ.1) THEN + CALL FLDNOR(IPSYS,NUN,NGRP,NEL,NBMIX,MAT,VOL,IDL,'DIRE', + 1 EV(1,1,IMOD),DNORM) + CALL FLDNOR(IPSYS,NUN,NGRP,NEL,NBMIX,MAT,VOL,IDL,'ADJO', + 1 AD(1,1,IMOD),ANORM) + ELSE + EV(:NUN,:NGRP,IMOD)=EV(:NUN,:NGRP,IMOD)*DNORM + AD(:NUN,:NGRP,IMOD)=AD(:NUN,:NGRP,IMOD)*DNORM + ENDIF + IF(LREL) THEN + CALL FLDREL(RELAX,MPFLUX,NGRP,NUN,EV(1,1,IMOD)) + CALL FLDREL(RELAX,NPFLUX,NGRP,NUN,AD(1,1,IMOD)) + ENDIF + DO 80 IGR=1,NGRP + CALL LCMPDL(MPFLUX,IGR,NUN,2,EV(1,IGR,IMOD)) + CALL LCMPDL(NPFLUX,IGR,NUN,2,AD(1,IGR,IMOD)) + 80 CONTINUE + 90 CONTINUE + CALL LCMPUT(IPFLUX,'K-EFFECTIVE',1,2,FKEFFV(1)) + DEALLOCATE(AD,EV,FKEFFV) + IF(IMPX.GT.1) THEN +* TEST ORTHOGONALITY OF EIGENVECTORS. + CALL FLDORT(IPSYS,IPFLUX,NUN,NGRP,LMOD) + ENDIF + ELSE IF(IBLSZ.GT.0) THEN +* IMPLICIT RESTARTED ARNOLDI METHOD (IRAM). + IF(LMOD.EQ.0) CALL XABORT('FLDDRV: LMOD>0 EXPECTED WITH IRAM.') + ALLOCATE(CFKEFFV(LMOD),CEV(NUN,NGRP,LMOD)) + EPSCON(1)=EPSINR + EPSCON(4)=EPSMSR + CALL LCMPUT(IPFLUX,'EPS-CONVERGE',5,2,EPSCON) + ISTATE(:NSTATE)=0 + ISTATE(3)=1 + ISTATE(8)=ICL1 + ISTATE(9)=ICL2 + ISTATE(10)=IREBAL + ISTATE(11)=MAXINR + ISTATE(13)=NADI + ISTATE(15)=NSTARD + ISTATE(40)=IMPX +* +* DIRECT CALCULATION + CALL LCMPUT(IPFLUX,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(CMODUL.EQ.'BIVAC') THEN + CALL FLDARN(FLDBMX,IPTRK,IPSYS,IPFLUX,LL4,NUN,NGRP,LMOD, + 1 IBLSZ,.FALSE.,IMPX,EPSOUT,MAXOUT,CEV,CFKEFFV) + ELSE IF(CMODUL.EQ.'TRIVAC') THEN + CALL FLDARN(FLDTMX,IPTRK,IPSYS,IPFLUX,LL4,NUN,NGRP,LMOD, + 1 IBLSZ,.FALSE.,IMPX,EPSOUT,MAXOUT,CEV,CFKEFFV) + ENDIF + JPFLUX=LCMLID(IPFLUX,'MODE',LMOD) + DO 120 IMOD=1,LMOD + IF(AIMAG(CFKEFFV(IMOD)).NE.0.0) THEN + WRITE(HSMG,'(8H FLDDRV:,I4,27H-TH DIRECT MODE IS COMPLEX.)') + 1 IMOD + WRITE(IOUT,'(A)') HSMG + IF(IMOD.EQ.1)CALL XABORT('FLDDRV: COMPLEX FUNDAMENTAL MODE.') + GO TO 120 + ENDIF +* CREATE A DIRECTORY AT IMOD-TH LIST ELEMENT. + KPFLUX=LCMDIL(JPFLUX,IMOD) +* PUT NODES IN DIRECTORY KPFLUX. + EVECT(:NUN,:NGRP)=REAL(CEV(:NUN,:NGRP,IMOD)) + CALL LCMPUT(KPFLUX,'K-EFFECTIVE',1,2,REAL(CFKEFFV(IMOD))) + CALL LCMPUT(KPFLUX,'K-INFINITY',1,2,REAL(CFKEFFV(IMOD))) +* STORE FLUX IN THE IGR-TH COMPONENT OF EACH LIST. + DO 100 IGR=1,NGRP + IF(CMODUL.EQ.'BIVAC') THEN + CALL FLDBIV(IPTRK,NEL,NUN,EVECT(1,IGR),MAT,VOL,IDL) + ELSE IF(CMODUL.EQ.'TRIVAC') THEN + CALL FLDTRI(IPTRK,NEL,NUN,EVECT(1,IGR),MAT,VOL,IDL) + ENDIF + 100 CONTINUE + IF(IMOD.EQ.1) THEN + CALL FLDNOR(IPSYS,NUN,NGRP,NEL,NBMIX,MAT,VOL,IDL,'DIRE', + 1 EVECT(1,1),DNORM) + ELSE + EVECT(:NUN,:NGRP)=EVECT(:NUN,:NGRP)*DNORM + ENDIF + MPFLUX=LCMLID(KPFLUX,'FLUX',NGRP) + IF(LREL) CALL FLDREL(RELAX,MPFLUX,NGRP,NUN,EVECT(1,1)) + DO 110 IGR=1,NGRP + CALL LCMPDL(MPFLUX,IGR,NUN,2,EVECT(1,IGR)) + 110 CONTINUE + 120 CONTINUE + CALL LCMPUT(IPFLUX,'K-EFFECTIVE',1,2,REAL(CFKEFFV(1))) + IF(.NOT.ADJ) GO TO 160 +* +* ADJOINT CALCULATION + IF(CMODUL.NE.'TRIVAC') CALL XABORT('FLDDRV: ADJOINT CALCULATI' + 1 //'ON IS ONLY POSSIBLE WITH TRIVAC.') + ISTATE(3)=10 + CALL LCMPUT(IPFLUX,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL FLDARN(FLDTMX,IPTRK,IPSYS,IPFLUX,LL4,NUN,NGRP,LMOD,IBLSZ, + 1 .TRUE.,IMPX,EPSOUT,MAXOUT,CEV,CFKEFFV) + JPFLUX=LCMLID(IPFLUX,'MODE',LMOD) + DO 150 IMOD=1,LMOD + IF(AIMAG(CFKEFFV(IMOD)).NE.0.0) THEN + WRITE(HSMG,'(8H FLDDRV:,I4,28H-TH ADJOINT MODE IS COMPLEX.)') + 1 IMOD + WRITE(IOUT,'(A)') HSMG + IF(IMOD.EQ.1)CALL XABORT('FLDDRV: COMPLEX FUNDAMENTAL MODE.') + GO TO 150 + ENDIF +* CREATE A DIRECTORY AT IMOD-TH LIST ELEMENT. + KPFLUX=LCMDIL(JPFLUX,IMOD) +* PUT NODES IN DIRECTORY KPFLUX. + EVECT(:NUN,:NGRP)=REAL(CEV(:NUN,:NGRP,IMOD)) + CALL LCMPUT(KPFLUX,'AK-EFFECTIVE',1,2,REAL(CFKEFFV(IMOD))) + CALL LCMPUT(KPFLUX,'AK-INFINITY',1,2,REAL(CFKEFFV(IMOD))) +* STORE FLUX IN THE IGR-TH COMPONENT OF EACH LIST. + DO 130 IGR=1,NGRP + CALL FLDTRI(IPTRK,NEL,NUN,EVECT(1,IGR),MAT,VOL,IDL) + 130 CONTINUE + IF(IMOD.EQ.1) THEN + CALL FLDNOR(IPSYS,NUN,NGRP,NEL,NBMIX,MAT,VOL,IDL,'ADJO', + 1 EVECT(1,1),ANORM) + ELSE + EVECT(:NUN,:NGRP)=EVECT(:NUN,:NGRP)*ANORM + ENDIF + NPFLUX=LCMLID(KPFLUX,'AFLUX',NGRP) + IF(LREL) CALL FLDREL(RELAX,NPFLUX,NGRP,NUN,EVECT(1,1)) + DO 140 IGR=1,NGRP + CALL LCMPDL(NPFLUX,IGR,NUN,2,EVECT(1,IGR)) + 140 CONTINUE + 150 CONTINUE + 160 DEALLOCATE(CEV,CFKEFFV) + IF(ADJ.AND.(IMPX.GT.1)) THEN +* TEST ORTHOGONALITY OF EIGENVECTORS. + CALL FLDORT(IPSYS,IPFLUX,NUN,NGRP,LMOD) + ENDIF + ELSE +* DIRECT NEUTRON FLUX CALCULATION WITH SVAT. + IF(CMODUL.EQ.'BIVAC') THEN + CALL FLDSMB(IPTRK,IPSYS,IPFLUX,LL4,ITY,NUN,NGRP,ICL1,ICL2, + 1 IMPX,IMPH,TITR,EPSOUT,MAXOUT,MAXINR,EPSINR,EVECT,FKEFF) + DO 210 IGR=1,NGRP + CALL FLDBIV(IPTRK,NEL,NUN,EVECT(1,IGR),MAT,VOL,IDL) + 210 CONTINUE + ELSE IF(CMODUL.EQ.'TRIVAC') THEN + CALL FLDDIR(IPTRK,IPSYS,IPFLUX,LL4,ITY,NUN,NGRP,ICL1,ICL2, + 1 IMPX,IMPH,TITR,EPSOUT,NADI,MAXOUT,MAXINR,EPSINR,EVECT,FKEFF) + DO 220 IGR=1,NGRP + CALL FLDTRI(IPTRK,NEL,NUN,EVECT(1,IGR),MAT,VOL,IDL) + 220 CONTINUE + ENDIF + CALL FLDNOR(IPSYS,NUN,NGRP,NEL,NBMIX,MAT,VOL,IDL,'DIRE', + 1 EVECT(1,1),DNORM) + CALL LCMPUT(IPFLUX,'K-EFFECTIVE',1,2,FKEFF) + CALL LCMPUT(IPFLUX,'K-INFINITY',1,2,FKEFF) + JPFLUX=LCMLID(IPFLUX,'FLUX',NGRP) + IF(LREL) CALL FLDREL(RELAX,JPFLUX,NGRP,NUN,EVECT(1,1)) + DO 230 IGR=1,NGRP + CALL LCMPDL(JPFLUX,IGR,NUN,2,EVECT(1,IGR)) + 230 CONTINUE + IF(.NOT.ADJ) GO TO 280 +* + IF(CMODUL.NE.'TRIVAC') CALL XABORT('FLDDRV: ADJOINT CALCULATI' + 1 //'ON IS ONLY POSSIBLE WITH TRIVAC.') +* ADJOINT FLUX INITIALIZATION. + IF(REC.AND.(IMPH.EQ.0)) THEN + CALL LCMLEN(IPFLUX,'AFLUX',ILONG,ITYLCM) + IF(ILONG.NE.NGRP) CALL XABORT('FLDDRV: UNABLE TO RECOVER AF' + 1 //'LUX.') + JPFLUX=LCMGID(IPFLUX,'AFLUX') + DO 240 IGR=1,NGRP + CALL LCMGDL(JPFLUX,IGR,EVECT(1,IGR)) + 240 CONTINUE + ELSE +* INITIAL ESTIMATE OF THE ADJOINT FLUXES. + EVECT(:NUN,:NGRP)=1.0 + ENDIF +* + CALL FLDADJ(IPTRK,IPSYS,IPFLUX,LL4,ITY,NUN,NGRP,ICL1,ICL2,IMPX, + 1 EPSOUT,NADI,MAXOUT,MAXINR,EPSINR,EVECT,FKEFF) + CALL LCMPUT(IPFLUX,'AK-EFFECTIVE',1,2,FKEFF) + CALL LCMPUT(IPFLUX,'AK-INFINITY',1,2,FKEFF) + JPFLUX=LCMLID(IPFLUX,'AFLUX',NGRP) + DO 260 IGR=1,NGRP + CALL FLDTRI(IPTRK,NEL,NUN,EVECT(1,IGR),MAT,VOL,IDL) + 260 CONTINUE + CALL FLDNOR(IPSYS,NUN,NGRP,NEL,NBMIX,MAT,VOL,IDL,'ADJO', + 1 EVECT(1,1),ANORM) + IF(LREL) CALL FLDREL(RELAX,JPFLUX,NGRP,NUN,EVECT(1,1)) + DO 270 IGR=1,NGRP + CALL LCMPDL(JPFLUX,IGR,NUN,2,EVECT(1,IGR)) + 270 CONTINUE + ENDIF +*---- +* SET STATE-VECTOR AND EPS-CONVERGE +*---- + 280 ISTATE(:NSTATE)=0 + ISTATE(1)=NGRP + ISTATE(2)=NUN + ISTATE(3)=1 + IF(ADJ) ISTATE(3)=11 + ISTATE(4)=LMOD + ISTATE(5)=0 + ISTATE(6)=2 + ISTATE(7)=0 + ISTATE(8)=ICL1 + ISTATE(9)=ICL2 + ISTATE(10)=IREBAL + ISTATE(11)=MAXINR + ISTATE(12)=MAXOUT + ISTATE(13)=NADI + ISTATE(14)=IBLSZ + ISTATE(15)=NSTARD + ISTATE(17)=NBMIX + CALL LCMPUT(IPFLUX,'STATE-VECTOR',NSTATE,1,ISTATE) + EPSCON(1)=EPSINR + EPSCON(2)=EPSOUT + EPSCON(3)=EPSOUT + EPSCON(4)=EPSMSR + EPSCON(5)=RELAX + CALL LCMPUT(IPFLUX,'EPS-CONVERGE',5,2,EPSCON) + CALL LCMPUT(IPFLUX,'KEYFLX',NEL,1,IDL) +*---- +* PRINT STATE-VECTOR +*---- + IF(IMPX.GT.0) THEN + WRITE (IOUT,300) IMPX,(ISTATE(I),I=1,9) + WRITE (IOUT,310) (ISTATE(I),I=10,15),ISTATE(17) + WRITE (IOUT,320) (EPSCON(I),I=1,5) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(EVECT) + RETURN + 300 FORMAT(/8H OPTIONS/8H -------/ + 1 7H IMPX ,I9,29H (0=NO PRINT/1=SHORT/2=MORE)/ + 2 7H NGRO ,I9,27H (NUMBER OF ENERGY GROUPS)/ + 3 7H NUN ,I9,39H (NUMBER OF UNKNOWNS PER ENERGY GROUP)/ + 4 7H IADJ ,I9,43H (1=DIRECT KEFF OR SOURCE/10=ADJOINT KEFF/, + 5 31H100=DIRECT GPT/100=ADJOINT GPT)/ + 6 7H LMOD ,I9,23H (NUMBER OF HARMONICS)/ + 7 7H NGPT ,I9,27H (NUMBER OF GPT EQUATIONS)/ + 8 7H ITYPE ,I9,46H (TYPE OF SOLUTION: 0=FIXED SOURCE/1=FIXED SO, + 9 57HURCE EIGENVALUE/2=TYPE K/3=TYPE K BUCK/4=TYPE B/5=TYPE L)/ + 1 7H ILEAK ,I9,25H (TYPE OF LEAKAGE MODEL)/ + 2 7H ICL1 ,I9,46H (NUMBER OF FREE ITERATIONS PER ACCELERATION , + 3 6HCYCLE)/ + 4 7H ICL2 ,I9,46H (NUMBER OF ACCELERATED ITERATIONS PER ACCELE, + 5 14H RATION CYCLE)) + 310 FORMAT(7H IREBAL,I9,34H (0/1: THERMAL ITERATIONS OFF/ON)/ + 1 7H MAXINR,I9,40H (MAXIMUM NUMBER OF THERMAL ITERATIONS)/ + 2 7H MAXOUT,I9,38H (MAXIMUM NUMBER OF OUTER ITERATIONS)/ + 3 7H NADI ,I9,46H (INITIAL NUMBER OF ADI ITERATIONS IN TRIVAC)/ + 4 7H IBLSZ ,I9,46H (BLOCK SIZE OF THE ARNOLDI HESSENBERG MATRIX, + 5 11H WITH IRAM)/ + 6 7H NSTARD,I9,46H (NUMBER OF RESTARTING ITERATIONS WITH GMRES , + 7 51HFOR SOLVING THE ADI-PRECONDITIONNED LINEAR SYSTEMS)/ + 8 7H NBMIX ,I9,31H (NUMBER OF MATERIAL MIXTURES)) + 320 FORMAT(7H EPSINR,1P,E9.2,29H (THERMAL ITERATION EPSILON)/ + 1 7H EPSOUT,1P,E9.2,32H (OUTER ITERATION KEFF EPSILON)/ + 2 7H EPSOUT,1P,E9.2,32H (OUTER ITERATION FLUX EPSILON)/ + 3 7H EPSMSR,1P,E9.2,33H (INNER ITERATION GMRES EPSILON)/ + 4 7H RELAX ,1P,E9.2,21H (RELAXATION FACTOR)/) + END |
