summaryrefslogtreecommitdiff
path: root/Dragon/src/MOCFCF.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/MOCFCF.f')
-rw-r--r--Dragon/src/MOCFCF.f412
1 files changed, 412 insertions, 0 deletions
diff --git a/Dragon/src/MOCFCF.f b/Dragon/src/MOCFCF.f
new file mode 100644
index 0000000..fdf9515
--- /dev/null
+++ b/Dragon/src/MOCFCF.f
@@ -0,0 +1,412 @@
+*DECK MOCFCF
+ SUBROUTINE MOCFCF(SUBFFI,SUBFFA,SUBLDC,SUBSCH,IFTRAK,NBTR,MXSUB,
+ 1 MXSEG,NDIM,KPN,NREG,NSOUT,NMAT,NALB,NGEFF,NPHI,
+ 2 NGSS,NLF,NFUNL,NMOD,NLFX,NLIN,NFUNLX,KEYFLX,
+ 3 MATALB,NCONV,SIGANG,CAZ1,CAZ2,XGSS,YGSS,WGSS,
+ 4 SOUR,ISGNR,IDIR,NBATCH,PHIOUT)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Flux integration upon the cyclic tracking.
+*
+*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): R. Roy and R. Le Tellier
+*
+*Parameters: input
+* SUBFFI Isotropic flux integration subroutine.
+* SUBFFA Anisotropic flux integration subroutine.
+* SUBLDC flux integration subroutine with linear-discontinuous source.
+* SUBSCH Track coefficients calculation subroutine.
+* IFTRAK tracking file unit number.
+* NGEFF number of groups to process.
+* NMAT number of mixtures.
+* NLF number of Legendre orders for the flux.
+* NREG number of regions.
+* KPN number of unknowns per energy group including spherical
+* harmonic terms and fundamental currents.
+* NGSS number of polar angles.
+* NSOUT number of surfaces.
+* MXSUB maximun number of subtracks in a track.
+* MXSEG maximun number of segments in a track.
+* NBTR number of tracks.
+* NPHI number of angles in the plane.
+* NFUNL number of moments of the flux (in 2D: NFUNL=NLF*(NLF+1)/2).
+* NMOD first dimension of ISGNR.
+* NLFX scattering anisotropy used to compute spherical harmonics.
+* NLIN linear discontinuous flag (=1 SC/DD0; =3 LDC/DD1).
+* NFUNLX number of spherical harmonics components.
+* ISGNR array of spherical harmonics signs.
+* KEYFLX position of flux elements in PHIIN vector.
+* MATALB mixture and albedo indices.
+* WGSS polar weights.
+* XGSS polar angle cosines.
+* YGSS polar angle sines.
+* NALB number of albedos.
+* SIGANG arrays of total cross-sections and albedos.
+* CAZ1 first cosines of the different tracking azimuthal angles.
+* CAZ2 second cosines of the different tracking azimuthal angles.
+* SOUR total source vector components.
+* NCONV logical array of convergence status for each group (.TRUE. for
+* not converged).
+* IDIR direction of fundamental current for TIBERE with MoC
+* (=0,1,2,3).
+* NBATCH number of tracks processed in each OpenMP core (default: =1).
+*
+*Parameters: output
+* PHIOUT vector containing the zonal flux moments.
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT NONE
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER IFTRAK,NGEFF,NMAT,NLF,NREG,NDIM,KPN,NGSS,NSOUT,MXSUB,
+ 1 MXSEG,NBTR,NPHI,NFUNL,NMOD,NLFX,NLIN,NFUNLX,ISGNR(NMOD,NFUNLX),
+ 2 KEYFLX(NREG,NLIN,NFUNL),MATALB(-NSOUT:NREG),NALB,IDIR,NBATCH
+ REAL WGSS(NGSS),XGSS(NGSS),YGSS(NGSS),
+ 1 SIGANG(-NALB:NMAT,NGEFF)
+ DOUBLE PRECISION CAZ1(NPHI),CAZ2(NPHI),SOUR(KPN,NGEFF),
+ 1 PHIOUT(KPN,NGEFF)
+ LOGICAL NCONV(NGEFF)
+ EXTERNAL SUBFFI,SUBFFA,SUBLDC,SUBSCH
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER MXE
+ PARAMETER (MXE=64)
+ INTEGER ILINE,IANG,JANG,ISUB,I,IE,II,NOMI,NZI,IND,JF,INDX,
+ 1 INDY,IREG,I0,IL1,IBATCH,NDFUNLX
+ DOUBLE PRECISION DWEIG(MXE),Q0,Q1,Q0X,Q1X,Q0Y,Q1Y
+ LOGICAL LNEW
+*----
+* ALLOCATABLE ARRAYS
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: NSUB,NSEG
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NRSEG,KANGL
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: RHARM
+ REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: TRHAR
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: DSIG,WEIGHT,EXPT,
+ 1 EXP2,FLUX
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: SEGLEN,COEFI,
+ 1 OMEGAX,OMEGAY,OMG2,FLM,FLP,CYM,CYP,DFLM,DFLP,CYM2,CYP2,FLUV,
+ 2 DFLUV
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: PHIV,DPHIV
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(NSUB(NBATCH),NSEG(NBATCH),WEIGHT(NBATCH),
+ 1 KANGL(MXSUB,NBATCH),NRSEG(MXSEG,NBATCH),SEGLEN(MXSEG,NBATCH))
+ ALLOCATE(FLM(NGSS,MXSEG),FLP(NGSS,MXSEG),CYM(NGSS,MXSEG),
+ 1 CYP(NGSS,MXSEG),EXPT(NGSS*MXSEG))
+ ALLOCATE(OMEGAX(NPHI,NGSS),OMEGAY(NPHI,NGSS),OMG2(NGSS,3))
+*---
+* Compute flux and currents for this tracking line
+*---
+ PHIOUT(:KPN,:NGEFF)=0.0D0
+ IF((NLF.EQ.1).AND.(NLIN.EQ.1)) THEN
+*----
+* ISOTROPIC SCATTERING
+*----
+ ALLOCATE(FLUX(KPN),EXP2(2*NGSS*MXSEG))
+ DO IE=1,NGSS
+ DO IANG=1,NPHI
+ OMEGAX(IANG,IE)=CAZ1(IANG)/YGSS(IE)
+ OMEGAY(IANG,IE)=CAZ2(IANG)/YGSS(IE)
+ ENDDO
+ ENDDO
+ DO IBATCH=1,(NBTR-1)/NBATCH+1
+ DO ILINE=(IBATCH-1)*NBATCH+1,MIN(IBATCH*NBATCH,NBTR)
+ IL1=ILINE-(IBATCH-1)*NBATCH
+ READ(IFTRAK) NSUB(IL1),NSEG(IL1),WEIGHT(IL1),
+ 1 (KANGL(I,IL1),I=1,NSUB(IL1)),(NRSEG(I,IL1),I=1,NSEG(IL1)),
+ 2 (SEGLEN(I,IL1),I=1,NSEG(IL1))
+ IF(NSUB(IL1).GT.MXSUB) CALL XABORT('MOCFCF: MXSUB OVERFLOW.')
+ ENDDO
+*$OMP PARALLEL DO
+*$OMP1 PRIVATE(IL1,IE,DWEIG,ISUB,LNEW,NOMI,NZI,IND,FLM,FLP,OMG2)
+*$OMP2 PRIVATE(FLUX,I0,ILINE,EXPT,EXP2,CYM,CYP)
+ DO II=1,NGEFF
+ IF(NCONV(II)) THEN
+ FLUX(:KPN)=0.0D0
+ DO ILINE=(IBATCH-1)*NBATCH+1,MIN(IBATCH*NBATCH,NBTR)
+ IL1=ILINE-(IBATCH-1)*NBATCH
+ OMG2(:NGSS,:3)=0.0D0
+ DO IE=1,NGSS
+ DWEIG(IE)=WEIGHT(IL1)*WGSS(IE)
+ ENDDO
+ FLM(:NGSS,:MXSEG)=0.D0
+ FLP(:NGSS,:MXSEG)=0.D0
+ ISUB=0
+ LNEW=.TRUE.
+ DO I0=1,NSEG(IL1)
+ NOMI=NRSEG(I0,IL1)
+ NZI=MATALB(NOMI)
+ IF(NZI.LE.0) THEN
+ LNEW=.TRUE.
+ ELSE
+ IF(LNEW) THEN
+ ISUB=ISUB+1
+ LNEW=.FALSE.
+ ENDIF
+ IND=KEYFLX(NOMI,1,1)
+ IF(IDIR.EQ.0) THEN
+ DO IE=1,NGSS
+ FLM(IE,I0)=DWEIG(IE)*SOUR(IND,II)
+ FLP(IE,I0)=FLM(IE,I0)
+ ENDDO
+ ELSEIF(IDIR.EQ.1) THEN
+ DO IE=1,NGSS
+ OMG2(IE,1)=3.0D0*OMEGAX(KANGL(ISUB,IL1),IE)**2
+ FLM(IE,I0)=DWEIG(IE)*SOUR(IND,II)*OMG2(IE,1)
+ FLP(IE,I0)=FLM(IE,I0)
+ ENDDO
+ ELSEIF(IDIR.EQ.2) THEN
+ DO IE=1,NGSS
+ OMG2(IE,2)=3.0D0*OMEGAY(KANGL(ISUB,IL1),IE)**2
+ FLM(IE,I0)=DWEIG(IE)*SOUR(IND,II)*OMG2(IE,2)
+ FLP(IE,I0)=FLM(IE,I0)
+ ENDDO
+ ELSEIF(IDIR.EQ.3) THEN
+ DO IE=1,NGSS
+ OMG2(IE,3)=3.0D0*(1.0-1.0/YGSS(IE)**2)
+ FLM(IE,I0)=DWEIG(IE)*SOUR(IND,II)*OMG2(IE,3)
+ FLP(IE,I0)=FLM(IE,I0)
+ ENDDO
+ ENDIF
+ ENDIF
+ ENDDO
+* MOCFFIR: 'Source Term Isolation' Strategy turned on
+* MOCFFIS: 'Source Term Isolation' Strategy turned off
+* MOCFFIT: 'MOCC/MCI' Iterative Strategy
+ CALL SUBFFI(SUBSCH,NREG,NSOUT,KPN,NMAT,NSEG(IL1),
+ 1 SEGLEN(1,IL1),NRSEG(1,IL1),NGSS,MATALB,
+ 2 SIGANG(-NALB,II),KEYFLX,YGSS,FLUX,EXPT,
+ 3 EXP2,FLM,FLP,CYM,CYP,IDIR,OMG2)
+ ENDDO ! ILINE
+ PHIOUT(:KPN,II)=PHIOUT(:KPN,II)+FLUX(:KPN)
+ ENDIF
+ ENDDO ! II
+*$OMP END PARALLEL DO
+ ENDDO ! IBATCH
+ DEALLOCATE(OMG2,OMEGAY,OMEGAX)
+ DEALLOCATE(EXP2,FLUX)
+ ELSE IF(NLIN.EQ.1) THEN
+*----
+* ANISOTROPIC SCATTERING
+*----
+ ALLOCATE(FLUX(KPN),EXP2(2*NGSS*MXSEG))
+ ALLOCATE(TRHAR(NGSS,NFUNL,NPHI,2),RHARM(NGSS,NFUNL))
+ DO IANG=1,NPHI
+ CALL MOCCHR(2,NLF-1,NFUNL,NGSS,XGSS,CAZ1(IANG),CAZ2(IANG),
+ 1 RHARM)
+ DO 15 JF=1,NFUNL
+ DO 10 IE=1,NGSS
+ TRHAR(IE,JF,IANG,1)=ISGNR(1,JF)*RHARM(IE,JF)
+ TRHAR(IE,JF,IANG,2)=ISGNR(NMOD,JF)*RHARM(IE,JF)
+ 10 CONTINUE
+ 15 CONTINUE
+ ENDDO
+ DEALLOCATE(RHARM)
+ DO IBATCH=1,(NBTR-1)/NBATCH+1
+ DO ILINE=(IBATCH-1)*NBATCH+1,MIN(IBATCH*NBATCH,NBTR)
+ IL1=ILINE-(IBATCH-1)*NBATCH
+ READ(IFTRAK) NSUB(IL1),NSEG(IL1),WEIGHT(IL1),
+ 1 (KANGL(I,IL1),I=1,NSUB(IL1)),(NRSEG(I,IL1),I=1,NSEG(IL1)),
+ 1 (SEGLEN(I,IL1),I=1,NSEG(IL1))
+ IF(NSUB(IL1).GT.MXSUB) CALL XABORT('MOCFCF: MXSUB OVERFLOW.')
+ ENDDO
+*$OMP PARALLEL DO
+*$OMP1 PRIVATE(IL1,IE,DWEIG,ISUB,LNEW,NOMI,NZI,Q0,Q1,FLM,FLP)
+*$OMP2 PRIVATE(FLUX,I0,II,EXPT,EXP2,CYM,CYP)
+ DO II=1,NGEFF
+ IF(NCONV(II)) THEN
+ FLUX(:KPN)=0.0D0
+ DO ILINE=(IBATCH-1)*NBATCH+1,MIN(IBATCH*NBATCH,NBTR)
+ IL1=ILINE-(IBATCH-1)*NBATCH
+ DO IE=1,NGSS
+ DWEIG(IE)=WEIGHT(IL1)*WGSS(IE)
+ ENDDO
+ FLM(:NGSS,:MXSEG)=0.0D0
+ FLP(:NGSS,:MXSEG)=0.0D0
+ ISUB=0
+ LNEW=.TRUE.
+ DO I0=1,NSEG(IL1)
+ NOMI=NRSEG(I0,IL1)
+ NZI=MATALB(NOMI)
+ IF(NZI.LE.0) THEN
+ LNEW=.TRUE.
+ ELSE
+ IF(LNEW) THEN
+ ISUB=ISUB+1
+ LNEW=.FALSE.
+ ENDIF
+ DO IE=1,NGSS
+ Q0=0.D0
+ Q1=0.D0
+ DO JF=1,NFUNL
+ IND=KEYFLX(NOMI,1,JF)
+ Q0=Q0+SOUR(IND,II)*TRHAR(IE,JF,KANGL(ISUB,IL1),2)
+ Q1=Q1+SOUR(IND,II)*TRHAR(IE,JF,KANGL(ISUB,IL1),1)
+ ENDDO
+ FLM(IE,I0)=DWEIG(IE)*Q0
+ FLP(IE,I0)=DWEIG(IE)*Q1
+ ENDDO
+ ENDIF
+ ENDDO
+ IF(ISUB.NE.NSUB(IL1)) CALL XABORT('MOCFCF: NSUB ERROR.')
+* MOCFFAR: 'Source Term Isolation' Strategy turned on
+* MOCFFAS: 'Source Term Isolation' Strategy turned off
+* MOCFFAT: 'MOCC/MCI' Iterative Strategy
+ CALL SUBFFA(SUBSCH,NREG,NSOUT,KPN,NMAT,NSEG(IL1),
+ 1 SEGLEN(1,IL1),NRSEG(1,IL1),NGSS,NFUNL,MATALB,
+ 2 SIGANG(-NALB,II),KEYFLX,YGSS,FLUX,EXPT,EXP2,FLM,
+ 3 FLP,CYM,CYP,NPHI,NSUB(IL1),KANGL(1,IL1),TRHAR)
+ ENDDO ! ILINE
+ PHIOUT(:KPN,II)=PHIOUT(:KPN,II)+FLUX(:KPN)
+ ENDIF
+ ENDDO ! II
+*$OMP END PARALLEL DO
+ ENDDO ! IBATCH
+ DEALLOCATE(EXP2,FLUX,TRHAR)
+ ELSE IF(NLIN.EQ.3) THEN
+*----
+* LINEAR DISCONTINUOUS SOURCE APPROXIMATION
+*----
+ NDFUNLX=NDIM*NFUNLX
+ ALLOCATE(PHIV(NFUNLX,NREG,NGEFF),DPHIV(NDFUNLX,NREG,NGEFF))
+ ALLOCATE(FLUV(NFUNLX,NREG),DFLUV(NDFUNLX,NREG))
+ ALLOCATE(EXP2(5*NGSS*MXSEG))
+ ALLOCATE(TRHAR(NGSS,NFUNLX,NPHI,2),RHARM(NGSS,NFUNLX))
+ DO IANG=1,NPHI
+ CALL MOCCHR(2,NLFX-1,NFUNLX,NGSS,XGSS,CAZ1(IANG),CAZ2(IANG),
+ 1 RHARM)
+ DO 25 JF=1,NFUNLX
+ DO 20 IE=1,NGSS
+ TRHAR(IE,JF,IANG,1)=ISGNR(1,JF)*RHARM(IE,JF)
+ TRHAR(IE,JF,IANG,2)=ISGNR(NMOD,JF)*RHARM(IE,JF)
+ 20 CONTINUE
+ 25 CONTINUE
+ ENDDO
+ DEALLOCATE(RHARM)
+ DO II=1,NGEFF
+ IF(NCONV(II)) THEN
+ PHIV(:NFUNLX,:NREG,II)=0.0D0
+ DPHIV(:NDFUNLX,:NREG,II)=0.0D0
+ ENDIF
+ ENDDO
+ ALLOCATE(DFLM(NGSS,MXSEG),DFLP(NGSS,MXSEG),DSIG(MXSEG),
+ 1 CYM2(NGSS,MXSEG),CYP2(NGSS,MXSEG))
+ DO IBATCH=1,(NBTR-1)/NBATCH+1
+ DO ILINE=(IBATCH-1)*NBATCH+1,MIN(IBATCH*NBATCH,NBTR)
+ IL1=ILINE-(IBATCH-1)*NBATCH
+ READ(IFTRAK) NSUB(IL1),NSEG(IL1),WEIGHT(IL1),
+ 1 (KANGL(I,IL1),I=1,NSUB(IL1)),(NRSEG(I,IL1),I=1,NSEG(IL1)),
+ 1 (SEGLEN(I,IL1),I=1,NSEG(IL1))
+ IF(NSUB(IL1).GT.MXSUB) CALL XABORT('MOCFCF: MXSUB OVERFLOW.')
+ ENDDO
+*$OMP PARALLEL DO
+*$OMP1 PRIVATE(IL1,IE,DWEIG,ISUB,JANG,LNEW,NOMI,NZI,Q0,Q1,Q0X,Q1X,Q0Y)
+*$OMP2 PRIVATE(Q1Y,IND,INDX,INDY,FLM,FLP,DFLM,DFLP,FLUV,DFLUV,I0,ILINE)
+*$OMP3 PRIVATE(DSIG,EXPT,EXP2,CYM,CYP,CYM2,CYP2)
+ DO II=1,NGEFF
+ IF(NCONV(II)) THEN
+ FLUV(:NFUNLX,:NREG)=0.0D0
+ DFLUV(:NDFUNLX,:NREG)=0.0D0
+ DO ILINE=(IBATCH-1)*NBATCH+1,MIN(IBATCH*NBATCH,NBTR)
+ IL1=ILINE-(IBATCH-1)*NBATCH
+ DO IE=1,NGSS
+ DWEIG(IE)=WEIGHT(IL1)*WGSS(IE)
+ ENDDO
+ FLM(:NGSS,:MXSEG)=0.0D0
+ FLP(:NGSS,:MXSEG)=0.0D0
+ DFLM(:NGSS,:MXSEG)=0.0D0
+ DFLP(:NGSS,:MXSEG)=0.0D0
+ ISUB=0
+ JANG=0
+ LNEW=.TRUE.
+ DO I0=1,NSEG(IL1)
+ NOMI=NRSEG(I0,IL1)
+ NZI=MATALB(NOMI)
+ IF(NZI.LE.0) THEN
+ LNEW=.TRUE.
+ ELSE
+ IF(LNEW) THEN
+ ISUB=ISUB+1
+ JANG=KANGL(ISUB,IL1)
+ LNEW=.FALSE.
+ ENDIF
+ DO IE=1,NGSS
+ Q0=0.D0
+ Q1=0.D0
+ Q0X=0.0D0
+ Q1X=0.0D0
+ Q0Y=0.0D0
+ Q1Y=0.0D0
+ DO JF=1,NFUNL
+ IND=KEYFLX(NOMI,1,JF)
+ INDX=KEYFLX(NOMI,2,JF)
+ INDY=KEYFLX(NOMI,3,JF)
+ Q0=Q0+SOUR(IND,II)*TRHAR(IE,JF,JANG,2)
+ Q1=Q1+SOUR(IND,II)*TRHAR(IE,JF,JANG,1)
+ Q0X=Q0X+SOUR(INDX,II)*TRHAR(IE,JF,JANG,2)
+ Q1X=Q1X+SOUR(INDX,II)*TRHAR(IE,JF,JANG,1)
+ Q0Y=Q0Y+SOUR(INDY,II)*TRHAR(IE,JF,JANG,2)
+ Q1Y=Q1Y+SOUR(INDY,II)*TRHAR(IE,JF,JANG,1)
+ ENDDO
+ FLM(IE,I0)=Q0
+ FLP(IE,I0)=Q1
+ DFLM(IE,I0)=-Q0X*CAZ1(JANG)-Q0Y*CAZ2(JANG)
+ DFLP(IE,I0)=Q1X*CAZ1(JANG)+Q1Y*CAZ2(JANG)
+ ENDDO
+ ENDIF
+ ENDDO
+ IF(ISUB.NE.NSUB(IL1)) CALL XABORT('MOCFCF: NSUB ERROR.')
+* MOCFFAL: 'Source Term Isolation' Strategy turned off
+ CALL SUBLDC(SUBSCH,NREG,NSOUT,NMAT,NSEG(IL1),
+ 1 SEGLEN(1,IL1),NRSEG(1,IL1),NGSS,NFUNLX,MATALB,
+ 2 DWEIG,SIGANG(-NALB,II),YGSS,FLM,FLP,DFLM,DFLP,
+ 3 NPHI,NSUB(IL1),KANGL(1,IL1),TRHAR,FLUV,
+ 4 DFLUV,DSIG,EXPT,EXP2,CYM,CYP,CYM2,CYP2)
+ ENDDO ! ILINE
+ PHIV(:NFUNLX,:NREG,II)=PHIV(:NFUNLX,:NREG,II)+
+ 1 FLUV(:NFUNLX,:NREG)
+ DPHIV(:NDFUNLX,:NREG,II)=DPHIV(:NDFUNLX,:NREG,II)+
+ 1 DFLUV(:NDFUNLX,:NREG)
+ ENDIF
+ ENDDO ! II
+*$OMP END PARALLEL DO
+ ENDDO ! IBATCH
+ DEALLOCATE(CYP2,CYM2,DSIG,DFLP,DFLM)
+ DEALLOCATE(EXP2,TRHAR)
+ ALLOCATE(COEFI(2*NFUNLX,2*NFUNLX))
+ CALL MCGCOEF(NFUNLX,NGSS,YGSS,WGSS,NPHI,CAZ1,CAZ2,COEFI)
+ DO II=1,NGEFF
+ IF(NCONV(II)) THEN
+ DO IREG=1,NREG
+ DPHIV(:,IREG,II)=MATMUL(COEFI,DPHIV(:,IREG,II))
+ DO JF=1,NFUNL
+ PHIOUT(KEYFLX(IREG,1,JF),II)=PHIV(JF,IREG,II)
+ PHIOUT(KEYFLX(IREG,2,JF),II)=DPHIV(JF,IREG,II)
+ PHIOUT(KEYFLX(IREG,3,JF),II)=DPHIV(NFUNLX+JF,IREG,II)
+ ENDDO
+ ENDDO
+ ENDIF
+ ENDDO
+ DEALLOCATE(COEFI,DFLUV,FLUV,DPHIV,PHIV)
+ ENDIF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(EXPT,CYP,CYM,FLP,FLM)
+ DEALLOCATE(SEGLEN,NRSEG,KANGL,WEIGHT,NSEG,NSUB)
+*
+ RETURN
+ END