diff options
Diffstat (limited to 'Dragon/src/LHXUNH.f')
| -rw-r--r-- | Dragon/src/LHXUNH.f | 1502 |
1 files changed, 1502 insertions, 0 deletions
diff --git a/Dragon/src/LHXUNH.f b/Dragon/src/LHXUNH.f new file mode 100644 index 0000000..9e61ec1 --- /dev/null +++ b/Dragon/src/LHXUNH.f @@ -0,0 +1,1502 @@ +*DECK LHXUNH + SUBROUTINE LHXUNH(IPTRK,IPGEOM,GEONAM,MESH,NCELA,IPLANZ,NCPHY, + + ICODE,ZCODE,MVOSU,NREGIO,ISURF,SIDE,ISTATE,NSMIN, + + NSMAX,MVOLUM,IHEX,LX,MCODE,IPLANI,VLAT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Read and analyse hexagonal geometry. +* +*Copyright: +* Copyright (C) 1991 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): M. Ouisloumen +* +*Parameters: input +* IPTRK pointer to tracking. +* IPGEOM pointer to geometry. +* GEONAM name of geometry +* +*Parameters: output +* ISURF number of surfaces. +* SIDE side of hexagone. +* ISTATE state vector. +* NSMIN surface minimum index. +* NSMAX surface maximum index. +* MVOLUM volume maximum index. +* IHEX flag for hexagonal geometry (=1 if geometry hexagonal). +* LX number of hexagones. +* MESH dimension of array REMESH for mesh storage. +* NCELA number of cells in assembly after unfolding. +* IPLANZ number of Z planes. +* NCPHY number of physical cells. +* ICODE albedo indices. +* ZCODE geometric albedos. +* NREGIO number of physical regions. +* MVOSU number of volumes ans surfaces. +* MCODE =1 if NCODE(5)=5 ,=2 if NCODE(6)=5 ,=0 otherwise. +* IPLANI plane identifier. +* VLAT lattice indices for surface and volumes. +* +*----------------------------------------------------------------------- +* + USE GANLIB + PARAMETER(NLCM=25,NSTATE=40,NIXS=9,NIST=2) + TYPE(C_PTR) IPTRK,IPGEOM + INTEGER LNLCM(NLCM),INVLCM(NIXS),INVSTA(NIST),ISTATE(NSTATE), + + NCODE(6),ICODE(6),JCODE(6),ISTOR(8),VLAT(*) + REAL ZCODE(6) + LOGICAL L1CELL,LGMERG,LGTURN,LSPLIT,LGCELL,LGSYM,LGSIDE,LGPASS + LOGICAL LMERG1,LTURN1 + CHARACTER LCMNM(NLCM)*12,GEONAM*12,TEXT12*12 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: IGG,IAA,SURL,JNR1,JCEL, + + ISECT,LSECT,ISP,ISZ,IBB,ICC,JSS,ISEC1,IXXX,ISS,ISSS,ICELL,IDD, + + IAD + REAL, ALLOCATABLE, DIMENSION(:) :: ZZZ,ZMZZ,ZZS,AQ,RR + TYPE PP + INTEGER, POINTER, DIMENSION(:) :: ILOCR + END TYPE PP + TYPE(PP), ALLOCATABLE, DIMENSION(:) :: JNR2,ISEC2 +*---- +* DATA STATEMENTS +*---- + DATA INVLCM,INVSTA /2,3,7,8,12,15,16,17,18,4,13/ + DATA ISTOR /12,6,6,4,3,2,2,2/ + DATA LCMNM / 'MIX', 'MESHX', 'MESHY', 'MESHZ', 'RADIUS', + > 'SIDE', 'SPLITX', 'SPLITY', 'SPLITZ', 'SPLITR', + > 'CELL', 'COORD', 'MERGE', 'TURN', 'CLUSTER', + > 'NPIN', 'RPIN', 'APIN', 'BIHET', 'POURCE', + > 'PROCEL', 'IHEX', 'NCODE', 'ZCODE', 'ICODE'/ +* + IFCOUR(N)=NINT( (4.+SQRT(1.+4.*FLOAT(N-1)/3.) + + +SQRT(1.+4.*FLOAT(N-2)/3.))*.25) + IFONC(N,L)= 2+(N-1)*(L+3*(N-2)) +* + LGSYM=.FALSE. + LGMERG=.FALSE. + LGTURN=.FALSE. + L1CELL=.FALSE. + LSPLIT=.FALSE. + LGCELL=.FALSE. + MCODE=0 + NRAY=0 + KRAY=0 + KSECT=0 + IPLANI=0 +* +* LECTURE DES DIFFERENTS BLOCS SUR LCM +* + DO 10 I=1,NLCM + CALL LCMLEN(IPGEOM,LCMNM(I),LNLCM(I),ITP) + 10 CONTINUE +* +* ELEMINATES OPTIONS NOT CHECKED BY THIS ROUTINE +* + DO 20 I=1,NIXS + IF(LNLCM(INVLCM(I)).NE.0) + + CALL XABORT('LHXUNH : '//GEONAM//' WAS NOT UNFOLDED ') + 20 CONTINUE +* + CALL LCMLEN(IPGEOM,'STATE-VECTOR',ILEN,ITP) + IF(ITP.NE.1.OR.ILEN.NE.NSTATE) + + CALL XABORT('LHXUNH : INVALID STATE VECTOR ') + ISTATE(:NSTATE)=0 + CALL LCMGET(IPGEOM,'STATE-VECTOR',ISTATE) +* +* ELEMINATES THE INVALID OPTIONS +* + DO 30 IST=1, NIST + IF(ISTATE(INVSTA(IST)).NE.0) + + CALL XABORT('LHXUNH : '//GEONAM//'WAS NOT UNFOLDED') + 30 CONTINUE + ITYPE=ISTATE(1) + LX=ISTATE(3) + LZ=ISTATE(5) + LZZ=LZ + LREG=ISTATE(6) + ISTAT9=ISTATE(9) + IF(ISTATE(8).EQ.1)LGCELL=.TRUE. + IF(ISTATE(10).EQ.1)LGMERG=.TRUE. + IF(ISTATE(11).EQ.1)LSPLIT=.TRUE. + NDIM=2 + NCEL=LX + IPLANZ=1 + IF(LZ.NE.0) THEN + NCEL=LX*LZ + NDIM=3 + NCELP=LX + IPLANZ=LZ + ENDIF + IF(LX.EQ.1)L1CELL=.TRUE. + IF(LGCELL)THEN + IF(L1CELL) THEN + IF(ITYPE.NE.8.AND.ITYPE.NE.9.AND.ITYPE.NE.24.AND.ITYPE.NE.25) + + CALL XABORT('LHXUNH : INVALID TYPE OF GEOMETRY') + ELSE + IF(ITYPE.NE.8.AND.ITYPE.NE.9) + + CALL XABORT('LHXUNH : INVALID TYPE OF GEOMETRY') + ENDIF + ELSE + IF(ITYPE.NE.8.AND.ITYPE.NE.9.AND.ITYPE.NE.24.AND.ITYPE.NE.25) + + CALL XABORT('LHXUNH : INVALID TYPE OF GEOMETRY') + ENDIF +* +* RECOVERS BOUDARY CONDITIONS +* + CALL LCMGET(IPGEOM,'NCODE',NCODE) + CALL LCMGET(IPGEOM,'ZCODE',ZCODE) + CALL LCMGET(IPGEOM,'ICODE',JCODE) + DO 35 I=1,6 + IF( JCODE(I).GT.0 )THEN + ICODE(I)= JCODE(I) + ELSE + ICODE(I)= -I + ENDIF + IF( NCODE(I).EQ.0 )THEN + IF( NDIM.EQ.3.AND.(I.EQ.5.OR.I.EQ.6) )THEN + CALL XABORT('LHXUNH : A BOUNDARY CONDITION IS MISSING') + ENDIF + IF( I.EQ.1 )THEN + CALL XABORT('LHXUNH : A BOUNDARY CONDITION IS MISSING') + ENDIF + ICODE(I)= 0 + ENDIF + 35 CONTINUE +* +* ELEMINATIONS DES OPTIONS IMCOMPATIBLES +* + DO 40 I=1,6 + IF(NCODE(I).EQ.4.OR.NCODE(I).EQ.7.OR.NCODE(I).EQ.3 .OR. + + (NDIM.EQ.2.AND.NCODE(I).EQ.5) .OR. + + (NDIM.EQ.2.AND.NCODE(I).EQ.10) ) + + CALL XABORT('LHXUNH : INVALID BOUNDARY CONDITION ') + IF((NCODE(5) .EQ. 5 .OR. NCODE(5) .EQ. 10) .AND. + + (NCODE(6) .EQ. 5 .OR. NCODE(6) .EQ. 10)) CALL XABORT( + + 'LHXUNH: UNE SEULE SYMETRIE SELON Z EST VALABLE') + IF(NCODE(5) .EQ. 5 .OR. NCODE(5) .EQ. 10 ) THEN + ZCODE(5)=ZCODE(6) + ICODE(5)=ICODE(6) + ELSEIF(NCODE(6) .EQ.5 .OR. NCODE(6) .EQ. 10) THEN + ZCODE(6)=ZCODE(5) + ICODE(6)=ICODE(5) + ENDIF + 40 CONTINUE + IF(L1CELL) THEN +* +* CAS D'UNE SEULE CELLULE +* + IF(NCODE(5) .EQ. 5 .OR. NCODE(5) .EQ. 10 .OR. + > NCODE(6) .EQ. 5 .OR. NCODE(6) .EQ. 10 ) CALL XABORT( + + 'LHXUNH: THE B.C. SYME FOR ONE CELL IS NOT PERMITTED ') + IF(LGCELL) THEN + CALL LCMLEN(IPGEOM,'CELL',ILEN,ITP) + IF(ILEN.NE.3*ISTAT9.OR.ITP.NE.3) CALL XABORT('LHXUNH: ' + + //'MISSING DIMENSION OR TYPE OF CELL ') + ALLOCATE(JCEL(3*ISTAT9)) + CALL LCMGET(IPGEOM,'CELL',JCEL) + WRITE(TEXT12,'(3A4)') (JCEL(ITC),ITC=1,3) + CALL LCMLEN(IPGEOM,TEXT12,ILEN,ITP) + IF(ILEN.NE.-1.OR.ITP.NE.0) CALL XABORT('LHXUNH: ' + + //'INVALID CELL DATA ') + CALL LCMSIX(IPGEOM,TEXT12,1) + ENDIF + CALL LCMLEN(IPGEOM,'SIDE',ISIDE,ITS) + IF(ISIDE.EQ.0) CALL XABORT('LHXUNH: SIDE NOT FOUND') + IF(ITS.NE.2) CALL XABORT('LHXUNH: SIDE MUST BE REAL') + CALL LCMGET(IPGEOM,'SIDE',SIDE) + CALL LCMLEN(IPGEOM,'RADIUS',ILENR,ITPR) + CALL LCMLEN(IPGEOM,'SECTOR',ILENS,ITPS) + IXX=1 + IF(ILENR.GT.0) IXX=ILENR + ALLOCATE(ISECT(IXX)) + IF(ILENS.GT.0) THEN + IF(ILENS.NE.IXX) + + CALL XABORT('LHXUNH: INVALID SECTOR DIMENSION(1)') + CALL LCMGET(IPGEOM,'SECTOR',ISECT) + ELSE + ISECT(:IXX)=1 + ENDIF + IF(ILENR.GT.0) THEN + IF(ITPR.NE.2)CALL XABORT('LHXUNH: RADIUS MUST BE REAL') + CALL LCMLEN(IPGEOM,'SPLITR',ILENSP,ITPS) + NRAY=ILENR-1 + IF(ILENSP.GT.0) THEN + IF(ILENSP.NE.NRAY) + + CALL XABORT('LHXUNH: INVALID SPLITR DIMENSION') + IF(ITPS.NE.1) CALL XABORT('LHXUNH: SPLITR MUST BE INTEGER') + ALLOCATE(ISP(ILENSP)) + CALL LCMGET(IPGEOM,'SPLITR',ISP) + NRAY=0 + DO 36 J=1,ILENSP + NRAY=NRAY+ABS(ISP(J)) + 36 CONTINUE + IF(ILENS.GT.0) THEN + ALLOCATE(LSECT(NRAY+1)) + MADD=-1 + DO 336 J=1,ILENR-1 + KSECT=ISECT(J) + DO 335 ISPS=1,ISP(J) + MADD=MADD+1 + LSECT(MADD+1)=KSECT + 335 CONTINUE + 336 CONTINUE + LSECT(NRAY+1)=ISECT(ILENR) + DEALLOCATE(ISECT) + ALLOCATE(ISECT(NRAY+1)) + DO 337 J=1,NRAY+1 + ISECT(J)=LSECT(J) + 337 CONTINUE + DEALLOCATE(LSECT) + ENDIF + DEALLOCATE(ISP) + ENDIF + ENDIF +* + ISURF=6 + MVOSU=0 + DO 39 K=1,NRAY+1 + KSECT=ISECT(K) + IF(KSECT.GT.1) THEN + MVOSU=MVOSU+6*(KSECT-1) + ELSE + MVOSU=MVOSU+1 + ENDIF + 39 CONTINUE + DEALLOCATE(ISECT) + IF(KSECT.GT.1) ISURF=6*(KSECT-1) + MVOLUM=1+NRAY + IF(NDIM.EQ.2) THEN + NCELA=1 + NCPHY=1 + MESH=2+NRAY + NREGIO=MVOSU + ELSEIF(NDIM.EQ.3) THEN + CALL LCMLEN(IPGEOM,'MESHZ',LZ,ITZ) + IF(LZ.EQ.0) CALL XABORT('LHXUNH: MESHZ NOT FOUND') + IF(LZ.NE.2) CALL XABORT('LHXUNH: MISSING DIMENSION OF MESHZ') + IF(ITZ.NE.2)CALL XABORT('LHXUNH: MESHZ MUST BE REAL') + ALLOCATE(ZZZ(LZ)) + CALL LCMGET(IPGEOM,'MESHZ',ZZZ) + IF(ZZZ(1).NE.0.) CALL XABORT('LHXUNH: FIRST MESHZ MUST BE 0') + CALL LCMLEN(IPGEOM,'SPLITZ',LSZ,ITSZ) + IF(LSZ.GT.0) THEN + IF(ITSZ.NE.1)CALL XABORT('LHXUNH: SPLITZ MUST BE INTEGER') + IF(LSZ.NE.LZ-1)CALL XABORT('LHXUNH: WRONG SPLITZ DIMENSION') + ALLOCATE(ISZ(LSZ)) + CALL LCMGET(IPGEOM,'SPLITZ',ISZ) + CALL LCMSIX(IPTRK,'DATA_DUP',1) + CALL LCMPUT(IPTRK,'SPLITZD',LSZ,1,ISZ) + CALL LCMSIX(IPTRK,' ',2) + MZ=ISZ(1)+1 + ALLOCATE(ZMZZ(MZ)) + KSP=ISZ(1) + PAS=(ZZZ(2)-ZZZ(1))/FLOAT(KSP) + ZMZZ(1)=0.0 + DO 37 K=1,KSP + ZMZZ(K+1)=PAS*FLOAT(K)+ZZZ(1) + 37 CONTINUE + DEALLOCATE(ISZ) + ELSE + MZ=LZ + ALLOCATE(ZMZZ(MZ)) + DO 38 J=1,MZ + ZMZZ(J)=ZZZ(J) + 38 CONTINUE + ENDIF + DEALLOCATE(ZZZ) + CALL LCMSIX(IPTRK,'DATA_DUP',1) + CALL LCMPUT(IPTRK,'MESHZ',MZ,2,ZMZZ) + CALL LCMSIX(IPTRK,' ',2) + DEALLOCATE(ZMZZ) + IPLANZ=MZ-1 + ISTATE(5)=IPLANZ + NCELA=MZ-1 + ISURF=NCELA*ISURF + NCPHY=MZ-1 + MESH=NCELA*(3+NRAY) + NSMIN=MVOSU + NSMAX=MVOSU + MVOSU=NCELA*MVOSU + MVOLUM=NCELA*MVOLUM + NREGIO=MVOSU + ENDIF + NCOUR=1 + ISURF=ISURF+NSMIN+NSMAX + RETURN + ENDIF +* +* TYPE DE LA SYMETRIE CONSIDEREE +* + CALL LCMLEN(IPGEOM,'IHEX',ILEN,ITP) + IF(ITP.NE.1.OR.ILEN.NE.1)CALL XABORT('LHXUNH: TYPE OF '// + + 'SYMETRIE MUST BE INTEGER') + CALL LCMGET(IPGEOM,'IHEX',IHEX) + IF(IHEX.LT.1.OR.IHEX.GT.9) CALL XABORT('LHXUNH: INVALID TYPE OF ' + + //'SYMETRIE') + IF(NDIM.EQ.2) THEN +* +* TRAITEMENT DE LA GEOMETRIE EN 2D +* + NCELA=NCEL + NCELAP=NCEL +* +* DUPLICATION DE LA SYMETRIE CONSIDEREE +* + IF(IHEX.LT.9) THEN + ALLOCATE(IBB(ISTOR(IHEX)*NCEL)) + CALL DEPLIT(IHEX,NCEL,NCELA,IBB) + NCELAP=NCELA + ELSE + ALLOCATE(IBB(NCEL)) + DO 137 I=1,NCEL + IBB(I)=I + 137 CONTINUE + ENDIF + CALL LCMLEN(IPGEOM,'MIX',ILENX,ITPX) + IF(ILENX.NE.NCEL.OR.ITPX.NE.1) THEN + CALL XABORT('LHXUNH: MISSING TYPE OR DIMENSION OF MIX') + ENDIF + NBASE=NCEL+NCELA + CALL LCMLEN(IPGEOM,'TURN',ILENT,ITP) + IF(ILENT.GT.0) THEN + IF(ILENT.NE.NCEL)CALL XABORT('LHXUNH: EXPECTED DIMENSION'// + + 'OF TURN') + IF(ITP.NE.1)CALL XABORT('LHXUNH: EXPECTED VALUE IN TURN ') + LGTURN=.TRUE. + ENDIF + NBASE=NBASE*2 + NBASE=NBASE+NCEL+NCELA + ALLOCATE(ICC(NBASE)) + NBB=2*NCEL + IF(LGCELL) THEN + CALL LCMGET(IPGEOM,'MIX',ICC) + ICMAX=-1 + DO 147 IGX=1,NCEL + ICC(IGX)=-ICC(IGX) + ICMAX=MAX(ICMAX,ICC(IGX)) + 147 CONTINUE + IF(ISTAT9.GT.ICMAX)CALL XABORT('LHXUNH: THERE ARE DEFINED' + + //' CELLS NOT USED IN THE ASSEMBLY') + ELSE + CALL LCMGET(IPGEOM,'MIX',ICC) + ENDIF + IF(LGMERG) THEN + CALL LCMLEN(IPGEOM,'MERGE',IAUXN,ITAUX) + IF(IAUXN.NE.NCEL.OR.ITAUX.NE.1)CALL XABORT('LHXUNH: DIMEN' + + //'SION OR TYPE OF MERGE INVALID') + CALL LCMGET(IPGEOM,'MERGE',ICC(NCEL+1)) + NCPHY=0 + DO 42 I=1,NCEL + NCPHY=MAX(NCPHY,ICC(NCEL+I)) + 42 CONTINUE + ELSE + DO 146 I=1,NCEL + ICC(NCEL+I)=ICC(I) + 146 CONTINUE + LGMERG=.TRUE. + NCPHY=NCEL + ENDIF + IF(LGTURN) THEN + CALL LCMLEN(IPGEOM,'TURN',IAUXN,ITAUX) + IF(IAUXN.NE.NCEL.OR.ITAUX.NE.1)CALL XABORT('LHXUNH: DIMEN' + + //'SION OR TYPE OF TURN INVALID') + CALL LCMGET(IPGEOM,'TURN',ICC(NBB+1)) + ELSE + LGTURN=.TRUE. + DO 777 ITT=1,NCEL + ICC(NBB+ITT)=1 + 777 CONTINUE + ENDIF + NBB=NBB+NCEL +* +* DUPLICATION DE MERGE ET MIX +* + DO 47 I=1,NCELA + ICC(NBB+I)=ICC(IBB(I)) + ICC(NBB+NCELA+I)=ICC(IBB(I)+NCEL) + 47 CONTINUE +* +* CAS OU SIDE EST ENTREE UNE SEULE FOIS +* + LGSIDE=.TRUE. + CALL LCMLEN(IPGEOM,'SIDE',ISIDE,IT) + IF(ISIDE.GT.0) THEN + CALL LCMGET(IPGEOM,'SIDE',SIDE) + LGSIDE=.FALSE. + ELSEIF(.NOT.LGCELL) THEN + CALL XABORT('LHXUNH: SIDE NOT FOUND ') + ENDIF +* +* EVALUATION DE MESH +* + MESH=2*NCELA + NCOUR=1 + IF(NCELAP.GT.1)NCOUR=IFCOUR(NCELAP) + ICELC0= IFONC(NCOUR,0) + ICELC1= IFONC(NCOUR,1)-ICELC0 + IF(LGCELL) THEN + ALLOCATE(JNR1(ISTAT9),JNR2(ISTAT9),JCEL(3*ISTAT9)) + CALL LCMGET(IPGEOM,'CELL',JCEL) + NREGIO=0 + DO 48 I=1,ISTAT9 + IRTC=3*I-2 + WRITE(TEXT12,'(3A4)') (JCEL(ITC),ITC=IRTC,IRTC+2) + CALL LCMSIX(IPGEOM,TEXT12,1) + CALL LCMLEN(IPGEOM,'RADIUS',ILENR,ITP) + CALL LCMLEN(IPGEOM,'SPLITR',ILENSP,ITP) + IF(LGSIDE) THEN + CALL LCMLEN(IPGEOM,'SIDE',ISIDE,IT) + IF(ISIDE.EQ.0)CALL XABORT('LHXUNH: SIDE NOT FOUND') + CALL LCMGET(IPGEOM,'SIDE',SSIDE) + IF(I.GT.1) THEN + IF(SSIDE.NE.SIDE)CALL XABORT('LHXUNH: INCOMPATIBLE SIDE') + ENDIF + SIDE=SSIDE + ENDIF + NRAY=ILENR + IF(ILENR.GT.0)NRAY=ILENR-1 + IF(ILENSP.GT.0) THEN + ALLOCATE(JSS(ILENSP)) + CALL LCMGET(IPGEOM,'SPLITR',JSS) + NRAY=0 + DO 46 J=1,ILENSP + NRAY=NRAY+ABS(JSS(J)) + 46 CONTINUE + DEALLOCATE(JSS) + ENDIF + JNR1(I)=NRAY + ALLOCATE(JNR2(I)%ILOCR(NRAY+1)) + CALL LCMLEN(IPGEOM,'SECTOR',ILENS,ITPS) + IF(ILENS.GT.0) THEN + IF(ILENS.NE.NRAY+1) + + CALL XABORT('LHXUNH: INVALID SECTOR DIMENSION(2)') + CALL LCMGET(IPGEOM,'SECTOR',JNR2(I)%ILOCR) + ELSE + JNR2(I)%ILOCR(:NRAY+1)=1 + NREGIO=NREGIO+1+NRAY + GOTO 430 + ENDIF + DO 43 K=1,NRAY+1 + KSECT=JNR2(I)%ILOCR(K) + IF(KSECT.GT.1) THEN + NREGIO=NREGIO+6*(KSECT-1) + ELSE + NREGIO=NREGIO+1 + ENDIF + 43 CONTINUE + 430 CONTINUE + CALL LCMSIX(IPGEOM,' ',2) + 48 CONTINUE + DEALLOCATE(JCEL) + NRAY=0 + MVOSU=0 + MVOLUM=0 + ISURF=0 + DO 49 I=1,NCELA + KRAY=JNR1(ICC(NBB+I)) + NRAY=NRAY+KRAY + DO 490 JR=1,KRAY+1 + KSECT=JNR2(ICC(NBB+I))%ILOCR(JR) + IF(KSECT.GT.1) THEN + MVOSU=MVOSU+6*(KSECT-1) + ELSE + MVOSU=MVOSU+1 + ENDIF + 490 CONTINUE + IF(I.GE.ICELC0) THEN + IF(KSECT.GT.1) THEN + ISURF=ISURF+2*(KSECT-1) + IF(MOD(I-ICELC0,ICELC1).EQ.0) ISURF=ISURF+KSECT-1 + ELSE + ISURF=ISURF+2 + IF(MOD(I-ICELC0,ICELC1).EQ.0) ISURF=ISURF+1 + ENDIF + ENDIF + MVOLUM=MVOLUM+KRAY+1 + 49 CONTINUE + MESH=NRAY+MESH + DO 495 I=1,ISTAT9 + DEALLOCATE(JNR2(I)%ILOCR) + 495 CONTINUE + DEALLOCATE(JNR2,JNR1) + ELSE + CALL LCMLEN(IPGEOM,'SECTOR',ILENS,ITP) + NREGIO=NCPHY + MVOSU=NCELA + MVOLUM=NCELA + ALLOCATE(IXXX(NCEL)) + IF(ILENS.GT.0) THEN + IF(ILENS.NE.NCEL) + + CALL XABORT('LHXUNH: INVALID SECTOR DIMENSION(3)') + CALL LCMGET(IPGEOM,'SECTOR',IXXX) + ELSE + IXXX(:NCEL)=1 + ENDIF + ILESS=0 + NREGIO=0 + DO 50 L=1,ILENS + MCEL=ICC(L) + IF(MCEL.GT.ILESS) THEN + ILESS=MCEL + KSECT=IXXX(L) + IF(KSECT.GT.1) THEN + NREGIO=NREGIO+6*(KSECT-1) + ELSE + NREGIO=NREGIO+1 + ENDIF + ENDIF + 50 CONTINUE + MVOSU=0 + ISURF=0 + DO 51 I=1,NCELA + KSECT=IXXX(ICC(NBB+I)) + IF(KSECT.GT.1) THEN + MVOSU=MVOSU+6*(KSECT-1) + IF(I.GE.ICELC0) THEN + ISURF=ISURF+2*(KSECT-1) + IF(MOD(I-ICELC0,ICELC1).EQ.0) ISURF=ISURF+KSECT-1 + ENDIF + ELSE + MVOSU=MVOSU+1 + IF(I.GE.ICELC0) THEN + ISURF=ISURF+2 + IF(MOD(I-ICELC0,ICELC1).EQ.0) ISURF=ISURF+1 + ENDIF + ENDIF + 51 CONTINUE + DEALLOCATE(IXXX) + ENDIF +* +* DUPLICATION DE TURN +* + MBB=2*NCELA + IF(LGTURN) THEN + IF (IHEX.LT.9) THEN + CALL DUTURN(IHEX,ICC(NBB-NCEL+1),NCEL,ICC(NBB+MBB+1), + + NCELA,IBB) + ELSE + DO 187 I=1,NCELA + ICC(NBB+MBB+I)=ICC(NBB-NCEL+I) + 187 CONTINUE + ENDIF + ENDIF +* +* RESTORAGE DES DONNEES +* + CALL LCMSIX(IPTRK,'DATA_DUP',1) +* +*--- CE VECTEUR EST UTILE DANS LA ROUTINE MESHST + CALL LCMPUT(IPTRK,'GENER0',NCELA,1,IBB) + IF(LGCELL) THEN + CALL LCMPUT(IPTRK,'GENERATING',NCELA,1,ICC(NBB+1)) + ELSE + CALL LCMPUT(IPTRK,'MIX',NCELA,1,ICC(NBB+1)) + ENDIF + IF(LGMERG) + + CALL LCMPUT(IPTRK,'MERGE',NCELA,1,ICC(NCELA+NBB+1)) + IF(LGTURN) + + CALL LCMPUT(IPTRK,'TURN',NCELA,1,ICC(NBB+MBB+1)) + CALL LCMSIX(IPTRK,' ',2) + DEALLOCATE(IBB,ICC) +* + ELSEIF(NDIM.EQ.3) THEN +* +* TRAITEMENT DU CAS 3D +* + NCELA=NCEL + CALL LCMLEN(IPGEOM,'MIX',ILENX,ITPX) + IF(ILENX.NE.NCEL.OR.ITPX.NE.1) CALL XABORT('LHXUNH: MISSING' + + //'VECTOR MIX') + NBASE=NCEL + CALL LCMLEN(IPGEOM,'TURN',ILENT,ITPT) + IF(ILENT.GT.0)THEN + IF(ILENT.NE.NCEL.OR.ITPT.NE.1) CALL XABORT('LHXUNH: MISSING' + + //'VECTOR TURN') + LGTURN=.TRUE. + ENDIF + NBASE=NCEL+NCEL + NBASE=NCEL+NBASE + ALLOCATE(ICC(NBASE)) + CALL LCMGET(IPGEOM,'MIX',ICC) + IF(LGCELL) THEN + DO 144 IGX=1,NCEL + ICC(IGX)=-ICC(IGX) + 144 CONTINUE + ENDIF + NBB=NCEL+NCEL + LMERG1=.FALSE. + LTURN1=.FALSE. + IF(LGMERG) THEN + CALL LCMGET(IPGEOM,'MERGE',ICC(NCEL+1)) + NCPHY=0 + DO 52 I=1,NCEL + NCPHY=MAX(NCPHY,ICC(NCEL+I)) + 52 CONTINUE + LMERG1=.TRUE. + ELSE + DO 53 I=1,NCEL + ICC(I+NCEL)=ICC(I) + 53 CONTINUE + LGMERG=.TRUE. + NCPHY=NCEL + ENDIF + IF(LGTURN) THEN + CALL LCMGET(IPGEOM,'TURN',ICC(NBB+1)) + LTURN1=.TRUE. + ELSE + LGTURN=.TRUE. + DO 778 ITT=1,NCEL + ICC(NBB+ITT)=1 + 778 CONTINUE + ENDIF + NBB=NBB+NCEL +* +* SPLITING DE LA DIRECTION Z +* + CALL LCMLEN(IPGEOM,'MESHZ',ILENZ,ITPZ) + IF(LGCELL.OR.IPLANZ.GT.1) THEN + IF(ILENZ.NE.0)CALL XABORT('LHXUNH: INVALID POSITION OF MESHZ') + ENDIF + IF(ILENZ.GT.0) THEN + IF(ILENZ.NE.LZ+1.OR.ITPZ.NE.2)CALL XABORT('LHXUNH: MISSING' + + //'DIMENSION OR VALUE IN MESHZ') + ALLOCATE(ZZZ(ILENZ)) + CALL LCMGET(IPGEOM,'MESHZ',ZZZ) + MZ=ILENZ + ENDIF +* +* EVALUATION DE NREGIO +* + NREGIO=NCPHY + CALL LCMLEN(IPGEOM,'SECTOR',ILENS,ITP) + IF(LGCELL.OR.IPLANZ.GT.1) THEN + IF(ILENS.NE.0)CALL XABORT('LHXUNH: INVALID POSITION OF SECTOR') + ENDIF + IF(ILENS.GT.0) THEN + IF(ILENS.NE.NCEL)CALL XABORT('LHXUNH: INVALID DIMENSION OF' + + //'SECTOR') + IF(ITP.NE.1)CALL XABORT('LHXUNH: SECTOR MUST BE INTEGER') + ALLOCATE(ISEC1(ILENS)) + ILESS=0 + NREGIO=0 + CALL LCMGET(IPGEOM,'SECTOR',ISEC1) + DO 54 L=1,ILENS + MCEL=ICC(L) + IF(MCEL.GT.ILESS) THEN + ILESS=MCEL + KSECT=ISEC1(L) + IF(KSECT.GT.1) THEN + NREGIO=NREGIO+6*(KSECT-1) + ELSE + NREGIO=NREGIO+1 + ENDIF + ENDIF + 54 CONTINUE + ENDIF +* + CALL LCMLEN(IPGEOM,'SPLITZ',ILEN,ITP) + IF(ILEN.NE.0) THEN + IF(ILEN.NE.LZ)CALL XABORT('LHXUNH: INVALID DIMENSION OF' + + //'SPLITZ') + IF(ILENZ.LT.0)CALL XABORT('LHXUNH: MESHZ MUST BE DEFINED' + + //'LIKE SPLITZ') + ALLOCATE(ISS(LZ)) + CALL LCMGET(IPGEOM,'SPLITZ',ISS) + CALL LCMSIX(IPTRK,'DATA_DUP',1) + CALL LCMPUT(IPTRK,'SPLITZD',LZ,1,ISS) + CALL LCMSIX(IPTRK,' ',2) + MZ=0 + DO 55 K=1,LZ + MZ=MZ+ISS(K) + 55 CONTINUE + LSPLIT=.TRUE. + ELSEIF(LGCELL) THEN + CALL LCMLEN(IPGEOM,'CELL',ILEN,ITP) + IF(ILEN.NE.3*ISTAT9.OR.ITP.NE.3)CALL XABORT('LHXUNH: ' + + //'MISSING DIMENSION OR TYPE OF CELL ') + ALLOCATE(ICELL(3*ISTAT9),RR(3*ISTAT9),ISSS(ISTAT9)) + CALL LCMGET(IPGEOM,'CELL',ICELL) + ALLOCATE(ISEC1(ISTAT9),ISEC2(ISTAT9)) + IAUX=0 + NREGIO=0 + DO 70 I=1,ISTAT9 + WRITE(TEXT12(1:4),'(A4)')ICELL(3*I-2) + WRITE(TEXT12(5:8),'(A4)')ICELL(3*I-1) + WRITE(TEXT12(9:12),'(A4)')ICELL(3*I) + CALL LCMSIX(IPGEOM,TEXT12,1) + CALL LCMGET(IPGEOM,'MESHZ',RR(IAUX+1)) + CALL LCMGET(IPGEOM,'SIDE',RR(2*ISTAT9+I)) + IAUX=IAUX+2 + CALL LCMLEN(IPGEOM,'SPLITZ',ILEN,ITP) + ISSS(I)=1 + IF(ILEN.NE.0) THEN + IF(ITP.NE.1)CALL XABORT('LHXUNH: INVALID TYPE OF SPLITZ') + CALL LCMGET(IPGEOM,'SPLITZ',ISSS(I)) + LSPLIT=.TRUE. + ENDIF + CALL LCMLEN(IPGEOM,'RADIUS',ILENR,ITP) + CALL LCMLEN(IPGEOM,'SPLITR',ILENSP,LT) + NRAY=0 + NSECT=1 + IF(ILENR.GT.0) THEN + IF(ITP.NE.2)CALL XABORT('LHXUNH: RADIUS MUST BE REAL ') + NRAY=ILENR-1 + NSECT=ILENR + ENDIF + CALL LCMLEN(IPGEOM,'SECTOR',ILENS,ITP) + ALLOCATE(ISECT(NSECT)) + IF(ILENS.GT.0) THEN + IF(ILENS.NE.NSECT) + + CALL XABORT('LHXUNH: INVALID SECTOR DIMENSION(4)') + CALL LCMGET(IPGEOM,'SECTOR',ISECT) + ELSE + ISECT(:NSECT)=1 + ENDIF + IF(ILENSP.GT.0) THEN + IF(LT.NE.1)CALLXABORT('LHXUNH: SPLITR MUST BE INTEGER') + ALLOCATE(JSS(ILENSP)) + CALL LCMGET(IPGEOM,'SPLITR',JSS) + NRAY=0 + DO 246 JP=1,ILENSP + NRAY=NRAY+ABS(JSS(JP)) + 246 CONTINUE + ALLOCATE(ISEC2(I)%ILOCR(NRAY+1)) + MAD=-1 + DO 248 JP=1,ILENS + KSECT=ISECT(JP) + DO 247 JT=1,JSS(JP) + MAD=MAD+1 + ISEC2(I)%ILOCR(MAD+1)=KSECT + 247 CONTINUE + 248 CONTINUE + ISEC2(I)%ILOCR(MAD+2)=ISECT(ILENS+1) + DEALLOCATE(JSS) + ELSE + ALLOCATE(ISEC2(I)%ILOCR(NRAY+1)) + DO 249 JP=1,NSECT + ISEC2(I)%ILOCR(JP)=ISECT(JP) + 249 CONTINUE + ENDIF + DEALLOCATE(ISECT) + ISEC1(I)=NRAY + DO 255 K=1,NRAY+1 + KSECT=ISEC2(I)%ILOCR(K) + IF(KSECT.GT.1) THEN + NREGIO=NREGIO+6*(KSECT-1) + ELSE + NREGIO=NREGIO+1 + ENDIF + 255 CONTINUE + CALL LCMSIX(IPGEOM,' ',2) + 70 CONTINUE + DEALLOCATE(ICELL) +* +* COMPATIBILITE DES DONNEES DES CELLULES D'UN MEME PLAN +* + LZZ=LZ + IAUX=0 + LISP=0 + ALLOCATE(ISS(ISTAT9),ZZZ(LZ+1)) + MZZ=0 + DO 80 I=1,LZ + SIDE=RR(2*ISTAT9+ICC(IAUX+1)) + LCC=2*(ICC(IAUX+1)-1) + Z1=RR(LCC+1) + Z2=RR(LCC+2) + ZZZ(I)=Z1 + ZZZ(I+1)=Z2 + IF(LSPLIT) THEN + LISP=ISSS(ICC(IAUX+1)) + ISS(I)=LISP + MZZ=MZZ+LISP + LZZ=MZZ + ENDIF + DO 75 K=2,NCELP + IAUX=IAUX+1 + IF(SIDE.NE.RR(2*ISTAT9+ICC(IAUX+1))) + + CALL XABORT('LHXUNH: INCOMPATIBLE SIDE ') + LCC=2*(ICC(IAUX+1)-1) + IF((Z1.NE.RR(LCC+1)).OR.(Z2.NE.RR(LCC+2))) + + CALL XABORT('LHXUNH: INCOMPATIBLE MESHZ ') + IF(LSPLIT) THEN + IF(LISP.NE.ISSS(ICC(IAUX+1))) + + CALL XABORT('LHXUNH: INCOMPATIBLE SPLITZ') + ENDIF + 75 CONTINUE + IAUX=IAUX+1 + 80 CONTINUE + DEALLOCATE(RR,ISSS) + MZ=LZ+1 + IF(LSPLIT)MZ=MZZ+1 + ENDIF + ALLOCATE(ZZS(MZ)) + IF(LSPLIT) THEN + LAUX=0 + Z1=ZZZ(1) + ZZS(1)=Z1 + DO 83 K=1,LZ + MSP=ISS(K) + Z2=ZZZ(K+1) + PAS=(Z2-Z1)/REAL(MSP) + DO 81 L=1,MSP-1 + LAUX=LAUX+1 + ZZS(LAUX+1)=Z1+PAS*REAL(L) + 81 CONTINUE + LAUX=LAUX+1 + ZZS(LAUX+1)=Z2 + Z1=Z2 + 83 CONTINUE + ELSE + DO 88 J=1,MZ + ZZS(J)=ZZZ(J) + 88 CONTINUE + ENDIF + DEALLOCATE(ZZZ) +* +* STORAGE DES VALEURS DE Z +* + CALL LCMSIX(IPTRK,'DATA_DUP',1) + LSPLZM=1 + LSPLZP=1 + IF(LSPLIT) THEN + LSPLZM=ISS(1) + LSPLZP=ISS(LZ) + CALL LCMPUT(IPTRK,'SPLITZD',LZ,1,ISS) + ENDIF + IF(NCODE(5) .EQ. 5 .OR. NCODE(5) .EQ. 10) THEN + IF(NCODE(5) .EQ. 5) THEN + MDZ=2*MZ-1-LSPLZM + IOFZD=2+LSPLZM + ELSE + MDZ=2*MZ-1 + IOFZD=2 + ENDIF + ALLOCATE(AQ(MDZ)) + IQ=0 + DO 583 IW=MZ,IOFZD,-1 + AQ(IQ+1)=-ZZS(IW)+ZZS(1)+ZZS(2) + IQ=IQ+1 + 583 CONTINUE + DO 584 IW=1,MZ + AQ(IQ+1)=ZZS(IW) + IQ=IQ+1 + 584 CONTINUE + CALL LCMPUT(IPTRK,'MESHZ',MDZ,2,AQ) + DEALLOCATE(AQ) + ELSEIF(NCODE(6) .EQ. 5 .OR. NCODE(6) .EQ. 10) THEN + IF(NCODE(6) .EQ. 5) THEN + MDZ=2*MZ-LSPLZP-1 + IOFZD=LSPLZP+1 + ELSE + MDZ=2*MZ-1 + IOFZD=1 + ENDIF + ALLOCATE(AQ(MDZ)) + IQ=0 + DO 585 IW=1,MZ + AQ(IQ+1)=ZZS(IW) + IQ=IQ+1 + 585 CONTINUE + DO 586 IW=MZ-IOFZD,1,-1 + AQ(IQ+1)=AQ(IQ)+ZZS(IW+1)-ZZS(IW) + IQ=IQ+1 + 586 CONTINUE + CALL LCMPUT(IPTRK,'MESHZ',MDZ,2,AQ) + DEALLOCATE(AQ) + ELSE + CALL LCMPUT(IPTRK,'MESHZ',MZ,2,ZZS) + ENDIF + CALL LCMSIX(IPTRK,' ',2) + DEALLOCATE(ZZS) +* + IF(IHEX.LT.9) THEN +* +* DUPLICATION DE LA GEOMETRIE CONSIDEREE +* + ALLOCATE(IBB(ISTOR(IHEX)*NCEL)) + CALL DEPLIT(IHEX,NCELP,NCELAP,IBB) + IAUX=NCELP + JAUX=NCELAP + DO 65 K=2,LZ + DO 60 L=1,NCELAP + IBB(JAUX+L)=IBB(L)+IAUX + 60 CONTINUE + IAUX=IAUX+NCELP + JAUX=JAUX+NCELAP + 65 CONTINUE + ELSEIF(IHEX.EQ.9) THEN + NCELAP=NCELA/LZ + ENDIF + IF(LSPLIT)THEN + NCELA=NCELAP*LZZ + ELSE + NCELA=NCELAP*LZ + ENDIF +* +* DUPLICATION DE MERGE ET MIX +* + NBASE=NCELA+NCELA + IF(LGTURN)NBASE=NBASE+NCELA + ALLOCATE(IDD(NBASE),IAD(NCELA)) + IAUX=-1 + JAUX=0 + ICELSP=0 + MAXSP=0 + MINSP=99999 + DO 85 I=1,LZ + IF(IHEX.LT.9) THEN + MAXSP=IBB(JAUX+1) + MINSP=MAXSP + ENDIF + DO 84 J=1,NCELAP + IAUX=IAUX+1 + IF(IHEX.LT.9) THEN + IAD(IAUX+1)=IBB(JAUX+J)+ICELSP + MAXSP=MAX(MAXSP,IBB(JAUX+J)) + MINSP=MIN(MINSP,IBB(JAUX+J)) + IDD(IAUX+1)=ICC(IBB(JAUX+J)) + IDD(NCELA+IAUX+1)=ICC(NCEL+IBB(JAUX+J)) + ELSE + IAD(IAUX+1)=IAUX+1 + IDD(IAUX+1)=ICC(JAUX+J) + IDD(NCELA+IAUX+1)=ICC(NCEL+JAUX+J) + ENDIF + 84 CONTINUE + IF(LSPLIT) THEN + LISP=ISS(I) + DO 86 K=2,LISP + IF(IHEX.LT.9) ICELSP=ICELSP+MAXSP-MINSP+1 + DO 82 J=1,NCELAP + IAUX=IAUX+1 + IF(IHEX.LT.9) THEN + IAD(IAUX+1)=IBB(JAUX+J)+ICELSP + IDD(IAUX+1)=ICC(IBB(JAUX+J)) + IDD(NCELA+IAUX+1)=ISS(NCEL+IBB(JAUX+J)) + ELSE + IAD(IAUX+1)=IAUX+1 + IDD(IAUX+1)=ICC(JAUX+J) + IDD(NCELA+IAUX+1)=ICC(NCEL+JAUX+J) + ENDIF + 82 CONTINUE + 86 CONTINUE + ENDIF + JAUX=JAUX+NCELAP + 85 CONTINUE +* +* DUPLICATION DE TURN +* + MBB=NCELA+NCELA + IF(LGTURN) THEN + IAUX=2*NCEL + JAUX=0 + DO 95 I=1,LZ + IF(IHEX.LT.9) THEN + CALL DUTURN(IHEX,ICC(IAUX+1),NCELP,IDD(MBB+JAUX+1), + + NCELAP,IBB) + ELSE + DO 87 IV=1,NCELAP + IDD(MBB+JAUX+IV)=ICC(IAUX+IV) + 87 CONTINUE + ENDIF + IAUX=IAUX+NCELP + KAUX=JAUX-1 + JAUX=JAUX+NCELAP + IF(LSPLIT) THEN + LISP=ISS(I) + DO 92 J=2,LISP + DO 90 K=1,NCELAP + IDD(MBB+JAUX+1)=IDD(MBB+KAUX+K+1) + JAUX=JAUX+1 + 90 CONTINUE + 92 CONTINUE + ENDIF + 95 CONTINUE + DEALLOCATE(ISS) + ENDIF + IF(IHEX.NE.9) DEALLOCATE(IBB) + DEALLOCATE(ICC) + IF(NCODE(5) .EQ. 5 .OR. NCODE(5) .EQ. 10) THEN +* +* DUPLICATION DE LA SYMETRIE SELON L'AXE Z- +* + IF(NCODE(6) .EQ. 5 .OR. NCODE(6) .EQ. 10) CALL XABORT( + > 'LHXUNH: ONLY ONE Z SYMETRY IS PERMITED') + IF(NCODE(6) .EQ. 5) THEN + KBB=NCELA+NCELA-NCELAP*LSPLZM + IOFZD=LSPLZM + ELSE + KBB=NCELA+NCELA + IOFZD=0 + ENDIF + MCODE=1 + KK=KBB + KBB=2*KBB + IF(LGTURN)KBB=KBB+KK + ALLOCATE(IGG(KBB),IAA(KK)) + IAUX=0 + JAUX=NCELA-NCELAP + LAUX=2*NCELA-NCELAP +* +* DUPLICATION DE MIX ET MERGE +* + NCOUR=IFCOUR(NCELAP) + DO 110 I=IOFZD,LZZ-1 + IPOS=0 + IAA(IAUX+1)=IAD(JAUX+1) + IGG(IAUX+1)=IDD(JAUX+1) + IGG(KK+IAUX+1)=IDD(LAUX+1) + DO 100 J1=2,NCOUR + DO 99 J=IFONC(J1,5)-1,IFONC(J1,0)-1,-1 + IPOS=IPOS+1 + IAA(IAUX+IPOS+1)=IAD(JAUX+J+1) + IGG(IAUX+IPOS+1)=IDD(JAUX+J+1) + IGG(KK+IAUX+IPOS+1)=IDD(LAUX+J+1) + 99 CONTINUE + NCLCOR=1+3*J1*(J1-1) + DO 105 J=NCLCOR-1,IFONC(J1,5),-1 + IPOS=IPOS+1 + IAA(IAUX+IPOS+1)=IAD(JAUX+J+1) + IGG(IAUX+IPOS+1)=IDD(JAUX+J+1) + IGG(KK+IAUX+IPOS+1)=IDD(LAUX+J+1) + 105 CONTINUE + 100 CONTINUE + IAUX=IAUX+NCELAP + JAUX=JAUX-NCELAP + LAUX=LAUX-NCELAP + 110 CONTINUE + DO 115 K=1,NCELA + IAA(IAUX+K)=IAD(K) + IGG(IAUX+K)=IDD(K) + IGG(KK+IAUX+K)=IDD(NCELA+K) + 115 CONTINUE +* +* DUPLICATION DE TURN +* + IF(LGTURN) THEN + IAUX=0 + LAUX=3*NCELA-NCELAP*IOFZD + DO 130 I=IOFZD,LZZ-1 + J=-1 + JAUX2=0 + JAUX1=0 + DO 120 J1=1,NCOUR + LGPASS=.TRUE. + 118 CONTINUE + DO 119 J2=JAUX2,JAUX1,-1 + J=J+1 + ITURN=IDD(LAUX+J2+1) + IF(ITURN.LE.6) THEN + IF(ITURN.EQ.1) THEN + IGG(2*KK+IAUX+J+1)=12 + ELSEIF(ITURN.EQ.2) THEN + IGG(2*KK+IAUX+J+1)=11 + ELSEIF(ITURN.EQ.3) THEN + IGG(2*KK+IAUX+J+1)=10 + ELSEIF(ITURN.EQ.4) THEN + IGG(2*KK+IAUX+J+1)=9 + ELSEIF(ITURN.EQ.5) THEN + IGG(2*KK+IAUX+J+1)=8 + ELSEIF(ITURN.EQ.6) THEN + IGG(2*KK+IAUX+J+1)=7 + ENDIF + ELSEIF(ITURN.LE.12) THEN + IF(ITURN.EQ.12) THEN + IGG(2*KK+IAUX+J+1)=1 + ELSEIF(ITURN.EQ.11) THEN + IGG(2*KK+IAUX+J+1)=2 + ELSEIF(ITURN.EQ.10) THEN + IGG(2*KK+IAUX+J+1)=3 + ELSEIF(ITURN.EQ.9) THEN + IGG(2*KK+IAUX+J+1)=4 + ELSEIF(ITURN.EQ.8) THEN + IGG(2*KK+IAUX+J+1)=5 + ELSEIF(ITURN.EQ.7) THEN + IGG(2*KK+IAUX+J+1)=6 + ENDIF + ELSE + CALL XABORT('LHXUNH: EXPECTED VALUE OF TURN ') + ENDIF + 119 CONTINUE + IF(LGPASS) THEN + JAUX2=1+3*J1*(J1-1)-1 + JAUX1=IFONC(J1,5) + LGPASS=.FALSE. + IF(J1.GT.1) GOTO 118 + ENDIF + JAUX2=IFONC(J1+1,5)-1 + JAUX1=IFONC(J1+1,0)-1 + 120 CONTINUE + IAUX=IAUX+NCELAP + LAUX=LAUX-NCELAP + 130 CONTINUE + ENDIF + DO 135 K=1,NCELA + IGG(2*KK+IAUX+K)=IDD(2*NCELA+K) + 135 CONTINUE + IPLANI=LZZ + LZZ=2*LZZ-IOFZD + ELSEIF(NCODE(6) .EQ. 5 .OR. NCODE(6) .EQ. 10) THEN +* +* DULPLICATION DE LA GEOMETRIE SELON Z+ +* + IF(NCODE(6) .EQ. 5) THEN + KBB=NCELA+NCELA-NCELAP*LSPLZP + IOFZD=LSPLZP + ELSE + KBB=NCELA+NCELA + IOFZD=0 + ENDIF + MCODE=2 + KK=KBB + KBB=2*KBB + IF(LGTURN)KBB=KBB+KK + ALLOCATE(IGG(KBB),IAA(KK)) +* +* DUPLICATION DE MIX ET MERGE +* + DO 140 I=1,NCELA + IAA(I)=IAD(I) + IGG(I)=IDD(I) + IGG(KK+I)=IDD(NCELA+I) + 140 CONTINUE + NCOUR=IFCOUR(NCELAP) + LFIN=-NCELAP*IOFZD+NCELA + IPOS=-1 + DO 145 I=IOFZD,LZZ-1 + LFIN=LFIN-NCELAP + IPOS=IPOS+1 + IAA(NCELA+IPOS+1)=IAD(LFIN+1) + IGG(NCELA+IPOS+1)=IDD(LFIN+1) + IGG(KK+NCELA+IPOS+1)=IDD(NCELA+LFIN+1) + DO 143 J1=2,NCOUR + DO 141 J=IFONC(J1,5)-1,IFONC(J1,0)-1,-1 + IPOS=IPOS+1 + IAA(NCELA+IPOS+1)=IAD(LFIN+J+1) + IGG(NCELA+IPOS+1)=IDD(LFIN+J+1) + IGG(KK+NCELA+IPOS+1)=IDD(NCELA+LFIN+J+1) + 141 CONTINUE + NCLCOR=1+3*J1*(J1-1) + DO 142 J=NCLCOR-1,IFONC(J1,5),-1 + IPOS=IPOS+1 + IAA(NCELA+IPOS+1)=IAD(LFIN+J+1) + IGG(NCELA+IPOS+1)=IDD(LFIN+J+1) + IGG(KK+NCELA+IPOS+1)=IDD(NCELA+LFIN+J+1) + 142 CONTINUE + 143 CONTINUE + 145 CONTINUE +* +* DUPLICATION DE TURN +* + IF(LGTURN) THEN + DO 150 I=1,NCELA + IGG(2*KK+I)=IDD(2*NCELA+I) + 150 CONTINUE + LFIN=-NCELAP*IOFZD+NCELA + J=-1+NCELA + DO 155 JP=IOFZD,LZZ-1 + LFIN=LFIN-NCELAP + JAUX2=0 + JAUX1=0 + DO 154 J1=1,NCOUR + LGPASS=.TRUE. + 152 CONTINUE + DO 153 J2=JAUX2,JAUX1,-1 + J=J+1 + ITURN=IDD(2*NCELA+LFIN+J2+1) + IF(ITURN.LE.6) THEN + IF(ITURN.EQ.1) THEN + IGG(2*KK+J+1)=12 + ELSEIF(ITURN.EQ.2) THEN + IGG(2*KK+J+1)=11 + ELSEIF(ITURN.EQ.3) THEN + IGG(2*KK+J+1)=10 + ELSEIF(ITURN.EQ.4) THEN + IGG(2*KK+J+1)=9 + ELSEIF(ITURN.EQ.5) THEN + IGG(2*KK+J+1)=8 + ELSEIF(ITURN.EQ.6) THEN + IGG(2*KK+J+1)=7 + ENDIF + ELSEIF(ITURN.LE.12) THEN + IF(ITURN.EQ.12) THEN + IGG(2*KK+J+1)=1 + ELSEIF(ITURN.EQ.11) THEN + IGG(2*KK+J+1)=2 + ELSEIF(ITURN.EQ.10) THEN + IGG(2*KK+J+1)=3 + ELSEIF(ITURN.EQ.9) THEN + IGG(2*KK+J+1)=4 + ELSEIF(ITURN.EQ.8) THEN + IGG(2*KK+J+1)=5 + ELSEIF(ITURN.EQ.7) THEN + IGG(2*KK+J+1)=6 + ENDIF + ELSE + CALL XABORT('LHXUNH: EXPECTED VALUE OF TURN ') + ENDIF + 153 CONTINUE + IF(LGPASS) THEN + JAUX2=1+3*J1*(J1-1)-1 + JAUX1=IFONC(J1,5) + LGPASS=.FALSE. + IF(J1.GT.1) GOTO 152 + ENDIF + JAUX2=IFONC(J1+1,5)-1 + JAUX1=IFONC(J1+1,0)-1 + 154 CONTINUE + 155 CONTINUE + ENDIF + IPLANI=LZZ + LZZ=2*LZZ-IOFZD + ELSE + ALLOCATE(IGG(NBASE),IAA(NCELA)) + DO 156 J=1,NBASE + IGG(J)=IDD(J) + 156 CONTINUE + DO 157 J=1,NCELA + IAA(J)=IAD(J) + 157 CONTINUE + KK=NCELA + ENDIF + DEALLOCATE(IDD,IAD) +* +* RESTORAGE DES DONNEES +* + NCELA=KK + MVOSU=0 + MVOLUM=0 + MESH=3*KK + NSMIN=0 + NSMAX=0 + ISURF=0 + NCOUR=1 + IF(NCELAP.GT.1)NCOUR=IFCOUR(NCELAP) + ICELC0= IFONC(NCOUR,0) + ICELC1= IFONC(NCOUR,1)-ICELC0 + MCOU=1 + LCOU=1 + ALLOCATE(SURL(2*LZZ)) + SURL(:2*LZZ)=0 + IF(LGCELL) THEN + CALL LCMSIX(IPTRK,'DATA_DUP',1) + CALL LCMPUT(IPTRK,'GENER0',KK,1,IAA) + CALL LCMPUT(IPTRK,'GENERATING',KK,1,IGG) + CALL LCMSIX(IPTRK,' ',2) + DEALLOCATE(IAA) + NRAY=0 + NCDP=NCELA-NCELAP + ICELL1=IFONC(NCOUR,5) + IP=1 + ISAUX=0 + DO 200 I=0,KK-1 + KRAY=ISEC1(IGG(I+1)) + NRAY=NRAY+KRAY + I1=I+1 + DO 205 JR=1,KRAY+1 + KSECT=ISEC2(IGG(I+1))%ILOCR(JR) + IF(KSECT.GT.1) THEN + MSEC=6*(KSECT-1) + MVOSU=MVOSU+MSEC + IF(I1.LE.NCELAP)THEN + NSMIN=NSMIN+MSEC + ELSEIF(I1.GT.NCDP) THEN + NSMAX=NSMAX+MSEC + ENDIF + ELSE + MVOSU=MVOSU+1 + IF(I1.LE.NCELAP)THEN + NSMIN=NSMIN+1 + ELSEIF(I1.GT.NCDP) THEN + NSMAX=NSMAX+1 + ENDIF + ENDIF + 205 CONTINUE + IF(IHEX.EQ.9) THEN + IF(MCODE.EQ.1) THEN + IF(I1.LE.NCELAP) THEN + IF(I1.LE.LCOU) THEN + VLAT(MCOU)=NSMIN + IF(I1.EQ.IFONC(MCOU,5)) VLAT(NCOUR+MCOU)=NSMIN + ELSE + LCOU=LCOU+6*MCOU + MCOU=MCOU+1 + ENDIF + ENDIF + ELSEIF(MCODE.EQ.2) THEN + IF(I1.GT.NCDP) THEN + I2=I1-NCDP + IF(I2.LE.LCOU) THEN + VLAT(MCOU)=NSMAX + IF(I2.EQ.IFONC(MCOU,5)) VLAT(NCOUR+MCOU)=NSMAX + ELSE + LCOU=LCOU+6*MCOU + MCOU=MCOU+1 + ENDIF + ENDIF + ENDIF + ENDIF + ICOX=INT(AINT(REAL(I1)/REAL(NCELAP))) + IF(MOD(I1,NCELAP).NE.0)ICOX=ICOX+1 + ICOX=ICOX-1 + ICX=NCELAP*ICOX + ICELC=ICELC0+ICX + ICLIM=NCELAP+ICX + IF(I1.GE.ICELC.AND.I1.LE.ICLIM) THEN + IF(KSECT.GT.1) THEN + ISURF=ISURF+2*(KSECT-1) + ISURF0=ISURF + IF(MOD(I1-ICELC,ICELC1).EQ.0)ISURF=ISURF+KSECT-1 + IF(I1.LE.NCELAP*IP) THEN + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=KSECT-1 + IF(I1.EQ.ICELL1+NXX) SURL(LZZ+IP)=ISURF0-ISAUX + SURL(IP)=ISURF + ELSE + ISAUX=0 + IP=IP+1 + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=KSECT-1 + ENDIF + ELSE + ISURF=ISURF+2 + ISURF0=ISURF + IF(MOD(I1-ICELC,ICELC1).EQ.0)ISURF=ISURF+1 + IF(I1.LE.NCELAP*IP) THEN + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=1 + IF(I1.EQ.ICELL1+NXX) SURL(LZZ+IP)=ISURF0-ISAUX + SURL(IP)=ISURF + ELSE + ISAUX=0 + IP=IP+1 + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=1 + ENDIF + ENDIF + ENDIF + MVOLUM=MVOLUM+KRAY+1 + 200 CONTINUE + DO 206 I=1,ISTAT9 + DEALLOCATE(ISEC2(I)%ILOCR) + 206 CONTINUE + MESH=MESH+NRAY + IF(IPLANZ.EQ.1) NSMAX=NSMIN + ELSE + CALL LCMSIX(IPTRK,'DATA_DUP',1) + CALL LCMPUT(IPTRK,'MIX',KK,1,IGG) + CALL LCMSIX(IPTRK,' ',2) + NCDP=NCELA-NCELAP + MVOLUM=KK + NCOUR=IFCOUR(NCELAP) + ICELL1=IFONC(NCOUR,5) + IP=1 + ISAUX=0 + DO 210 I=0,KK-1 + I1=I+1 + KSECT=ISEC1(IGG(I+1)) + ICOX=INT(AINT(REAL(I1)/REAL(NCELAP))) + IF(MOD(I1,NCELAP).NE.0)ICOX=ICOX+1 + ICOX=ICOX-1 + ICXX=NCELAP*ICOX + ICELC=ICELC0+ICXX + ICLIM=NCELAP+ICXX + IF(KSECT.GT.1) THEN + MSEC=6*(KSECT-1) + MVOSU=MVOSU+MSEC + IF(I1.LE.NCELAP)THEN + NSMIN=NSMIN+MSEC + ELSEIF(I1.GT.NCDP) THEN + NSMAX=NSMAX+MSEC + ENDIF + IF(I1.GE.ICELC.AND.I1.LE.ICLIM) THEN + ISURF=ISURF+2*(KSECT-1) + ISURF0=ISURF + IF(MOD(I1-ICELC,ICELC1).EQ.0)ISURF=ISURF+KSECT-1 + IF(I1.LE.NCELAP*IP) THEN + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=KSECT-1 + IF(I1.EQ.ICELL1+NXX) SURL(LZZ+IP)=ISURF0-ISAUX + SURL(IP)=ISURF + ELSE + ISAUX=0 + IP=IP+1 + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=KSECT-1 + ENDIF + ENDIF + ELSE + MVOSU=MVOSU+1 + IF(I1.LE.NCELAP)THEN + NSMIN=NSMIN+1 + ELSEIF(I1.GT.NCDP) THEN + NSMAX=NSMAX+1 + ENDIF + IF(I1.GE.ICELC.AND.I1.LE.ICLIM) THEN + ISURF=ISURF+2 + ISURF0=ISURF + IF(MOD(I1-ICELC,ICELC1).EQ.0)ISURF=ISURF+1 + IF(I1.LE.NCELAP*IP) THEN + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=1 + IF(I1.EQ.ICELL1+NXX) SURL(LZZ+IP)=ISURF0-ISAUX + SURL(IP)=ISURF + ELSE + ISAUX=0 + IP=IP+1 + NXX=NCELAP*(IP-1) + IF(I1.EQ.ICELC0+NXX) ISAUX=1 + ENDIF + ENDIF + ENDIF + IF(IHEX.EQ.9) THEN + IF(MCODE.EQ.1) THEN + IF(I1.LE.NCELAP) THEN + IF(I1.LE.LCOU) THEN + VLAT(MCOU)=NSMIN + IF(I1.EQ.IFONC(MCOU,5)) VLAT(NCOUR+MCOU)=NSMIN + ELSE + LCOU=LCOU+6*MCOU + MCOU=MCOU+1 + ENDIF + ENDIF + ELSEIF(MCODE.EQ.2) THEN + IF(I1.GT.NCDP) THEN + I2=I1-NCDP + IF(I2.LE.LCOU) THEN + VLAT(MCOU)=NSMAX + IF(I2.EQ.IFONC(MCOU,5)) VLAT(NCOUR+MCOU)=NSMAX + ELSE + LCOU=LCOU+6*MCOU + MCOU=MCOU+1 + ENDIF + ENDIF + ENDIF + ENDIF + 210 CONTINUE + IF(IPLANZ.EQ.1) NSMAX=NSMIN + ENDIF + DEALLOCATE(ISEC2,ISEC1) + CALL LCMSIX(IPTRK,'DATA_DUP',1) + CALL LCMPUT(IPTRK,'SURL_HEX',2*LZZ,1,SURL) + CALL LCMPUT(IPTRK,'MERGE',KK,1,IGG(KK+1)) + IF(LGTURN)CALL LCMPUT(IPTRK,'TURN',KK,1,IGG(2*KK+1)) + CALL LCMSIX(IPTRK,' ',2) + DEALLOCATE(IGG,SURL) +* +* MODIFICATION DU VECTEUR STATE +* + ISTATE(5)=LZZ + IPLANZ=LZZ + ENDIF + ISTATE(3)=NCELAP + ISURF=ISURF+NSMIN+NSMAX + RETURN + END |
