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/AXGSYM.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/AXGSYM.f')
| -rw-r--r-- | Dragon/src/AXGSYM.f | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/Dragon/src/AXGSYM.f b/Dragon/src/AXGSYM.f new file mode 100644 index 0000000..3c82225 --- /dev/null +++ b/Dragon/src/AXGSYM.f @@ -0,0 +1,298 @@ +*DECK AXGSYM + SUBROUTINE AXGSYM( IPGEOM, IPRT, NBLOCK, NTYPO, NXYZ, + > GEONAM, LCLSYM, MINGRI, MAXGRI, CELLT, + > KEYTYP, ITGEOM) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Unfold assembly or cell according to center cell symmetry in +* $x$, $y$ or $z$ and verify if the symmetry is valid. +* +*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): G. Marleau +* +*Parameters: input +* IPGEOM pointer to the reference geometry data structure. +* IPRT intermediate printing level for output. +* NBLOCK number of block in geometry. +* NTYPO number of types in geometry. +* NXYZ maximum mesh size in directions $x$, $y$ and $z$. +* GEONAM name of the reference geometry. +* LCLSYM flag that is set to 1 when the $x$ (LCLSYM(1)), +* $y$ (LCLSYM(2)) and/or $z$ (LCLSYM(3)) +* symmetries are required. +* MINGRI minimum grid cell in $x$, $y$ and $z$ directions. +* MAXGRI maximum grid cell in $x$, $y$ and $z$ directions. +* CELLT cell type name. +* +*Parameters: input/output +* KEYTYP type key for each block. +* ITGEOM turn key associated with each cell type. +* +*External functions +* LELCSY to verify if a geometry possesses the required internal +* symmetry. +* AXGTRS to modify current turn according to required internal +* symmetry. +* AXGTRN to associate a DRAGON turn name to a specific turn key. +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPGEOM + INTEGER IPRT,NBLOCK,NTYPO,NXYZ + CHARACTER GEONAM*12 + INTEGER LCLSYM(3) + INTEGER MINGRI(3),MAXGRI(3),CELLT(3*NTYPO) + INTEGER KEYTYP(NBLOCK),ITGEOM(NBLOCK) +*---- +* EXTERNAL FUNCTIONS +*---- + LOGICAL LELCSY + INTEGER AXGTRS + CHARACTER AXGTRN*2 +*---- +* LOCAL VARIABLES +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='AXGSYM') +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: ISPLT,ISPLT1 + REAL, ALLOCATABLE, DIMENSION(:) :: MESH,MESH1 +*---- +* LOCAL PARAMETERS +*---- + INTEGER IX,IY,IZ,IOF1,IOF2 + INTEGER IKOF1,IKOF2,ITOF1,ITOF2 + INTEGER IKG,IKT(2) + LOGICAL VALSYM + CHARACTER GEOCV*12 +*---- +* SCRATCH STORAGE ALLOCATION +*---- + ALLOCATE(ISPLT(NXYZ),ISPLT1(3*3*NXYZ)) + ALLOCATE(MESH(NXYZ+1),MESH1(2*3*3*(NXYZ+1))) +*---- +* APPLY SYMMETRY IN Z +*---- + IF( LCLSYM(3) .NE. 0) THEN + IF(IPRT .GT. 10) THEN + WRITE(IOUT,8000) NAMSBR,'Z-Z' + ENDIF + DO 200 IZ=1,MINGRI(3) + DO 210 IY=1,MAXGRI(2) + DO 220 IX=1,MAXGRI(1) + IOF1=((IZ-1)*MAXGRI(2)+(IY-1))*MAXGRI(1)+IX + IOF2=((MAXGRI(3)-IZ)*MAXGRI(2)+(IY-1))*MAXGRI(1)+IX + IKOF1=KEYTYP(IOF1) + IKOF2=KEYTYP(IOF2) + ITOF1=ITGEOM(IOF1) + ITOF2=ITGEOM(IOF2) + IF(IPRT .GT. 10) THEN + WRITE(IOUT,8010) IZ,IY,IX, + > IOF1,IOF2,IKOF1,IKOF2,ITOF1,ITOF2 + ENDIF + IF( IKOF1 .NE. IKOF2) THEN + IF( IKOF1 .GT. IKOF2) THEN + IKOF2= IKOF1 + ITOF2= AXGTRS(ITOF1,4) + KEYTYP(IOF2)= IKOF2 + ITGEOM(IOF2)= ITOF2 + ELSE + IKOF1= IKOF2 + ITOF1= AXGTRS(ITOF2,4) + KEYTYP(IOF1)= IKOF1 + ITGEOM(IOF1)= ITOF1 + ENDIF + ENDIF + IF(IKOF1 .GT. 0) THEN + IF(IZ .EQ. (MAXGRI(3)+1-IZ)) THEN + IKG=IKOF1 + IKT(1)=ITOF1 + IKT(2)=AXGTRS(IKT(1),4) + IF(IKG .GT. 0) THEN + WRITE(GEOCV,'(3A4)') + > CELLT(3*IKG-2),CELLT(3*IKG-1),CELLT(3*IKG) + IF(GEOCV .EQ. ' ') THEN + IF(IPRT .GT. 10) WRITE(IOUT,8001) + > GEONAM,AXGTRN(IKT(1)),AXGTRN(IKT(2)) + ELSE + IF(IPRT .GT. 10) WRITE(IOUT,8001) + > GEOCV,AXGTRN(IKT(1)),AXGTRN(IKT(2)) + ENDIF + VALSYM=LELCSY(IPGEOM,IPRT,GEONAM,GEOCV,NXYZ,IKT, + > MESH,ISPLT,MESH1,ISPLT1) + IF(.NOT. VALSYM) THEN + WRITE(IOUT,8002) 'Z-Z',GEOCV, + > AXGTRN(IKT(1)),AXGTRN(IKT(2)) + CALL XABORT(NAMSBR// + > ': INVALID Z SYMMETRY FOR CELL') + ENDIF + ENDIF + ENDIF + ENDIF + 220 CONTINUE + 210 CONTINUE + 200 CONTINUE + ENDIF +*---- +* APPLY SYMMETRY IN Y +*---- + IF( LCLSYM(2).NE.0)THEN + IF(IPRT .GT. 10) THEN + WRITE(IOUT,8000) NAMSBR,'Y-Y' + ENDIF + DO 300 IZ=1,MAXGRI(3) + DO 310 IY=1,MINGRI(2) + DO 320 IX=1,MAXGRI(1) + IOF1=((IZ-1)*MAXGRI(2)+(IY-1))*MAXGRI(1)+IX + IOF2=((IZ-1)*MAXGRI(2)+(MAXGRI(2)-IY))*MAXGRI(1)+IX + IKOF1=KEYTYP(IOF1) + IKOF2=KEYTYP(IOF2) + ITOF1=ITGEOM(IOF1) + ITOF2=ITGEOM(IOF2) + IF(IPRT .GT. 10) THEN + WRITE(IOUT,8010) IZ,IY,IX, + > IOF1,IOF2,IKOF1,IKOF2,ITOF1,ITOF2 + ENDIF + IF( IKOF1 .NE. IKOF2) THEN + IF( IKOF1 .GT. IKOF2) THEN + IKOF2= IKOF1 + ITOF2= AXGTRS(ITOF1,2) + KEYTYP(IOF2)= IKOF2 + ITGEOM(IOF2)= ITOF2 + ELSE + IKOF1= IKOF2 + ITOF1= AXGTRS(ITOF2,2) + KEYTYP(IOF1)= IKOF1 + ITGEOM(IOF1)= ITOF1 + ENDIF + ENDIF + IF(IKOF1 .GT. 0) THEN + IF(IY .EQ. (MAXGRI(2)+1-IY) ) THEN + IKG=IKOF1 + IKT(1)=ITOF1 + IKT(2)=AXGTRS(IKT(1),2) + IF(IKG .GT. 0) THEN + WRITE(GEOCV,'(3A4)') + > CELLT(3*IKG-2),CELLT(3*IKG-1),CELLT(3*IKG) + IF(GEOCV .EQ. ' ') THEN + IF(IPRT .GT. 10) WRITE(IOUT,8001) + > GEONAM,AXGTRN(IKT(1)),AXGTRN(IKT(2)) + ELSE + IF(IPRT .GT. 10) WRITE(IOUT,8001) + > GEOCV,AXGTRN(IKT(1)),AXGTRN(IKT(2)) + ENDIF + VALSYM=LELCSY(IPGEOM,IPRT,GEONAM,GEOCV,NXYZ,IKT, + > MESH,ISPLT,MESH1,ISPLT1) + IF(.NOT. VALSYM) THEN + WRITE(IOUT,8002) 'Y-Y',GEOCV, + > AXGTRN(IKT(1)),AXGTRN(IKT(2)) + CALL XABORT(NAMSBR// + > ': INVALID Y SYMMETRY FOR CELL') + ENDIF + ENDIF + ENDIF + ENDIF + 320 CONTINUE + 310 CONTINUE + 300 CONTINUE + ENDIF +*---- +* APPLY SYMMETRY IN X +*---- + IF( LCLSYM(1).NE.0)THEN + IF(IPRT .GT. 10) THEN + WRITE(IOUT,8000) NAMSBR,'X-X' + ENDIF + DO 400 IZ=1,MAXGRI(3) + DO 410 IY=1,MAXGRI(2) + DO 420 IX=1,MINGRI(1) + IOF1=((IZ-1)*MAXGRI(2)+(IY-1))*MAXGRI(1)+IX + IOF2=((IZ-1)*MAXGRI(2)+(IY-1))*MAXGRI(1)+MAXGRI(1)+1-IX + IKOF1=KEYTYP(IOF1) + IKOF2=KEYTYP(IOF2) + ITOF1=ITGEOM(IOF1) + ITOF2=ITGEOM(IOF2) + IF(IPRT .GT. 10) THEN + WRITE(IOUT,8010) IZ,IY,IX, + > IOF1,IOF2,IKOF1,IKOF2,ITOF1,ITOF2 + ENDIF + IF( IKOF1 .NE. IKOF2) THEN + IF( IKOF1 .GT. IKOF2) THEN + IKOF2= IKOF1 + ITOF2= AXGTRS(ITOF1,1) + KEYTYP(IOF2)= IKOF2 + ITGEOM(IOF2)= ITOF2 + ELSE + IKOF1= IKOF2 + ITOF1= AXGTRS(ITOF2,1) + KEYTYP(IOF1)= IKOF1 + ITGEOM(IOF1)= ITOF1 + ENDIF + ENDIF + IF(IKOF1 .GT. 0) THEN + IF(IX .EQ. (MAXGRI(1)+1-IX)) THEN + IKG=IKOF1 + IKT(1)=ITOF1 + IKT(2)=AXGTRS(IKT(1),1) + IF(IKG .GT. 0) THEN + WRITE(GEOCV,'(3A4)') + > CELLT(3*IKG-2),CELLT(3*IKG-1),CELLT(3*IKG) + IF(GEOCV .EQ. ' ') THEN + IF(IPRT .GT. 10) WRITE(IOUT,8001) + > GEONAM,AXGTRN(IKT(1)),AXGTRN(IKT(2)) + ELSE + IF(IPRT .GT. 10) WRITE(IOUT,8001) + > GEOCV,AXGTRN(IKT(1)),AXGTRN(IKT(2)) + ENDIF + VALSYM=LELCSY(IPGEOM,IPRT,GEONAM,GEOCV,NXYZ,IKT, + > MESH,ISPLT,MESH1,ISPLT1) + IF(.NOT. VALSYM) THEN + WRITE(IOUT,8002) 'X-X',GEOCV, + > AXGTRN(IKT(1)),AXGTRN(IKT(2)) + CALL XABORT(NAMSBR// + > ': INVALID X SYMMETRY FOR CELL') + ENDIF + ENDIF + ENDIF + ENDIF + 420 CONTINUE + 410 CONTINUE + 400 CONTINUE + ENDIF +*---- +* SCRATCH STORAGE DEALLOCATION +*---- + DEALLOCATE(MESH1,MESH) + DEALLOCATE(ISPLT1,ISPLT) +*---- +* RETURN +*---- + RETURN +*---- +* FORMAT +*---- + 8000 FORMAT(1X,A6,' NOW TESTING SYMMETRY ',A3) + 8001 FORMAT(7X,A12,1X,'WITH ROTATION',1X,A2,' AND ',A2) + 8002 FORMAT(' INVALID SYMMETRY ',A3,' FOR ', + > A12,1X,'WITH ROTATION',1X,A2,' AND ',A2) + 8010 FORMAT(1X,'IZ=',I6,1X,'IY=',I6,1X,'IX=',I6/ + > 1X,'IOF1 =',I6,1X,'IOF2 =',I6, + > 1X,'KOF1 =',I6,1X,'KOF2 =',I6, + > 1X,'TOF1 =',I6,1X,'TOF2 =',I6) + END |
