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/XELBIN.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/XELBIN.f')
| -rw-r--r-- | Dragon/src/XELBIN.f | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/Dragon/src/XELBIN.f b/Dragon/src/XELBIN.f new file mode 100644 index 0000000..f84be2f --- /dev/null +++ b/Dragon/src/XELBIN.f @@ -0,0 +1,457 @@ +*DECK XELBIN + SUBROUTINE XELBIN( IPGEOM, NDIM, NGEOME, L1CELL, NTYPES, NGIDL, + > NTIDL, NBLOCK, MAXGRI, NUNKO, IPRT, CELLG, + > NSURO, NVOLO, IDLGEO, MATGEO, KEYGEO, IDLTYP, + > IDLBLK, KEYTYP, MATTYP, KEYINT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Identify every zone of every type to its material and +* interface all internal surfaces for cells present in the supercell. +* +*Copyright: +* Copyright (C) 1987 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. Roy +* +*Parameters: input +* IPGEOM pointer to the geometry (l_geom). +* NDIM number of dimensions (2 or 3). +* NGEOME number of geometries. +* L1CELL .true. if only one cell. +* NTYPES number of types. +* NGIDL lenght of geometric numbering. +* NTIDL lenght of type numbering. +* NBLOCK number of blocks. +* MAXGRI number of cells along each axis. +* NUNKO old number of unknowns. +* IPRT intermediate printing level for output. +* CELLG to keep geometry names. +* NSURO number of surfaces of each geometry. +* NVOLO number of zones of each geometry. +* IDLGEO position of each geometry in the +* geometry numbering scheme. +* MATGEO material numbers corresponding to geometries. +* KEYGEO geometric key for each type. +* IDLTYP position of each type in numbering scheme. +* IDLBLK position of each block in numbering scheme. +* KEYTYP type key for each block. +* +*Parameters: output +* MATTYP material numbers for zones of every type. +* KEYINT interface key (giving the connected surface). +* +*----------------------------------------------------------------------- +* + USE GANLIB + IMPLICIT NONE +* + TYPE(C_PTR) IPGEOM + INTEGER NDIM, NGEOME, NTYPES, NGIDL, NTIDL, NBLOCK, + > NUNKO, IPRT + INTEGER NSURO(NGEOME), NVOLO(NGEOME), IDLGEO(NGEOME), + > MATGEO( NGIDL), KEYGEO(NTYPES), IDLTYP(NTYPES), + > MATTYP( NTIDL), KEYTYP(NBLOCK), IDLBLK(NBLOCK), + > KEYINT(NUNKO ), MAXGRI(NDIM) , CELLG(3*NTYPES) +* + INTEGER ILO(3,2), NO(2), KTYP(2), + > KMAT(2), KSUR(2), KABSO(2), KSID(2), + > ICOORD(3), NCODE(6) + CHARACTER GEOCEL*12, TEDATA*12, TEMESH(4)*7 + LOGICAL SWKILL, L1CELL, LL1, LL2 + INTEGER NSTATE, IOUT, MAXSPL + PARAMETER ( NSTATE=40, IOUT=6, MAXSPL=100 ) + INTEGER ISTATE(NSTATE),ISPLT(MAXSPL) + INTEGER NUMGEO, NUMTYP, NUMBLK, I, K + INTEGER NBMD + INTEGER IMYT, IUNK, ITYP, IMYG, IGEO, NSUX, NVOX, ICYL, + > ICX, ICY, ICZ, LR, LX, LY, LZ, KOLD, ITYPG, + > ISUR, IX, IY, IZ, IOFF, KNEW, ILEN, ITYLCM, + > ISX, ISY, ISZ, ISR, KIOFX, KIOFY, KIOFZ, + > J0, J1, J2, JC, JR, IP0, IP1, IP2, N, NP1, NP2, + > K0, K1, K2, K3, KR, IBLK, ISUX + EQUIVALENCE ( ICOORD(1),LX ),(ICOORD(2),LY),(ICOORD(3),LZ ) + DATA TEMESH / 'X', 'Y', 'Z', 'R'/ +* + NUMGEO(I,K)= I + IDLGEO(K) + NUMTYP(I,K)= I + IDLTYP(K) + NUMBLK(I,K)= I + IDLBLK(K) +* + SWKILL= .FALSE. + LL1= .FALSE. + LL2= .FALSE. + DO 10 IMYT= 1, NTIDL + MATTYP(IMYT)= 0 + 10 CONTINUE + DO 20 IUNK= 1, NUNKO + KEYINT(IUNK)= 0 + 20 CONTINUE + DO 40 ITYP= 1, NTYPES + IGEO = KEYGEO( ITYP ) + NVOX = NVOLO( IGEO ) + NSUX = NSURO( IGEO ) + IF( .NOT.L1CELL )THEN + WRITE(GEOCEL( 1: 4), '(A4)') CELLG(3*ITYP-2) + WRITE(GEOCEL( 5: 8), '(A4)') CELLG(3*ITYP-1) + WRITE(GEOCEL( 9:12), '(A4)') CELLG(3*ITYP ) + CALL LCMSIX(IPGEOM, GEOCEL, 1) + ELSE + CALL LCMGET(IPGEOM,'NCODE', NCODE) + LL1=((NCODE(2).EQ.3).AND.(NCODE(3).EQ.3)) + LL2=((NCODE(1).EQ.3).AND.(NCODE(4).EQ.3)) + ENDIF + ISTATE(:NSTATE)=0 + CALL LCMGET(IPGEOM,'STATE-VECTOR',ISTATE) + ITYPG= ISTATE(1) + IF( ITYPG.EQ.20) THEN +* FOR *CARCEL* GEOMETRIES + ICYL= 1 + ICX= 1 + ICY= 2 + ICZ= 3 + ELSEIF(ITYPG.EQ.3.OR.ITYPG.EQ.6 )THEN +* FOR *CARCEL*, *TUBE* OR *TUBEZ* GEOMETRIES + ICYL= 1 + ICX= 1 + ICY= 2 + ICZ= 3 + IF( LL1.OR.LL2 )THEN + CALL XABORT( 'XELBIN: DIAGONAL SYMETRIES NOT POSSIBLE') + ENDIF + ELSEIF( ITYPG.GT.20 )THEN +* FOR *CARCELX*, *CARCELY* OR *CARCELZ* + ICYL= 1 + ICZ= ITYPG-20 + ICX= MOD(ICZ , 3) + 1 + ICY= MOD(ICZ+1, 3) + 1 + ELSE +* FOR *CAR2D* OR *CAR3D* + ICYL= 0 + ICX= 1 + ICY= 2 + ICZ= 3 + ENDIF + LR= ISTATE(2) + LX= MAX(1,ISTATE(3)) + LY= MAX(1,ISTATE(4)) + LZ= MAX(1,ISTATE(5)) + KOLD= ISTATE(6) + DO 30 ISUR= NSUX, -1 + MATTYP(NUMTYP(ISUR,ITYP))= MATGEO(NUMGEO(ISUR,IGEO)) + 30 CONTINUE +* +* GET MIXTURE NUMBERS + CALL LCMLEN(IPGEOM, 'MIX', ILEN, ITYLCM) + IF( ILEN.NE.KOLD )THEN + WRITE(IOUT,*) 'LENGHT(MIX)= ',ILEN + WRITE(IOUT,*) '# OF VOLUMES= ',KOLD + CALL LCMLIB(IPGEOM) + CALL XABORT( 'XELBIN: INVALID NUMBER OF MIXTURES') + ENDIF + CALL LCMGET(IPGEOM,'MIX',MATTYP(NUMTYP(1,ITYP))) +* +* IN THE CASE OF DIAGONAL SYMMETRY IN 'ONE-CELL' +* CAR2D AND CAR3D GEOMETRY UNFOLD MIXTURES +* + IF(ITYPG .LT. 20) THEN + K3=ISTATE(6) + NBMD=(LZ*LY*(LX+1))/2 + IF(K3 .EQ. NBMD) THEN +*---- +* MIXTURE ENTERED IN DIAGONAL FORM +*---- + IF( LL1 )THEN + DO 72 IZ=LZ,1,-1 + IOFF=(IZ-1)*LX*LY + DO 71 IY=LY,1,-1 + DO 60 IX=LX,IY+1,-1 + MATTYP(NUMTYP(IOFF+(IY-1)*LX+IX,ITYP))= + > MATTYP(NUMTYP(IOFF+(IX-1)*LY+IY,ITYP)) + 60 CONTINUE + DO 70 IX=IY,1,-1 + MATTYP(NUMTYP(IOFF+(IY-1)*LX+IX,ITYP))= + > MATTYP(NUMTYP(K3,ITYP)) + K3=K3-1 + 70 CONTINUE + 71 CONTINUE + 72 CONTINUE + KOLD= LX*LY*LZ + ELSEIF( LL2 )THEN + DO 82 IZ=LZ,1,-1 + IOFF=(IZ-1)*LX*LY + DO 81 IY=LY,1,-1 + DO 80 IX=LX,IY,-1 + MATTYP(NUMTYP(IOFF+(IY-1)*LX+IX,ITYP))= + > MATTYP(NUMTYP(K3,ITYP)) + K3=K3-1 + 80 CONTINUE + 81 CONTINUE + 82 CONTINUE + DO 92 IZ=1,LZ + IOFF=(IZ-1)*LX*LY + DO 91 IY=1,LY + DO 90 IX=1,IY-1 + MATTYP(NUMTYP(IOFF+(IY-1)*LX+IX,ITYP))= + > MATTYP(NUMTYP(IOFF+(IX-1)*LY+IY,ITYP)) + 90 CONTINUE + 91 CONTINUE + 92 CONTINUE + KOLD= LX*LY*LZ + ENDIF + ENDIF + ENDIF +* +* FOR THE PARTICULAR CASE OF *TUBE* OR *TUBEZ* GEOMETRIES + IF( ITYPG.EQ.3.OR.ITYPG.EQ.6 )THEN + DO 39 IZ= 1, LZ + MATTYP(NUMTYP(KOLD+IZ,ITYP))= -2 + 39 CONTINUE + KOLD= KOLD+LZ + ENDIF +* +* FILL UP MATTYP ACCORDING TO SPLITTING VALUES. + KNEW= NVOX + ISR= 0 + ISX= 0 + ISY= 0 + ISZ= 0 + DO 308 K0= ICOORD(ICZ),1,-1 + KIOFZ= KOLD + TEDATA= 'SPLIT'//TEMESH(ICZ) + CALL LCMLEN(IPGEOM,TEDATA,ILEN,ITYLCM) + IF( ILEN.GT.MAXSPL )THEN + CALL XABORT('XELBIN: SPLIT OVERFLOW ('//TEDATA//')') + ELSEIF( ILEN.EQ.0 )THEN + ISZ= 1 + ELSE + CALL LCMGET(IPGEOM,TEDATA,ISPLT) + ISZ= ISPLT(K0) + ENDIF + DO 307 J0=ISZ,1,-1 + KOLD= KIOFZ + DO 306 K1= ICOORD(ICY),1,-1 + KIOFY= KOLD + TEDATA= 'SPLIT'//TEMESH(ICY) + CALL LCMLEN(IPGEOM,TEDATA,ILEN,ITYLCM) + IF( ILEN.GT.MAXSPL )THEN + CALL XABORT('XELBIN: SPLIT OVERFLOW ('//TEDATA//')') + ELSEIF( ILEN.EQ.0 )THEN + ISY= 1 + ELSE + CALL LCMGET(IPGEOM,TEDATA,ISPLT) + ISY= ISPLT(K1) + ENDIF + DO 305 J1=ISY,1,-1 + KOLD= KIOFY + DO 304 K2= ICOORD(ICX),1,-1 + KIOFX= KOLD + TEDATA= 'SPLIT'//TEMESH(ICX) + CALL LCMLEN(IPGEOM,TEDATA,ILEN,ITYLCM) + IF( ILEN.GT.MAXSPL )THEN + CALL XABORT('XELBIN: SPLIT OVERFLOW ('//TEDATA//')') + ELSEIF( ILEN.EQ.0 )THEN + ISX= 1 + ELSE + CALL LCMGET(IPGEOM,TEDATA,ISPLT) + ISX= ISPLT(K2) + ENDIF + DO 303 J2=ISX,1,-1 + KOLD= KIOFX +* FOR RECTANGULAR OUTER REGIONS. + IMYT= MATTYP(NUMTYP(KOLD,ITYP)) + MATTYP(NUMTYP(KNEW,ITYP))= IMYT + KNEW= KNEW-1 + KOLD= KOLD-1 + IF( ICYL.EQ.1 )THEN +* FOR CYLINDRICAL INNER REGIONS. + DO 302 KR= LR,1,-1 + TEDATA= 'SPLIT'//TEMESH(4) + CALL LCMLEN(IPGEOM,TEDATA,ILEN,ITYLCM) + IF( ILEN.GT.MAXSPL )THEN + CALL XABORT('XELBIN: SPLIT OVERFLOW ('//TEDATA//')') + ELSEIF( ILEN.EQ.0 )THEN + ISR= 1 + ELSE + CALL LCMGET(IPGEOM,TEDATA,ISPLT) + ISR= ABS(ISPLT(KR)) + ENDIF + IMYT= MATTYP(NUMTYP(KOLD,ITYP)) + DO 301 JR=ISR,1,-1 + MATTYP(NUMTYP(KNEW,ITYP))= IMYT + KNEW= KNEW-1 + 301 CONTINUE + KOLD= KOLD-1 + 302 CONTINUE + ENDIF + 303 CONTINUE + 304 CONTINUE + 305 CONTINUE + 306 CONTINUE + 307 CONTINUE + 308 CONTINUE + IF( KNEW.NE.0 )THEN + WRITE(IOUT,*) 'XELBIN: KNEW.NE.0 = PROBLEM WITH SPLITTING' + SWKILL= .TRUE. + ENDIF + IF( KOLD.NE.0 )THEN + WRITE(IOUT,*) 'XELBIN: KOLD.NE.0 = PROBLEM WITH SPLITTING' + SWKILL= .TRUE. + ENDIF +* + IF( .NOT.L1CELL ) CALL LCMSIX(IPGEOM, ' ', 2) + 40 CONTINUE +* +* RECOMPOSE INTERNAL SURFACES COUPLING (INTERFACES) +* THIS ASSUMES THAT AN ORDERING OF SURFACES IS DONE +* BECAUSE: SIDE-BY-SIDE INTERFACES +* ARE SUPPOSED IN INCREASING POSITION. + DO 220 N= 1, NDIM +* +* DEFINITION OF THE SIDE NUMBER TO COUPLE. + KSID(1)= -2*N + KSID(2)= (-2*N) + 1 + NP1 = MOD(N ,NDIM) + 1 + IF( NDIM.EQ.3 )THEN + NP2 = MOD(N+1,NDIM) + 1 + DO 112 IP1= 1, MAXGRI(NP1) + ILO(NP1,1)= IP1 + ILO(NP1,2)= IP1 + DO 111 IP2= 1, MAXGRI(NP2) + ILO(NP2,1)= IP2 + ILO(NP2,2)= IP2 + DO 110 IP0= 1, MAXGRI(N)-1 + ILO(N ,1)= IP0 + ILO(N ,2)= IP0 + 1 + DO 100 JC= 1, 2 + NO(JC)= MAXGRI(1)*(MAXGRI(2)*ILO(3,JC)+ILO(2,JC)- + > MAXGRI(2))+ILO(1,JC)-MAXGRI(1) + KTYP(JC)= KEYTYP( NO(JC) ) + IF( KTYP(JC).EQ.0 ) GO TO 110 + IGEO = KEYGEO( KTYP(JC) ) +* SEARCH FROM THE END + KSUR(JC)= NSURO(IGEO) + KMAT(JC)= MATTYP( NUMTYP(KSUR(JC),KTYP(JC)) ) + 100 CONTINUE +* +* ORDERING INTERFACING OF THE TWO BLOCKS. + 101 CONTINUE + IF( KMAT(1).EQ.KSID(1).AND.KMAT(2).EQ.KSID(2) )THEN + IF( KSUR(1).EQ.0 .OR. KSUR(2).EQ.0 ) GO TO 109 + KABSO(1)= NUMBLK( KSUR(1),NO(1) ) + KABSO(2)= NUMBLK( KSUR(2),NO(2) ) + KEYINT( KABSO(1) )= KABSO(2) + KEYINT( KABSO(2) )= KABSO(1) + KSUR(1)= KSUR(1)+1 + KSUR(2)= KSUR(2)+1 + ELSE + IF( KMAT(1).NE.KSID(1) ) KSUR(1)= KSUR(1)+1 + IF( KMAT(2).NE.KSID(2) ) KSUR(2)= KSUR(2)+1 + ENDIF + IF( KSUR(1).NE.0 )THEN + KMAT(1)= MATTYP( NUMTYP(KSUR(1),KTYP(1)) ) + ELSE + KMAT(1)= KSID(1) + ENDIF + IF( KSUR(2).NE.0 )THEN + KMAT(2)= MATTYP( NUMTYP(KSUR(2),KTYP(2)) ) + ELSE + KMAT(2)= KSID(2) + ENDIF + GO TO 101 + 109 IF( KSUR(1).NE.0 .OR. KSUR(2).NE.0 )THEN + WRITE(IOUT,'(1H ,I8,4H OF ,I8,5H <=> ,I8,4H OF ,I8)') + > KSUR(1), NO(1), KSUR(2), NO(2) + SWKILL=.TRUE. + ENDIF + 110 CONTINUE + 111 CONTINUE + 112 CONTINUE + ELSEIF( NDIM.EQ.2 )THEN + DO 215 IP1= 1, MAXGRI(NP1) + ILO(NP1,1)= IP1 + ILO(NP1,2)= IP1 + DO 210 IP0= 1, MAXGRI(N)-1 + ILO(N ,1)= IP0 + ILO(N ,2)= IP0 + 1 + DO 200 JC= 1, 2 + NO(JC)= MAXGRI(1) * (ILO(2,JC) - 1) + ILO(1,JC) + KTYP(JC)= KEYTYP( NO(JC) ) + IF( KTYP(JC).EQ.0 ) GO TO 210 + IGEO = KEYGEO( KTYP(JC) ) +* SEARCH FROM THE END + KSUR(JC)= NSURO(IGEO) + KMAT(JC)= MATTYP( NUMTYP(KSUR(JC),KTYP(JC)) ) + 200 CONTINUE +* +* ORDERING INTERFACING OF THE TWO BLOCKS. + 201 CONTINUE + IF( KMAT(1).EQ.KSID(1).AND.KMAT(2).EQ.KSID(2) )THEN + IF( KSUR(1).EQ.0 .OR. KSUR(2).EQ.0 ) GO TO 209 + KABSO(1)= NUMBLK( KSUR(1),NO(1) ) + KABSO(2)= NUMBLK( KSUR(2),NO(2) ) + KEYINT( KABSO(1) )= KABSO(2) + KEYINT( KABSO(2) )= KABSO(1) + KSUR(1)= KSUR(1)+1 + KSUR(2)= KSUR(2)+1 + ELSE + IF( KMAT(1).NE.KSID(1) ) KSUR(1)= KSUR(1)+1 + IF( KMAT(2).NE.KSID(2) ) KSUR(2)= KSUR(2)+1 + ENDIF + IF( KSUR(1).NE.0 )THEN + KMAT(1)= MATTYP( NUMTYP(KSUR(1),KTYP(1)) ) + ELSE + KMAT(1)= KSID(1) + ENDIF + IF( KSUR(2).NE.0 )THEN + KMAT(2)= MATTYP( NUMTYP(KSUR(2),KTYP(2)) ) + ELSE + KMAT(2)= KSID(2) + ENDIF + GO TO 201 + 209 IF( KSUR(1).NE.0 .OR. KSUR(2).NE.0 )THEN + WRITE(IOUT,'(1H ,I8,4H OF ,I8,5H <=> ,I8,4H OF ,I8)') + > KSUR(1), NO(1), KSUR(2), NO(2) + SWKILL=.TRUE. + ENDIF + 210 CONTINUE + 215 CONTINUE + ELSE + CALL LCMLIB(IPGEOM) + CALL XABORT( 'XELBIN: *** FALSE NDIM VALUE') + ENDIF + 220 CONTINUE +* + IF( IPRT.GE.100 .OR. SWKILL )THEN + IUNK= 0 + WRITE(IOUT,'(/40H KEYINT COUPLE MATERIAL )') + DO 250 IBLK= 1, NBLOCK + ITYP= KEYTYP(IBLK) + IGEO= KEYGEO(ITYP) + NVOX= NVOLO(IGEO) + NSUX= NSURO(IGEO) + DO 240 ISUX= NSUX, NVOX + IUNK= IUNK+1 + IMYT= MATTYP( NUMTYP(ISUX,ITYP) ) + IF( ISUX.LT.0 )THEN + WRITE(IOUT, + > '(5H SUR(,I8,5H) => ,I8,4H OF , I8)') + > IUNK, KEYINT(IUNK), IMYT + ELSEIF( ISUX.GT.0 )THEN + IMYG= MATGEO( NUMGEO(ISUX,IGEO) ) + WRITE(IOUT, + > '(5H VOL(,I8,5H) => ,I8,4H OF , I8,1H(,I8,1H))') + > IUNK, KEYINT(IUNK), IMYT, IMYG + ENDIF + 240 CONTINUE + WRITE(IOUT,'(/1X)') + 250 CONTINUE + ENDIF + IF( SWKILL ) CALL XABORT( 'XELBIN: IMPOSSIBLE TO INTERFACE') +* + RETURN + END |
