diff options
Diffstat (limited to 'Dragon/src/MCGCOEF.f')
| -rw-r--r-- | Dragon/src/MCGCOEF.f | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/Dragon/src/MCGCOEF.f b/Dragon/src/MCGCOEF.f new file mode 100644 index 0000000..298bf04 --- /dev/null +++ b/Dragon/src/MCGCOEF.f @@ -0,0 +1,106 @@ +*DECK MCGCOEF + SUBROUTINE MCGCOEF(NFUNL,NMU,ZMU,WZMU,NANGL,CAZ1,CAZ2,COEFI) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Find MOC coefficients for DD1 approximation up to P3 scattering order +* using a Gauss-Chebyshev or Leonard-McDaniel-Chebyshev quadrature. +* +*Copyright: +* Copyright (C) 2015 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 +* NFUNL number of spherical harmonics components. +* NMU number of polar angles. +* ZMU polar quadrature set in 2D. +* WZMU polar quadrature set in 2D. +* NANGL number of azimuthal angles. +* CAZ1 first azimuthal cosines. +* CAZ2 second azimuthal cosines. +* +*Parameters: output +* COEFI Gram-Schmidt MOC coefficients. +* +*Reference: +* A. Hebert, "High-Order Diamond Differencing Along Finite +* Characteristics," Nucl. Sci. Eng., 169, 81-97 (2011). +* +*----------------------------------------------------------------------- +* + IMPLICIT DOUBLE PRECISION(A-H,O-Z) +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NFUNL,NMU + REAL ZMU(NMU),WZMU(NMU) + DOUBLE PRECISION CAZ1(NANGL),CAZ2(NANGL),COEFI(2*NFUNL,2*NFUNL) +*---- +* LOCAL VARIABLES +*---- + DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: COEF,COEF2,COEF3 + DOUBLE PRECISION, DIMENSION(2,2) :: M + INTEGER, DIMENSION(10), PARAMETER :: + > LL=(/ 0, 1, 1, 2, 2, 2, 3, 3, 3, 3 /) + INTEGER, DIMENSION(10), PARAMETER :: + > MM=(/ 0, -1, 1, -2, 0, 2, -3, -1, 1, 3 /) +* + ALLOCATE(COEF(2*NFUNL,2*NFUNL)) + DO I=1,NFUNL + IL=LL(I) ; IM=MM(I) ; + DO J=1,NFUNL + ILP=LL(J) ; IMP=MM(J) ; + CALL MCGDYA(NMU,ZMU,WZMU,NANGL,CAZ1,CAZ2,IL,IM,ILP,IMP,M) ; + COEF(I,J)=M(1,1) ; COEF(I,NFUNL+J)=M(1,2) ; + COEF(NFUNL+I,J)=M(2,1) ; COEF(NFUNL+I,NFUNL+J)=M(2,2) ; + ENDDO + ENDDO + IF(NFUNL == 1) THEN + CALL ALPINVD(2*NFUNL,2*NFUNL,COEF,COEFI(1,1)) ; + ELSEIF(NFUNL == 3) THEN + ALLOCATE(COEF2(2*NFUNL+1,2*NFUNL), COEF3(2*NFUNL,2*NFUNL+1)) + COEF2=0.0D0 ; COEF2(1:2*NFUNL,:)=COEF ; + COEF2(2*NFUNL+1,2)=1.0D0 ; COEF2(2*NFUNL+1,NFUNL+3)=-1.0D0 ; + CALL ALPINVD(2*NFUNL+1,2*NFUNL,COEF2,COEF3(1,1)) ; + COEFI=COEF3(:,1:2*NFUNL) ; + DEALLOCATE(COEF2, COEF3) + ELSEIF(NFUNL == 6) THEN + ALLOCATE(COEF2(2*NFUNL+3,2*NFUNL), COEF3(2*NFUNL,2*NFUNL+3)) + COEF2=0.0D0 ; COEF2(1:2*NFUNL,:)=COEF ; + COEF2(2*NFUNL+1,2)=1.0D0 ; COEF2(2*NFUNL+1,NFUNL+3)=-1.0D0 ; + COEF2(2*NFUNL+2,5)=SQRT(3.0D0) ; COEF2(2*NFUNL+2,6)=1.0D0 ; + COEF2(2*NFUNL+2,NFUNL+4)=1.0D0 ; + COEF2(2*NFUNL+3,NFUNL+5)=SQRT(3.0D0) ; + COEF2(2*NFUNL+3,NFUNL+6)=-1.0D0 ; COEF2(2*NFUNL+3,4)=1.0D0 ; + CALL ALPINVD(2*NFUNL+3,2*NFUNL,COEF2,COEF3(1,1)) ; + COEFI=COEF3(:,1:2*NFUNL) ; + DEALLOCATE(COEF2, COEF3) + ELSEIF(NFUNL == 10) THEN + ALLOCATE(COEF2(2*NFUNL+6,2*NFUNL), COEF3(2*NFUNL,2*NFUNL+6)) + COEF2=0.0D0 ; COEF2(1:2*NFUNL,:)=COEF ; + COEF2(2*NFUNL+1,2)=1.0D0 ; COEF2(2*NFUNL+1,NFUNL+3)=-1.0D0 ; + COEF2(2*NFUNL+2,5)=SQRT(3.0D0) ; COEF2(2*NFUNL+2,6)=1.0D0 ; + COEF2(2*NFUNL+2,NFUNL+4)=1.0D0 ; + COEF2(2*NFUNL+3,NFUNL+5)=SQRT(3.0D0) ; + COEF2(2*NFUNL+3,NFUNL+6)=-1.0D0 ; COEF2(2*NFUNL+3,4)=1.0D0 ; + COEF2(2*NFUNL+4,8)=1.0D0 ; COEF2(2*NFUNL+4,NFUNL+9)=-1.0D0 ; + COEF2(2*NFUNL+5,7)=1.0D0 ; COEF2(2*NFUNL+5,NFUNL+10)=-1.0D0 ; + COEF2(2*NFUNL+6,10)=1.0D0 ; + COEF2(2*NFUNL+6,9)=SQRT(5.0D0/3.0D0) ; + COEF2(2*NFUNL+6,NFUNL+8)=-SQRT(5.0D0/3.0D0) ; + COEF2(2*NFUNL+6,NFUNL+7)=1.0D0 ; + CALL ALPINVD(2*NFUNL+6,2*NFUNL,COEF2,COEF3(1,1)) ; + COEFI=COEF3(:,1:2*NFUNL) ; + DEALLOCATE(COEF2, COEF3) + ELSE + CALL XABORT('MCGCOEF: NFUNL MUST BE = 1, 3, 6 OR 10') + ENDIF + DEALLOCATE(COEF) + RETURN + END |
