Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
11 KiB

2 years ago
C Copyright(C) 1999-2020 National Technology & Engineering Solutions
C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
C NTESS, the U.S. Government retains certain rights in this software.
C
C See packages/seacas/LICENSE for details
C=======================================================================
SUBROUTINE DBSEL (A, IA, INLINE,
& SELTYP, IFLD, INTYP, CFIELD, IFIELD, RFIELD,
& NAMES, TIMES, WHOTIM, NPTIMS, IPTIMS,
& IDELB, LENE, IDNPS, IDESS,
& NCSTEP, LISNP, NLISEL, LISEL, LISNPS, LISESS,
& LISHV, LISGV, LISNV, LISEV, MAPEL, MAPND)
C=======================================================================
C --*** DBSEL *** (BLOT) Process SELECT commands
C -- Written by Amy Gilkey - revised 03/07/88
C --
C --DBSEL inputs and executes a SELECT command.
C --
C --Parameters:
C -- A - IN - the dynamic memory base array
C -- INLINE - IN/OUT - the parsed input lines for the log file
C -- SELTYP - IN - the selection type
C -- IFLD, INTYP, CFIELD, IFIELD, RFIELD - IN/OUT - the free-field
C -- reader index and fields
C -- NAMES - IN - the variable names
C -- TIMES - IN - the times for all time steps
C -- WHOTIM - IN - true iff whole (versus history) time step
C -- NPTIMS - IN - the number of selected time steps
C -- IPTIMS - IN - the selected time steps
C -- IDELB - IN - the element block ID for each block
C -- LENE - IN - the cumulative element counts by element block
C -- IDNPS - IN - the node set ID for each set
C -- IDESS - IN - the side set ID for each set
C -- NCSTEP - IN/OUT - the current step number for display
C -- LISNP - IN/OUT - the indices of the selected coordinates
C -- NLISEL - IN/OUT - the number of selected elements for each block
C -- LISEL - IN/OUT - the indices of the selected elements (by block)
C -- LISNPS - IN/OUT - the indices of the selected node sets
C -- LISESS - IN/OUT - the indices of the selected side sets
C -- LISHV - IN/OUT - the indices of the selected history variables
C -- LISGV - IN/OUT - the indices of the selected global variables
C -- LISNV - IN/OUT - the indices of the selected nodal variables
C -- LISEV - IN/OUT - the indices of the selected element variables
C --
C --Common Variables:
C -- Uses NDIM, NUMNP, NUMEL, NELBLK, NVARHI, NVARGL, NVARNP, NVAREL,
C -- NSTEPS of /DBNUMS/
C -- Uses NUMNPS, NUMESS of /DBNUMG/
include 'params.blk'
include 'dbnums.blk'
include 'dbnumgq.blk'
DIMENSION A(*)
INTEGER IA(*)
CHARACTER*(*) INLINE(*)
CHARACTER*(*) SELTYP
INTEGER INTYP(*)
CHARACTER*(*) CFIELD(*)
INTEGER IFIELD(*)
REAL RFIELD(*)
CHARACTER*(*) NAMES(*)
REAL TIMES(*)
LOGICAL WHOTIM(*)
INTEGER IPTIMS(*)
INTEGER IDELB(*)
INTEGER LENE(0:*)
INTEGER IDNPS(*)
INTEGER IDESS(*)
INTEGER LISNP(0:*)
INTEGER NLISEL(0:*), LISEL(0:*)
INTEGER LISNPS(0:*), LISESS(0:*)
INTEGER LISHV(0:*), LISGV(0:*), LISNV(0:*), LISEV(0:*)
INTEGER MAPEL(*)
INTEGER MAPND(*)
CHARACTER*(MXSTLN) STYP
LOGICAL FIRST
SAVE FIRST
C --FIRST - true iff first time through routine
CHARACTER*(MXSTLN) CMDTBL(14)
SAVE CMDTBL
C --CMDTBL - the valid commands table
DATA FIRST / .TRUE. /
C --Command table follows. Remember to change the dimensioned size when
C --changing the table.
DATA CMDTBL /
1 'NODES ', 'ELEMENTS', 'BLOCKS ', 'MATERIAL',
2 'NSETS ', 'SSETS ',
3 'HVARS ', 'GVARS ', 'NVARS ', 'EVARS ',
4 'READ ', 'STEP ', 'TIME ',
5 ' ' /
C --Get the command STYP
CALL ABRSTR (STYP, SELTYP, CMDTBL)
IF (STYP .EQ. ' ') STYP = SELTYP
C *** Initialization ***
C --Reset parameters
IF (FIRST .OR. (STYP .EQ. 'RESET')) THEN
LISNP(0) = NUMNP
DO 100 I = 1, NUMNP
LISNP(I) = I
100 CONTINUE
NLISEL(0) = NELBLK
DO 110 I = 1, NELBLK
NLISEL(I) = LENE(I) - LENE(I-1)
110 CONTINUE
LISEL(0) = NUMEL
DO 120 I = 1, NUMEL
LISEL(I) = I
120 CONTINUE
LISNPS(0) = NUMNPS
DO 130 I = 1, NUMNPS
LISNPS(I) = I
130 CONTINUE
LISESS(0) = NUMESS
DO 140 I = 1, NUMESS
LISESS(I) = I
140 CONTINUE
IF (EXODUS) THEN
LISHV(0) = NVARHI
DO 150 I = 1, NVARHI
LISHV(I) = I
150 CONTINUE
LISGV(0) = NVARGL
DO 160 I = 1, NVARGL
LISGV(I) = I
160 CONTINUE
LISNV(0) = NVARNP
DO 170 I = 1, NVARNP
LISNV(I) = I
170 CONTINUE
LISEV(0) = NVAREL
DO 180 I = 1, NVAREL
LISEV(I) = I
180 CONTINUE
END IF
NCSTEP = MIN (1, NSTEPS)
FIRST = .FALSE.
END IF
IF ((STYP .EQ. 'RESET') .OR. (STYP .EQ. 'reset')) GOTO 230
C *** GENESIS Print Commands ***
IF (STYP .EQ. 'NODES') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKNONE (NUMNP, .FALSE., 'nodes', *220)
CALL RMIXINT (INLINE(1), IFLD, INTYP, CFIELD, IFIELD,
& 'node number', NUMNP, LISNP(0), LISNP(1), MAPND, *220)
IF (LISNP(0) .GT. 0) THEN
CALL PRNSEL (LISNP(0), NUMNP, 'nodes')
END IF
ELSE IF (STYP .EQ. 'ELEMENTS') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKNONE (NUMEL, .FALSE., 'elements', *220)
CALL MDRSRV ('SCRSEL', KLEL, 1+NUMEL)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 220
CALL RMIXINT (INLINE(1), IFLD, INTYP, CFIELD, IFIELD,
& 'element number', NUMEL, IA(KLEL), IA(KLEL+1), MAPEL, *190)
190 CONTINUE
CALL DBSBEL (NELBLK, NUMEL, LENE, A(KLEL), NLISEL, LISEL)
CALL MDDEL ('SCRSEL')
IF (NLISEL(0) .GT. 0) THEN
CALL PRNSEL (NLISEL(0), NELBLK, 'element blocks')
CALL PRNSEL (LISEL(0), NUMEL, 'elements')
END IF
ELSE IF ((STYP .EQ. 'BLOCKS') .OR. (STYP .EQ. 'MATERIAL')) THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKNONE (NELBLK, .FALSE., 'element blocks', *220)
CALL MDRSRV ('SCRSEL', KLELB, 1+NELBLK)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 220
CALL RIXID (INLINE(1), IFLD, INTYP, CFIELD, IFIELD,
& 'element block ID',
& NELBLK, IDELB, IA(KLELB), IA(KLELB+1), *200)
200 CONTINUE
CALL DBSELB (NELBLK, NUMEL, LENE, A(KLELB), NLISEL, LISEL)
CALL MDDEL ('SCRSEL')
IF (NLISEL(0) .GT. 0) THEN
CALL PRNSEL (NLISEL(0), NELBLK, 'element blocks')
CALL PRNSEL (LISEL(0), NUMEL, 'elements')
END IF
ELSE IF (STYP .EQ. 'NSETS') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKNONE (NUMNPS, .FALSE., 'node sets', *220)
CALL RIXID (INLINE(1), IFLD, INTYP, CFIELD, IFIELD,
& 'node set ID',
& NUMNPS, IDNPS, LISNPS(0), LISNPS(1), *220)
IF (LISNPS(0) .GT. 0) THEN
CALL PRNSEL (LISNPS(0), NUMNPS, 'node sets')
END IF
ELSE IF (STYP .EQ. 'SSETS') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKNONE (NUMESS, .FALSE., 'side sets', *220)
CALL RIXID (INLINE(1), IFLD, INTYP, CFIELD, IFIELD,
& 'side set ID',
& NUMESS, IDESS, LISESS(0), LISESS(1), *220)
IF (LISESS(0) .GT. 0) THEN
CALL PRNSEL (LISESS(0), NUMESS, 'side sets')
END IF
C *** EXODUS Print Commands ***
ELSE IF (STYP .EQ. 'HVARS') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKEXOD (EXODUS, *220)
CALL CKNONE (NVARHI, .FALSE., 'history variables', *220)
CALL DBVIX_BL ('H', 1, IXHV)
CALL RIXWRD (INLINE(1), IFLD, INTYP, CFIELD,
& 'history variable name', NVARHI, NAMES(IXHV),
& LISHV(0), LISHV(1), *220)
IF (LISHV(0) .GT. 0) THEN
CALL PRNSEL (LISHV(0), NVARHI, 'history variables')
END IF
ELSE IF (STYP .EQ. 'GVARS') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKEXOD (EXODUS, *220)
CALL CKNONE (NVARGL, .FALSE., 'global variables', *220)
CALL DBVIX_BL ('G', 1, IXGV)
CALL RIXWRD (INLINE(1), IFLD, INTYP, CFIELD,
& 'global variable name', NVARGL, NAMES(IXGV),
& LISGV(0), LISGV(1), *220)
IF (LISGV(0) .GT. 0) THEN
CALL PRNSEL (LISGV(0), NVARGL, 'global variables')
END IF
ELSE IF (STYP .EQ. 'NVARS') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKEXOD (EXODUS, *220)
CALL CKNONE (NVARNP, .FALSE., 'nodal variables', *220)
CALL DBVIX_BL ('N', 1, IXNV)
CALL RIXWRD (INLINE(1), IFLD, INTYP, CFIELD,
& 'nodal variable name', NVARNP, NAMES(IXNV),
& LISNV(0), LISNV(1), *220)
IF (LISNV(0) .GT. 0) THEN
CALL PRNSEL (LISNV(0), NVARNP, 'nodal variables')
END IF
ELSE IF (STYP .EQ. 'EVARS') THEN
CALL FFADDC (STYP, INLINE(1))
CALL CKEXOD (EXODUS, *220)
CALL CKNONE (NVAREL, .FALSE., 'element variables', *220)
CALL DBVIX_BL ('E', 1, IXEV)
CALL RIXWRD (INLINE(1), IFLD, INTYP, CFIELD,
& 'element variable name', NVAREL, NAMES(IXEV),
& LISEV(0), LISEV(1), *220)
IF (LISEV(0) .GT. 0) THEN
CALL PRNSEL (LISEV(0), NVAREL, 'element variables')
END IF
C *** EXODUS Movement Commands ***
ELSE IF ((STYP .EQ. 'READ') .OR. (STYP .EQ. 'STEP')
& .OR. (STYP .EQ. 'TIME')) THEN
nstep = 0
CALL FFADDC (STYP, INLINE(1))
CALL CKEXOD (EXODUS, *220)
CALL CKNONE (NSTEPS, .FALSE., 'time steps', *220)
IF (STYP .EQ. 'READ') THEN
CALL FFINTG (IFLD, INTYP, IFIELD,
& 'number of steps to read', 1, N, *210)
CALL FFADDI (N, INLINE(1))
NSTEP = MAX (1, NCSTEP + N)
ELSE IF (STYP .EQ. 'STEP') THEN
CALL FFINTG (IFLD, INTYP, IFIELD,
& 'step number', NCSTEP, N, *210)
CALL FFADDI (N, INLINE(1))
NSTEP = N
ELSE IF (STYP .EQ. 'TIME') THEN
CALL FFREAL (IFLD, INTYP, RFIELD,
& 'time step time', TIMES(NCSTEP), T, *210)
CALL FFADDR (T, INLINE(1))
NSTEP = LOCREA (T, NSTEPS, TIMES)
END IF
NCSTEP = NSTEP
IF (NCSTEP .GT. NSTEPS) THEN
CALL PRTERR ('CMDERR',
& 'All time steps have been read from the database')
NCSTEP = NSTEPS
END IF
210 CONTINUE
CALL PRSTEP ('*', -1,
& TIMES(NCSTEP), WHOTIM(NCSTEP), NCSTEP, NSTEPS)
ELSE IF (STYP .NE. 'RESET') THEN
CALL SHOCMD ('SELECT Options:', CMDTBL)
GOTO 220
END IF
GOTO 230
220 CONTINUE
INLINE(1) = ' '
230 CONTINUE
RETURN
END