diff options
Diffstat (limited to 'Dragon/src/NXTBCG.f')
| -rw-r--r-- | Dragon/src/NXTBCG.f | 386 |
1 files changed, 386 insertions, 0 deletions
diff --git a/Dragon/src/NXTBCG.f b/Dragon/src/NXTBCG.f new file mode 100644 index 0000000..eab77e3 --- /dev/null +++ b/Dragon/src/NXTBCG.f @@ -0,0 +1,386 @@ +*DECK NXTBCG + SUBROUTINE NXTBCG(IPGEO ,IPTRK ,IPRINT,NDIM ,ITYPBC,IDIRG , + > IDIAG ,ISAXIS,IHSYM ,ILEAK ,IPRISM ) +* +*---------- +* +*Purpose: +* To read boundary conditions and symmetries and verify +* if information is consistent. Also prepare axis for +* symmetry identification. +* +*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): +* G. Marleau. +* +*Parameters: input +* IPGEO pointer to the GEOMETRY data structure. +* IPTRK pointer to the TRACKING data structure in +* update or creation mode. +* IPRINT print level. +* NDIM problem dimensions. +* ITYPBC type of boundary conditions where: +* =0 for geometry with Cartesian +* boundaries; +* =1 for geometry with annular +* boundary; +* =2 for geometry with hexagonal +* boundary; +* IDIRG geometry main direction: +* =1 for $X-Y-Z$ geometry; +* =2 for $Y-Z-X$ geometry; +* =3 for $Z-X-Y$ geometry. +* IPRISM projection axis for prismatic tracking. +* +*Parameters: output +* IDIAG the diagonal symmetry flag where: +* =-1 indicates X- DIAG symmetry; +* = 1 indicates X+ Y- DIAG symmetry; +* = 0 indicates no DIAG symmetry. +* ISAXIS symmetry vector for each direction. +* IHSYM hexagonal symmetry option where: +* = 0 geometry is not hexagonal; +* = 1 for S30; +* = 2 for SA60; +* = 3 for SB60; +* = 4 for S90; +* = 5 for R120; +* = 6 for R180; +* = 7 for SA180; +* = 8 for SB180; +* = 9 for COMPLETE; +* =10 for R60. +* ILEAK leakage option where: +* =1 indicates that there is no out of cell leakage; +* =0 indicates that there no out of cell leakage. +* +*Reference: +* G. Marleau, +* New Geometries Processing in DRAGON: The NXT: Module, +* Report IGE-260, Polytechnique Montreal, +* Montreal, 2005. +* +*---------- +* + USE GANLIB + IMPLICIT NONE +*---- +* Subroutine arguments +*---- + TYPE(C_PTR) IPGEO,IPTRK + INTEGER IPRINT,NDIM,ITYPBC,IDIRG + INTEGER IDIAG,ISAXIS(3),IHSYM,ILEAK,IPRISM +*---- +* Local parameters +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='NXTBCG') + INTEGER MAXDIM,NGBC + PARAMETER (MAXDIM=3,NGBC=6) +*---- +* Local variables +*---- + INTEGER IDIRP,IT3,ISUR,IDIR,ISCOMP + INTEGER ICODE(NGBC),NCODE(NGBC),JCODE(NGBC) + REAL ZCODE(NGBC) + INTEGER IVBC(NGBC),MRGSUR(NGBC) +*---- +* Data +*---- + CHARACTER CDIR(MAXDIM)*1 + SAVE CDIR + DATA CDIR /'X','Y','Z'/ +*---- +* Processing starts: +* print routine opening header if required +* and initialize various parameters. +*---- + IF(IPRINT .GE. 10) THEN + WRITE(IOUT,6000) NAMSBR + ENDIF + IHSYM=0 +*---- +* Read boundary conditions from geometry +*---- + DO ISUR=1,NGBC + ICODE(ISUR)=-ISUR + ENDDO + CALL LCMGET(IPGEO ,'ICODE',JCODE) + CALL LCMGET(IPGEO ,'NCODE',NCODE) + IF (IPRISM.NE.0) THEN +* special case of a prismatic tracking: +* the geometry is not unfolded for the symmetries along the projection axis + CALL LCMPUT(IPTRK,'NCODE',6,1,NCODE) + DO IDIRG=1,2 + IF ((NCODE(2*(IPRISM-1)+IDIRG).EQ.5).OR. + 1 (NCODE(2*(IPRISM-1)+IDIRG).EQ.10)) THEN + NCODE(2*(IPRISM-1)+IDIRG)=2 + ENDIF + ENDDO + ENDIF + CALL LCMGET(IPGEO ,'ZCODE',ZCODE) +*---- +* Validate boundary conditions to process +*---- + IDIRP=MOD(IDIRG+1,3)+1 + IT3=NDIM/3 + IF(ITYPBC .EQ. 0) THEN + DO ISUR=1,4 + IVBC(ISUR)=1 + MRGSUR( ISUR)=ISUR + ENDDO + DO ISUR=5,NGBC + IVBC(ISUR)=IT3 + MRGSUR( ISUR)=ISUR + ENDDO + ELSE IF(ITYPBC .EQ. 1) THEN + DO ISUR=1,NGBC + IVBC(ISUR)=0 + ENDDO + IF(IDIRG .EQ. 1) THEN + IVBC(2)=1 + IF(NDIM .EQ. 3) THEN + IVBC(5)=1 + IVBC(6)=1 + ENDIF + ELSE IF(IDIRG .EQ. 2) THEN + IVBC(4)=1 + IF(NDIM .EQ. 3) THEN + IVBC(1)=1 + IVBC(2)=1 + ENDIF + ELSE IF(IDIRG .EQ. 3) THEN + IVBC(6)=1 + IF(NDIM .EQ. 3) THEN + IVBC(3)=1 + IVBC(4)=1 + ENDIF + ENDIF + ELSE IF(ITYPBC .EQ. 2) THEN + CALL LCMGET(IPGEO ,'IHEX',IHSYM) + IF(IHSYM .NE. 9) CALL XABORT(NAMSBR//': only COMPLETE '// + > ' hexagonal symmetry option programed in NXT:.') + DO ISUR=1,NGBC + IVBC(ISUR)=0 + ENDDO + IVBC(1)=1 + IF(NDIM .EQ. 3) THEN + IVBC(5)=1 + IVBC(6)=1 + ENDIF + ENDIF + DO ISUR=1,NGBC + MRGSUR(ISUR)=ISUR + ENDDO +*---- +* Find pairs of diagonal and translation B.C. +*---- + IDIAG=0 + ISCOMP=0 + DO ISUR=1,NGBC + IF(IVBC(ISUR) .EQ. 1) THEN + IF(JCODE(ISUR) .NE. 0 ) THEN + ICODE(ISUR)=JCODE(ISUR) + ZCODE(ISUR)= 1.0 + ELSE IF(NCODE(ISUR) .EQ. 0) THEN + CALL XABORT(NAMSBR// + > ': A boundary condition is missing.') + ENDIF + IF(NCODE(ISUR) .EQ. 2) THEN + ZCODE(ISUR)= 1.0 + ELSE IF(NCODE(ISUR) .EQ. 3) THEN + IDIAG=IDIAG+1 + ELSE IF(NCODE(ISUR) .EQ. 4)THEN + ISCOMP=ISCOMP+1 + ZCODE(ISUR)=1.0 + ELSE IF(NCODE(ISUR) .EQ. 6 ) THEN + NCODE(ISUR)= 1 + ELSE IF(NCODE(ISUR) .EQ. 7 .OR. + > NCODE(ISUR) .EQ. 8 .OR. + > NCODE(ISUR) .EQ. 9 .OR. + > NCODE(ISUR) .GE. 11 ) THEN + CALL XABORT(NAMSBR// + > ': An invalid boundary condition detected.') + ENDIF + ENDIF + ENDDO +*---- +* Analyse DIAG boundary conditions +* Only X+ DIAG Y- DIAG or X- DIAG Y+ DIAG permitted +*---- + IF(IDIAG .GT. 0) THEN + IF(ITYPBC .NE. 0) CALL XABORT(NAMSBR// + > ': DIAG BC permitted only for Cartesian geometries') + IF(IDIAG .NE. 2) CALL XABORT(NAMSBR// + > ': Only one pair of DIAG boundary conditions permitted') + IF((NCODE(2) .EQ. 3) .AND. (NCODE(3) .EQ. 3)) THEN + MRGSUR(2)= 4 + MRGSUR(3)= 1 + NCODE(2)= NCODE(4) + NCODE(3)= NCODE(1) + ICODE(2)= ICODE(4) + ICODE(3)= ICODE(1) + ZCODE(2)= ZCODE(4) + ZCODE(3)= ZCODE(1) + IDIAG=1 + ELSE IF((NCODE(1) .EQ. 3) .AND. (NCODE(4) .EQ. 3)) THEN + MRGSUR(1)= 3 + MRGSUR(4)= 2 + NCODE(1)= NCODE(3) + NCODE(4)= NCODE(2) + ICODE(1)= ICODE(3) + ICODE(4)= ICODE(2) + ZCODE(1)= ZCODE(3) + ZCODE(4)= ZCODE(2) + IDIAG=-1 + ELSE + CALL XABORT(NAMSBR// + > ': Only (X+ DIAG Y- DIAG) or (X- DIAG Y+ DIAG) permitted') + ENDIF + ENDIF +*---- +* Analyse TRAN boundary conditions +* Only X- TRAN X+ TRAN, Y- TRAN Y+ TRAN and +* Z- TRAN Z+ TRAN permitted +*---- + DO IDIR=1,MAXDIM + ISAXIS(IDIR)=0 + ENDDO + IF(ISCOMP .GT. 0) THEN + IF(ITYPBC .NE. 0) CALL XABORT(NAMSBR// + > ': TRAN BC permitted only for Cartesian geometries') + IF(MOD(ISCOMP,2) .EQ. 1) CALL XABORT(NAMSBR// + > ': TRAN boundary conditions must come in pairs') + DO IDIR=1,MAXDIM + ISUR=2*IDIR + IF(IVBC(ISUR) .EQ. 1) THEN + IF(NCODE(ISUR) .EQ. 4 .AND. NCODE(ISUR-1) .EQ. 4) THEN + MRGSUR(ISUR )=ISUR-1 + MRGSUR(ISUR-1)=ISUR + ISCOMP=ISCOMP-2 + ISAXIS(IDIR)=3 + ENDIF + ENDIF + ENDDO + IF(ISCOMP .NE. 0) CALL XABORT(NAMSBR// + > ': Illegal pairing of TRAN boundary conditions') + ENDIF +*---- +* Analyse SYME and SSYM boundary conditions +*---- + DO ISUR=1,NGBC + IF(IVBC(ISUR) .EQ. 1) THEN + IDIR=(ISUR+1)/2 + IF(NCODE(ISUR) .EQ. 5)THEN + IF(MOD(ISUR,2) .EQ. 0) THEN + ISCOMP=ISUR-1 + ISAXIS(IDIR)=1 + ELSE + ISCOMP=ISUR+1 + ISAXIS(IDIR)=-1 + ENDIF + IF(NCODE(ISCOMP) .NE. 1 .AND. NCODE(ISCOMP) .NE. 2 .AND. + > NCODE(ISCOMP) .NE. 6) CALL XABORT(NAMSBR// + > ': Invalid combination for SYME or SSYM symmetry') + MRGSUR(ISUR)=ISCOMP + ZCODE(ISUR)=ZCODE(ISCOMP) + ICODE(ISUR)=ICODE(ISCOMP) + NCODE(ISUR)=NCODE(ISCOMP) + ELSE IF(NCODE(ISUR) .EQ. 10)THEN + IF(MOD(ISUR,2) .EQ. 0) THEN + ISCOMP=ISUR-1 + ISAXIS(IDIR)=2 + ELSE + ISCOMP=ISUR+1 + ISAXIS(IDIR)=-2 + ENDIF + IF(NCODE(ISCOMP) .NE. 1 .AND. NCODE(ISCOMP) .NE. 2 .AND. + > NCODE(ISCOMP) .NE. 6) CALL XABORT(NAMSBR// + > ': Invalid combination for SYME or SSYM symmetry') + MRGSUR(ISUR)=ISCOMP + ZCODE(ISUR)=ZCODE(ISCOMP) + ICODE(ISUR)=ICODE(ISCOMP) + NCODE(ISUR)=NCODE(ISCOMP) + ENDIF + ENDIF + ENDDO + ILEAK=1 + DO ISUR=1,NGBC + IF(IVBC(ISUR) .EQ. 1) THEN + IF(ICODE(ISUR) .GT. 0) THEN + ILEAK=0 + ELSE IF(ZCODE(ISUR) .NE. 1.0) THEN + ILEAK=0 + ENDIF + ENDIF + ENDDO +*---- +* For combined DIAG/SYME symmetry +* complete set of symmetry available +* X/Y SYME -> Y/X SYME +*---- +* IF(IDIAG .EQ. -1) THEN +* IF(ISAXIS(2) .EQ. -1) THEN +* ISAXIS(1)=1 +* ELSE IF(ISAXIS(1) .EQ. 1) THEN +* ISAXIS(2)=-1 +* ENDIF +* ELSE IF(IDIAG .EQ. 1) THEN +* IF(ISAXIS(2) .EQ. 1) THEN +* ISAXIS(1)=-1 +* ELSE IF(ISAXIS(1) .EQ. -1) THEN +* ISAXIS(2)=1 +* ENDIF +* ENDIF +*---- +* Save boundary conditions on tracking +*---- + CALL LCMPUT(IPTRK ,'ALBEDO ',NGBC,2,ZCODE) + CALL LCMPUT(IPTRK ,'ICODE ',NGBC,1,ICODE) +*---- +* Processing finished: +* print routine closing header if required +* and return +*---- + IF(IPRINT .GE. 10) THEN + IF(IDIAG .EQ. 1) THEN + WRITE(IOUT,6010) '(X+, Y-)' + ELSE IF(IDIAG .EQ. -1) THEN + WRITE(IOUT,6010) '(X+, Y-)' + ENDIF + DO ISUR=1,3 + IF(ISAXIS(ISUR) .EQ. -2) THEN + WRITE(IOUT,6011) 'SSYM',CDIR(ISUR),'-' + ELSE IF(ISAXIS(ISUR) .EQ. -1) THEN + WRITE(IOUT,6011) 'SYME',CDIR(ISUR),'-' + ELSE IF(ISAXIS(ISUR) .EQ. 1) THEN + WRITE(IOUT,6011) 'SYME',CDIR(ISUR),'+' + ELSE IF(ISAXIS(ISUR) .EQ. 2) THEN + WRITE(IOUT,6011) 'SSYM',CDIR(ISUR),'+' + ELSE IF(ISAXIS(ISUR) .EQ. 3) THEN + WRITE(IOUT,6011) 'TRAN',CDIR(ISUR),' ' + ENDIF + ENDDO + DO ISUR=1,NGBC + WRITE(IOUT,6012) ISUR,ICODE(ISUR),NCODE(ISUR),IVBC(ISUR), + > MRGSUR(ISUR),ZCODE(ISUR) + ENDDO + WRITE(IOUT,6001) NAMSBR + ENDIF + RETURN +*---- +* Output formats +*---- + 6000 FORMAT('(* Output from --',A6,'-- follows ') + 6001 FORMAT(' Output from --',A6,'-- completed *)') + 6010 FORMAT('Diagonal symmetry : ',A8) + 6011 FORMAT('Symmetry : ',A4,1X,'on surface ',2A1) + 6012 FORMAT('BC[[',I10,']]={',4(I5,','),F20.10,'}') + END |
