summaryrefslogtreecommitdiff
path: root/Dragon/src/PSPXEL.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/PSPXEL.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/PSPXEL.f')
-rw-r--r--Dragon/src/PSPXEL.f200
1 files changed, 200 insertions, 0 deletions
diff --git a/Dragon/src/PSPXEL.f b/Dragon/src/PSPXEL.f
new file mode 100644
index 0000000..c09c113
--- /dev/null
+++ b/Dragon/src/PSPXEL.f
@@ -0,0 +1,200 @@
+*DECK PSPXEL
+ SUBROUTINE PSPXEL(IPRINT,ISPSP ,ICOLR ,NDIM ,NSUR ,NVOL ,
+ > NTOTCL,MAXR ,
+ > MINDIM,MAXDIM,KEYMRG,INDEX ,REMESH,COLREG)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Graphics for 2-D cluster geometry.
+*
+*Copyright:
+* Copyright (C) 1999 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
+* IPRINT print level.
+* ISPSP psp file unit.
+* ICOLR color set used:
+* = -4 fill hsb with no-contour;
+* = -3 fill cmyk with no-contour;
+* = -2 fill rgb with no-contour;
+* = -1 fill bw with no-contour;
+* = 0 no fill contour only;
+* = 1 fill bw and contour;
+* = 2 fill rgb and contour;
+* = 3 fill cmyk and contour;
+* = 4 fill hsb and contour.
+* NDIM number of dimensions.
+* NSUR number of surfaces.
+* NVOL number of regions.
+* NTOTCL number of cylinders.
+* MAXR dimension of REMESH vector.
+* MINDIM min index values for axes.
+* MAXDIM max index values for axes.
+* KEYMRG merge index.
+* INDEX numbering of surfaces and zones.
+* REMESH meshing.
+* COLREG region color.
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT NONE
+ INTEGER IOUT,NPTS,MXDIM,NXY,NINT
+ CHARACTER NAMSBR*6
+ REAL PI,DIMX,DIMY,WLINE
+ PARAMETER (IOUT=6,NPTS=4,MXDIM=3,NXY=2,NINT=16,
+ > PI=3.1415926535897932,
+ > DIMX=3.5,DIMY=3.5,WLINE=0.002,NAMSBR='PSPXEL')
+*----
+* ROUTINE PARAMETERS
+*----
+ INTEGER IPRINT,ISPSP,ICOLR,NDIM,
+ > NSUR,NVOL,NTOTCL,MAXR
+ INTEGER MINDIM(NTOTCL),MAXDIM(NTOTCL),
+ > KEYMRG(NSUR:NVOL),INDEX(4,NSUR:NVOL)
+ REAL REMESH(MAXR),COLREG(4,NVOL)
+*----
+* LOCAL PARAMETERS
+*----
+ INTEGER ICOL,ICONT,IDIR,IVOL,IMRG,
+ > IX,IY,IR,ICL,NSEG,IORDER(NINT)
+ REAL WLFAC,RCIRC,OFFDIR(MXDIM),XYPOS(NXY,NPTS),
+ > FACT,CENTER(NXY),RADANG(NXY,NINT)
+ INTEGER KFS,KFR,KSS,KSR
+*----
+* INITIALIZE
+* ICOL FOR COLOR (NONE, BW, RGB)
+* ICONT FOR CONTOUR (WITH OR WITHOUT CONTOUR)
+*----
+ IF(IPRINT .GE. 10) THEN
+ WRITE(IOUT,6000) NAMSBR
+ ENDIF
+ KFS=0
+ KFR=0
+ KSS=0
+ KSR=0
+ ICONT=1
+ WLFAC=1.0
+ ICOL=ABS(ICOLR)
+ IF(ICOLR .EQ. 0) THEN
+ WLFAC=2.5
+ ELSE IF(ICOLR .LT. 0) THEN
+ ICONT=0
+ ELSE
+ KFS=1
+ KSR=1
+ ENDIF
+*----
+* COMPUTE THE CIRCUMSCRIBED RADIUS
+* THE COORDINATE FOR THE TRUE CENTER OF THE CELL
+*----
+ RCIRC= 0.0
+ DO 100 IDIR=1,NDIM
+ OFFDIR(IDIR)=0.5
+ > *(REMESH(MAXDIM(IDIR))+REMESH(MINDIM(IDIR)))
+ RCIRC=MAX(RCIRC,
+ > 0.5*(REMESH(MAXDIM(IDIR))-REMESH(MINDIM(IDIR))))
+ 100 CONTINUE
+*----
+* LOCATE PEN AT CENTER OF CELL
+* DETERMINE DIMENSION OF GRAPH USING CELL LIMIT
+* FOR HEXAGONAL CELL PRINT HEXAGONAL REGION
+* FOR CARTESIAN CELL PRINT CARTESIAN REGION
+*----
+ XYPOS(1,1)=DIMX
+ XYPOS(2,1)=DIMY
+ CALL PSMOVE(ISPSP,XYPOS(1,1),-3)
+ FACT=DIMX/RCIRC
+*----
+* SCAN ALL REGIONS AND LOCATE POSITION
+* REGION NUMBER FROM INSIDE ANNULUS
+* TO EXTERIOR CARTESIAN
+*----
+ DO 110 IVOL=NVOL,1,-1
+ IMRG=KEYMRG(IVOL)
+ IF(IMRG .NE. 0) THEN
+*----
+* CARTESIAN CELL POSITION IN X AND Y
+*----
+ IX=INDEX(1,IVOL)
+ IY=INDEX(2,IVOL)
+ XYPOS(1,1)=FACT*(REMESH(IX)-OFFDIR(1))
+ XYPOS(2,1)=FACT*(REMESH(IY)-OFFDIR(2))
+ XYPOS(1,2)=FACT*(REMESH(IX+1)-OFFDIR(1))
+ XYPOS(2,2)=XYPOS(2,1)
+ XYPOS(1,3)=XYPOS(1,2)
+ XYPOS(2,3)=FACT*(REMESH(IY+1)-OFFDIR(2))
+ XYPOS(1,4)=XYPOS(1,1)
+ XYPOS(2,4)=XYPOS(2,3)
+ IF(INDEX(4,IVOL) .EQ. 0) THEN
+*----
+* CARTESIAN POSITION GEOMETRY LOCATED
+* COLOR AND TRACE IT
+*----
+ CALL PSDREG(ISPSP,NPTS,XYPOS)
+ IF(ICOL. GT. 0) THEN
+ CALL PSFILL(ISPSP,ICOL,COLREG(1,IVOL),KFS,KFR)
+ ENDIF
+ IF(ICONT.EQ.1) THEN
+ CALL PSSTRK(ISPSP,WLFAC*WLINE,KSS,KSR)
+ ENDIF
+ ELSE
+*----
+* CARTESIAN GEOMETRY CONTAINS ANNULAR SUBDIVISION
+* DETERMINE WHICH ANNULUS
+*----
+ DO 111 ICL=4,NTOTCL
+ IR=INDEX(4,IVOL)
+ IF( IR .GE. MINDIM(ICL)-1 .AND.
+ > IR .LT. MAXDIM(ICL) ) THEN
+*----
+* ANNULUS IS DETERMINED
+* LOCATE ANNULAR/CARTESIAN AND ORDER CARTESIAN POINTS
+* FOR GEOMETRY TRACING
+*----
+ CENTER(1)=FACT*(REMESH(MINDIM(ICL)-2)-OFFDIR(1))
+ CENTER(2)=FACT*(REMESH(MINDIM(ICL)-1)-OFFDIR(2))
+ RCIRC=FACT*SQRT(REMESH(IR+1))
+ CALL PSPRAI(NINT,NPTS,XYPOS,CENTER,RCIRC,
+ > NSEG,IORDER,RADANG)
+*----
+* COLOR AND TRACE RESULT
+*----
+ CALL PSMOVE(ISPSP,CENTER(1),-3)
+ CALL PSDRAI(ISPSP,NSEG,IORDER,CENTER,RADANG)
+ IF(ICOL. GT. 0) THEN
+ CALL PSFILL(ISPSP,ICOL,COLREG(1,IVOL),KFS,KFR)
+ ENDIF
+ IF(ICONT.EQ.1) THEN
+ CALL PSSTRK(ISPSP,WLFAC*WLINE,KSS,KSR)
+ ENDIF
+ CENTER(1)=-CENTER(1)
+ CENTER(2)=-CENTER(2)
+ CALL PSMOVE(ISPSP,CENTER(1),-3)
+ GO TO 115
+ ENDIF
+ 111 CONTINUE
+ 115 CONTINUE
+ ENDIF
+ ENDIF
+ 110 CONTINUE
+ XYPOS(1,1)=-DIMX
+ XYPOS(2,1)=-DIMY
+ CALL PSMOVE(ISPSP,XYPOS(1,1),-3)
+ IF(IPRINT .GE. 10) THEN
+ WRITE(IOUT,6001) NAMSBR
+ ENDIF
+ RETURN
+*----
+* Output formats
+*----
+ 6000 FORMAT('(* Output from --',A6,'-- follows ')
+ 6001 FORMAT(' Output from --',A6,'-- completed *)')
+ END