summaryrefslogtreecommitdiff
path: root/Dragon/src/TRFICF.f
blob: 291e47133672cfc95058e2a6ef4262932f867aba (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
*DECK TRFICF
      SUBROUTINE TRFICF(KPSYS,IFTRAK,IPRNTF,NGEFF,NGIND,IDIR,NREGIO,
     >                  NUNKNO,MATCOD,VOLUME,KEYFLX,FUNKNO,SUNKNO,
     >                  TITRE)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Solve N-group transport equation for fluxes using the scattering
* modified collision probability matrix.
*
*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): G. Marleau
*
*Parameters: input
* KPSYS   pointer to the pij matrices (L_PIJ signature). KPSYS is
*         an array of directories.
* IFTRAK  not used.
* IPRNTF  print selection for flux modules.
* NGEFF   number of energy groups processed in parallel.
* NGIND   energy group indices assign to the NGEFF set.
* IDIR    directional collision probability flag:
*         =0 for pij or wij;
*         =k for pijk or wijk k=1,2,3.
* NREGIO  number of regions considered.
* NUNKNO  number of unknown in the system.
* MATCOD  mixture code in region.
* VOLUME  volume of region.
* KEYFLX  flux elements in unknown system.
* SUNKNO  source for system of unknown.
* TITRE   title.
*
*Parameters: input/output
* FUNKNO  unknown vector solved for.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) KPSYS(NGEFF)
      CHARACTER   TITRE*72
      INTEGER     NGEFF,NGIND(NGEFF),IFTRAK,IPRNTF,IDIR,NREGIO,NUNKNO,
     >            MATCOD(NREGIO),KEYFLX(NREGIO)
      REAL        VOLUME(NREGIO),FUNKNO(NUNKNO,NGEFF),
     >            SUNKNO(NUNKNO,NGEFF)
*----
*  LOCAL VARIABLES
*----
      PARAMETER  (IUNOUT=6)
      CHARACTER   CNS(0:3)*1,NAMLCM*12,NAMMY*12
      INTEGER     ILCMLN
      LOGICAL     EMPTY,LCM
      SAVE        CNS
*----
*  ALLOCATABLE ARRAYS
*----
      TYPE(C_PTR) CPMAT_PTR
      REAL, POINTER, DIMENSION(:) :: CPMAT
*----
*  DATA STATEMENTS
*----
      DATA   CNS  /'-','1','2','3'/
*----
*  RECOVER TRAFIC SPECIFIC PARAMETERS
*----
      IF(IPRNTF.GT.2) WRITE(IUNOUT,'(//9H TRFICF: ,A72)') TITRE
      CALL LCMINF(KPSYS(1),NAMLCM,NAMMY,EMPTY,ILONG,LCM)
      IF(IFTRAK.LT.0) CALL XABORT('TRFICF: EXPECTING IFTRAK>=0')
      IF(MATCOD(1).LT.0) CALL XABORT('TRFICF: EXPECTING MATCOD(1)>=0')
      IF(VOLUME(1).LT.0.0) CALL XABORT('TRFICF: EXPECTING VOLUME(1)>=0')
*----
*  MAIN LOOP OVER ENERGY GROUPS.
*----
      IF(.NOT.LCM) THEN
        ALLOCATE(CPMAT(NREGIO*NREGIO),STAT=IER)
        IF(IER.NE.0) CALL XABORT('TRFICF: CANNOT ALLOCATE CPMAT.')
      ENDIF
      DO 60 II=1,NGEFF
      IF(IPRNTF.GT.2) WRITE(IUNOUT,'(/25H TRFICF: PROCESSING GROUP,I5,
     1 6H WITH ,A,1H.)') NGIND(II),'TRAFIC'
*----
*  READ SCATTERING MODIFIED COLLISION PROBABILITIES
*----
      CALL LCMLEN(KPSYS(II),'DRAGON'//CNS(IDIR)//'PCSCT',ILCMLN,ITYLCM)
      IF((ILCMLN.GT.0).AND.LCM) THEN
        CALL LCMGPD(KPSYS(II),'DRAGON'//CNS(IDIR)//'PCSCT',CPMAT_PTR)
        CALL C_F_POINTER(CPMAT_PTR,CPMAT,(/ NREGIO*NREGIO /))
      ELSE IF(ILCMLN.GT.0) THEN
        CALL LCMGET(KPSYS(II),'DRAGON'//CNS(IDIR)//'PCSCT',CPMAT)
      ELSE
        CALL XABORT('TRFICF: RECORD DRAGON'//CNS(IDIR)//
     >              'PCSCT ABSENT FROM LCM')
      ENDIF
*----
*  SOLVE TRANSPORT EQUATION
*----
      JCPMAT=0
      DO 30 I=1,NREGIO
        FUNKNO(KEYFLX(I),II)=0.0
   30 CONTINUE
      DO 50 I=1,NREGIO
        IPOS=KEYFLX(I)
        DO 40 J=1,NREGIO
          JPOS=KEYFLX(J)
          JCPMAT=JCPMAT+1
          FUNKNO(JPOS,II)=FUNKNO(JPOS,II)+SUNKNO(IPOS,II)*CPMAT(JCPMAT)
   40   CONTINUE
   50 CONTINUE
*----
* END OF LOOP OVER ENERGY GROUPS
*----
   60 CONTINUE
      IF(.NOT.LCM) DEALLOCATE(CPMAT)
      RETURN
      END