summaryrefslogtreecommitdiff
path: root/Dragon/src/MCGPJJ.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/MCGPJJ.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/MCGPJJ.f')
-rw-r--r--Dragon/src/MCGPJJ.f109
1 files changed, 109 insertions, 0 deletions
diff --git a/Dragon/src/MCGPJJ.f b/Dragon/src/MCGPJJ.f
new file mode 100644
index 0000000..c837c56
--- /dev/null
+++ b/Dragon/src/MCGPJJ.f
@@ -0,0 +1,109 @@
+*DECK MCGPJJ
+ SUBROUTINE MCGPJJ(IPTRK,IPRINT,NDIM,NANI,MAXNU,NPJJM,KEYANI)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute the effective number of pjj intermodes to be stored in 2D or
+* 3D and the corresponding index when an expansion up to order L
+* of the scattering cross-section is considered in order to
+* construct the source term of the scalar flux moments for
+* a method of characteristics iteration.
+*
+*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 (L_TRACK signature).
+* IPRINT print flag (> 1 for print).
+* NDIM number of dimensions for the geometry.
+* NANI scattering anisotropy (=1 for isotropic scattering).
+* MAXNU number of angular modes nu=(l,m).
+* KEYANI 'mode to l' index: l=KEYANI(nu):
+* Cartesian 2D KEYANI(NU)=INT(0.5*(SQRT(REAL(1+8*(NU-1)))-1.0));
+* Cartesian 3D KEYANI(NU)=INT(SQRT(REAL(NU-1))).
+*
+*Parameters: output
+* NPJJM number of non-vanishing pjj modes.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPTRK
+ INTEGER IPRINT,NDIM,NANI,MAXNU,NPJJM,KEYANI(MAXNU)
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER MAXPJJM,IL,INU,ILP,INUP,L,LT,DT,NMODE,NMODO,NPJJM0
+ LOGICAL EVEN
+ CHARACTER CDIM*2
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: IPJJM
+*---
+* Compute the number of effective modes
+*---
+ MAXPJJM=MAXNU*(MAXNU+1)/2
+ L=NANI-1
+ LT=L/2
+ DT=L-2*LT
+ IF (NDIM.EQ.2) THEN
+ CDIM='2D'
+ NMODE=(LT+1)**2 ! number of 'even l' modes
+ NMODO=(LT+1)*(LT+2*DT) ! number of 'odd l' modes
+ ELSE ! NDIM.EQ.3
+ CDIM='3D'
+ NMODE=(L+1-DT)*(LT+1)
+ NMODO=(L+1+DT)*(LT+DT)
+ ENDIF
+* 'even l' and 'odd l' modes are unconnected
+* (i.e. pjj('even l' <- 'odd l') = 0)
+* and pjj(nu <- nu') = pjj(nu' <- nu)
+* so the effective number of pjj is
+ NPJJM=NMODE*(NMODE+1)/2+NMODO*(NMODO+1)/2
+*
+ IF (IPRINT.GT.1) THEN
+ WRITE(*,*) '--------------------'
+ WRITE(*,*) 'ANISOTROPY INDEX FOR L=',NANI-1,' IN ',CDIM
+ CALL PRINIM('NU->L ',KEYANI(1),MAXNU)
+ WRITE(*,*) '--------------------'
+ WRITE(*,*) NPJJM,
+ 1 ' PJJ(NU <- NU'') MODES OUT OF',MAXPJJM,' TO BE STORED'
+ ENDIF
+*---
+* Compute and store the indexes for these modes
+*---
+ ALLOCATE(IPJJM(2*NPJJM))
+ NPJJM0=-1
+ DO INU=1,MAXNU
+ IL=KEYANI(INU)
+ DO INUP=1,INU
+ ILP=KEYANI(INUP)
+ EVEN=(MOD((IL+ILP),2).EQ.0)
+ IF (EVEN) THEN
+ NPJJM0=NPJJM0+1
+ IPJJM(NPJJM0+1)=INU
+ IPJJM(NPJJM+NPJJM0+1)=INUP
+ ENDIF
+ ENDDO
+ ENDDO
+ NPJJM0=NPJJM0+1
+ IF(NPJJM0.NE.NPJJM) CALL XABORT('MCGPIJ: bug.')
+ CALL LCMPUT(IPTRK,'PJJIND$MCCG',2*NPJJM,1,IPJJM)
+ IF (IPRINT.GT.1) THEN
+ WRITE(*,*) 'INDEXES FOR THE CORRESPONDING',NPJJM,' MODES:'
+ CALL PRINIM('-> NU ',IPJJM(1),NPJJM)
+ CALL PRINIM('NU''-> ',IPJJM(NPJJM+1),NPJJM)
+ ENDIF
+ DEALLOCATE(IPJJM)
+*
+ RETURN
+ END