summaryrefslogtreecommitdiff
path: root/Dragon/src/MCGSCS.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 /Dragon/src/MCGSCS.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MCGSCS.f')
-rw-r--r--Dragon/src/MCGSCS.f102
1 files changed, 102 insertions, 0 deletions
diff --git a/Dragon/src/MCGSCS.f b/Dragon/src/MCGSCS.f
new file mode 100644
index 0000000..92f07aa
--- /dev/null
+++ b/Dragon/src/MCGSCS.f
@@ -0,0 +1,102 @@
+*DECK MCGSCS
+ SUBROUTINE MCGSCS(KPN,K,NREG,M,NANI,NFUNL,NPJJM,KEYFLX,KEYANI,
+ 1 PJJIND,NZON,XSW,PJJ,AR,PSI,MATRIX)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Solve the SCR anisotropic system.
+*
+*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
+* KPN total number of unknowns in vectors SUNKNO and FUNKNO.
+* K total number of volumes for which specific values
+* of the neutron flux and reactions rates are required.
+* NREG number of volumes.
+* M number of material mixtures.
+* NANI scattering anisotropy (=1 for isotropic scattering).
+* NFUNL number of moments of the flux (in 2D : NFUNL=NANI*(NANI+1)/2).
+* NPJJM second dimension of PJJ.
+* KEYFLX position of flux elements in FI vector.
+* KEYANI 'mode to l' index l=KEYANI(nu).
+* PJJIND index for pjj(nu <- nu') modes.
+* NZON index-number of the mixture type assigned to each volume.
+* XSW macroscopic scattering cross section.
+* PJJ used in scr acceleration.
+* AR residuals of the current iteration.
+*
+*Parameters: output
+* PSI corrective flux.
+*
+*Parameters: scratch
+* MATRIX undefined.
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER KPN,K,NREG,M,NANI,NFUNL,NPJJM,KEYFLX(NREG,NPJJM),
+ 1 KEYANI(NFUNL),PJJIND(NPJJM,2),NZON(K)
+ REAL XSW(0:M,NANI),PJJ(NREG,NPJJM),MATRIX(NFUNL,NFUNL+1,NREG)
+ DOUBLE PRECISION AR(KPN),PSI(KPN)
+*---
+* LOCAL VARIABLES
+*---
+ INTEGER IRHS,I,INU,IMOD,INUP,L,LP,L1,LP1,NZI,IND,INDP,IER
+ REAL DL,DLP,XSWI,XSWIP,TEMP
+*---
+* CONSTRUCT LINEAR SYSTEM BY REGION TO SOLVE
+*---
+ IRHS=NFUNL+1
+ MATRIX(:NFUNL,:NFUNL+1,:NREG)=0.0
+ DO 10 IMOD=1,NPJJM
+ INU=PJJIND(IMOD,1)
+ INUP=PJJIND(IMOD,2)
+ IF((INU.GT.NFUNL).OR.(INUP.GT.NFUNL)) GOTO 10
+ L=KEYANI(INU)
+ L1=L+1
+ LP=KEYANI(INUP)
+ LP1=LP+1
+ DL=REAL(2*L+1)
+ DLP=REAL(2*LP+1)
+ DO I=1,NREG
+ NZI=NZON(I)
+ IND=KEYFLX(I,INU)
+ INDP=KEYFLX(I,INUP)
+ XSWI=XSW(NZI,L1)
+ XSWIP=XSW(NZI,LP1)
+ TEMP=PJJ(I,IMOD)
+ MATRIX(INU,IRHS,I)=MATRIX(INU,IRHS,I)+TEMP*REAL(AR(INDP))
+ MATRIX(INU,INUP,I)=-DLP*XSWIP*TEMP
+ IF(INU.EQ.INUP) THEN
+ MATRIX(INU,INUP,I)=MATRIX(INU,INUP,I)+1.0
+ ELSE
+ MATRIX(INUP,IRHS,I)=MATRIX(INUP,IRHS,I)+TEMP*REAL(AR(IND))
+ MATRIX(INUP,INU,I)=-DL*XSWI*TEMP
+ ENDIF
+ ENDDO
+ 10 CONTINUE
+*---
+* SOLVE LINEAR SYSTEM BY REGION
+*---
+ DO I=1,NREG
+ CALL ALSB(NFUNL,1,MATRIX(1,1,I),IER,NFUNL)
+ IF(IER.NE.0) CALL XABORT('MCGSCS: SINGULAR MATRIX.')
+ DO INU=1,NFUNL
+ IND=KEYFLX(I,INU)
+ PSI(IND)=MATRIX(INU,IRHS,I)
+ ENDDO
+ ENDDO
+*
+ RETURN
+ END