diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/SPHSX5.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/SPHSX5.f')
| -rw-r--r-- | Dragon/src/SPHSX5.f | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/Dragon/src/SPHSX5.f b/Dragon/src/SPHSX5.f new file mode 100644 index 0000000..f3b89de --- /dev/null +++ b/Dragon/src/SPHSX5.f @@ -0,0 +1,132 @@ +*DECK SPHSX5 + SUBROUTINE SPHSX5(IPAPX,RECNAM,NREA,NGROUP,NISOF,NISOP,NL,INDX, + 1 NOMREA,SIGS,SS2D,XS,LXS) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover the cross sections of an elementary calculation and single +* mixture in an Apex file. +* +*Copyright: +* Copyright (C) 2021 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 +* IPAPX pointer to the Apex file. +* RECNAM character identification of calculation. +* NREA number of reactions in the Apex file. +* NGROUP number of energy groups. +* NISOF number of fissile isotopes. +* NISOP number of fission products. +* NL maximum Legendre order (NL=1 is for isotropic scattering). +* INDX position of isotopic set in current mixture (=-2: residual +* set; -1: total set; >0 isotope index). +* NOMREA names of reactions in the Apex file. +* LXS existence flag of each reaction. +* +*Parameters: output +* SIGS scattering cross sections. +* SS2D complete scattering matrix. +* XS cross sections per reaction. +* LXS existence flag of each reaction. +* +*----------------------------------------------------------------------- +* + USE GANLIB + USE hdf5_wrap + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPAPX + CHARACTER RECNAM*80 + INTEGER NREA,NGROUP,NISOF,NISOP,NL,INDX + REAL SS2D(NGROUP,NGROUP,NL),SIGS(NGROUP,NL),XS(NGROUP,NREA) + LOGICAL LXS(NREA) + CHARACTER NOMREA(NREA)*12 +*---- +* LOCAL VARIABLES +*---- + INTEGER RANK,TYPE,NBYTE,DIMSR(5),IREA,IOF,IL + CHARACTER RECNAM2*80,RECNAM3*80 + REAL, ALLOCATABLE, DIMENSION(:) :: WORK1D + REAL, ALLOCATABLE, DIMENSION(:,:) :: WORK2D + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: WORK3D + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: WORK4D +*---- +* FILL OUTPUT ARRAYS +*---- + SIGS(:NGROUP,:NL)=0.0 + SS2D(:NGROUP,:NGROUP,:NL)=0.0 + XS(:NGROUP,:NREA)=0.0 + IOF=0 + IF(INDX.EQ.-2) THEN + ! residual set + RECNAM2=TRIM(RECNAM)//"mac/RESIDUAL/" + ELSE IF(INDX.EQ.-1) THEN + ! total set + RECNAM2=TRIM(RECNAM)//"mac/TOTAL/" + ELSE IF((INDX.GE.1).AND.(INDX.LE.NISOF)) THEN + ! particularized fissile isotope set + IOF=0 + RECNAM2=TRIM(RECNAM)//"mic/f.p./" + ELSE IF((INDX.GE.NISOF+1).AND.(INDX.LE.NISOF+NISOP)) THEN + ! particularized fission product set + IOF=NISOF + RECNAM2=TRIM(RECNAM)//"mic/fiss/" + ELSE IF(INDX.GE.NISOF+NISOP+1) THEN + ! particularized stable isotope set + IOF=NISOF+NISOP + RECNAM2=TRIM(RECNAM)//"mic/othe/" + ENDIF + DO IREA=1,NREA + RECNAM3=TRIM(RECNAM2)//NOMREA(IREA) + IF(NOMREA(IREA).EQ.'PROF') CYCLE + CALL hdf5_info(IPAPX,RECNAM3,RANK,TYPE,NBYTE,DIMSR) + IF(TYPE.NE.99) THEN + LXS(IREA)=.TRUE. + IF(NOMREA(IREA).EQ.'DIFF') THEN + IF(INDX.LT.0) THEN + CALL hdf5_read_data(IPAPX,RECNAM3,WORK2D) + SIGS(:,:)=WORK2D(:,:) + DEALLOCATE(WORK2D) + ELSE + CALL hdf5_read_data(IPAPX,RECNAM3,WORK3D) + SIGS(:,:)=WORK3D(:,:,INDX-IOF) + DEALLOCATE(WORK3D) + ENDIF + ELSE IF(NOMREA(IREA).EQ.'SCAT') THEN + IF(INDX.LT.0) THEN + CALL hdf5_read_data(IPAPX,RECNAM3,WORK3D) + SS2D(:,:,:)=WORK3D(:,:,:) + DEALLOCATE(WORK3D) + ELSE + CALL hdf5_read_data(IPAPX,RECNAM3,WORK4D) + SS2D(:,:,:)=WORK4D(:,:,:,INDX-IOF) + DEALLOCATE(WORK4D) + ENDIF + NL=SIZE(SS2D,3) + DO IL=2,NL + SS2D(:,:,IL)=SS2D(:,:,IL)/REAL(2*IL-1) + ENDDO + ELSE + IF(INDX.LT.0) THEN + CALL hdf5_read_data(IPAPX,RECNAM3,WORK1D) + XS(:,IREA)=WORK1D(:) + DEALLOCATE(WORK1D) + ELSE + CALL hdf5_read_data(IPAPX,RECNAM3,WORK2D) + XS(:,IREA)=WORK2D(:,INDX-IOF) + DEALLOCATE(WORK2D) + ENDIF + ENDIF + ENDIF + ENDDO + RETURN + END |
