summaryrefslogtreecommitdiff
path: root/Dragon/src/NXTRPS.f
diff options
context:
space:
mode:
Diffstat (limited to 'Dragon/src/NXTRPS.f')
-rw-r--r--Dragon/src/NXTRPS.f190
1 files changed, 190 insertions, 0 deletions
diff --git a/Dragon/src/NXTRPS.f b/Dragon/src/NXTRPS.f
new file mode 100644
index 0000000..8770e26
--- /dev/null
+++ b/Dragon/src/NXTRPS.f
@@ -0,0 +1,190 @@
+*DECK NXTRPS
+ SUBROUTINE NXTRPS(IPTRK ,IPRINT,ITYPG ,IGEO ,ILEV ,
+ > NREG ,NSUR ,NSURN ,IDFEX ,
+ > INDXSR,DHPIN ,DCMESH,NASUR ,IDSUR )
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Renumber pin cluster surfaces.
+*
+*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
+* IPTRK pointer to the TRACKING data structure.
+* IPRINT intermediate printing level for output.
+* ITYPG type of geometry.
+* IGEO geometry number.
+* ILEV geometry level.
+* NREG maximum number of regions in split geometry.
+* NSUR maximum number of surfaces in split geometry.
+* NSURN number of surfaces in splitted geometry after symmetry.
+* IDFEX flag to identify surface to consider.
+* INDXSR local indexing of surfaces/regions.
+* DHPIN pins height.
+* DCMESH cell dimensions.
+*
+*Parameters: input/output
+* NASUR last surcace number considered.
+* IDSUR surface identifier after symmetry.
+*
+*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) IPTRK
+ INTEGER IPRINT,ITYPG,IGEO,ILEV,
+ > NREG,NSUR,NSURN
+ INTEGER IDFEX(0:8),INDXSR(5,-NSUR:NREG)
+ DOUBLE PRECISION DHPIN,DCMESH(3,2)
+ INTEGER NASUR,IDSUR(NSUR)
+*----
+* Local parameters
+*----
+ INTEGER IOUT
+ CHARACTER NAMSBR*6
+ PARAMETER (IOUT=6,NAMSBR='NXTRPS')
+ DOUBLE PRECISION DZERO,DONE,DTWO
+ PARAMETER (DZERO=0.0D0,DONE=1.0D0,DTWO=2.0D0)
+*----
+* Local variables
+*----
+ INTEGER IDGPP,IAS(2),IDIRS(2),ISUR,ID,IND,
+ > IDIRC,INV,LSTSUR,IDS,INS
+ CHARACTER NAMREC*12
+ DOUBLE PRECISION DCTOP,DCBOT,DOFF,DPBOT,DPTOP
+*----
+* Allocatable arrays
+*----
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: INREN
+*----
+* Data
+*----
+ CHARACTER CLEV(2)*1
+ SAVE CLEV
+ DATA CLEV /'C','P'/
+*----
+* Processing starts:
+* print routine openning output header if required
+* and initialize various parameters.
+*----
+ ALLOCATE(INREN(NSURN))
+ IF(IPRINT .GE. 100) THEN
+ WRITE(IOUT,6000) NAMSBR
+ WRITE(IOUT,6012)
+ WRITE(IOUT,6014) (IDSUR(IDS),IDS=1,NSUR)
+ ENDIF
+*----
+* Select main pin direction
+*----
+ IDGPP=3
+ IF(ITYPG .EQ. 10 .OR. ITYPG .EQ. 21) THEN
+ IDGPP=1
+ ELSE IF(ITYPG .EQ. 11 .OR. ITYPG .EQ. 22) THEN
+ IDGPP=2
+ ENDIF
+*----
+* Find if pin reaches bottom or top surface
+*----
+ DCTOP=DCMESH(IDGPP,1)/DTWO
+ DCBOT=-DCTOP
+ DOFF=DCMESH(IDGPP,2)
+ DPBOT=DCMESH(IDGPP,2)-DHPIN/DTWO
+ DPTOP=DPBOT+DHPIN
+ IAS(1)=0
+ IF(DPBOT .LE. DCBOT .AND. DPTOP .GE. DCBOT) IAS(1)=1
+ IAS(2)=0
+ IF(DPBOT .LE. DCTOP .AND. DPTOP .GE. DCTOP) IAS(2)=1
+ IDIRS(2)=2*IDGPP
+ IDIRS(1)=IDIRS(2)-1
+*----
+* get rid of radial surfaces
+*----
+ DO ISUR=1,NSUR
+ IF(INDXSR(4,-ISUR) .EQ. -2) THEN
+ IDSUR(ISUR)=0
+ ENDIF
+ ENDDO
+*----
+* Get rid of botton and top surfaces if not used
+*----
+ DO ID=1,2
+ IND=-ID
+ IDIRC=IDIRS(ID)
+ IF(IAS(ID) .EQ. 0 .OR. IDFEX(IDIRC) .EQ. 0) THEN
+ DO ISUR=1,NSUR
+ IF(INDXSR(IDGPP,-ISUR) .EQ. IND) THEN
+ IDSUR(ISUR)=0
+ ENDIF
+ ENDDO
+ ENDIF
+ ENDDO
+*----
+* Renumber surfaces
+*----
+ INREN(:NSURN)=0
+ INV=0
+ DO ISUR=1,NSUR
+ IND=IDSUR(ISUR)
+ IF(IND .GT. 0) THEN
+ INV=INV+1
+ INREN(IND)=INV
+ ENDIF
+ ENDDO
+ LSTSUR=INV+NASUR
+ DO ISUR=1,NSUR
+ IDS=IDSUR(ISUR)
+ IF(IDS .NE. 0) THEN
+ INS=INREN(ABS(IDS))
+ IF(INS .NE. 0) INS=INS+NASUR
+ IF(IDS .LT. 0) THEN
+ IDSUR(ISUR)=-INS
+ ELSE
+ IDSUR(ISUR)=INS
+ ENDIF
+ ENDIF
+ ENDDO
+ NASUR=LSTSUR
+ WRITE(NAMREC,'(A1,I8.8,A3)') CLEV(ILEV),IGEO,'SID'
+ CALL LCMPUT(IPTRK,NAMREC,NSUR,1,IDSUR)
+*----
+* Processing finished:
+* print routine closing output header if required
+* and return
+*----
+ IF(IPRINT .GE. 100) THEN
+ WRITE(IOUT,6013)
+ WRITE(IOUT,6014) (IDSUR(IDS),IDS=1,NSUR)
+ WRITE(IOUT,6001) NAMSBR
+ ENDIF
+ DEALLOCATE(INREN)
+ RETURN
+*----
+* FORMATS
+*----
+*----
+* Output formats
+*----
+ 6000 FORMAT('(* Output from --',A6,'-- follows ')
+ 6001 FORMAT(' Output from --',A6,'-- completed *)')
+ 6012 FORMAT(' Original surfaces ID')
+ 6013 FORMAT(' Final surfaces ID')
+ 6014 FORMAT(5I15)
+ END