summaryrefslogtreecommitdiff
path: root/Dragon/src/PIJABC.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/PIJABC.f')
-rw-r--r--Dragon/src/PIJABC.f122
1 files changed, 122 insertions, 0 deletions
diff --git a/Dragon/src/PIJABC.f b/Dragon/src/PIJABC.f
new file mode 100644
index 0000000..1b31e1b
--- /dev/null
+++ b/Dragon/src/PIJABC.f
@@ -0,0 +1,122 @@
+*DECK PIJABC
+ SUBROUTINE PIJABC(NREG,NSOUT,NPRB,SIGTAL,MATRT,PROB,PSST,PSVT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Reconstruct collision probabilities (CP) for all zones eliminating
+* surfaces from the system.
+*
+*Copyright:
+* Copyright (C) 1991 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, R. Roy, I. petrovic
+*
+*Parameters: input
+* NREG number of zones for geometry.
+* NSOUT number of surfaces for geometry.
+* NPRB number of probabilities.
+* SIGTAL albedo-sigt vector.
+* MATRT reflection/transmission vector.
+* PROB directional cp matrix for all types.
+*
+*Parameters: output
+* PROB directional cp matrix for all types.
+* PSST PSST=(A**(-1)-PSS)**(-1).
+* PSVT PSVT=PSST*PSV.
+*
+*-----------------------------------------------------------------------
+*
+
+ IMPLICIT NONE
+*----
+* VARIABLES
+*-----
+ INTEGER NREG,NSOUT,NPRB,NSP1,IPSS,ISUR,ISX,IS,JSX,JS,IER,
+ 1 IV,JV,IVSI,IVVI,ISV,IVS,IVV
+ INTEGER MATRT(NSOUT)
+*
+ REAL SIGTAL(-NSOUT:NREG)
+ DOUBLE PRECISION PROB(NPRB),PSST(NSOUT,NSOUT),PSVT(NSOUT,NREG)
+*----
+* EVALUATE MATRIX (A**(-1)-PSS)
+*----
+ NSP1=NSOUT+1
+ IPSS=0
+ ISUR=(NSOUT*NSP1)/2
+ ISX=0
+ DO 100 IS=-NSOUT,-1,1
+ ISX=ISX+1
+ JSX=0
+ ISUR=ISUR+1
+ DO 101 JS=-NSOUT,IS,1
+ JSX=JSX+1
+ IPSS=IPSS+1
+ IF((SIGTAL(IS).EQ.0.0).OR.(SIGTAL(JS).EQ.0.0)) THEN
+ PSST(ISX,JSX)= 0.0D0
+ ELSE
+ PSST(ISX,JSX)=-PROB(IPSS)
+ ENDIF
+ IF(JS.NE.IS) THEN
+ PSST(JSX,ISX)=PSST(ISX,JSX)
+ ENDIF
+ 101 CONTINUE
+ IF(SIGTAL(IS) .EQ. 0.0)THEN
+ PSST(ISX,ISX)=PROB(ISUR)
+ ELSE
+ JS=-MATRT(-IS)
+ IF(JS .EQ. IS) THEN
+ PSST(ISX,ISX)=PSST(ISX,ISX)+PROB(ISUR)/SIGTAL(IS)
+ ELSE IF(JS .LT. IS) THEN
+ JSX=NSOUT+JS+1
+ PSST(ISX,JSX)=PSST(ISX,JSX)+PROB(ISUR)/SIGTAL(IS)
+ PSST(JSX,ISX)=PSST(ISX,JSX)
+ ENDIF
+ ENDIF
+ 100 CONTINUE
+*----
+* INVERSE MATRIX PSST=(A**(-1)-PSS)
+*----
+ CALL ALINVD(NSOUT,PSST,NSOUT,IER)
+*----
+* CHECK IF INVERSE IS VALID
+*----
+ IF(IER .NE. 0 ) CALL XABORT
+ > ('PIJABC: IMPOSSIBLE TO INVERT PSS COUPLING MATRIX')
+ IVSI=(NSP1*(NSP1+1))/2
+ IVVI=IVSI+NSP1
+ DO 110 IV=1,NREG
+*----
+* PSVT(IS,IV)=SUM(JSS) PSST(ISS,JSS)*PSV(JSS,IV)
+*----
+ DO 111 IS=1,NSOUT
+ PSVT(IS,IV)=0.0D0
+ 111 CONTINUE
+ DO 120 IS=1,NSOUT
+ DO 121 JS=1,NSOUT
+ ISV=IVSI+JS
+ PSVT(IS,IV)=PSVT(IS,IV)+PSST(IS,JS)*PROB(ISV)
+ 121 CONTINUE
+ 120 CONTINUE
+ IVV=IVVI
+ DO 130 JV=1,IV
+ IVV=IVV+1
+ ISV=0
+ IVS=IVSI
+ DO 131 IS=-NSOUT,-1,1
+ ISV=ISV+1
+ IVS=IVS+1
+ IF(SIGTAL(IS).NE.0.0) THEN
+ PROB(IVV)=PROB(IVV)+PROB(IVS)*PSVT(ISV,JV)
+ ENDIF
+ 131 CONTINUE
+ 130 CONTINUE
+ IVSI=IVSI+NSP1+IV
+ IVVI=IVVI+NSP1+IV
+ 110 CONTINUE
+ RETURN
+ END