summaryrefslogtreecommitdiff
path: root/Dragon/src/EDIWP1.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/EDIWP1.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/EDIWP1.f')
-rw-r--r--Dragon/src/EDIWP1.f233
1 files changed, 233 insertions, 0 deletions
diff --git a/Dragon/src/EDIWP1.f b/Dragon/src/EDIWP1.f
new file mode 100644
index 0000000..488dc75
--- /dev/null
+++ b/Dragon/src/EDIWP1.f
@@ -0,0 +1,233 @@
+*DECK EDIWP1
+ SUBROUTINE EDIWP1(IPFLUX,NW,NGROUP,NUN,NREGIO,NDIM,IADJ,NLIN,
+ > NFUNL,NGCOND,NMERGE,KEYANI,VOLUME,IGCOND,IMERGE,FLUXES,AFLUXE)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Evaluate the PN weighting spectra for an homogenization based on
+* spherical harmonic moments of the flux.
+*
+*Copyright:
+* Copyright (C) 2019 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
+* IPFLUX pointer to the flux LCM object.
+* NW order of the spherical harmonic expansion for the flux.
+* NGROUP number of energy groups.
+* NUN number of unknowns in flux array.
+* NREGIO number of regions.
+* NDIM number of dimensions.
+* IADJ type of flux weighting:
+* =0: direct flux weighting;
+* =1: direct-adjoint flux weighting.
+* NLIN number of polynomial components in flux.
+* NFUNL number of spherical harmonic components in flux.
+* NGCOND number of merged energy groups.
+* NMERGE number of merged regions.
+* KEYANI position of spherical harmonic components in unknown vector.
+* VOLUME volumes.
+* IGCOND limit condensed groups.
+* IMERGE region merging matrix.
+*
+*Parameters: input/output
+* FLUXES weighting function for PN fluxes.
+* AFLUXE weighting function for PN adjoint fluxes.
+*
+*Reference:
+* Jean-Francois Vidal et al., APOLLO3 homogenization techniques for
+* transport core calculations - application to the ASTRID CFV core,
+* Nuclear Engineering and Technology 49 (2017) 1379 - 1387.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ TYPE(C_PTR) IPFLUX
+ INTEGER NW,NREGIO,NGROUP,NUN,NDIM,IADJ,NLIN,NFUNL,NGCOND,
+ > NMERGE,KEYANI(NREGIO,NLIN,NFUNL),IGCOND(NGCOND),
+ > IMERGE(NREGIO)
+ REAL VOLUME(NREGIO),FLUXES(NREGIO,NGROUP,NW),
+ > AFLUXE(NREGIO,NGROUP,NW)
+*----
+* LOCAL VARIABLES
+*----
+ TYPE(C_PTR) JPFLUX,JPFLUA
+ DOUBLE PRECISION DVOL
+*----
+* ALLOCATABLE ARRAYS
+*----
+ REAL, ALLOCATABLE, DIMENSION(:) :: WORKF,WORKA
+ REAL, ALLOCATABLE, DIMENSION(:,:) :: FDEN,ADEN
+ REAL, ALLOCATABLE, DIMENSION(:,:,:) :: FLUANI,AFLANI
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: SVOL
+ DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: DFLUA,DAFLA
+*----
+* INITIALIZATION
+*----
+ IF(NFUNL.EQ.1) CALL XABORT('EDIWP1: ANIS.GE.2 EXPECTED IN TRACKI'
+ > //'NG.')
+ JPFLUX=LCMGID(IPFLUX,'FLUX')
+ ALLOCATE(WORKF(NUN))
+ IF(IADJ.EQ.1) THEN
+ JPFLUA=LCMGID(IPFLUX,'AFLUX')
+ ALLOCATE(WORKA(NUN))
+ ENDIF
+*----
+* PROCESS TRIVIAL 1D CASE
+*----
+ IF(NDIM.EQ.1) THEN
+ DO IL=1,NW
+ DO IGR=1,NGROUP
+ IF(IADJ.EQ.0) THEN
+ CALL LCMGDL(JPFLUX,IGR,WORKF)
+ DO IREG=1,NREGIO
+ FLUXES(IREG,IGR,IL)=WORKF(KEYANI(IREG,1,IL+1))
+ AFLUXE(IREG,IGR,IL)=1.0
+ ENDDO
+ ELSE IF(IADJ.EQ.1) THEN
+ CALL LCMGDL(JPFLUX,IGR,WORKF)
+ CALL LCMGDL(JPFLUA,IGR,WORKA)
+ DO IREG=1,NREGIO
+ FLUXES(IREG,IGR,IL)=WORKF(KEYANI(IREG,1,IL+1))
+ AFLUXE(IREG,IGR,IL)=WORKA(KEYANI(IREG,1,IL+1))
+ ENDDO
+ ENDIF
+ DO IREG=1,NREGIO
+ FLUXES(IREG,IGR,IL)=MAX(ABS(FLUXES(IREG,IGR,IL)),1.0E-10)
+ AFLUXE(IREG,IGR,IL)=MAX(ABS(AFLUXE(IREG,IGR,IL)),1.0E-10)
+ ENDDO
+ ENDDO
+ ENDDO
+ DEALLOCATE(WORKF)
+ IF(IADJ.EQ.1) DEALLOCATE(WORKA)
+ RETURN
+ ENDIF
+*----
+* RECOVER PN MOMENTS OF THE FLUX
+*----
+ IOF=1
+ DO IL=1,NW
+ IOF0=IOF
+ NTRM=1
+ IF(NDIM.EQ.2) THEN
+ NTRM=IL+1
+ ELSE IF(NDIM.EQ.3) THEN
+ NTRM=2*IL+1
+ ENDIF
+ ALLOCATE(FLUANI(NREGIO,NGROUP,NTRM),AFLANI(NREGIO,NGROUP,NTRM))
+ DO IGR=1,NGROUP
+ IF(IADJ.EQ.0) THEN
+ CALL LCMGDL(JPFLUX,IGR,WORKF)
+ DO IREG=1,NREGIO
+ IOF=IOF0
+ ID=0
+ DO IM=-IL,IL
+ IF((NDIM.EQ.2).AND.(MOD(IL+IM,2).EQ.1)) CYCLE
+ IOF=IOF+1
+ IF(IOF.GT.NFUNL) CALL XABORT('EDIWP1: KEYANI OVERFLOW.')
+ ID=ID+1
+ FLUANI(IREG,IGR,ID)=WORKF(KEYANI(IREG,1,IOF))
+ AFLANI(IREG,IGR,ID)=1.0
+ ENDDO
+ ENDDO
+ ELSE IF(IADJ.EQ.1) THEN
+ CALL LCMGDL(JPFLUX,IGR,WORKF)
+ CALL LCMGDL(JPFLUA,IGR,WORKA)
+ DO IREG=1,NREGIO
+ IOF=IOF0
+ ID=0
+ DO IM=-IL,IL
+ IF((NDIM.EQ.2).AND.(MOD(IL+IM,2).EQ.1)) CYCLE
+ IOF=IOF+1
+ IF(IOF.GT.NFUNL) CALL XABORT('EDIWP1: KEYANI OVERFLOW.')
+ ID=ID+1
+ FLUANI(IREG,IGR,ID)=WORKF(KEYANI(IREG,1,IOF))
+ AFLANI(IREG,IGR,ID)=WORKA(KEYANI(IREG,1,IOF))
+ ENDDO
+ ENDDO
+ ENDIF
+ ENDDO
+*----
+* CONDENSATION AND HOMOGENIZATION OF SPHERICAL HARMONIC MOMENTS
+*----
+ ALLOCATE(DFLUA(NMERGE,NGCOND,NTRM),DAFLA(NMERGE,NGCOND,NTRM),
+ > SVOL(NMERGE))
+ DFLUA(:NMERGE,:NGCOND,:NTRM)=0.0D0
+ DAFLA(:NMERGE,:NGCOND,:NTRM)=0.0D0
+ IGRFIN=0
+ DO IGRC=1,NGCOND
+ IGRDEB=IGRFIN+1
+ IGRFIN=IGCOND(IGRC)
+ DO IGR=IGRDEB,IGRFIN
+ SVOL(:NMERGE)=0.0D0
+ DO IREG=1,NREGIO
+ IRA=IMERGE(IREG)
+ IF(IRA.EQ.0) CYCLE
+ DVOL=VOLUME(IREG)
+ SVOL(IRA)=SVOL(IRA)+DVOL
+ DO ID=1,NTRM
+ DFLUA(IRA,IGRC,ID)=DFLUA(IRA,IGRC,ID)+
+ > FLUANI(IREG,IGR,ID)*DVOL
+ DAFLA(IRA,IGRC,ID)=DAFLA(IRA,IGRC,ID)+
+ > FLUANI(IREG,IGR,ID)*AFLANI(IREG,IGR,ID)*DVOL
+ ENDDO
+ ENDDO
+ DO IRA=1,NMERGE
+ DO ID=1,NTRM
+ DFLUA(IRA,IGRC,ID)=DFLUA(IRA,IGRC,ID)/SVOL(IRA)
+ DAFLA(IRA,IGRC,ID)=DAFLA(IRA,IGRC,ID)/
+ > (DFLUA(IRA,IGRC,ID)*SVOL(IRA))
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+*----
+* USE APOLLO3 FORMULA
+*----
+ ALLOCATE(FDEN(NREGIO,NGROUP),ADEN(NREGIO,NGROUP))
+ FLUXES(:NREGIO,:NGROUP,IL)=0.0D0
+ AFLUXE(:NREGIO,:NGROUP,IL)=0.0D0
+ FDEN(:NREGIO,:NGROUP)=0.0D0
+ ADEN(:NREGIO,:NGROUP)=0.0D0
+ IGRFIN=0
+ DO IGRC=1,NGCOND
+ IGRDEB=IGRFIN+1
+ IGRFIN=IGCOND(IGRC)
+ DO IGR=IGRDEB,IGRFIN
+ DO IREG=1,NREGIO
+ IRA=IMERGE(IREG)
+ IF(IRA.EQ.0) CYCLE
+ DO ID=1,NTRM
+ FLUXES(IREG,IGR,IL)=FLUXES(IREG,IGR,IL)+
+ > REAL(FLUANI(IREG,IGR,ID)*DFLUA(IRA,IGRC,ID))
+ AFLUXE(IREG,IGR,IL)=AFLUXE(IREG,IGR,IL)+
+ > REAL(AFLANI(IREG,IGR,ID)*DAFLA(IRA,IGRC,ID))
+ FDEN(IREG,IGR)=FDEN(IREG,IGR)+REAL(DFLUA(IRA,IGRC,ID))
+ ADEN(IREG,IGR)=ADEN(IREG,IGR)+REAL(DAFLA(IRA,IGRC,ID))
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ DO IGR=1,NGROUP
+ DO IREG=1,NREGIO
+ FLUXES(IREG,IGR,IL)=FLUXES(IREG,IGR,IL)/FDEN(IREG,IGR)
+ AFLUXE(IREG,IGR,IL)=AFLUXE(IREG,IGR,IL)/ADEN(IREG,IGR)
+ FLUXES(IREG,IGR,IL)=MAX(ABS(FLUXES(IREG,IGR,IL)),1.0E-10)
+ AFLUXE(IREG,IGR,IL)=MAX(ABS(AFLUXE(IREG,IGR,IL)),1.0E-10)
+ ENDDO
+ ENDDO
+ DEALLOCATE(ADEN,FDEN,SVOL,DAFLA,DFLUA,AFLANI,FLUANI)
+ ENDDO
+ DEALLOCATE(WORKF)
+ IF(IADJ.EQ.1) DEALLOCATE(WORKA)
+ RETURN
+ END