summaryrefslogtreecommitdiff
path: root/Dragon/src/MCGPJJ.f
blob: c837c56fc878fd024984bbd9fa0f220b1fcdada9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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