diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/MCGABGR.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MCGABGR.f')
| -rw-r--r-- | Dragon/src/MCGABGR.f | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/Dragon/src/MCGABGR.f b/Dragon/src/MCGABGR.f new file mode 100644 index 0000000..ea36bd4 --- /dev/null +++ b/Dragon/src/MCGABGR.f @@ -0,0 +1,294 @@ +*DECK MCGABGR + SUBROUTINE MCGABGR(IPRINT,LFORW,PACA,N,NG,NFIRST,NGEFF,M,LC,NGIND, + 1 NGINDV,NCONV,KPSYS,JPMACR,NZON,IPERM,IM,MCU,JU, + 2 EPSM,MAXM,RHS,F,FAC,LC0,IM0,MCU0) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solve the ACA corrective system (in a rebalancing form) using +* BICGSTAB. +* +*Reference: (p382) +* MEURANT, G. 1999. "Computer Solution of Large Linear Systems". +* Studies in Mathematics and its Applications vol.28. North Holland. +* 776p. +* +*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): R. Le Tellier +* +*Parameters: input +* IPRINT print parameter. +* LFORW flag set to .false. to transpose the coefficient matrix. +* PACA type of preconditioner to solve the ACA corrective system. +* N number of unknowns per group. +* NG total number of groups. +* NFIRST first group to proceed. +* NGEFF number of unconverged groups. +* M number of material mixtures. +* LC dimension of profiled matrices MCU and CQ. +* NGIND index of the groups to process. +* NGINDV index to pass from "NGEFF format" to "NG format". +* NCONV logical array of convergence status for each group (.TRUE.: +* not converged). +* KPSYS pointer array for each group properties. +* JPMACR pointer to the macrolib LCM object ('GROUP' directory). +* NZON index-number of the mixture type assigned to each volume. +* IPERM permutation array for ACA. +* IM connection matrix. +* MCU connection matrix. +* JU used for ilu0 preconditioner. +* EPSM stopping criterion. +* MAXM maximum number of iterations allowed. +* RHS right hand-side of the corrective system (already +* preconditioned). +* FAC scaling factor for precision. +* LC0 used in ILU0-ACA acceleration. +* IM0 used in ILU0-ACA acceleration. +* MCU0 used in ILU0-ACA acceleration. +* +*Parameters: output +* F corrective fluxes and currents. +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER IPRINT,PACA,N,NG,NFIRST,NGEFF,M,LC,NGIND(NGEFF), + 1 NGINDV(NG),KPSYS(NGEFF),JPMACR,NZON(N),IPERM(N),IM(N+1),MCU(LC), + 2 JU(N),MAXM,LC0,IM0(*),MCU0(*) + REAL EPSM,FAC + DOUBLE PRECISION RHS(N,NGEFF),F(N,NGEFF) + LOGICAL LFORW,NCONV(NGEFF) +*---- +* LOCAL VARIABLE +*---- + REAL EPSMAX,EPSINF,EPS2 + PARAMETER (EPSMAX=1E-7) + INTEGER I,II,J,ITER + DOUBLE PRECISION R,BI,WI,RT1,ASIN,ASIN2,SQ2 + DOUBLE PRECISION DDOT,AUX(2),EPS,FNORM,RHSN + LOGICAL DEBUG + INTRINSIC SQRT,ABS + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: PI,RI,SI,ROT,API, + 1 ASI +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(PI(N,NGEFF),RI(N,NGEFF),SI(N,NGEFF),ROT(N,NGEFF), + 1 API(N,NGEFF),ASI(N,NGEFF)) +* + SQ2=1.D0/SQRT(2.D0) +*--- + DEBUG=.FALSE. + EPSINF=EPSMAX*FAC + ITER=0 +* + RHSN=0.0 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO I=1,N + RHSN=MAX(RHSN,ABS(RHS(I,II))) + ENDDO + ENDIF + ENDDO + IF (RHSN.LT.EPSINF) THEN + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO I=1,N + F(I,II)=0.0D0 + ENDDO + ENDIF + ENDDO + IF (DEBUG) WRITE(6,200) RHSN,EPSINF + GO TO 40 + ENDIF + EPS2=EPSMAX*REAL(RHSN) + EPS2=EPS2*EPS2 +*--- +* initial corrective flux is set to rhs +* calculate (P times (D times RHS)) -> RI + CALL MCGACA(LFORW,PACA,N,NG,NFIRST,NGEFF,M,LC,NGIND,NGINDV,NCONV, + 1 KPSYS,JPMACR,NZON,IPERM,IM,MCU,JU,RHS(1,1),LC0,IM0,MCU0,RI) + R=0.0 + FNORM=0.0 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO I=1,N + F(I,II)=RHS(I,II) + RI(I,II)=RHS(I,II)-RI(I,II) + PI(I,II)=RI(I,II) + ROT(I,II)=RI(I,II) + ENDDO + R=R+DDOT(N,RI(1,II),1,RI(1,II),1) + FNORM=FNORM+DDOT(N,F(1,II),1,F(1,II),1) + ENDIF + ENDDO + EPS=SQRT(R/FNORM) + IF (DEBUG) WRITE(6,100) ITER,EPS,EPSM + IF (EPS.LE.EPSM) GO TO 40 + AUX(1)=R !!DDOT(N,RI,1,ROT,1) +* + DO WHILE (ITER.LT.MAXM) +* BiCGSTAB iterations + ITER=ITER+1 +* calculate (P times (D times PI)) -> API + CALL MCGACA(LFORW,PACA,N,NG,NFIRST,NGEFF,M,LC,NGIND,NGINDV, + 1 NCONV,KPSYS,JPMACR,NZON,IPERM,IM,MCU,JU,PI(1,1),LC0,IM0, + 2 MCU0,API) +* + AUX(2)=0.0 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + AUX(2)=AUX(2)+DDOT(N,API(1,II),1,ROT(1,II),1) + ENDIF + ENDDO + AUX(2)=AUX(1)/AUX(2) + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO J=1,N + SI(J,II)=RI(J,II)-AUX(2)*API(J,II) + ENDDO + ENDIF + ENDDO + ITER=ITER+1 +* calculate (P times (D times SI)) -> ASI + CALL MCGACA(LFORW,PACA,N,NG,NFIRST,NGEFF,M,LC,NGIND,NGINDV, + 1 NCONV,KPSYS,JPMACR,NZON,IPERM,IM,MCU,JU,SI(1,1),LC0,IM0, + 2 MCU0,ASI) +* + ASIN2=0.0 + ASIN=0.0 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + ASIN2=ASIN2+DDOT(N,ASI(1,II),1,SI(1,II),1) + ASIN=ASIN+DDOT(N,ASI(1,II),1,ASI(1,II),1) + ENDIF + ENDDO + IF (ASIN.GT.EPSMAX*ASIN2) THEN + WI=ASIN2/ASIN + ELSE +* assuming lucky breakdown + WI=1.0 + ENDIF +!!!!* Modification proposed by Sleijpen and Van der Vorst +!!!!* (Numerical Algorithms, 10:203-223, 1995) +!!!! ASIN2=0.0 +!!!! ASIN=0.0 +!!!! SIN=0.0 +!!!! DO II=NFIRST,NGEFF +!!!! IF (NCONV(II)) THEN +!!!! ASIN2=ASIN2+DDOT(N,ASI(1,II),1,SI(1,II),1) +!!!! ASIN=ASIN+DDOT(N,ASI(1,II),1,ASI(1,II),1) +!!!! SIN=SIN+DDOT(N,SI(1,II),1,SI(1,II),1) +!!!! ENDIF +!!!! ENDDO +!!!! ASIN=SQRT(ASIN) +!!!! SIN=SQRT(SIN) +!!!! CN=ASIN*SIN +!!!! IF (CN.GT.EPSMAX*ASIN2) THEN +!!!! CN=ASIN2/CN +!!!! WI=MAX(ABS(CN),SQ2)*SIN/ASIN +!!!! WI=SIGN(WI,CN) +!!!! ELSE +!!!!* assuming lucky breakdown +!!!! WI=1.0 +!!!! ENDIF +* calculate new iterate + R=0.0 + FNORM=0.0 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO J=1,N + F(J,II)=F(J,II)+AUX(2)*PI(J,II)+WI*SI(J,II) + RI(J,II)=SI(J,II)-WI*ASI(J,II) + ENDDO + R=R+DDOT(N,RI(1,II),1,RI(1,II),1) + FNORM=FNORM+DDOT(N,F(1,II),1,F(1,II),1) + ENDIF + ENDDO + IF (FNORM.LT.EPS2) GOTO 30 + EPS=SQRT(R/FNORM) + IF (DEBUG) WRITE(6,100) ITER,EPS,EPSM + IF (EPS.LE.EPSM) GO TO 20 + RT1=AUX(1) + AUX(1)=0.0 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + AUX(1)=AUX(1)+DDOT(N,RI(1,II),1,ROT(1,II),1) + ENDIF + ENDDO + BI=AUX(1)/RT1*AUX(2)/WI + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO J=1,N + PI(J,II)=RI(J,II)+BI*(PI(J,II)-WI*API(J,II)) + ENDDO + ENDIF + ENDDO + ENDDO + 20 CONTINUE +* determine final residual norm + ITER=ITER+1 +* calculate (P times (D times F)) -> RI + CALL MCGACA(LFORW,PACA,N,NG,NFIRST,NGEFF,M,LC,NGIND,NGINDV,NCONV, + 1 KPSYS,JPMACR,NZON,IPERM,IM,MCU,JU,F(1,1),LC0,IM0,MCU0,RI) +* + R=0.0 + FNORM=0.0 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO I=1,N + RI(I,II)=RHS(I,II)-RI(I,II) + ENDDO + R=R+DDOT(N,RI(1,II),1,RI(1,II),1) + FNORM=FNORM+DDOT(N,F(1,II),1,F(1,II),1) + ENDIF + ENDDO + IF (FNORM.LT.EPS2) GOTO 30 + EPS=SQRT(R/FNORM) + IF (IPRINT.GT.0) WRITE(6,400) EPS,ITER +!!!! R=0.0 +!!!! FNORM=0.0 +!!!! EPS=0.0 +!!!! DO II=NFIRST,NGEFF +!!!! IF (NCONV(II)) THEN +!!!! DO I=1,N +!!!! R=MAX(R,ABS(RI(I,II))) +!!!! FNORM=MAX(FNORM,ABS(F(I,II))) +!!!! ENDDO +!!!! EPS=MAX(EPS,R/FNORM) +!!!! ENDIF +!!!! ENDDO +!!!! WRITE(*,*) ' PRC=',EPS + GO TO 40 +* + 30 IF (DEBUG) WRITE(6,300) ITER,FNORM,EPS2 + DO II=NFIRST,NGEFF + IF (NCONV(II)) THEN + DO I=1,N + F(I,II)=0.0 + ENDDO + ENDIF + ENDDO +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + 40 DEALLOCATE(ASI,API,ROT,SI,RI,PI) + RETURN +* + 100 FORMAT(9X,14H MCGABGR:ITER=,I3,5H EPS=,E9.2,5H TAR=,E9.2) + 200 FORMAT(9X,27H MCGABGR:RHS INFINITE NORM=,E9.2,5H LIM=,E9.2/ + 1 9X,33H -> ACA CORRECTION IS SET TO ZERO) + 300 FORMAT(9X,14H MCGABGR:ITER=,I3,7H FNORM=,E9.2,5H LIM=,E9.2) + 400 FORMAT(10X,48HACA: UP-SCATTE. GROUPS: MULTIGROUP BICGSTAB: PRC:, + 1 E9.2,2H (,I4,12H ITERATIONS)) + END |
