summaryrefslogtreecommitdiff
path: root/Trivac/src/PNDM2E.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 /Trivac/src/PNDM2E.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Trivac/src/PNDM2E.f')
-rwxr-xr-xTrivac/src/PNDM2E.f247
1 files changed, 247 insertions, 0 deletions
diff --git a/Trivac/src/PNDM2E.f b/Trivac/src/PNDM2E.f
new file mode 100755
index 0000000..a501b70
--- /dev/null
+++ b/Trivac/src/PNDM2E.f
@@ -0,0 +1,247 @@
+*DECK PNDM2E
+ SUBROUTINE PNDM2E(ITY,NEL,L4,IELEM,ICOL,MAT,VOL,NBMIX,NLF,NVD,
+ 1 NAN,SIGT,SIGTI,XX,YY,KN,QFR,MU,IIMAX,LC,R,V,SYS)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Assembly of system matrices for a mixed-dual formulation of the
+* simplified PN method in 2D Cartesian geometry.
+*
+*Copyright:
+* Copyright (C) 2004 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
+* ITY type of assembly:
+* =0: leakage-removal matrix assembly; =1: cross section matrix
+* assembly.
+* NEL number of finite elements.
+* L4 number of unknowns per energy group and per set of two
+* Legendre orders.
+* IELEM degree of the Lagrangian finite elements: =1 (linear);
+* =2 (parabolic); =3 (cubic); =4 (quartic).
+* ICOL type of quadrature: =1 (analytical integration);
+* =2 (Gauss-Lobatto); =3 (Gauss-Legendre).
+* MAT mixture index assigned to each element.
+* VOL volume of each element.
+* NBMIX number of mixtures.
+* NLF number of Legendre orders for the flux (even number).
+* NVD type of void boundary condition if NLF>0 and ICOL=3.
+* NAN number of Legendre orders for the cross sections.
+* SIGT total minus self-scattering macroscopic cross sections.
+* SIGT(:,NAN) generally contains the total cross section only.
+* SIGTI inverse macroscopic cross sections ordered by mixture.
+* SIGTI(:,NAN) generally contains the inverse total cross
+* section only.
+* XX X-directed mesh spacings.
+* YY Y-directed mesh spacings.
+* KN element-ordered unknown list.
+* QFR element-ordered boundary conditions.
+* MU compressed storage mode indices.
+* IIMAX dimension of vector SYS.
+* LC order of the unit matrices.
+* R unit Cartesian mass matrix.
+* V unit nodal coupling matrix.
+*
+*Parameters: output
+* SYS system matrix.
+*
+*Reference:
+* J.J. Lautard, D. Schneider, A.M. Baudron, "Mixed Dual Methods for
+* Neutronic Reactor Core Calculations in the CRONOS System,"
+* Proc. Int. Conf. on Mathematics and Computation, Reactor
+* Physics and Environmental Analysis in Nuclear Applications,
+* Madrid, Spain, September 27-30, 1999.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER ITY,NEL,L4,IELEM,ICOL,MAT(NEL),NBMIX,NLF,NAN,KN(5*NEL),
+ 1 MU(L4),IIMAX,LC
+ REAL VOL(NEL),SIGT(NBMIX,NAN),SIGTI(NBMIX,NAN),XX(NEL),YY(NEL),
+ 1 QFR(4*NEL),R(LC,LC),V(LC,LC-1),SYS(IIMAX)
+*----
+* LOCAL VARIABLES
+*----
+ REAL QQ(5,5)
+*
+ IF(ICOL.EQ.3) THEN
+ IF(NVD.EQ.0) THEN
+ NZMAR=NLF+1
+ ELSE IF(NVD.EQ.1) THEN
+ NZMAR=NLF
+ ELSE IF(NVD.EQ.2) THEN
+ NZMAR=65
+ ENDIF
+ ELSE
+ NZMAR=65
+ ENDIF
+ DO 12 I0=1,IELEM
+ DO 11 J0=1,IELEM
+ QQ(I0,J0)=0.0
+ DO 10 K0=2,IELEM
+ QQ(I0,J0)=QQ(I0,J0)+V(K0,I0)*V(K0,J0)/R(K0,K0)
+ 10 CONTINUE
+ 11 CONTINUE
+ 12 CONTINUE
+ MUMAX=MU(L4)
+ DO 100 IL=0,NLF-1
+ ZMARS=0.0
+ IF(MOD(IL,2).EQ.1) ZMARS=PNMAR2(NZMAR,IL,IL)
+ FACT=REAL(2*IL+1)
+*----
+* ASSEMBLY OF THE MAIN COEFFICIENT MATRIX AT ORDER IL.
+*----
+ NUM1=0
+ NUM2=0
+ KEY=0
+ DO 90 K=1,NEL
+ IBM=MAT(K)
+ IF(IBM.EQ.0) GO TO 90
+ VOL0=VOL(K)
+ GARS=SIGT(IBM,MIN(IL+1,NAN))
+ IF(MOD(IL,2).EQ.0) THEN
+* EVEN PARITY EQUATION.
+ DO 25 I0=1,IELEM
+ DO 20 J0=1,IELEM
+ JND1=KN(NUM1+1)+(I0-1)*IELEM+J0-1
+ KEY=(IL/2)*MUMAX+MU(JND1)
+ SYS(KEY)=SYS(KEY)+FACT*VOL0*GARS
+ 20 CONTINUE
+ 25 CONTINUE
+ ELSE
+ GARSI=SIGTI(IBM,MIN(IL+1,NAN))
+ DO 80 I0=1,IELEM
+* PARTIAL INVERSION OF THE ODD PARITY EQUATION. MODIFICATION OF
+* THE EVEN PARITY EQUATION.
+ DO 45 J0=1,IELEM
+ JND1=KN(NUM1+1)+(I0-1)*IELEM+J0-1
+ DO 30 K0=1,J0
+ IF(QQ(J0,K0).EQ.0.0) GO TO 30
+ KND1=KN(NUM1+1)+(I0-1)*IELEM+K0-1
+ KEY=(IL/2)*MUMAX+MU(JND1)-JND1+KND1
+ SYS(KEY)=SYS(KEY)+(REAL(IL)**2)*VOL0*QQ(J0,K0)*GARSI/(FACT*
+ 1 XX(K)*XX(K))
+ IF(IL.LE.NLF-3) THEN
+ KEY=((IL+2)/2)*MUMAX+MU(JND1)-JND1+KND1
+ SYS(KEY)=SYS(KEY)+(REAL(IL+1)**2)*VOL0*QQ(J0,K0)*GARSI/
+ 1 (FACT*XX(K)*XX(K))
+ ENDIF
+ 30 CONTINUE
+ JND1=KN(NUM1+1)+(J0-1)*IELEM+I0-1
+ DO 40 K0=1,J0
+ IF(QQ(J0,K0).EQ.0.0) GO TO 40
+ KND1=KN(NUM1+1)+(K0-1)*IELEM+I0-1
+ KEY=(IL/2)*MUMAX+MU(JND1)-JND1+KND1
+ SYS(KEY)=SYS(KEY)+(REAL(IL)**2)*VOL0*QQ(J0,K0)*GARSI/(FACT*
+ 1 YY(K)*YY(K))
+ IF(IL.LE.NLF-3) THEN
+ KEY=((IL+2)/2)*MUMAX+MU(JND1)-JND1+KND1
+ SYS(KEY)=SYS(KEY)+(REAL(IL+1)**2)*VOL0*QQ(J0,K0)*GARSI/
+ 1 (FACT*YY(K)*YY(K))
+ ENDIF
+ 40 CONTINUE
+ 45 CONTINUE
+*
+* ODD PARITY EQUATION.
+ DO 55 IC=1,2
+ IIC=1
+ IF(IC.EQ.2) IIC=IELEM+1
+ IND1=ABS(KN(NUM1+1+IC))+I0-1
+ S1=REAL(SIGN(1,KN(NUM1+1+IC)))
+ DO 50 JC=1,2
+ JJC=1
+ IF(JC.EQ.2) JJC=IELEM+1
+ IND2=ABS(KN(NUM1+1+JC))+I0-1
+ IF((KN(NUM1+1+IC).NE.0).AND.(KN(NUM1+1+JC).NE.0).AND.
+ 1 (IND1.GE.IND2)) THEN
+ S2=REAL(SIGN(1,KN(NUM1+1+JC)))
+ KEY=(IL/2)*MUMAX+MU(IND1)-IND1+IND2
+ SYS(KEY)=SYS(KEY)-S1*S2*FACT*R(IIC,JJC)*VOL0*GARS
+ ENDIF
+ 50 CONTINUE
+ 55 CONTINUE
+ DO 65 IC=3,4
+ IIC=1
+ IF(IC.EQ.4) IIC=IELEM+1
+ IND1=ABS(KN(NUM1+1+IC))+I0-1
+ S1=REAL(SIGN(1,KN(NUM1+1+IC)))
+ DO 60 JC=3,4
+ JJC=1
+ IF(JC.EQ.4) JJC=IELEM+1
+ IND2=ABS(KN(NUM1+1+JC))+I0-1
+ IF((KN(NUM1+1+IC).NE.0).AND.(KN(NUM1+1+JC).NE.0).AND.
+ 1 (IND1.GE.IND2)) THEN
+ S2=REAL(SIGN(1,KN(NUM1+1+JC)))
+ KEY=(IL/2)*MUMAX+MU(IND1)-IND1+IND2
+ SYS(KEY)=SYS(KEY)-S1*S2*FACT*R(IIC,JJC)*VOL0*GARS
+ ENDIF
+ 60 CONTINUE
+ 65 CONTINUE
+ IF(ITY.EQ.1) GO TO 80
+*
+ IND1=ABS(KN(NUM1+2))+I0-1
+ IND2=ABS(KN(NUM1+3))+I0-1
+ IND3=ABS(KN(NUM1+4))+I0-1
+ IND4=ABS(KN(NUM1+5))+I0-1
+ IF((QFR(NUM2+1).NE.0.0).AND.(KN(NUM1+2).NE.0)) THEN
+ KEY=(IL/2)*MUMAX+MU(IND1)
+ SYS(KEY)=SYS(KEY)-0.5*FACT*QFR(NUM2+1)*ZMARS
+ ENDIF
+ IF((QFR(NUM2+2).NE.0.0).AND.(KN(NUM1+3).NE.0)) THEN
+ KEY=(IL/2)*MUMAX+MU(IND2)
+ SYS(KEY)=SYS(KEY)-0.5*FACT*QFR(NUM2+2)*ZMARS
+ ENDIF
+ IF((QFR(NUM2+3).NE.0.0).AND.(KN(NUM1+4).NE.0)) THEN
+ KEY=(IL/2)*MUMAX+MU(IND3)
+ SYS(KEY)=SYS(KEY)-0.5*FACT*QFR(NUM2+3)*ZMARS
+ ENDIF
+ IF((QFR(NUM2+4).NE.0.0).AND.(KN(NUM1+5).NE.0)) THEN
+ KEY=(IL/2)*MUMAX+MU(IND4)
+ SYS(KEY)=SYS(KEY)-0.5*FACT*QFR(NUM2+4)*ZMARS
+ ENDIF
+*
+ DO 70 J0=1,IELEM
+ JND1=KN(NUM1+1)+(I0-1)*IELEM+J0-1
+ IF(KN(NUM1+2).NE.0) THEN
+ S1=REAL(SIGN(1,KN(NUM1+2)))
+ IF(JND1.GT.IND1) KEY=(IL/2)*MUMAX+MU(JND1)-JND1+IND1
+ IF(JND1.LT.IND1) KEY=(IL/2)*MUMAX+MU(IND1)-IND1+JND1
+ SYS(KEY)=SYS(KEY)+S1*REAL(IL)*VOL0*V(1,J0)/XX(K)
+ ENDIF
+ IF(KN(NUM1+3).NE.0) THEN
+ S2=REAL(SIGN(1,KN(NUM1+3)))
+ IF(JND1.GT.IND2) KEY=(IL/2)*MUMAX+MU(JND1)-JND1+IND2
+ IF(JND1.LT.IND2) KEY=(IL/2)*MUMAX+MU(IND2)-IND2+JND1
+ SYS(KEY)=SYS(KEY)+S2*REAL(IL)*VOL0*V(IELEM+1,J0)/XX(K)
+ ENDIF
+ JND1=KN(NUM1+1)+(J0-1)*IELEM+I0-1
+ IF(KN(NUM1+4).NE.0) THEN
+ S3=REAL(SIGN(1,KN(NUM1+4)))
+ IF(JND1.GT.IND3) KEY=(IL/2)*MUMAX+MU(JND1)-JND1+IND3
+ IF(JND1.LT.IND3) KEY=(IL/2)*MUMAX+MU(IND3)-IND3+JND1
+ SYS(KEY)=SYS(KEY)+S3*REAL(IL)*VOL0*V(1,J0)/YY(K)
+ ENDIF
+ IF(KN(NUM1+5).NE.0) THEN
+ S4=REAL(SIGN(1,KN(NUM1+5)))
+ IF(JND1.GT.IND4) KEY=(IL/2)*MUMAX+MU(JND1)-JND1+IND4
+ IF(JND1.LT.IND4) KEY=(IL/2)*MUMAX+MU(IND4)-IND4+JND1
+ SYS(KEY)=SYS(KEY)+S4*REAL(IL)*VOL0*V(IELEM+1,J0)/YY(K)
+ ENDIF
+ 70 CONTINUE
+ 80 CONTINUE
+ ENDIF
+ NUM1=NUM1+5
+ NUM2=NUM2+4
+ 90 CONTINUE
+ 100 CONTINUE
+ RETURN
+ END