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/MCGFCA.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MCGFCA.f')
| -rw-r--r-- | Dragon/src/MCGFCA.f | 535 |
1 files changed, 535 insertions, 0 deletions
diff --git a/Dragon/src/MCGFCA.f b/Dragon/src/MCGFCA.f new file mode 100644 index 0000000..892bbbd --- /dev/null +++ b/Dragon/src/MCGFCA.f @@ -0,0 +1,535 @@ +*DECK MCGFCA + SUBROUTINE MCGFCA(IPTRK,KPSYS,IPMACR,IPRINT,N1,NG,NGEFF,KPN,NREG, + 1 NANI,NFUNL,M,LC,LFORW,PACA,KEYFLX,KEYCUR,NZON, + 2 NGIND,NCONV,MXACA,EPSACA,MACFLG,REBFLG,PHIOUT, + 3 PHIIN,COMBFLG,NPJJM,KEYANI,IDIR) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Acceleration of iterations (ACA method). +* +*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 +* IPTRK pointer to the tracking LCM object. +* KPSYS pointer array for each group properties. +* IPMACR pointer to the macrolib LCM object. +* IPRINT print parameter (equal to zero for no print). +* N1 number of unknowns per group of the corrective system. +* NG number of groups. +* NGEFF number of groups to process. +* KPN total number of unknowns in vectors SUNKNO and FUNKNO. +* NREG number of volumes. +* NANI scattering anisotropy (=1 for isotropic scattering). +* NFUNL number of moments of the flux (in 2D: NFUNL=NANI*(NANI+1)/2). +* M number of material mixtures. +* LC dimension of profiled matrices MCU and CQ. +* LFORW flag set to .false. to transpose the coefficient matrix. +* PACA type of preconditioner to solve the ACA corrective system. +* KEYFLX position of flux elements in FI vector. +* KEYCUR position of current elements in FI vector. +* NZON index-number of the mixture type assigned to each volume. +* NGIND index of the groups to process. +* NCONV logical array of convergence status for each group (.TRUE. +* not converged). +* MXACA maximum number of iterations. +* EPSACA convergence criterion. +* MACFLG multigroup cross section flag. +* REBFLG rebalancing form flag for ACA. +* PHIIN initial guess (for this iteration) of zonal scalar flux. +* COMBFLG flag for three-step scheme in combination wih SCR. +* NPJJM second dimension of PJJ. +* KEYANI 'mode to l' index: l=KEYANI(nu). +* IDIR direction of fundamental current for TIBERE with MoC +* (=0,1,2,3). +* +*Parameters: input/output +* PHIOUT zonal scalar flux. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPTRK,KPSYS(NGEFF),IPMACR + INTEGER N1,N2,NGEFF,NG,IPRINT,KPN,NREG,NANI,NFUNL,M,LC,PACA, + 1 KEYFLX(NREG,NFUNL),KEYCUR(*),NZON(N1),NGIND(NGEFF),MXACA,NPJJM, + 2 KEYANI(NFUNL),IDIR + REAL EPSACA,PHIIN(KPN,NGEFF) + DOUBLE PRECISION PHIOUT(KPN,NGEFF) + LOGICAL LFORW,NCONV(NGEFF),MACFLG,REBFLG,COMBFLG +*---- +* LOCAL VARIABLES +*---- + TYPE(C_PTR) JPMACR,KPMACR,JPSYS + INTEGER LC0 + REAL FLXN + CHARACTER*12 NGTYP + INTEGER, TARGET, SAVE, DIMENSION(1) :: IDUMMY + REAL, TARGET, SAVE, DIMENSION(1) :: DUMMY +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NGINDV,NJJ,IJJ,IPOS + REAL, ALLOCATABLE, DIMENSION(:) :: XSCAT + REAL, ALLOCATABLE, DIMENSION(:,:) :: XSW,PJJ + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: AR,PSI,ARSCR +* + TYPE(C_PTR) PJJIND_PTR,IM_PTR,MCU_PTR,IPERM_PTR,JU_PTR,IM0_PTR, + 1 MCU0_PTR + TYPE(C_PTR) DIAGQ_PTR,CQ_PTR,LUDF_PTR,LUCF_PTR,CF_PTR,DIAGF_PTR + INTEGER, POINTER, DIMENSION(:) :: IM,MCU,IPERM,JU,IM0,MCU0 + INTEGER, POINTER, DIMENSION(:,:) :: PJJIND + REAL, POINTER, DIMENSION(:) :: DIAGQ,CQ,LUDF,LUCF,CF,DIAGF +*---- +* INITIALIZE POINTERS +*---- + JU=>IDUMMY + IM0=>IDUMMY + MCU0=>IDUMMY + LUDF=>DUMMY + LUCF=>DUMMY + CF=>DUMMY + DIAGF=>DUMMY +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(NGINDV(NG),AR(N1,NGEFF),PSI(N1,NGEFF),XSW(0:M,NANI), + 1 ARSCR(KPN,NGEFF)) + AR(:N1,:NGEFF)=0.0D0 + XSW(0:M,:NANI)=0.0 + ARSCR(:KPN,:NGEFF)=0.0D0 +* recover connection matrices + CALL LCMGPD(IPTRK,'IM$MCCG',IM_PTR) + CALL LCMGPD(IPTRK,'MCU$MCCG',MCU_PTR) + CALL C_F_POINTER(IM_PTR,IM,(/ N1+1 /)) + CALL C_F_POINTER(MCU_PTR,MCU,(/ LC /)) +* recover permutation array + CALL LCMGPD(IPTRK,'PI$MCCG',IPERM_PTR) + CALL C_F_POINTER(IPERM_PTR,IPERM,(/ N1 /)) + IF(PACA.GE.2) THEN + CALL LCMGPD(IPTRK,'JU$MCCG',JU_PTR) + CALL C_F_POINTER(JU_PTR,JU,(/ N1 /)) + ENDIF + IF(PACA.EQ.3) THEN + CALL LCMLEN(IPTRK,'IM0$MCCG',LIM0,ITYLCM) + CALL LCMLEN(IPTRK,'MCU0$MCCG',LC0,ITYLCM) + CALL LCMGPD(IPTRK,'IM0$MCCG',IM0_PTR) + CALL LCMGPD(IPTRK,'MCU0$MCCG',MCU0_PTR) + CALL C_F_POINTER(IM0_PTR,IM0,(/ LIM0 /)) + CALL C_F_POINTER(MCU0_PTR,MCU0,(/ LC0 /)) + ELSE + LIM0=0 + LC0=0 + ENDIF + IF(MACFLG) THEN + JPMACR=LCMGID(IPMACR,'GROUP') + ALLOCATE(NJJ(0:M),IJJ(0:M),IPOS(0:M),XSCAT(0:M*NG)) + ENDIF + IF(REBFLG) THEN +* N2: number of groups to treat at the same time. +* rebalancing + N2=NGEFF + ELSE +* inner iterations acceleration + N2=1 + ENDIF +*---- +* CONSTRUCT NGINDV (index to pass from "NGEFF format" to "NG format"). +*---- + NGINDV(:NG)=0 + DO II=1,NGEFF + IF(NCONV(II)) THEN + IG=NGIND(II) + NGINDV(IG)=II + ENDIF + ENDDO +*---- +* COMPUTE RESIDUAL OF THE PREVIOUS FREE ITERATION FOR RHS WITHOUT +* COMBFLG OPTION +*---- + IF(IPRINT.GT.10) WRITE(6,*) 'Direction',IDIR + IF(.NOT.COMBFLG) THEN + DO II=1,NGEFF + IF(NCONV(II)) THEN + IG=NGIND(II) + JPSYS=KPSYS(II) + CALL LCMGET(JPSYS,'DRAGON-S0XSC',XSW) + IF(MACFLG) THEN + KPMACR=LCMGIL(JPMACR,IG) + CALL LCMGET(KPMACR,'NJJS00',NJJ(1)) + CALL LCMGET(KPMACR,'IJJS00',IJJ(1)) + CALL LCMGET(KPMACR,'IPOS00',IPOS(1)) + CALL LCMGET(KPMACR,'SCAT00',XSCAT(1)) + ENDIF +* residual for ACA system + CALL MCGFCR(IPRINT,IG,II,NG,NGEFF,KPN,N1,NREG,NANI,NFUNL, + 1 M,.TRUE.,KEYFLX,KEYCUR,NZON,NGINDV,MACFLG,PHIOUT,PHIIN, + 2 XSW,IPERM(1),NJJ,IJJ,IPOS,XSCAT,AR(1,II)) + ENDIF + ENDDO +*---- +* COMPUTE RESIDUAL OF THE PREVIOUS FREE ITERATION FOR RHS WITH COMBFLG +* OPTION +*---- + ELSE + ALLOCATE(PJJ(NREG,NPJJM)) + CALL LCMGPD(IPTRK,'PJJIND$MCCG',PJJIND_PTR) + CALL C_F_POINTER(PJJIND_PTR,PJJIND,(/ NPJJM,2 /)) + DO II=1,NGEFF + IF(NCONV(II)) THEN + IG=NGIND(II) + JPSYS=KPSYS(II) + CALL LCMGET(JPSYS,'DRAGON-S0XSC',XSW) + IF(MACFLG) THEN + KPMACR=LCMGIL(JPMACR,IG) + CALL LCMGET(KPMACR,'NJJS00',NJJ(1)) + CALL LCMGET(KPMACR,'IJJS00',IJJ(1)) + CALL LCMGET(KPMACR,'IPOS00',IPOS(1)) + CALL LCMGET(KPMACR,'SCAT00',XSCAT(1)) + ENDIF +* residual for ACA system + CALL MCGFCR(IPRINT,IG,II,NG,NGEFF,KPN,N1,NREG,NANI,NFUNL, + 1 M,.TRUE.,KEYFLX,KEYCUR,NZON,NGINDV,MACFLG,PHIOUT,PHIIN, + 2 XSW,IPERM(1),NJJ,IJJ,IPOS,XSCAT,AR(1,II)) +* residual for SCR-combined scheme + CALL MCGFCR(IPRINT,IG,II,NG,NGEFF,KPN,N1,NREG,NANI,NFUNL, + 1 M,.FALSE.,KEYFLX,KEYCUR,NZON,NGINDV,MACFLG,PHIOUT, + 2 PHIIN,XSW,KEYANI(1),NJJ,IJJ,IPOS,XSCAT,ARSCR(1,II)) + IF(NANI.GT.1) THEN + IF(IDIR.EQ.0) THEN + CALL LCMGET(JPSYS,'PJJ$MCCG',PJJ) + ELSEIF(IDIR.EQ.1) THEN + CALL LCMGET(JPSYS,'PJJX$MCCG',PJJ) + ELSEIF(IDIR.EQ.2) THEN + CALL LCMGET(JPSYS,'PJJY$MCCG',PJJ) + ELSEIF(IDIR.EQ.3) THEN + CALL LCMGET(JPSYS,'PJJZ$MCCG',PJJ) + ENDIF + DO I=1,N1 + J=IPERM(I) + IBM=NZON(J) + IF(IBM.GE.0) THEN + DO IMOD=1,NPJJM + INU1=PJJIND(IMOD,1) + INU2=PJJIND(IMOD,2) + IF((INU1.EQ.1).AND.(INU2.NE.1)) THEN + IND2=KEYFLX(J,INU2) + AR(I,II)=AR(I,II)+PJJ(J,IMOD)*ARSCR(IND2,II) + ELSEIF((INU2.EQ.1).AND.(INU1.NE.1)) THEN + IND1=KEYFLX(J,INU1) + AR(I,II)=AR(I,II)+PJJ(J,IMOD)*ARSCR(IND1,II) + ENDIF + ENDDO + ENDIF + ENDDO + ENDIF + ENDIF + ENDDO + DEALLOCATE(PJJ) + ENDIF +*--- +* ITERATIVE APPROACH TO SOLVE THE PRECONDITIONING SYSTEM +*--- +* --- +* GROUP PER GROUP PROCEDURE +* --- + IF(MACFLG) THEN +* MULTIGROUP REBALANCING (GAUSS-SEIDEL SCHEME) + NGTYP='GAUSS-SEIDEL' + PSI(:N1,:NGEFF)=0.0D0 + NGFAST=NGEFF + IF(REBFLG) THEN +* ONLY FOR FAST GROUPS (thermal group will be treated iteratively) + DO II=1,NGEFF + IF(NCONV(II)) THEN + IG=NGIND(II) + KPMACR=LCMGIL(JPMACR,IG) + CALL LCMGET(KPMACR,'IJJS00',IJJ(1)) + DO IBM=1,M + IF(IJJ(IBM).GT.IG) THEN + NGFAST=II-1 ! last fast group index in NGEFF format + GOTO 5 + ENDIF + ENDDO + ENDIF + ENDDO + ENDIF + ELSE +* INNER ITERATION ACCELERATION + NGTYP=' ONE-GROUP' + NGFAST=NGEFF + ENDIF + 5 CONTINUE + DO II=1,NGFAST + IF(NCONV(II)) THEN +* infinite norm of group scalar flux + FLXN=0.0 + DO I=1,NREG + IND=KEYFLX(I,1) + TEMP=REAL(ABS(PHIOUT(IND,II))) + FLXN=MAX(TEMP,FLXN) + ENDDO + IF(MACFLG) THEN +* contribution from other groups (Gauss-Seidel multigroup +* scheme without iterations) + IG=NGIND(II) + KPMACR=LCMGIL(JPMACR,IG) + CALL LCMGET(KPMACR,'NJJS00',NJJ(1)) + CALL LCMGET(KPMACR,'IJJS00',IJJ(1)) + CALL LCMGET(KPMACR,'IPOS00',IPOS(1)) + CALL LCMGET(KPMACR,'SCAT00',XSCAT(1)) + DO I=1,N1 + J=IPERM(I) + IBM=NZON(J) + IF(IBM.GT.0) THEN + JG=IJJ(IBM) + DO 10 JND=1,NJJ(IBM) + IF(JG.NE.IG) THEN + JJ=NGINDV(JG) + IF(JJ.GT.0) THEN + AR(I,II)=AR(I,II)+XSCAT(IPOS(IBM)+JND-1)* + 1 PSI(I,JJ) + ENDIF + ENDIF + JG=JG-1 + 10 CONTINUE + ENDIF + ENDDO + ENDIF +* apply preconditioner to RHS + IG=NGIND(II) + JPSYS=KPSYS(II) + CALL LCMGPD(JPSYS,'DIAGQ$MCCG',DIAGQ_PTR) + CALL LCMGPD(JPSYS,'CQ$MCCG',CQ_PTR) + CALL C_F_POINTER(DIAGQ_PTR,DIAGQ,(/ N1 /)) + CALL C_F_POINTER(CQ_PTR,CQ,(/ LC /)) + IF(PACA.GE.2) THEN + CALL LCMGPD(JPSYS,'ILUDF$MCCG',LUDF_PTR) + CALL C_F_POINTER(LUDF_PTR,LUDF,(/ N1 /)) + IF(PACA.LT.4) THEN + CALL LCMGPD(JPSYS,'ILUCF$MCCG',LUCF_PTR) + CALL C_F_POINTER(LUCF_PTR,LUCF,(/ LC /)) + ENDIF + IF(PACA.GE.3) THEN + CALL LCMGPD(JPSYS,'CF$MCCG',CF_PTR) + CALL C_F_POINTER(CF_PTR,CF,(/ N1 /)) + ENDIF + ELSE IF(PACA.EQ.1) THEN + CALL LCMGPD(JPSYS,'DIAGF$MCCG',DIAGF_PTR) + CALL C_F_POINTER(DIAGF_PTR,DIAGF,(/ LC /)) + ENDIF + CALL MCGPRA(LFORW,3,PACA,.TRUE.,N1,LC,IM,MCU,JU,DIAGQ,CQ, + 1 LUDF,LUCF,DIAGF,AR(1,II),PSI(1,II),LC0,IM0,MCU0,CF) +* group per group BICGSTAB + JPSYS=KPSYS(II) + CALL LCMGPD(JPSYS,'DIAGF$MCCG',DIAGF_PTR) + CALL LCMGPD(JPSYS,'CF$MCCG',CF_PTR) + CALL C_F_POINTER(DIAGF_PTR,DIAGF,(/ N1 /)) + CALL C_F_POINTER(CF_PTR,CF,(/ LC /)) + IF(PACA.GE.2) THEN + CALL LCMGPD(JPSYS,'ILUDF$MCCG',LUDF_PTR) + CALL C_F_POINTER(LUDF_PTR,LUDF,(/ N1 /)) + IF(PACA.LT.4) THEN + CALL LCMGPD(JPSYS,'ILUCF$MCCG',LUCF_PTR) + CALL C_F_POINTER(LUCF_PTR,LUCF,(/ LC /)) + ENDIF + ENDIF + CALL MCGABG(IPRINT,LFORW,PACA,N1,LC,EPSACA,MXACA,IM,MCU, + 1 JU,DIAGF,CF,LUDF,LUCF,AR(1,II),PSI(1,II),FLXN,LC0, + 2 IM0,MCU0) + ENDIF + ENDDO +* + IF((REBFLG).AND.(IPRINT.GT.0)) THEN + IF(NGFAST.GT.0) WRITE(6,100) NGIND(1),NGIND(NGFAST),NGTYP + ELSE + IF(IPRINT.GT.1) WRITE(6,100) NGIND(1),NGIND(NGFAST),NGTYP + ENDIF +* + IF((REBFLG).AND.(NGFAST.LT.NGEFF)) THEN +* --- +* MULTIGROUP PROCEDURE +* --- +* THERMAL GROUPS REBALANCING + FLXN=0.0 + NFIRST=NGFAST+1 + DO II=NFIRST,NGEFF + IF(NCONV(II)) THEN +* infinite norm of multigroup (thermal groups) scalar flux + DO I=1,NREG + IND=KEYFLX(I,1) + TEMP=REAL(ABS(PHIOUT(IND,II))) + FLXN=MAX(TEMP,FLXN) + ENDDO +* contribution from fast groups to rhs + IG=NGIND(II) + KPMACR=LCMGIL(JPMACR,IG) + CALL LCMGET(KPMACR,'NJJS00',NJJ(1)) + CALL LCMGET(KPMACR,'IJJS00',IJJ(1)) + CALL LCMGET(KPMACR,'IPOS00',IPOS(1)) + CALL LCMGET(KPMACR,'SCAT00',XSCAT(1)) + DO I=1,N1 + J=IPERM(I) + IBM=NZON(J) + IF(IBM.GT.0) THEN + JG=IJJ(IBM) + DO 20 JND=1,NJJ(IBM) + IF(JG.NE.IG) THEN + JJ=NGINDV(JG) + IF((JJ.GT.0).AND.(JJ.LE.NGFAST)) THEN + AR(I,II)=AR(I,II)+XSCAT(IPOS(IBM)+JND-1)* + 1 PSI(I,JJ) + ENDIF + ENDIF + JG=JG-1 + 20 CONTINUE + ENDIF + ENDDO + ENDIF + ENDDO +* apply preconditioner to RHS + DO II=NFIRST,NGEFF + IF(NCONV(II)) THEN + JPSYS=KPSYS(II) + CALL LCMGPD(JPSYS,'DIAGQ$MCCG',DIAGQ_PTR) + CALL LCMGPD(JPSYS,'CQ$MCCG',CQ_PTR) + CALL C_F_POINTER(DIAGQ_PTR,DIAGQ,(/ 1 /)) + CALL C_F_POINTER(CQ_PTR,CQ,(/ 1 /)) + IF(PACA.GE.2) THEN + CALL LCMGPD(JPSYS,'ILUDF$MCCG',LUDF_PTR) + CALL C_F_POINTER(LUDF_PTR,LUDF,(/ 1 /)) + IF(PACA.LT.4) THEN + CALL LCMGPD(JPSYS,'ILUCF$MCCG',LUCF_PTR) + CALL C_F_POINTER(LUCF_PTR,LUCF,(/ 1 /)) + ENDIF + IF(PACA.GE.3) THEN + CALL LCMGPD(JPSYS,'CF$MCCG',CF_PTR) + CALL C_F_POINTER(CF_PTR,CF,(/ 1 /)) + ENDIF + ELSEIF(PACA.EQ.1) THEN + CALL LCMGPD(JPSYS,'DIAGF$MCCG',DIAGF_PTR) + CALL C_F_POINTER(DIAGF_PTR,DIAGF,(/ 1 /)) + ENDIF + CALL MCGPRA(LFORW,3,PACA,.TRUE.,N1,LC,IM,MCU,JU,DIAGQ,CQ, + 1 LUDF,LUCF,DIAGF,AR(1,II),PSI(1,II),LC0,IM0,MCU0,CF) + ENDIF + ENDDO +* multigroup BICGSTAB + CALL MCGABGR(IPRINT,LFORW,PACA,N1,NG,NFIRST,NGEFF,M,LC,NGIND, + 1 NGINDV,NCONV,KPSYS,JPMACR,NZON,IPERM,IM,MCU,JU,EPSACA, + 2 MXACA,AR,PSI,FLXN,LC0,IM0,MCU0) + ENDIF +*---- +* PERFORM THE CORRECTION +*---- + IF(COMBFLG) THEN +* ----------------------------------------------- +* ACA is combined in a three-step scheme with SCR +* ----------------------------------------------- + ALLOCATE(PJJ(NREG,NPJJM)) + CALL LCMGPD(IPTRK,'PJJIND$MCCG',PJJIND_PTR) + CALL C_F_POINTER(PJJIND_PTR,PJJIND,(/ NPJJM,2 /)) + DO II=1,NGEFF + IF(NCONV(II)) THEN + IG=NGIND(II) + JPSYS=KPSYS(II) + CALL LCMGET(JPSYS,'DRAGON-S0XSC',XSW) + IF(MACFLG) THEN + KPMACR=LCMGIL(JPMACR,IG) + CALL LCMGET(KPMACR,'NJJS00',NJJ(1)) + CALL LCMGET(KPMACR,'IJJS00',IJJ(1)) + CALL LCMGET(KPMACR,'IPOS00',IPOS(1)) + CALL LCMGET(KPMACR,'SCAT00',XSCAT(1)) + ENDIF + IF(IDIR.EQ.0) THEN + CALL LCMGET(JPSYS,'PJJ$MCCG',PJJ) + ELSEIF(IDIR.EQ.1) THEN + CALL LCMGET(JPSYS,'PJJX$MCCG',PJJ) + ELSEIF(IDIR.EQ.2) THEN + CALL LCMGET(JPSYS,'PJJY$MCCG',PJJ) + ELSEIF(IDIR.EQ.3) THEN + CALL LCMGET(JPSYS,'PJJZ$MCCG',PJJ) + ENDIF + DO I=1,N1 + J=IPERM(I) + IBM=NZON(J) + IF(IBM.GE.0) THEN +* Flux Correction + IND=KEYFLX(J,1) + PHIOUT(IND,II)=PHIOUT(IND,II) + 1 +(1.0-PJJ(J,1)*XSW(IBM,1))*PSI(I,II) + DO IMOD=1,NPJJM + INU1=PJJIND(IMOD,1) + INU2=PJJIND(IMOD,2) + IF(INU1.EQ.1) THEN + IND2=KEYFLX(J,INU2) + PHIOUT(IND,II)=PHIOUT(IND,II) + 1 -PJJ(J,IMOD)*ARSCR(IND2,II) + ELSEIF(INU2.EQ.1) THEN + IND1=KEYFLX(J,INU1) + PHIOUT(IND,II)=PHIOUT(IND,II) + 1 -PJJ(J,IMOD)*ARSCR(IND1,II) + ENDIF + ENDDO + IF(MACFLG) THEN + JG=IJJ(IBM) + DO 30 JND=1,NJJ(IBM) + IF(JG.NE.IG) THEN + JJ=NGINDV(JG) + IF(JJ.GT.0) THEN + PHIOUT(IND,II)=PHIOUT(IND,II)-PJJ(J,1)* + 1 XSCAT(IPOS(IBM)+JND-1)*PSI(I,JJ) + ENDIF + ENDIF + JG=JG-1 + 30 CONTINUE + ENDIF + ELSE +* Current Correction + IND=KEYCUR(J-NREG) + PHIOUT(IND,II)=PHIOUT(IND,II)+PSI(I,II) + ENDIF + ENDDO + ENDIF + ENDDO + DEALLOCATE(PJJ) + ELSE +* ----------------- +* ACA is used alone +* ----------------- + DO II=1,NGEFF + IF(NCONV(II)) THEN + DO I=1,N1 + J=IPERM(I) + IF(NZON(J).GE.0) THEN +* Flux Correction + IND=KEYFLX(J,1) + PHIOUT(IND,II)=PHIOUT(IND,II)+PSI(I,II) + ELSE +* Current Correction + IND=KEYCUR(J-NREG) + PHIOUT(IND,II)=PHIOUT(IND,II)+PSI(I,II) + ENDIF + ENDDO + ENDIF + ENDDO + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + IF(MACFLG) DEALLOCATE(XSCAT,IPOS,IJJ,NJJ) + DEALLOCATE(ARSCR,XSW,PSI,AR,NGINDV) + RETURN +* + 100 FORMAT(10X,11HACA: GROUPS,I4,3H TO,I4,2H: ,A12,7H SCHEME) + END |
