summaryrefslogtreecommitdiff
path: root/Dragon/src/SYB31C.f
blob: 5d914a112ddaa5656219854bb8e88050eeb7a2af (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
*DECK SYB31C
      SUBROUTINE SYB31C (PPLUS,TAUP,XOPJ,XOPI)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Evaluation of the $C_{ij}$ function in 1D cylindrical and 2D geometry.
*
*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
* TAUP   side to side optical path.
* XOPJ   optical path in volume j (or volume i).
* XOPI   optical path in volume i (or volume j).
*
*Parameters: output
* PPLUS   value of the probability.
*
*-----------------------------------------------------------------------
*
*----
*  SUBROUTINE ARGUMENTS
*----
      REAL PPLUS,TAUP,XOPJ,XOPI
*----
*  LOCAL VARIABLES
*----
      PARAMETER (MKI3=600)
      REAL T(2,2),B(2,2)
      COMMON /BICKL3/BI3(0:MKI3),BI31(0:MKI3),BI32(0:MKI3),PAS3,XLIM3,L3
*----
*  ASYMPTOTIC VALUE
*----
      IF(TAUP.GE.XLIM3) THEN
        PPLUS = 0.
        RETURN
      ENDIF
*----
*  SYMMETRIC FORMULA IN (I,J). WE SET POPI <= POPJ
*----
      IF(XOPJ.LT.XOPI) THEN
        POPI = XOPJ
        POPJ = XOPI
      ELSE
        POPI = XOPI
        POPJ = XOPJ
      ENDIF
*----
*  GENERAL CASE
*
*  POPI < POPJ < 1.
*  VOID (I,J) UP TO THE END OF PROGRAM
*----
      T(2,2) = TAUP + POPJ + POPI
      T(1,2) = TAUP + POPJ
      T(2,1) = TAUP + POPI
      T(1,1) = TAUP
*
      DO 15 I=1,2
      DO 10 J=1,2
      B(I,J) = TABKI(3,T(I,J))
   10 CONTINUE
   15 CONTINUE
*----
*  GENERAL DIFFERENCE FORMULA. THIS FORMULAS SHOULD NOT BE APPLIED TO
*  VOIDED (I,J) VOLUMES
*----
      IF(POPI.GE.0.004) THEN
*       LARGE POPI AND POPJ (MOST GENERAL CASE)
        PNLUS = B(2,2) + B(1,1) - (B(1,2) + B(2,1))
        PPLUS = PNLUS
      ELSE IF(POPJ.GT.0.002) THEN
*       SMALL POPI, LARGE POPJ. USE DERIVATIVE DIFFERENCES.
        IF(TAUP.GE.XLIM3) THEN
          APLUS=0.
        ELSE IF(TAUP+POPI.GE.XLIM3) THEN
          APLUS=TABKI(3,TAUP)
        ELSE IF(POPI.LE.0.002) THEN
          APLUS=(TABKI(2,TAUP)+TABKI(2,TAUP+POPI))*POPI*0.5
        ELSE IF(POPI.LT.0.004) THEN
          PQLUS=(TABKI(2,TAUP)+TABKI(2,TAUP+POPI))*POPI*0.5
          PRLUS=TABKI(3,TAUP)-TABKI(3,TAUP+POPI)
          FACT=500.0*(POPI-0.002)
          APLUS=PRLUS*FACT+PQLUS*(1.0-FACT)
        ELSE
          APLUS=TABKI(3,TAUP)-TABKI(3,TAUP+POPI)
        ENDIF
        IF(TAUP+POPJ.GE.XLIM3) THEN
          BPLUS=0.
        ELSE IF(TAUP+POPI+POPJ.GE.XLIM3) THEN
          BPLUS=TABKI(3,TAUP+POPJ)
        ELSE IF(POPI.LE.0.002) THEN
          BPLUS=(TABKI(2,TAUP+POPJ)+TABKI(2,TAUP+POPI+POPJ))*POPI*0.5
        ELSE IF(POPI.LT.0.004) THEN
          PQLUS=(TABKI(2,TAUP+POPJ)+TABKI(2,TAUP+POPI+POPJ))*POPI*0.5
          PRLUS=TABKI(3,TAUP+POPJ)-TABKI(3,TAUP+POPI+POPJ)
          FACT=500.0*(POPI-0.002)
          BPLUS=PRLUS*FACT+PQLUS*(1.0-FACT)
        ELSE
          BPLUS=TABKI(3,TAUP+POPJ)-TABKI(3,TAUP+POPI+POPJ)
        ENDIF
        PPLUS = APLUS - BPLUS
      ELSE IF(T(2,2).GE.XLIM3) THEN
*       SIMILAR TO A SECOND DERIVATIVE. ASYMPTOTIC TAUP.
        PNLUS = B(2,2) + B(1,1) - (B(1,2) + B(2,1))
        PPLUS = PNLUS
      ELSE
*       SIMILAR TO A SECOND DERIVATIVE.
        IF(T(2,2).EQ.0.) THEN
          PPLUS = 0.
        ELSE IF(TAUP.EQ.0.) THEN
          PPLUS = 1.57079632679489 + TABKI(1,TAUP+POPI+POPJ)
          PPLUS = PPLUS * 0.5 * POPI*POPJ
        ELSE IF(TAUP.LE.0.002) THEN
          PPLUS = TABKI(1,TAUP) + TABKI(1,TAUP+POPI+POPJ)
          PPLUS = PPLUS * 0.5 * POPI*POPJ
        ELSE IF(TAUP.LT.0.004) THEN
          PQLUS = TABKI(1,TAUP) + TABKI(1,TAUP+POPI+POPJ)
          PRLUS = TABKI(1,TAUP)
          TAUP1 = TAUP + POPI + POPJ
          PRLUS = PRLUS + TABKI(1,TAUP1)
          FACT=500.0*(TAUP-0.002)
          PPLUS = PRLUS * FACT + PQLUS * (1.0-FACT)
          PPLUS = PPLUS * 0.5 * POPI*POPJ
        ELSE
*         VOIDED VOLUMES (I,J) SEPARATED WITH NON-VOIDED VOLUMES.
          PRLUS = TABKI(1,TAUP)
          TAUP1 = TAUP + POPI + POPJ
          PRLUS = PRLUS + TABKI(1,TAUP1)
          PPLUS = PRLUS * 0.5 * POPI*POPJ
        ENDIF
      ENDIF
      RETURN
      END