diff options
Diffstat (limited to 'Trivac/src/FLDMON.f')
| -rwxr-xr-x | Trivac/src/FLDMON.f | 793 |
1 files changed, 793 insertions, 0 deletions
diff --git a/Trivac/src/FLDMON.f b/Trivac/src/FLDMON.f new file mode 100755 index 0000000..8504eb9 --- /dev/null +++ b/Trivac/src/FLDMON.f @@ -0,0 +1,793 @@ +*DECK FLDMON + SUBROUTINE FLDMON (IPTRK,IPSYS,IPFLUX,LL4,ITY,NUN,NGRP,LMOD,ICL1, + 1 ICL2,IMPX,IMPH,TITR,EPS2,NADI,MAXOUT,MAXINR,EPSINR,RAND,FKEFF, + 2 EVECT,ADECT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solution of multigroup eigenvalue systems for the calculation of the +* LMOD first bi-orthogonal harmonics of the diffusion equation in +* Trivac. Use the preconditionned power method with Hotelling deflation +* and a two-parameter SVAT acceleration technique. +* +*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 +* IPTRK L_TRACK pointer to the tracking information. +* IPSYS L_SYSTEM pointer to system matrices. +* IPFLUX L_FLUX pointer to the solution. +* LL4 order of the system matrices. +* ITY type of solution (2: classical Trivac; 3: Thomas-Raviart). +* NUN number of unknowns in each energy group. +* NGRP number of energy groups. +* LMOD number of bi-orthogonal harmonics to compute. +* ICL1 number of free iterations in one cycle of the inverse power +* method. +* ICL2 number of accelerated iterations in one cycle. +* IMPX print parameter: =0: no print ; =1: minimum printing; +* =2: iteration history is printed; =3: solution is printed. +* IMPH type of histogram processing: +* =0: no action is taken; +* =1: the flux is compared to a reference flux stored on LCM +* =2: the convergence histogram is printed; +* =3: the convergence histogram is printed with axis and +* titles. The plotting file is completed; +* =4: the convergence histogram is printed with axis, acce- +* leration factors and titles. The plotting file is +* completed. +* TITR title. +* EPS2 convergence criteria for the flux. +* NADI number of inner ADI iterations per outer iteration. +* MAXOUT maximum number of outer iterations. +* MAXINR maximum number of thermal iterations. +* EPSINR thermal iteration epsilon. +* RAND initialization flag: +* =.true. use an initial random flux; =.false. use a flat flux. +* +*Parameters: output +* FKEFF effective multiplication factor of each harmonic. +* EVECT converged direct harmonic vector. +* ADECT converged adjoint harmonic vector. +* +*References: +* A. H\'ebert, 'Preconditioning the power method for reactor +* calculations', Nucl. Sci. Eng., 94, 1 (1986). +* J. H. Wilkinson, "The algebraic eigenvalue problem", Clarendon +* Press, Oxford, p. 584, 1965. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPTRK,IPSYS,IPFLUX + CHARACTER TITR*72 + INTEGER LL4,ITY,NUN,NGRP,LMOD,ICL1,ICL2,IMPX,IMPH,NADI,MAXOUT, + 1 MAXINR + REAL EPS2,EPSINR,FKEFF(LMOD),EVECT(NUN,NGRP,LMOD), + 1 ADECT(NUN,NGRP,LMOD) + LOGICAL RAND +*---- +* LOCAL VARIABLES +*---- + PARAMETER (MMAXX=250,EPS1=1.0E-5) + PARAMETER (IM=714025,ID=1366,IC=150889,RM=1.4005112E-6) + CHARACTER*12 TEXT12 + LOGICAL LOGTES + DOUBLE PRECISION AEAE,AEAG,AEAH,AGAG,AGAH,AHAH,BEBE,BEBG,BEBH, + 1 BGBG,BGBH,BHBH,AEBE,AEBG,AEBH,AGBE,AGBG,AGBH,AHBE,AHBG,AHBH, + 2 X,DXDA,DXDB,Y,DYDA,DYDB,Z,DZDA,DZDB,F,D2F(2,3),EVAL,ALP,BET,Z1, + 3 FMIN + TYPE(C_PTR) JPFLUX,KPFLUX,MPFLUX,NPFLUX + REAL ERR(MMAXX),ALPH(MMAXX),BETA(MMAXX) + DOUBLE PRECISION, PARAMETER :: ALP_TAB(24) = (/ 0.2, 0.4, 0.6, + 1 0.8, 1.0, 1.2, 1.5, 2.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, + 2 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0, 75.0, 80.0, 85.0 /) + DOUBLE PRECISION, PARAMETER :: BET_TAB(11) = (/ -1.0, -0.8, -0.6, + 1 -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 /) + REAL, DIMENSION(:), ALLOCATABLE :: AGAR + REAL, DIMENSION(:,:), ALLOCATABLE :: GRAD1,GRAD2,VEA1,VEA2,VEA3, + 1 VEB1,VEB2,VEB3 + REAL, DIMENSION(:), POINTER :: AGARM + TYPE(C_PTR) AGARM_PTR +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(AGAR(LL4),GRAD1(NUN,NGRP),GRAD2(NUN,NGRP),VEA1(NUN,NGRP), + 1 VEA2(NUN,NGRP),VEA3(NUN,NGRP),VEB1(NUN,NGRP),VEB2(NUN,NGRP), + 2 VEB3(NUN,NGRP)) +* +* TKT : CPU TIME FOR THE SOLUTION OF LINEAR SYSTEMS. +* TKB : CPU TIME FOR BILINEAR PRODUCT EVALUATIONS. + TKT=0.0 + TKB=0.0 + CALL MTOPEN(IMPX,IPTRK,LL4) + IF(LL4.GT.NUN) CALL XABORT('FLDMON: INVALID NUMBER OF UNKNOWNS.') +* + DO 390 IMOD=1,LMOD + CALL KDRCPU(TK1) + IF(IMPX.GE.1) WRITE (6,'(1H1//13H HARMONIC NB.,I3//)') IMOD + CALL LCMLEN(IPFLUX,'MODE',ILONG,ITYLCM) + IF((ILONG.NE.0).AND.(IMPH.EQ.0)) THEN + JPFLUX=LCMGID(IPFLUX,'MODE') + KPFLUX=LCMGIL(JPFLUX,IMOD) + MPFLUX=LCMGID(KPFLUX,'FLUX') + NPFLUX=LCMGID(KPFLUX,'AFLUX') + DO 10 IGR=1,NGRP + CALL LCMGDL(MPFLUX,IGR,EVECT(1,IGR,IMOD)) + CALL LCMGDL(NPFLUX,IGR,ADECT(1,IGR,IMOD)) + 10 CONTINUE + ELSE IF((IMOD.EQ.1).OR.(.NOT.RAND)) THEN +* UNIFORM UNKNOWN VECTOR. + DO 25 IGR=1,NGRP + DO 20 I=1,NUN + EVECT(I,IGR,IMOD)=1.0 + ADECT(I,IGR,IMOD)=1.0 + 20 CONTINUE + 25 CONTINUE + ELSE +* RANDOM UNKNOWN VECTOR. + ISEED=0 + DO 35 IGR=1,NGRP + DO 30 I=1,NUN + ISEED=MOD(ISEED*ID+IC,IM) + RAN=REAL(ISEED)*RM + EVECT(I,IGR,IMOD)=RAN + ADECT(I,IGR,IMOD)=RAN + 30 CONTINUE + 35 CONTINUE + ENDIF +*---- +* PRECONDITIONED POWER METHOD FOR THE DIRECT PROBLEM +*---- + EVAL=1.0D0 + VVV=0.0 + ISTART=1 + NNADI=NADI + TEST=0.0 + IF(IMPX.GE.1) WRITE (6,600) NADI,'DIRECT' + IF(IMPX.GE.2) WRITE (6,610) + CALL FLDDEF(NUN,IPTRK,IPSYS,LL4,ITY,NGRP,IMOD,LMOD,EVECT,ADECT, + 1 EVECT(1,1,IMOD),1,VEA1,VEB1) + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) + M=0 + 50 M=M+1 +*---- +* EIGENVALUE EVALUATION +*---- + CALL KDRCPU(TK1) + AEBE=0.0D0 + BEBE=0.0D0 + DO 65 IGR=1,NGRP + DO 60 I=1,LL4 + AEBE=AEBE+VEA1(I,IGR)*VEB1(I,IGR) + BEBE=BEBE+VEB1(I,IGR)**2 + 60 CONTINUE + 65 CONTINUE + EVAL=AEBE/BEBE + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) +*---- +* DIRECTION EVALUATION +*---- + DO 110 IGR=1,NGRP + CALL KDRCPU(TK1) + DO 70 I=1,LL4 + GRAD1(I,IGR)=REAL(EVAL)*VEB1(I,IGR)-VEA1(I,IGR) + 70 CONTINUE + DO 100 JGR=1,IGR-1 + WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR + CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM) + IF(ILONG.EQ.0) GO TO 100 + IF(ITY.EQ.13) THEN + CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,GRAD1(1,JGR),AGAR) + DO 80 I=1,LL4 + GRAD1(I,IGR)=GRAD1(I,IGR)+AGAR(I) + 80 CONTINUE + ELSE + CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR) + CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /)) + DO 90 I=1,ILONG + GRAD1(I,IGR)=GRAD1(I,IGR)+AGARM(I)*GRAD1(I,JGR) + 90 CONTINUE + ENDIF + 100 CONTINUE + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) +* + CALL KDRCPU(TK1) + WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR + CALL FLDADI(TEXT12,IPTRK,IPSYS,LL4,ITY,GRAD1(1,IGR),NNADI) + CALL KDRCPU(TK2) + TKT=TKT+(TK2-TK1) + 110 CONTINUE +*---- +* PERFORM THERMAL (UP-SCATTERING) ITERATIONS +*---- + IF(MAXINR.GT.1) THEN + CALL FLDTHR(IPTRK,IPSYS,IPFLUX,.FALSE.,LL4,ITY,NUN,NGRP,ICL1, + 1 ICL2,IMPX,NNADI,0,MAXINR,EPSINR,ITER,TKT,TKB,GRAD1) + ENDIF +*---- +* DISPLACEMENT EVALUATION +*---- + CALL KDRCPU(TK1) + F=0.0D0 + DELS=ABS(REAL((EVAL-VVV)/EVAL)) + VVV=REAL(EVAL) +*---- +* EVALUATION OF THE TWO ACCELERATION PARAMETERS ALP AND BET +*---- + ALP=1.0D0 + BET=0.0D0 + N=0 + AEAE=0.0D0 + AEAG=0.0D0 + AEAH=0.0D0 + AGAG=0.0D0 + AGAH=0.0D0 + AHAH=0.0D0 + BEBG=0.0D0 + BEBH=0.0D0 + BGBG=0.0D0 + BGBH=0.0D0 + BHBH=0.0D0 + AEBG=0.0D0 + AEBH=0.0D0 + AGBE=0.0D0 + AGBG=0.0D0 + AGBH=0.0D0 + AHBE=0.0D0 + AHBG=0.0D0 + AHBH=0.0D0 + CALL FLDDEF(NUN,IPTRK,IPSYS,LL4,ITY,NGRP,IMOD,LMOD,EVECT,ADECT, + 1 GRAD1(1,1),1,VEA2,VEB2) + IF(1+MOD(M-ISTART,ICL1+ICL2).GT.ICL1) THEN + DO 125 IGR=1,NGRP + DO 120 I=1,LL4 +* COMPUTE (A ,A ) + AEAE=AEAE+VEA1(I,IGR)**2 + AEAG=AEAG+VEA1(I,IGR)*VEA2(I,IGR) + AEAH=AEAH+VEA1(I,IGR)*VEA3(I,IGR) + AGAG=AGAG+VEA2(I,IGR)**2 + AGAH=AGAH+VEA2(I,IGR)*VEA3(I,IGR) + AHAH=AHAH+VEA3(I,IGR)**2 +* COMPUTE (B ,B ) + BEBG=BEBG+VEB1(I,IGR)*VEB2(I,IGR) + BEBH=BEBH+VEB1(I,IGR)*VEB3(I,IGR) + BGBG=BGBG+VEB2(I,IGR)**2 + BGBH=BGBH+VEB2(I,IGR)*VEB3(I,IGR) + BHBH=BHBH+VEB3(I,IGR)**2 +* COMPUTE (A ,B ) + AEBG=AEBG+VEA1(I,IGR)*VEB2(I,IGR) + AEBH=AEBH+VEA1(I,IGR)*VEB3(I,IGR) + AGBE=AGBE+VEA2(I,IGR)*VEB1(I,IGR) + AGBG=AGBG+VEA2(I,IGR)*VEB2(I,IGR) + AGBH=AGBH+VEA2(I,IGR)*VEB3(I,IGR) + AHBE=AHBE+VEA3(I,IGR)*VEB1(I,IGR) + AHBG=AHBG+VEA3(I,IGR)*VEB2(I,IGR) + AHBH=AHBH+VEA3(I,IGR)*VEB3(I,IGR) + 120 CONTINUE + 125 CONTINUE +* + 130 N=N+1 + IF(N.GT.10) GO TO 135 +* COMPUTE X(M+1) + X=BEBE+ALP*ALP*BGBG+BET*BET*BHBH+2.0D0*(ALP*BEBG+BET*BEBH + 1 +ALP*BET*BGBH) + DXDA=2.0D0*(BEBG+ALP*BGBG+BET*BGBH) + DXDB=2.0D0*(BEBH+ALP*BGBH+BET*BHBH) +* COMPUTE Y(M+1) + Y=AEAE+ALP*ALP*AGAG+BET*BET*AHAH+2.0D0*(ALP*AEAG+BET*AEAH + 1 +ALP*BET*AGAH) + DYDA=2.0D0*(AEAG+ALP*AGAG+BET*AGAH) + DYDB=2.0D0*(AEAH+ALP*AGAH+BET*AHAH) +* COMPUTE Z(M+1) + Z=AEBE+ALP*ALP*AGBG+BET*BET*AHBH+ALP*(AEBG+AGBE) + 1 +BET*(AEBH+AHBE)+ALP*BET*(AGBH+AHBG) + DZDA=AEBG+AGBE+2.0D0*ALP*AGBG+BET*(AGBH+AHBG) + DZDB=AEBH+AHBE+ALP*(AGBH+AHBG)+2.0D0*BET*AHBH +* COMPUTE F(M+1) + F=X*Y-Z*Z + D2F(1,1)=2.0D0*(BGBG*Y+DXDA*DYDA+X*AGAG-DZDA**2-2.0D0*Z*AGBG) + D2F(1,2)=2.0D0*BGBH*Y+DXDA*DYDB+DXDB*DYDA+2.0D0*X*AGAH + 1 -2.0D0*DZDA*DZDB-2.0D0*Z*(AGBH+AHBG) + D2F(2,2)=2.0D0*(BHBH*Y+DXDB*DYDB+X*AHAH-DZDB**2-2.0D0*Z*AHBH) + D2F(2,1)=D2F(1,2) + D2F(1,3)=DXDA*Y+X*DYDA-2.0D0*Z*DZDA + D2F(2,3)=DXDB*Y+X*DYDB-2.0D0*Z*DZDB +* SOLUTION OF A LINEAR SYSTEM. + CALL ALSBD(2,1,D2F,IER,2) + IF(IER.NE.0) GO TO 135 + ALP=ALP-D2F(1,3) + BET=BET-D2F(2,3) + IF(ALP.GT.100.0) GO TO 135 + IF((ABS(D2F(1,3)).LE.1.0D-4).AND.(ABS(D2F(2,3)).LE.1.0D-4)) + 1 GO TO 140 + GO TO 130 +* +* alternative algorithm in case of Newton-Raphton failure + 135 IF(IMPX.GT.0) WRITE(6,'(/30H FLDMON: FAILURE OF THE NEWTON, + 1 55H-RAPHTON ALGORIHTHM FOR COMPUTING THE OVERRELAXATION PA, + 2 12HRAMETERS(1).)') + IAMIN=999 + IBMIN=999 + FMIN=HUGE(FMIN) + DO IA=1,SIZE(ALP_TAB) + ALP=ALP_TAB(IA) + DO IB=1,SIZE(BET_TAB) + BET=BET_TAB(IB) +* COMPUTE X + X=BEBE+ALP*ALP*BGBG+BET*BET*BHBH+2.0D0*(ALP*BEBG+BET*BEBH + 1 +ALP*BET*BGBH) +* COMPUTE Y + Y=AEAE+ALP*ALP*AGAG+BET*BET*AHAH+2.0D0*(ALP*AEAG+BET*AEAH + 1 +ALP*BET*AGAH) +* COMPUTE Z + Z=AEBE+ALP*ALP*AGBG+BET*BET*AHBH+ALP*(AEBG+AGBE) + 1 +BET*(AEBH+AHBE)+ALP*BET*(AGBH+AHBG) +* COMPUTE F + F=X*Y-Z*Z + IF(F.LT.FMIN) THEN + IAMIN=IA + IBMIN=IB + FMIN=F + ENDIF + ENDDO + ENDDO + ALP=ALP_TAB(IAMIN) + BET=BET_TAB(IBMIN) + 140 BET=BET/ALP + IF((ALP.LT.1.0D0).AND.(ALP.GT.0.0D0)) THEN + ALP=1.0D0 + BET=0.0D0 + ELSE IF(ALP.LE.0.0D0) THEN + ISTART=M+1 + ALP=1.0D0 + BET=0.0D0 + ENDIF + DO 155 IGR=1,NGRP + DO 150 I=1,LL4 + GRAD1(I,IGR)=REAL(ALP)*(GRAD1(I,IGR)+REAL(BET)*GRAD2(I,IGR)) + VEA2(I,IGR)=REAL(ALP)*(VEA2(I,IGR)+REAL(BET)*VEA3(I,IGR)) + VEB2(I,IGR)=REAL(ALP)*(VEB2(I,IGR)+REAL(BET)*VEB3(I,IGR)) + 150 CONTINUE + 155 CONTINUE + ENDIF + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) +* + LOGTES=(M.LT.ICL1).OR.(MOD(M-ISTART,ICL1+ICL2).EQ.ICL1-1) + IF(LOGTES.AND.(DELS.LE.EPS1)) THEN + DELT=0.0 + DO 170 IGR=1,NGRP + DELN=0.0 + DELD=0.0 + DO 160 I=1,LL4 + EVECT(I,IGR,IMOD)=EVECT(I,IGR,IMOD)+GRAD1(I,IGR) + VEA1(I,IGR)=VEA1(I,IGR)+VEA2(I,IGR) + VEB1(I,IGR)=VEB1(I,IGR)+VEB2(I,IGR) + GRAD2(I,IGR)=GRAD1(I,IGR) + VEA3(I,IGR)=VEA2(I,IGR) + VEB3(I,IGR)=VEB2(I,IGR) + DELN=MAX(DELN,ABS(VEB2(I,IGR))) + DELD=MAX(DELD,ABS(VEB1(I,IGR))) + 160 CONTINUE + IF(DELD.NE.0.0) DELT=MAX(DELT,DELN/DELD) + 170 CONTINUE + IF(IMPX.GE.2) WRITE (6,615) M,AEAE,AEAG,AEAH,AGAG,AGAH,AHAH, + 1 BEBE,ALP,BET,EVAL,F,DELS,DELT,N,BEBG,BEBH,BGBG,BGBH,BHBH, + 2 AEBE,AEBG,AEBH,AGBE,AGBG,AGBH,AHBE,AHBG,AHBH +* COMPUTE THE CONVERGENCE HISTOGRAM. + IF((IMPH.GE.1).AND.(M.LE.MMAXX)) THEN + JPFLUX=LCMGID(IPFLUX,'MODE') + KPFLUX=LCMGIL(JPFLUX,IMOD) + CALL FLDXCO(KPFLUX,LL4,NUN,EVECT(1,NGRP,IMOD),.TRUE.,ERR(M)) + ALPH(M)=REAL(ALP) + BETA(M)=REAL(BET) + ENDIF + IF(DELT.LE.EPS2) GO TO 190 + ELSE + DO 185 IGR=1,NGRP + DO 180 I=1,LL4 + EVECT(I,IGR,IMOD)=EVECT(I,IGR,IMOD)+GRAD1(I,IGR) + VEA1(I,IGR)=VEA1(I,IGR)+VEA2(I,IGR) + VEB1(I,IGR)=VEB1(I,IGR)+VEB2(I,IGR) + GRAD2(I,IGR)=GRAD1(I,IGR) + VEA3(I,IGR)=VEA2(I,IGR) + VEB3(I,IGR)=VEB2(I,IGR) + 180 CONTINUE + 185 CONTINUE + IF(IMPX.GE.2) WRITE (6,620) M,AEAE,AEAG,AEAH,AGAG,AGAH,AHAH, + 1 BEBE,ALP,BET,EVAL,F,DELS,N,BEBG,BEBH,BGBG,BGBH,BHBH,AEBE, + 2 AEBG,AEBH,AGBE,AGBG,AGBH,AHBE,AHBG,AHBH +* COMPUTE THE CONVERGENCE HISTOGRAM. + IF((IMPH.GE.1).AND.(M.LE.MMAXX)) THEN + JPFLUX=LCMGID(IPFLUX,'MODE') + KPFLUX=LCMGIL(JPFLUX,IMOD) + CALL FLDXCO(KPFLUX,LL4,NUN,EVECT(1,NGRP,IMOD),.TRUE.,ERR(M)) + ALPH(M)=REAL(ALP) + BETA(M)=REAL(BET) + ENDIF + ENDIF +* + IF(M.EQ.1) TEST=DELS + IF((M.GT.5).AND.(DELS.GT.TEST)) CALL XABORT('FLDMON: CONVERGENCE' + 1 //' FAILURE.') + IF(M.GE.MAXOUT) THEN + WRITE (6,'(/46H FLDMON: ***WARNING*** MAXIMUM NUMBER OF ITERA, + 1 17HTIONS IS REACHED.)') + GO TO 190 + ENDIF + IF(MOD(M,36).EQ.0) THEN + ISTART=M+1 + NNADI=NNADI+1 + IF(IMPX.GE.1) WRITE (6,700) NNADI + ENDIF + GO TO 50 +*---- +* DIRECT SOLUTION EDITION +*---- + 190 Z1=1.0D0/EVAL + IF(IMPX.GE.1) WRITE (6,630) 1.0D0/EVAL + IF(IMPX.EQ.1) WRITE (6,640) M + IF(IMPX.EQ.3) THEN + DO 210 IGR=1,NGRP + WRITE (6,660) 'DIRECT',IGR,(EVECT(I,IGR,IMOD),I=1,LL4) + 210 CONTINUE + ENDIF + IF(IMPH.EQ.1) THEN + JPFLUX=LCMGID(IPFLUX,'MODE') + KPFLUX=LCMGIL(JPFLUX,IMOD) + CALL LCMLEN(KPFLUX,'REF',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + WRITE(6,'(44H FLDMON: STORE A REFERENCE THERMAL HARMONIC.)') + CALL LCMPUT(KPFLUX,'REF',NUN,2,EVECT(1,NGRP,IMOD)) + ENDIF + ELSE IF(IMPH.GE.2) THEN + JPFLUX=LCMGID(IPFLUX,'MODE') + KPFLUX=LCMGIL(JPFLUX,IMOD) + IGRAPH=0 + 215 IGRAPH=IGRAPH+1 + WRITE (TEXT12,'(5HHISTO,I3)') IGRAPH + CALL LCMLEN (KPFLUX,TEXT12,ILENG,ITYLCM) + IF(ILENG.EQ.0) THEN + MM=MIN(M,MMAXX) + CALL LCMSIX (KPFLUX,TEXT12,1) + CALL LCMPTC (KPFLUX,'HTITLE',72,TITR) + CALL LCMPUT (KPFLUX,'ALPHA',MM,2,ALPH) + CALL LCMPUT (KPFLUX,'BETA',MM,2,BETA) + CALL LCMPUT (KPFLUX,'ERROR',MM,2,ERR) + CALL LCMPUT (KPFLUX,'IMPH',1,1,IMPH) + CALL LCMSIX (KPFLUX,' ',2) + ELSE + GO TO 215 + ENDIF + ENDIF +*---- +* PRECONDITIONED POWER METHOD FOR THE ADJOINT PROBLEM +*---- + CALL KDRCPU(TK1) + EVAL=1.0D0 + VVV=0.0 + ISTART=1 + NNADI=NADI + TEST=0.0 + IF(IMPX.GE.1) WRITE (6,600) NADI,'ADJOINT' + IF(IMPX.GE.2) WRITE (6,610) + CALL FLDDEF(NUN,IPTRK,IPSYS,LL4,ITY,NGRP,IMOD,LMOD,EVECT,ADECT, + 1 ADECT(1,1,IMOD),2,VEA1,VEB1) + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) + M=0 + 220 M=M+1 +*---- +* EIGENVALUE CALCULATION +*---- + CALL KDRCPU(TK1) + AEBE=0.0D0 + BEBE=0.0D0 + DO 235 IGR=1,NGRP + DO 230 I=1,LL4 + AEBE=AEBE+VEA1(I,IGR)*VEB1(I,IGR) + BEBE=BEBE+VEB1(I,IGR)**2 + 230 CONTINUE + 235 CONTINUE + EVAL=AEBE/BEBE + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) +*---- +* DIRECTION EVALUATION +*---- + DO 280 IGR=NGRP,1,-1 + CALL KDRCPU(TK1) + DO 240 I=1,LL4 + GRAD1(I,IGR)=REAL(EVAL)*VEB1(I,IGR)-VEA1(I,IGR) + 240 CONTINUE + DO 270 JGR=NGRP,IGR+1,-1 + WRITE(TEXT12,'(1HA,2I3.3)') JGR,IGR + CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM) + IF(ILONG.EQ.0) GO TO 270 + IF(ITY.EQ.13) THEN + CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,GRAD1(1,JGR),AGAR) + DO 250 I=1,LL4 + GRAD1(I,IGR)=GRAD1(I,IGR)+AGAR(I) + 250 CONTINUE + ELSE + CALL LCMGPD(IPSYS,TEXT12,AGARM_PTR) + CALL C_F_POINTER(AGARM_PTR,AGARM,(/ ILONG /)) + DO 260 I=1,ILONG + GRAD1(I,IGR)=GRAD1(I,IGR)+AGARM(I)*GRAD1(I,JGR) + 260 CONTINUE + ENDIF + 270 CONTINUE + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) +* + CALL KDRCPU(TK1) + WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR + CALL FLDADI(TEXT12,IPTRK,IPSYS,LL4,ITY,GRAD1(1,IGR),NNADI) + CALL KDRCPU(TK2) + TKT=TKT+(TK2-TK1) + 280 CONTINUE +*---- +* PERFORM THERMAL (UP-SCATTERING) ITERATIONS +*---- + IF(MAXINR.GT.1) THEN + CALL FLDTHR(IPTRK,IPSYS,IPFLUX,.TRUE.,LL4,ITY,NUN,NGRP,ICL1, + 1 ICL2,IMPX,NNADI,0,MAXINR,EPSINR,ITER,TKT,TKB,GRAD1) + ENDIF +*---- +* DISPLACEMENT EVALUATION +*---- + CALL KDRCPU(TK1) + F=0.0D0 + DELS=ABS(REAL((EVAL-VVV)/EVAL)) + VVV=REAL(EVAL) +*---- +* EVALUATION OF THE TWO ACCELERATION PARAMETERS ALP AND BET +*---- + ALP=1.0D0 + BET=0.0D0 + N=0 + AEAE=0.0D0 + AEAG=0.0D0 + AEAH=0.0D0 + AGAG=0.0D0 + AGAH=0.0D0 + AHAH=0.0D0 + BEBG=0.0D0 + BEBH=0.0D0 + BGBG=0.0D0 + BGBH=0.0D0 + BHBH=0.0D0 + AEBG=0.0D0 + AEBH=0.0D0 + AGBE=0.0D0 + AGBG=0.0D0 + AGBH=0.0D0 + AHBE=0.0D0 + AHBG=0.0D0 + AHBH=0.0D0 + CALL FLDDEF(NUN,IPTRK,IPSYS,LL4,ITY,NGRP,IMOD,LMOD,EVECT,ADECT, + 1 GRAD1(1,1),2,VEA2,VEB2) + IF(1+MOD(M-ISTART,ICL1+ICL2).GT.ICL1) THEN + DO 295 IGR=1,NGRP + DO 290 I=1,LL4 +* COMPUTE (A ,A ) + AEAE=AEAE+VEA1(I,IGR)**2 + AEAG=AEAG+VEA1(I,IGR)*VEA2(I,IGR) + AEAH=AEAH+VEA1(I,IGR)*VEA3(I,IGR) + AGAG=AGAG+VEA2(I,IGR)**2 + AGAH=AGAH+VEA2(I,IGR)*VEA3(I,IGR) + AHAH=AHAH+VEA3(I,IGR)**2 +* COMPUTE (B ,B ) + BEBG=BEBG+VEB1(I,IGR)*VEB2(I,IGR) + BEBH=BEBH+VEB1(I,IGR)*VEB3(I,IGR) + BGBG=BGBG+VEB2(I,IGR)**2 + BGBH=BGBH+VEB2(I,IGR)*VEB3(I,IGR) + BHBH=BHBH+VEB3(I,IGR)**2 +* COMPUTE (A ,B ) + AEBG=AEBG+VEA1(I,IGR)*VEB2(I,IGR) + AEBH=AEBH+VEA1(I,IGR)*VEB3(I,IGR) + AGBE=AGBE+VEA2(I,IGR)*VEB1(I,IGR) + AGBG=AGBG+VEA2(I,IGR)*VEB2(I,IGR) + AGBH=AGBH+VEA2(I,IGR)*VEB3(I,IGR) + AHBE=AHBE+VEA3(I,IGR)*VEB1(I,IGR) + AHBG=AHBG+VEA3(I,IGR)*VEB2(I,IGR) + AHBH=AHBH+VEA3(I,IGR)*VEB3(I,IGR) + 290 CONTINUE + 295 CONTINUE +* + 300 N=N+1 + IF(N.GT.10) GO TO 305 +* COMPUTE X(M+1) + X=BEBE+ALP*ALP*BGBG+BET*BET*BHBH+2.0D0*(ALP*BEBG+BET*BEBH + 1 +ALP*BET*BGBH) + DXDA=2.0D0*(BEBG+ALP*BGBG+BET*BGBH) + DXDB=2.0D0*(BEBH+ALP*BGBH+BET*BHBH) +* COMPUTE Y(M+1) + Y=AEAE+ALP*ALP*AGAG+BET*BET*AHAH+2.0D0*(ALP*AEAG+BET*AEAH + 1 +ALP*BET*AGAH) + DYDA=2.0D0*(AEAG+ALP*AGAG+BET*AGAH) + DYDB=2.0D0*(AEAH+ALP*AGAH+BET*AHAH) +* COMPUTE Z(M+1) + Z=AEBE+ALP*ALP*AGBG+BET*BET*AHBH+ALP*(AEBG+AGBE) + 1 +BET*(AEBH+AHBE)+ALP*BET*(AGBH+AHBG) + DZDA=AEBG+AGBE+2.0D0*ALP*AGBG+BET*(AGBH+AHBG) + DZDB=AEBH+AHBE+ALP*(AGBH+AHBG)+2.0D0*BET*AHBH +* COMPUTE F(M+1) + F=X*Y-Z*Z + D2F(1,1)=2.0D0*(BGBG*Y+DXDA*DYDA+X*AGAG-DZDA**2-2.0D0*Z*AGBG) + D2F(1,2)=2.0D0*BGBH*Y+DXDA*DYDB+DXDB*DYDA+2.0D0*X*AGAH + 1 -2.0D0*DZDA*DZDB-2.0D0*Z*(AGBH+AHBG) + D2F(2,2)=2.0D0*(BHBH*Y+DXDB*DYDB+X*AHAH-DZDB**2-2.0D0*Z*AHBH) + D2F(2,1)=D2F(1,2) + D2F(1,3)=DXDA*Y+X*DYDA-2.0D0*Z*DZDA + D2F(2,3)=DXDB*Y+X*DYDB-2.0D0*Z*DZDB +* SOLUTION OF A LINEAR SYSTEM. + CALL ALSBD(2,1,D2F,IER,2) + IF(IER.NE.0) GO TO 305 + ALP=ALP-D2F(1,3) + BET=BET-D2F(2,3) + IF(ALP.GT.100.0) GO TO 305 + IF((ABS(D2F(1,3)).LE.1.0D-4).AND.(ABS(D2F(2,3)).LE.1.0D-4)) + 1 GO TO 310 + GO TO 300 +* +* alternative algorithm in case of Newton-Raphton failure + 305 IF(IMPX.GT.0) WRITE(6,'(/30H FLDMON: FAILURE OF THE NEWTON, + 1 55H-RAPHTON ALGORIHTHM FOR COMPUTING THE OVERRELAXATION PA, + 2 12HRAMETERS(2).)') + IAMIN=999 + IBMIN=999 + FMIN=HUGE(FMIN) + DO IA=1,SIZE(ALP_TAB) + ALP=ALP_TAB(IA) + DO IB=1,SIZE(BET_TAB) + BET=BET_TAB(IB) +* COMPUTE X + X=BEBE+ALP*ALP*BGBG+BET*BET*BHBH+2.0D0*(ALP*BEBG+BET*BEBH + 1 +ALP*BET*BGBH) +* COMPUTE Y + Y=AEAE+ALP*ALP*AGAG+BET*BET*AHAH+2.0D0*(ALP*AEAG+BET*AEAH + 1 +ALP*BET*AGAH) +* COMPUTE Z + Z=AEBE+ALP*ALP*AGBG+BET*BET*AHBH+ALP*(AEBG+AGBE) + 1 +BET*(AEBH+AHBE)+ALP*BET*(AGBH+AHBG) +* COMPUTE F + F=X*Y-Z*Z + IF(F.LT.FMIN) THEN + IAMIN=IA + IBMIN=IB + FMIN=F + ENDIF + ENDDO + ENDDO + ALP=ALP_TAB(IAMIN) + BET=BET_TAB(IBMIN) + 310 BET=BET/ALP +* + IF((ALP.LT.1.0D0).AND.(ALP.GT.0.0D0)) THEN + ALP=1.0D0 + BET=0.0D0 + ELSE IF(ALP.LE.0.0D0) THEN + ISTART=M+1 + ALP=1.0D0 + BET=0.0D0 + ENDIF + DO 325 IGR=1,NGRP + DO 320 I=1,LL4 + GRAD1(I,IGR)=REAL(ALP)*(GRAD1(I,IGR)+REAL(BET)*GRAD2(I,IGR)) + VEA2(I,IGR)=REAL(ALP)*(VEA2(I,IGR)+REAL(BET)*VEA3(I,IGR)) + VEB2(I,IGR)=REAL(ALP)*(VEB2(I,IGR)+REAL(BET)*VEB3(I,IGR)) + 320 CONTINUE + 325 CONTINUE + ENDIF + CALL KDRCPU(TK2) + TKB=TKB+(TK2-TK1) +* + LOGTES=(M.LT.ICL1).OR.(MOD(M-ISTART,ICL1+ICL2).EQ.ICL1-1) + IF(LOGTES.AND.(DELS.LE.EPS1))THEN + DELT=0.0 + DO 340 IGR=1,NGRP + DELN=0.0 + DELD=0.0 + DO 330 I=1,LL4 + ADECT(I,IGR,IMOD)=ADECT(I,IGR,IMOD)+GRAD1(I,IGR) + VEA1(I,IGR)=VEA1(I,IGR)+VEA2(I,IGR) + VEB1(I,IGR)=VEB1(I,IGR)+VEB2(I,IGR) + GRAD2(I,IGR)=GRAD1(I,IGR) + VEA3(I,IGR)=VEA2(I,IGR) + VEB3(I,IGR)=VEB2(I,IGR) + DELN=MAX(DELN,ABS(VEB2(I,IGR))) + DELD=MAX(DELD,ABS(VEB1(I,IGR))) + 330 CONTINUE + IF(DELD.NE.0.0) DELT=MAX(DELT,DELN/DELD) + 340 CONTINUE + IF(IMPX.GE.2) WRITE (6,615) M,AEAE,AEAG,AEAH,AGAG,AGAH,AHAH, + 1 BEBE,ALP,BET,EVAL,F,DELS,DELT,N,BEBG,BEBH,BGBG,BGBH,BHBH,AEBE, + 2 AEBG,AEBH,AGBE,AGBG,AGBH,AHBE,AHBG,AHBH + IF(DELT.LE.EPS2) GO TO 360 + ELSE + DO 355 IGR=1,NGRP + DO 350 I=1,LL4 + ADECT(I,IGR,IMOD)=ADECT(I,IGR,IMOD)+GRAD1(I,IGR) + VEA1(I,IGR)=VEA1(I,IGR)+VEA2(I,IGR) + VEB1(I,IGR)=VEB1(I,IGR)+VEB2(I,IGR) + GRAD2(I,IGR)=GRAD1(I,IGR) + VEA3(I,IGR)=VEA2(I,IGR) + VEB3(I,IGR)=VEB2(I,IGR) + 350 CONTINUE + 355 CONTINUE + IF(IMPX.GE.2) WRITE (6,620) M,AEAE,AEAG,AEAH,AGAG,AGAH,AHAH, + 1 BEBE,ALP,BET,EVAL,F,DELS,N,BEBG,BEBH,BGBG,BGBH,BHBH,AEBE, + 2 AEBG,AEBH,AGBE,AGBG,AGBH,AHBE,AHBG,AHBH + ENDIF + IF(M.EQ.1) TEST=DELS + IF((M.GT.5).AND.(DELS.GT.TEST)) CALL XABORT('FLDMON: CONVERGENCE' + 1 //' FAILURE.') + IF(M.GE.MAXOUT) THEN + WRITE (6,'(/46H FLDMON: ***WARNING*** MAXIMUM NUMBER OF ITERA, + 1 17HTIONS IS REACHED.)') + GO TO 360 + ENDIF + IF(MOD(M,36).EQ.0) THEN + ISTART=M+1 + NNADI=NNADI+1 + IF(IMPX.GE.1) WRITE (6,700) NNADI + ENDIF + GO TO 220 +*---- +* ADJOINT SOLUTION EDITION +*---- + 360 IF(IMPX.GE.1) WRITE (6,630) 1.0D0/EVAL + IF(IMPX.EQ.1) WRITE (6,640) M + IF(IMPX.EQ.3) THEN + DO 380 IGR=1,NGRP + WRITE (6,660) 'ADJOINT',IGR,(ADECT(I,IGR,IMOD),I=1,LL4) + 380 CONTINUE + ENDIF +* + IF(ABS(Z1-1.0D0/EVAL).GT.1.0E-4) CALL XABORT('FLDMON: FAILURE O' + 1 //'F HARMONIC COMPUTATION.') + FKEFF(IMOD)=REAL(0.5D0*(Z1+1.0D0/EVAL)) + 390 CONTINUE + IF(IMPX.GE.1) THEN + WRITE (6,650) TKT,TKB,TKT+TKB + WRITE (6,670) (FKEFF(IMOD),IMOD=1,LMOD) + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(AGAR,GRAD1,GRAD2,VEA1,VEA2,VEA3,VEB1,VEB2,VEB3) + RETURN +* + 600 FORMAT(1H1/50H FLDMON: ITERATIVE PROCEDURE BASED ON PRECONDITION, + 1 17HED POWER METHOD (,I2,37H ADI ITERATIONS PER OUTER ITERATION)./ + 2 9X,A7,10H EQUATION.) + 610 FORMAT(//5X,17HBILINEAR PRODUCTS,48X,5HALPHA,3X,4HBETA,3X, + 1 12HEIGENVALUE..,12X,8HACCURACY,11(1H.),2X,1HN) + 615 FORMAT(1X,I3,1P,7E9.1,0P,2F8.3,E14.6,3E10.2,I4/(4X,1P,7E9.1)) + 620 FORMAT(1X,I3,1P,7E9.1,0P,2F8.3,E14.6,2E10.2,10X,I4/(4X,1P,7E9.1)) + 630 FORMAT(/42H FLDMON: EFFECTIVE MULTIPLICATION FACTOR =,1P,D17.10/) + 640 FORMAT(/23H FLDMON: CONVERGENCE IN,I5,12H ITERATIONS.) + 650 FORMAT(/53H FLDMON: CPU TIME USED TO SOLVE THE TRIANGULAR LINEAR, + 1 10H SYSTEMS =,F10.3/23X,34HTO COMPUTE THE BILINEAR PRODUCTS =, + 2 F10.3,20X,16HTOTAL CPU TIME =,F10.3) + 660 FORMAT(//9H FLDMON: ,A7,37H EIGENVECTOR CORRESPONDING TO THE GRO, + 1 2HUP,I4//(5X,1P,8E14.5)) + 670 FORMAT(//21H FLDMON: EIGENVALUES:/(5X,1P,E17.10)) + 700 FORMAT(/53H FLDMON: INCREASING THE NUMBER OF INNER ITERATIONS TO, + 1 I3,36H ADI ITERATIONS PER OUTER ITERATION./) + END |
