summaryrefslogtreecommitdiff
path: root/Dragon/src/LIBMOM.f
blob: 94f472bec5e7e80d3de18a07ef5e165d74500b95 (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
*DECK LIBMOM
      SUBROUTINE LIBMOM(NFS,NDIL,NPAR,DELTA,SIGTF,SIGSF,SIGFF,NOR,
     1 SIGERD,MOMT,MOMP,SEFFER)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Compute a set of total (SIGT**N) and partial (SIGA*(SIGT**N)) moments
* and a set of reference self-shielded flux and cross sections.
*
*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): A. Hebert
*
*Parameters: input
* NFS     number of fine energy groups.
* NDIL    number of dilutions.
* NPAR    number of partial cross sections (NPAR=0, 1 or 2).
* DELTA   lethargy widths of the fine groups.
* SIGTF   microscopic principal x-sections in the fine groups.
* SIGSF   microscopic partial x-sections 1 in the fine groups.
* SIGFF   microscopic partial x-sections 2 in the fine groups.
* NOR     related to the number of moments to preserve.
*         For the total moments: -NOR+1 <= N <= NOR.
*         For the partial moments: -NOR/2 <= N <= (NOR-1)/2.
* SIGERD  dilutions used to compute SEFFER.
*
*Parameters: output
* MOMT    total moments.
* MOMP    partial moments in absorption.
* SEFFER  Bondarenko self-shielded flux and cross sections at each
*         dilution.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NFS,NDIL,NPAR,NOR
      REAL DELTA(NFS),SIGTF(NFS),SIGSF(NFS),SIGFF(NFS),SIGERD(NDIL),
     1 SEFFER(NPAR+2,NDIL)
      DOUBLE PRECISION MOMT(2*NOR),MOMP(NOR,NPAR)
*----
*  LOCAL VARIABLES
*----
      DOUBLE PRECISION T,DEL
*
      DEL=0.0D0
      DO 10 I=1,2*NOR
      MOMT(I)=0.0D0
   10 CONTINUE
      DO 21 I=1,NOR
      DO 20 J=1,NPAR
      MOMP(I,J)=0.0D0
   20 CONTINUE
   21 CONTINUE
      DO 26 IDIL=1,NDIL
      DO 25 IPAR=1,NPAR+2
      SEFFER(IPAR,IDIL)=0.0
   25 CONTINUE
   26 CONTINUE
*
      DO 70 IGF=1,NFS
        DELF=DELTA(IGF)
        SIGT=MAX(0.001,SIGTF(IGF))
        DEL=DEL+DELF
        T=DELF
        DO 30 INOR=NOR,2*NOR
        MOMT(INOR)=MOMT(INOR)+T
        T=T*SIGT
   30   CONTINUE
        T=DELF/SIGT
        DO 40 INOR=NOR-1,1,-1
        MOMT(INOR)=MOMT(INOR)+T
        T=T/SIGT
   40   CONTINUE
        DO 45 IDIL=1,NDIL
        T=SIGERD(IDIL)*DELF
        SEFFER(1,IDIL)=SEFFER(1,IDIL)+REAL(T)/(SIGERD(IDIL)+SIGT)
        SEFFER(2,IDIL)=SEFFER(2,IDIL)+REAL(T)*SIGT/(SIGERD(IDIL)+SIGT)
   45   CONTINUE
        IF(NPAR.GT.0) THEN
          SIGS=MAX(1.E-9,SIGSF(IGF))
          T=DELF*SIGS
          DO 50 INOR=NOR/2+1,NOR
          MOMP(INOR,1)=MOMP(INOR,1)+T
          T=T*SIGT
   50     CONTINUE
          T=DELF*SIGS/SIGT
          DO 60 INOR=NOR/2,1,-1
          MOMP(INOR,1)=MOMP(INOR,1)+T
          T=T/SIGT
   60     CONTINUE
          DO 65 IDIL=1,NDIL
          T=SIGERD(IDIL)*DELF
          SEFFER(3,IDIL)=SEFFER(3,IDIL)+REAL(T)*SIGS/(SIGERD(IDIL)+SIGT)
   65     CONTINUE
          IF(NPAR.EQ.2) THEN
            SIGF=MAX(1.E-9,SIGFF(IGF))
            T=DELF*SIGF
            DO 500 INOR=NOR/2+1,NOR
            MOMP(INOR,2)=MOMP(INOR,2)+T
            T=T*SIGT
  500       CONTINUE
            T=DELF*SIGF/SIGT
            DO 600 INOR=NOR/2,1,-1
            MOMP(INOR,2)=MOMP(INOR,2)+T
            T=T/SIGT
  600       CONTINUE
            DO 650 IDIL=1,NDIL
            T=SIGERD(IDIL)*DELF
            SEFFER(4,IDIL)=SEFFER(4,IDIL)+REAL(T)*SIGF/(SIGERD(IDIL)+
     1      SIGT)
  650       CONTINUE
          ENDIF
        ENDIF
   70 CONTINUE
*
      IF(DEL.EQ.0.0) CALL XABORT('LIBMOM: ALGORITHM FAILURE.')
      DO 80 INOR=1,2*NOR
      MOMT(INOR)=MOMT(INOR)/DEL
   80 CONTINUE
      IF(NPAR.GT.0) THEN
         DO 95 INOR=1,NOR
         DO 90 IPAR=1,NPAR
         MOMP(INOR,IPAR)=MOMP(INOR,IPAR)/REAL(DEL)
   90    CONTINUE
   95    CONTINUE
      ENDIF
      DO 110 IDIL=1,NDIL
      DO 100 IPAR=2,NPAR+2
      SEFFER(IPAR,IDIL)=SEFFER(IPAR,IDIL)/SEFFER(1,IDIL)
  100 CONTINUE
      SEFFER(1,IDIL)=SEFFER(1,IDIL)/REAL(DEL)
  110 CONTINUE
      RETURN
      END