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/NXT3T2.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/NXT3T2.f')
| -rw-r--r-- | Dragon/src/NXT3T2.f | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/Dragon/src/NXT3T2.f b/Dragon/src/NXT3T2.f new file mode 100644 index 0000000..f608d1e --- /dev/null +++ b/Dragon/src/NXT3T2.f @@ -0,0 +1,310 @@ +*DECK NXT3T2 + SUBROUTINE NXT3T2(IPTRK,JPTRK,IX,IY,IZ,NFREG,NFSUR,MAXMSH, + 1 NUCELL,NBUCEL,MXGSUR,MXGREG,MAXPIN,MATALB, + 2 SURVOL,IUNFLD,NZP,N2REG,N2SUR,N2CEL,N2PIN, + 3 IND2T3,ZCORD,MATALB2,SURVOL2) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Create 2D projection (NXT geometry analysis) of a 3D prismatic +* geometry. +* +*Copyright: +* Copyright (C) 2005 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. Le Tellier +* +*Parameters: input +* IPTRK pointer to the NXT 3D geometry analysis. +* JPTRK pointer to the NXT 2D projected geometry analysis. +* IX first direction perpendicular to the projection axis. +* IY second direction perpendicular to the projection axis. +* IZ projection axis. +* NFREG number of regions in the 3D geometry. +* NFSUR number of outer surfaces in the 3D geometry. +* MAXMSH maximum dimension of any mesh in any sub-geometry of the 3D +* geometry. +* NUCELL number of cells along the three axis in the 3D geometry. +* NBUCEL total number of cells in the 3D geometry. +* MXGSUR maximum number of surfaces for any sub-geometry of the 3D +* geometry. +* MXGREG maximum number of regions for any sub-geometry of the 3D +* geometry. +* MAXPIN maximum number of pins for any cell of the 3D geometry. +* MATALB mixtures/albedos array for the 3D geometry. +* SURVOL surfaces/volumes array for the 3D geometry. +* IUNFLD assembly description array for the 3D geometry (*,*,*,*,0) +* / projected 2D geometry (*,*,*,*,1). +* +*Parameters: output +* NZP number of plans in the 3D prismatic geometry. +* N2REG number of regions in the projected 2D geometry. +* N2SUR number of outer surfaces in the projected 2D geometry. +* N2CEL total number of cells in the projected 2D geometry. +* N2PIN total number of pin descriptions in the projected 2D geometry. +* IND2T3 mapping index between the 2D projected geometries (plan by +* plan) and the initial 3D geometry. +* ZCORD coordinates of the different plans of the 3D prismatic +* geometry. +* MATALB2 mixtures/albedos array for the projected 2D geometry. +* SURVOL2 surfaces/volumes array for the projected 2D geometry. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPTRK,JPTRK + INTEGER IX,IY,IZ,NFREG,NFSUR,MAXMSH,NUCELL(3),NBUCEL,MXGSUR, + 1 MXGREG,MAXPIN,MATALB(-NFSUR:NFREG), + 2 IUNFLD(2,NUCELL(1),NUCELL(2),NUCELL(3),0:1),NZP,N2REG,N2SUR, + 3 N2CEL,N2PIN,IND2T3(-NFSUR:NFREG,0:NUCELL(IZ)*MAXMSH+1), + 4 MATALB2(-NFSUR:NFREG) + DOUBLE PRECISION SURVOL(-NFSUR:NFREG),ZCORD(0:MAXMSH), + 1 SURVOL2(-NFSUR:NFREG) +*---- +* LOCAL VARIABLES +*---- + INTEGER NSTATE + DOUBLE PRECISION DEPS + PARAMETER(NSTATE=40,DEPS=1.D-7) + INTEGER ESTATE(NSTATE) + INTEGER I,J,ITRN,ICEL,K,JJ,II,NTPINR,N2SURC,N2REGC,IPIN,N2SURP, + 1 N2REGP,NUNK2 + DOUBLE PRECISION DELZ,HPIN,APIN,RPIN,RADP +!! CHARACTER SIZEX*5,FORM*30 + CHARACTER NAMCEL*9,NAMREC*12,NAMCE2*9 + LOGICAL LFIRST,XDDCOM,LPIN,LSTCEL,LSTPIN + CHARACTER CDIR(4)*1 + DATA CDIR /'X','Y','Z','R'/ +*---- +* Allocatable arrays +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NSURC,NREGC,IDIRC,NTPIN, + > REGI,CELID,PINID + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IDSUR,IDREG,MESHC + INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: INDEX,ITPIN + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: DCMESH,DRAPIN +* +!!!! WRITE(SIZEX,*) NUCELL(1) +!!!! FORM='('//SIZEX//'(I2,1X,1H(,I2,1H),2X))' +!!!! WRITE(6,*) 'GLOBAL ASSEMBLY:' +!!!! DO K=1,MAX(NUCELL(3),1) +!!!! WRITE(6,*) K,' z-plan' +!!!! DO J=NUCELL(2),1,-1 +!!!! WRITE(6,FORM) ((IUNFLD(JJ,I,J,K,0),JJ=1,2),I=1,NUCELL(1)) +!!!! ENDDO +!!!! ENDDO +*---- +* Scratch storage allocation +*---- + ALLOCATE(INDEX(5,-MXGSUR:MXGREG,0:NUCELL(IZ)), + > IDSUR(MXGSUR,0:NUCELL(IZ)),IDREG(MXGREG,0:NUCELL(IZ)), + > MESHC(4,NUCELL(IZ)),NSURC(NUCELL(IZ)),NREGC(NUCELL(IZ)), + > IDIRC(NUCELL(IZ)),NTPIN(NUCELL(IZ)), + > ITPIN(3,MAXPIN,0:NUCELL(IZ))) + ALLOCATE(DCMESH(-1:MAXMSH,4,0:NUCELL(IZ)), + > DRAPIN(-1:4,MAXPIN,0:NUCELL(IZ)),REGI(-NFSUR:NFREG), + > CELID(NBUCEL),PINID(NBUCEL*MAXPIN)) +* + REGI(-NFSUR:NFREG)=0 + CELID(:NBUCEL)=0 + IND2T3(-NFSUR:NFREG,0:NUCELL(IZ)*MAXMSH+1)=0 + N2SUR=0 + N2REG=0 + N2CEL=0 + N2PIN=0 + LFIRST=.TRUE. + LSTCEL=.FALSE. + DO 15 J=1,NUCELL(IY) + DO 10 I=1,NUCELL(IX) +*---- +* LOOP OVER THE CELLS IN THE PLAN PERPENDICULAR TO THE PROJECTION AXIS +*---- +* ---- +* CELL LEVEL (1) +* ---- + !write(*,*) 'CELL LEVEL (',I,J,' )' + DO K=1,NUCELL(IZ) + ICEL=IUNFLD(1,I,J,K,0) + ITRN=IUNFLD(2,I,J,K,0) + IF (ITRN.NE.IUNFLD(2,I,J,1,0)) + 1 CALL XABORT('NXT3T2: INVALID PRISMATIC GEOMETRY (TURN).') +* LOAD THE CONTENTS OF THE DIFFERENT CELLS (I,J,K=1,NUCELL(IZ)) + CALL NXTLDC(IPTRK,MAXMSH,ICEL,IDIRC(K),MESHC(1,K),NSURC(K), + 1 NREGC(K),NTPIN(K),DCMESH(-1,1,K),INDEX(1,-MXGSUR,K), + 2 IDREG(1,K),IDSUR(1,K),ITPIN(1,1,K),DRAPIN(-1,1,K)) + !write(*,*) 'loading cell',ICEL,MESHC(1,K),MESHC(2,K),MESHC(4,K) + IF (K.EQ.1) THEN + IF (CELID(ICEL).EQ.0) THEN +* RECOVER DIM INFO FOR THE CORRESPONDING 2D CELL + LSTCEL=.TRUE. + N2CEL=N2CEL+1 + WRITE(NAMCEL,'(A1,I8.8)') 'C',ICEL + !write(*,*) 'copying from ',NAMCEL + NAMREC=NAMCEL//'DIM' + ESTATE(:NSTATE)=0 + CALL LCMGET(IPTRK,NAMREC,ESTATE) + IF ((ESTATE(1).EQ.21).OR. + 1 (ESTATE(1).EQ.22).OR. + 2 (ESTATE(1).EQ.23)) THEN + ESTATE(1)=20 + ELSEIF(ESTATE(1).EQ.7) THEN + ESTATE(1)=5 + ENDIF + ESTATE(5)=0 + ESTATE(6)=0 + ESTATE(12)=N2REG+1 + ESTATE(14)=N2SUR+1 + CELID(ICEL)=N2CEL + ENDIF + IUNFLD(1,I,J,1,1)=CELID(ICEL) + IUNFLD(2,I,J,1,1)=ITRN + ENDIF + ENDDO +* CHECK CELLS COMPATIBILITY, UPDATE IND2T3 FOR THIS SET OF CELLS +* AND FILL-IN 2D CORRESPONDING CELL CONTENTS + NTPINR=NTPIN(1) + DO K=2,NUCELL(IZ) + IF (NTPIN(K).NE.NTPINR) + 1 CALL XABORT('NXT3T2: INVALID PRISMATIC GEOMETRY (NTPIN).') + ENDDO + CALL NXTPRI(IPTRK,JPTRK,IX,IY,IZ,NFREG,NFSUR,MAXMSH,NUCELL,MXGSUR, + 1 MXGREG,INDEX,IDSUR,IDREG,MESHC,NSURC,NREGC,IDIRC,NZP,N2REG, + 2 N2SUR,IND2T3,REGI,DEPS,DCMESH,ZCORD,LFIRST,LSTCEL,1, + 3 IUNFLD(1,I,J,1,0),N2CEL,N2SURC,N2REGC) + IF (LSTCEL) THEN +* STORE 2D CELL CONTENTS: DIM ARRAY + ESTATE(10)=N2REGC + ESTATE(11)=N2SURC + ESTATE(13)=N2REG + ESTATE(15)=N2SUR + !write(*,*) ESTATE(1),ESTATE(2) + WRITE(NAMCE2,'(A1,I8.8)') 'C',N2CEL + NAMREC=NAMCE2//'DIM' + CALL LCMPUT(JPTRK,NAMREC,NSTATE,1,ESTATE) + ENDIF +* ---- +* PIN LEVEL (2) +* ---- + PINID(:NTPINR)=0 + DO II=1,NTPINR + !write(*,*) 'PIN LEVEL ( ',II,')' +* LOAD THE CONTENTS OF THE DIFFERENT PINS (II,K=1,NUCELL(IZ)) + IDIRC(1)=ABS(ITPIN(3,II,1)) + IPIN=ITPIN(2,II,1) + HPIN=DRAPIN(IZ,II,1) + DELZ=DCMESH(MESHC(IZ,1),IZ,1)-DCMESH(0,IZ,1) + IF (.NOT.XDDCOM(DELZ,HPIN,DEPS)) + 1 CALL XABORT('NXT3T2: INVALID PRISMATIC GEOMETRY (HPIN).') + CALL NXTLDP(IPTRK,MAXMSH,IPIN,MESHC(1,1),NSURC(1),NREGC(1), + 1 DCMESH(-1,1,1),INDEX(1,-MXGSUR,1),IDREG(1,1),IDSUR(1,1)) + APIN=DRAPIN(-1,II,1) + RPIN=DRAPIN( 0,II,1) + RADP=DRAPIN( 4,II,1) + LSTPIN=.FALSE. + IF (PINID(IPIN).EQ.0) THEN +* RECOVER DIM INFO FOR THE CORRESPONDING 2D PIN + LSTPIN=.TRUE. + N2PIN=N2PIN+1 + WRITE(NAMCEL,'(A1,I8.8)') 'P',IPIN + !write(*,*) 'copying from ',NAMCEL + NAMREC=NAMCEL//'DIM' + ESTATE(:NSTATE)=0 + CALL LCMGET(IPTRK,NAMREC,ESTATE) + IF ((ESTATE(1).EQ.6).OR. + 1 (ESTATE(1).EQ.10).OR. + 2 (ESTATE(1).EQ.11)) THEN + ESTATE(1)=3 + ENDIF + ESTATE(5)=0 + ESTATE(6)=0 + ESTATE(12)=N2REG+1 + ESTATE(14)=N2SUR+1 + PINID(IPIN)=N2PIN + ENDIF + ITPIN(1,II,0)=ITPIN(1,II,1) + ITPIN(2,II,0)=PINID(IPIN) + ITPIN(3,II,0)=3 + DRAPIN(-1,II,0)=APIN + DRAPIN( 0,II,0)=RPIN + DRAPIN( 1,II,0)=0.D0 + DRAPIN( 2,II,0)=0.D0 + DRAPIN( 3,II,0)=1.D0 + DRAPIN( 4,II,0)=RADP + DO K=2,NUCELL(IZ) + DO JJ=1,NTPINR + LPIN=.TRUE. + LPIN=LPIN.AND.(XDDCOM(HPIN,DRAPIN(IZ,JJ,K),DEPS)) + LPIN=LPIN.AND.(XDDCOM(APIN,DRAPIN(-1,JJ,K),DEPS)) + LPIN=LPIN.AND.(XDDCOM(RPIN,DRAPIN( 0,JJ,K),DEPS)) + LPIN=LPIN.AND.(XDDCOM(RADP,DRAPIN( 4,JJ,K),DEPS)) + IF (LPIN) THEN + IPIN=ITPIN(2,JJ,K) + IDIRC(K)=ABS(ITPIN(3,JJ,K)) + GOTO 20 + ENDIF + ENDDO + CALL XABORT('NXT3T2: INVALID PRISMATIC GEOMETRY (PIN).') + 20 CONTINUE + CALL NXTLDP(IPTRK,MAXMSH,IPIN,MESHC(1,K),NSURC(K),NREGC(K), + 1 DCMESH(-1,1,K),INDEX(1,-MXGSUR,K),IDREG(1,K), + 2 IDSUR(1,K)) + ENDDO +* CHECK PINS COMPATIBILITY AND UPDATE IND2T3 FOR THIS SET OF PINS + CALL NXTPRI(IPTRK,JPTRK,IX,IY,IZ,NFREG,NFSUR,MAXMSH,NUCELL, + 1 MXGSUR,MXGREG,INDEX,IDSUR,IDREG,MESHC,NSURC,NREGC,IDIRC, + 2 NZP,N2REG,N2SUR,IND2T3,REGI,DEPS,DCMESH,ZCORD,LFIRST, + 3 LSTPIN,2,ITPIN(2,II,1),N2PIN,N2SURP,N2REGP) + IF (LSTPIN) THEN +* STORE 2D PIN CONTENTS: DIM ARRAY + ESTATE(10)=N2REGP + ESTATE(11)=N2SURP + ESTATE(13)=N2REG + ESTATE(15)=N2SUR + WRITE(NAMCE2,'(A1,I8.8)') 'P',N2PIN + NAMREC=NAMCE2//'DIM' + CALL LCMPUT(JPTRK,NAMREC,NSTATE,1,ESTATE) + ENDIF + ENDDO + IF (LSTCEL) THEN +* STORE 2D CELL CONTENTS: PIN RELATED + IF (NTPINR.GT.0) THEN + WRITE(NAMCE2,'(A1,I8.8)') 'C',N2CEL + NAMREC=NAMCE2//'PIN' + CALL LCMPUT(JPTRK,NAMREC,6*NTPINR,4,DRAPIN(-1,1,0)) + NAMREC=NAMCE2//'PNT' + CALL LCMPUT(JPTRK,NAMREC,3*NTPINR,1,ITPIN(1,1,0)) + ENDIF + ENDIF + LSTCEL=.FALSE. + LFIRST=.FALSE. +*---- + 10 CONTINUE + 15 CONTINUE + N2SUR=-N2SUR +*---- +* FILL IN AND STORE MATALB AND SareaRvolume ARRAYS FOR THE 2D GEOMETRY +*---- + DELZ=ZCORD(1) + DO I=-N2SUR,N2REG + MATALB2(I)=MATALB(IND2T3(I,1)) + SURVOL2(I)=SURVOL(IND2T3(I,1))/DELZ + ENDDO + NUNK2=N2SUR+N2REG+1 + CALL LCMPUT(JPTRK,'MATALB ',NUNK2,1,MATALB2(-N2SUR)) + CALL LCMPUT(JPTRK,'SAreaRvolume',NUNK2,4,SURVOL2(-N2SUR)) +*---- +* Scratch storage deallocation +*---- + DEALLOCATE(PINID,CELID,REGI,DRAPIN,DCMESH) + DEALLOCATE(ITPIN,NTPIN,IDIRC,NREGC,NSURC,MESHC,IDREG,IDSUR,INDEX) + RETURN + END |
