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.

1013 lines
35 KiB

2 years ago
C Copyright(C) 1999-2020, 2023 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 COMAND (A, IA, EXODUS, DBNAME, QAREC, INFO,
& NAMECO, EBTYPE, EBNAME, ATNAME,
$ NAMIGV, NAMINV, NAMIEV, NAMINS, NAMISS,
& NAMOGV, NAMONV, NAMOEV, NAMONS, NAMOSS,
& CORD, MAPEL, DBMAPEL, MAPND, DBMAPND, DOMAPN, DOMAPE,
& do_check, IDELB, NUMELB, LENE, NUMLNK, NUMATR, LINK, ATRIB,
& IDNPS, NNNPS, NDNPS, IXNNPS, IXDNPS, LTNNPS, FACNPS, NSNAME,
& IDESS, NEESS, NNESS, IXEESS, IXNESS, LTEESS, LTSESS, FACESS,
$ SSNAME, ISEVOK, ISNSVOK, ISSSVOK, TIMES,
$ VARGL, VARNP, VAREL, VARNS, VARSS,
& LISNP, NLISEL, LISEL, LISNPS, LISESS,
& LISGV, LISNV, LISEV, LISMV, LISSV)
C=======================================================================
C --*** COMAND *** (EXPLORE) Input and process commands
C --
C --COMAND inputs and executes an user command.
C --
C --Parameters:
C -- A - IN - the dynamic memory base array
C -- EXODUS - IN - true iff database is in the EXODUS database format
C -- DBNAME - the database name
C -- QAREC - IN - the QA records containing:
C -- (1) - the analysis code name
C -- (2) - the analysis code QA descriptor
C -- (3) - the analysis date
C -- (4) - the analysis time
C -- INFO - IN - the information records
C -- NAMECO - IN - the names of the coordinates
C -- EBTYPE - IN - the names of the element block types
C -- EBNAME - IN - the names of the element blocks
C -- NAMIGV - IN - the names of the global variables as input
C -- NAMINV - IN - the names of the nodal variables as input
C -- NAMIEV - IN - the names of the element variables as input
C -- NAMOGV - IN - the names of the global variables for comparison
C -- NAMONV - IN - the names of the nodal variables for comparison
C -- NAMOEV - IN - the names of the element variables for comparison
C -- CORD - IN - the coordinates
C -- MAPEL - IN - the element order map
C -- MAPND - IN - the node order map
C -- IDELB - IN - the element block ID for each block
C -- NUMELB - IN - the number of elements for each block
C -- LENE - IN - the cumulative element count by element block
C -- NUMLNK - IN - the number of nodes per element for each block
C -- NUMATR - IN - the number of attributes for each block
C -- LINK - IN - the connectivity array for all blocks
C -- ATRIB - IN - the attribute array for all blocks
C -- IDNPS - IN - the nodal point set ID for each set
C -- NNNPS - IN - the number of nodes for each set
C -- NDNPS - IN - the number of distribution factors for each set
C -- IXNNPS - IN - the index of the first node for each set
C -- IXDNPS - IN - the index of the first dist factor for each set
C -- LTNNPS - IN - the nodes for all sets
C -- FACNPS - IN - the distribution factors for all sets
C -- NSNAME - IN - the names of the nodesets
C -- IDESS - IN - the element side set ID for each set
C -- NEESS - IN - the number of elements for each set
C -- NNESS - IN - the number of nodes for each set
C -- IXEESS - IN - the index of the first element for each set
C -- IXNESS - IN - the index of the first node for each set
C -- LTEESS - IN - the elements for all sets
C -- LTSESS - IN - the element sides for all sets
C -- FACESS - IN - the distribution factors for all sets
C -- SSNAME - IN - the names of the sidesets
C -- TIMES - IN - the times for all time steps
C -- VARGL - SCRATCH - the global variables for current time step
C -- VARNP - SCRATCH - the nodal variables for current time step
C -- VAREL - SCRATCH - the element variables for current time step
C -- LISNP - SCRATCH - the indices of the selected nodes
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 - SCRATCH - the indices of the selected nodal point sets
C -- LISESS - SCRATCH - the indices of the selected element side sets
C -- LISGV - SCRATCH - the indices of the selected global variables
C -- LISNV - SCRATCH - the indices of the selected nodal variables
C -- LISEV - SCRATCH - the indices of the selected element variables
C --
C --Common Variables:
C -- Uses NDIM, NUMNP, NUMEL, NELBLK,
C -- NUMNPS, LNPSNL, NUMESS, LESSEL, LESSNL, LESSDF,
C -- NQAREC, NINFO, NVARGL, NVARNP, NVAREL, NSTEPS of /DBNUMS/
C -- Uses NOUT, NCRT, NPRT, ANYPRT of /OUTFIL/
PARAMETER (MAXFLD = 80)
include 'exodusII.inc'
INCLUDE 'exp_progqa.blk'
INCLUDE 'exp_dbtitl.blk'
INCLUDE 'exp_dbase.blk'
INCLUDE 'exp_dbnums.blk'
INCLUDE 'exp_outfil.blk'
include 'exp_errcnt.blk'
DIMENSION A(*)
INTEGER IA(*)
LOGICAL EXODUS, FFMATC, DO_CHECK
LOGICAL DOMAPN, DOMAPE, DOBLK, DOELE, ADD
CHARACTER*(*) DBNAME
CHARACTER*(MXSTLN) QAREC(4,*)
CHARACTER*(MXLNLN) INFO(*)
CHARACTER*(MXSTLN) EBTYPE(*)
CHARACTER*(NAMLEN) NAMECO(*)
CHARACTER*(NAMLEN) EBNAME(*), ATNAME(*), NSNAME(*), SSNAME(*)
CHARACTER*(NAMLEN) NAMIGV(*), NAMINV(*), NAMIEV(*),
$ NAMINS(*), NAMISS(*)
CHARACTER*(NAMLEN) NAMOGV(*), NAMONV(*), NAMOEV(*),
$ NAMONS(*), NAMOSS(*)
REAL CORD(*)
INTEGER MAPEL(*)
INTEGER DBMAPEL(*)
INTEGER MAPND(*)
INTEGER DBMAPND(*)
INTEGER IDELB(*), NUMELB(*)
INTEGER LENE(0:*)
INTEGER NUMLNK(*), NUMATR(*)
INTEGER LINK(*)
REAL ATRIB(*)
INTEGER IDNPS(*), NNNPS(*), IXNNPS(*)
INTEGER LTNNPS(*)
REAL FACNPS(*)
INTEGER IDESS(*), NEESS(*), NNESS(*), IXEESS(*), IXNESS(*)
INTEGER LTEESS(*), LTSESS(*)
REAL FACESS(*)
INTEGER ISEVOK(*), ISNSVOK(*), ISSSVOK(*)
REAL TIMES(*)
REAL VARGL(*), VARNP(*), VAREL(*), VARNS(*), VARSS(*)
INTEGER LISNP(0:*)
INTEGER NLISEL(0:*), LISEL(0:*)
INTEGER LISNPS(0:*), LISESS(0:*)
INTEGER LISGV(0:*), LISNV(0:*), LISEV(0:*), LISMV(0:*), LISSV(0:*)
LOGICAL FFEXST, MATSTR
CHARACTER*(MXNAME) WORD, VERB, LISTYP
INTEGER INTYP(MAXFLD+1)
CHARACTER*(MXNAME) CFIELD(MAXFLD)
INTEGER IFIELD(MAXFLD)
REAL RFIELD(MAXFLD)
LOGICAL HELP
LOGICAL ISON
CHARACTER*(MXNAME) OPT
CHARACTER*(MXNAME) MMNAME
CHARACTER MMTYP
CHARACTER*80 DUMLIN
character*2048 OUTPUT, LCOUTPUT
CHARACTER*(MXSTLN) CMDTBL(15), SELTBL(15), LISTBL(38)
SAVE CMDTBL, SELTBL, LISTBL, KINVC, KINVS
C --CMDTBL - the valid commands table
C --SELTBL - the valid SELECT options table
C --LISTBL - the valid LIST/PRINT options table
C --Command table follows. Remember to change the dimensioned size when
C --changing the table.
DATA CMDTBL /
1 'SELECT ', 'LIST ', 'PRINT ', 'LIMITS ',
2 'MINMAX ', 'CHECK ', 'HELP ', 'MAP ',
3 'EXIT ', 'MAXERRS ', 'END ', 'QUIT ',
4 'PRECISION','OUTPUT ',
5 ' ' /
DATA SELTBL /
1 'NODES ', 'ELEMENTS', 'BLOCKS ', 'MATERIAL',
2 'NSETS ', 'SSETS ',
3 'READ ', 'STEP ', 'TIME ',
4 'GVARS ', 'NVARS ', 'EVARS ', 'NSVARS ', 'SSVARS ',
5 ' ' /
DATA LISTBL /
1 'TITLE ', 'VARS ',
2 'COORDINA', 'MAP ', 'NMAP ', 'NODEMAP ',
3 'BLOCKS ', 'MATERIAL', 'LINK ', 'CONNECTI', 'ATTRIBUT',
4 'NSETS ', 'NNODES ', 'NFACTORS', 'INVCON ',
5 'SSETS ', 'SELEMS ', 'SFACES ', 'SFACTORS',
6 'NAMES ', 'TIMES ', 'STEPS ',
7 'GVARS ', 'GLOBALS ', 'GLOBNODE', 'GLOBELEM',
8 'NVARS ', 'NODALS ', 'EVARS ', 'ELEMENTS',
9 'VERSION ', 'COMMANDS', 'NSVARS ', 'NODESETVARS',
$ 'SSVARS ', 'SIDESETVARS', 'FRAMES ', ' ' /
DATA KINVC,KINVS /0,0/
C --Initialize
OUTPUT = "explore.o"
MAXERRS = 10
LENE(0) = 0
DO 100 I = 1, NELBLK
LENE(I) = LENE(I-1) + NUMELB(I)
100 CONTINUE
LISNP(0) = NUMNP
DO 110 I = 1, NUMNP
LISNP(I) = I
110 CONTINUE
NLISEL(0) = NELBLK
DO 120 I = 1, NELBLK
NLISEL(I) = LENE(I) - LENE(I-1)
120 CONTINUE
LISEL(0) = NUMEL
DO 130 I = 1, NUMEL
LISEL(I) = I
130 CONTINUE
LISNPS(0) = NUMNPS
DO 140 I = 1, NUMNPS
LISNPS(I) = I
140 CONTINUE
LISESS(0) = NUMESS
DO 150 I = 1, NUMESS
LISESS(I) = I
150 CONTINUE
IF (EXODUS) THEN
LISGV(0) = NVARGL
DO 170 I = 1, NVARGL
LISGV(I) = I
170 CONTINUE
LISNV(0) = NVARNP
DO 180 I = 1, NVARNP
LISNV(I) = I
180 CONTINUE
LISEV(0) = NVAREL
DO 190 I = 1, NVAREL
LISEV(I) = I
190 CONTINUE
LISMV(0) = NVARNS
DO 191 I = 1, NVARNS
LISMV(I) = I
191 CONTINUE
LISSV(0) = NVARSS
DO 192 I = 1, NVARSS
LISSV(I) = I
192 CONTINUE
END IF
mmname = ' '
mmvar = 0
C --Read first time step variables
IF (EXODUS) THEN
NCSTEP = 999
NSTEPNS = -1
NSTEPSS = -1
NSTEP = 1
CALL TOSTEP (NSTEP, NUMELB, IDELB, ISEVOK,
& TIME, VARGL, VARNP, VAREL)
END IF
WRITE (*, *)
CALL PRTERR ('CMDREQ',
& 'Use "precision low|normal|high|#" to control" output precision')
if (domape .and. domapn) then
call PRTERR('CMDREQ',
* 'Nodes and Elements using Global Ids')
else if (domape) then
call PRTERR('CMDREQ',
* 'Elements use Global Ids, Node Ids are Local')
else if (domapn) then
call PRTERR('CMDREQ',
* 'Element use Local Ids, Node Ids are Global')
else
call PRTERR('CMDREQ',
* 'Nodes and Elements using Local Ids')
end if
200 CONTINUE
C --Read command line
if (do_check) then
call check(a, ia, exodus, idelb, ebtype, numelb, isevok, numlnk,
* numatr, link, atrib, atname, mapnd, dbmapnd, mapel, dbmapel,
* idnps, nnnps, ixnnps,
* ltnnps, facnps, idess, neess, nness, ixeess, ixness, lteess,
* ltsess, facess, vargl, varnp, varel)
return
endif
WRITE (*, *)
CALL FREFLD (0, 0, 'EXPLORE> ', MAXFLD,
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
IF (IOSTAT .LT. 0) GOTO 280
IF (NUMFLD .EQ. 0) GOTO 200
INTYP(MIN(MAXFLD,NUMFLD)+1) = -999
IFLD = 1
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
CALL ABRSTR (VERB, WORD, CMDTBL)
IF ((VERB .EQ. ' ') .AND. (WORD .NE. ' ')) THEN
VERB = '*'
IFLD = IFLD - 1
END IF
IF (VERB .EQ. 'SELECT') THEN
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
CALL ABRSTR (LISTYP, WORD, SELTBL)
IF (LISTYP .EQ. ' ') LISTYP = WORD
ELSE IF ((VERB .EQ. 'LIST') .OR. (VERB .EQ. 'PRINT')) THEN
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
IF (VERB .EQ. 'PRINT') THEN
IF ((WORD .EQ. ' ')
& .OR. (WORD .EQ. 'ON') .OR. (WORD .EQ. 'OFF')) THEN
CALL PRTERR ('CMDERR',
& 'Please use the new PRINT command'
& // ' (e.g., PRINT NAMES)')
GOTO 270
END IF
END IF
CALL ABRSTR (LISTYP, WORD, LISTBL)
IF (LISTYP .EQ. ' ') LISTYP = WORD
ELSE IF (VERB .EQ. '*') THEN
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
CALL ABRSTR (LISTYP, WORD, LISTBL)
IF (LISTYP .EQ. ' ') THEN
CALL ABRSTR (LISTYP, WORD, SELTBL)
IF (LISTYP .NE. ' ') THEN
CALL PRTERR ('CMDREQ', 'Please use the SELECT command')
VERB = 'SELECT'
ELSE
LISTYP = WORD
END IF
END IF
END IF
IF (VERB .EQ. 'PRINT') THEN
IF (NPRT .LE. 0) THEN
CALL PRTERR ('CMDERR', 'Print file cannot be opened')
GOTO 270
END IF
IF (.NOT. ANYPRT) THEN
C --Set up the print file
OPEN (unit=nprt, file=OUTPUT, IOSTAT=IERR)
IF (IERR .NE. 0) THEN
CALL PRTERR ('CMDERR', 'Print file cannot be opened')
NPRT = -1
GOTO 270
END IF
CALL BANNER (NPRT, QAINFO,
& ' ', ' ', ' ')
CALL PRINIT ('N', NPRT, DBNAME, TITLE,
& NDIM, NUMNP, NUMEL, NELBLK,
& NUMNPS, LNPSNL, LNPSDF, NUMESS, LESSEL, LESSNL, LESSDF,
& NVARGL, NVARNP, NVAREL, NVARNS, NVARSS)
ANYPRT = .TRUE.
END IF
NOUT = NPRT
ELSE
NOUT = NCRT
END IF
DUMLIN = ' '
C *** GENESIS Print Commands ***
IF ((VERB .EQ. 'SELECT') .OR.
& (FFEXST (IFLD, INTYP) .AND. ((VERB .EQ. '*')
& .OR. (VERB .EQ. 'LIST') .OR. (VERB .EQ. 'PRINT')))) THEN
IF (LISTYP .EQ. 'NODES') THEN
IF (VERB .EQ. '*') VERB = 'SELECT'
CALL CKNONE (NUMNP, .FALSE., 'nodes', *270)
if (FFMATC (IFLD, INTYP, CFIELD, 'NSET', 4) .OR.
* FFMATC (IFLD, INTYP, CFIELD, 'NODESET', 7)) THEN
CALL RIXID (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'nodal point set ID',
& NUMNPS, IDNPS, LISNPS(0), LISNPS(1), *270)
if (lisnps(0) .gt. 0) then
call selset(lisnp(0), lisnp(1),
* numnps, lisnps, lnpsnl,
* idnps, nnnps, ixnnps, ltnnps, "nodes")
end if
else if (FFMATC (IFLD, INTYP, CFIELD, 'SSET', 4) .OR.
* FFMATC (IFLD, INTYP, CFIELD, 'SIDESET', 7)) THEN
CALL RIXID (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'side set ID',
& NUMESS, IDESS, LISESS(0), LISESS(1), *270)
if (lisess(0) .gt. 0) then
CALL MDRSRV ('SCR', KSCR, NUMNP)
call selssetn(lisnp(0), lisnp(1),
* lisess, idess, "nodes", ia(kscr), ia)
call MDDEL('SCR')
end if
else if (FFMATC (IFLD, INTYP, CFIELD, 'BLOCK', 3) .OR.
* FFMATC (IFLD, INTYP, CFIELD, 'MATERIAL', 3)) THEN
CALL MDRSRV ('SCRSEL', KLELB, 1+NELBLK)
CALL MDRSRV ('SCR', KSCR, NUMNP)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
CALL RIXID (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'element block ID',
& NELBLK, IDELB, IA(KLELB), IA(KLELB+1), *205)
205 continue
if (IA(KLELB) .gt. 0) then
call selblk(lisnp(0), lisnp(1),
* nelblk, IA(KLELB), numelb, numlnk, link,
* A(KSCR), numnp, ebtype)
end if
CALL MDDEL ('SCRSEL')
CALL MDDEL ('SCR')
else
CALL RMIXINT (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'node number', NUMNP, LISNP(0), LISNP(1), MAPND, *270)
end if
ELSE IF ((VERB .NE. 'SELECT')
& .AND. (LISTYP .EQ. 'COORDINA')) THEN
IF (VERB .EQ. '*') VERB = 'LIST'
CALL CKNONE (NUMNP, .FALSE., 'nodes', *270)
CALL CKNONE (NDIM, .FALSE., 'coordinates', *270)
CALL RMIXINT (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'node number', NUMNP, LISNP(0), LISNP(1), MAPND, *270)
ELSE IF ((LISTYP .EQ. 'ELEMENTS')
& .OR. ((VERB .NE. 'SELECT')
& .AND. ((LISTYP .EQ. 'LINK') .OR. (LISTYP .EQ. 'CONNECTI')
& .OR. (LISTYP .EQ. 'ATTRIBUT')))) THEN
IF (VERB .EQ. '*') VERB = 'LIST'
CALL CKNONE (NUMEL, .FALSE., 'elements', *270)
CALL MDRSRV ('SCRSEL', KLEL, 1+NUMEL)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
if (FFMATC (IFLD, INTYP, CFIELD, 'SSET', 4) .OR.
* FFMATC (IFLD, INTYP, CFIELD, 'SIDESET', 7)) THEN
CALL RIXID (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'side set ID',
& NUMESS, IDESS, LISESS(0), LISESS(1), *270)
if (lisess(0) .gt. 0) then
call selset(IA(KLEL), IA(KLEL+1),
* numess, lisess, lessel,
* idess, neess, ixeess, lteess, "elements")
end if
else
IA(KLEL) = 0
CALL RMIXINT (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'element number', NUMEL, IA(KLEL), IA(KLEL+1), MAPEL,
* *270)
end if
add = .false.
if (intyp(3) .ge. 0) then
if (matstr(cfield(3), 'ADD', 3)) then
add = .true.
end if
end if
CALL DBSBEL (NELBLK, NUMEL, LENE, A(KLEL), NLISEL, LISEL, ADD)
CALL MDDEL ('SCRSEL')
ELSE IF ((LISTYP .EQ. 'BLOCKS')
& .OR. (LISTYP .EQ. 'MATERIAL')) THEN
IF (VERB .EQ. '*') VERB = 'LIST'
CALL CKNONE (NELBLK, .FALSE., 'element blocks', *270)
CALL MDRSRV ('SCRSEL', KLELB, 1+NELBLK)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
CALL RIXID (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'element block ID',
& NELBLK, IDELB, IA(KLELB), IA(KLELB+1), *220)
220 CONTINUE
CALL DBSELB (NELBLK, NUMEL, LENE, A(KLELB),
& NLISEL, LISEL)
CALL MDDEL ('SCRSEL')
ELSE IF (LISTYP .EQ. 'NSETS') THEN
NSTEPNS = -1
IF (VERB .EQ. '*') VERB = 'LIST'
CALL CKNONE (NUMNPS, .FALSE., 'nodal point sets', *270)
CALL RIXID (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'nodal point set ID',
& NUMNPS, IDNPS, LISNPS(0), LISNPS(1), *270)
ELSE IF (LISTYP .EQ. 'SSETS') THEN
NSTEPSS = -1
IF (VERB .EQ. '*') VERB = 'LIST'
CALL CKNONE (NUMESS, .FALSE., 'element side sets', *270)
CALL RIXID (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'element side set ID',
& NUMESS, IDESS, LISESS(0), LISESS(1), *270)
C *** EXODUS Movement Commands ***
ELSE IF (((VERB .EQ. 'SELECT') .OR. (VERB .EQ. '*'))
& .AND. ((LISTYP .EQ. 'READ') .OR. (LISTYP .EQ. 'STEP')
& .OR. (LISTYP .EQ. 'TIME'))) THEN
IF (VERB .EQ. '*') VERB = 'SELECT'
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NSTEPS, .FALSE., 'time steps', *270)
IF (LISTYP .EQ. 'READ') THEN
CALL FFINTG (IFLD, INTYP, IFIELD,
& 'number of steps to read', 1, N, *230)
NSTEP = MAX (1, NCSTEP + N)
ELSE IF (LISTYP .EQ. 'STEP') THEN
CALL FFINTG (IFLD, INTYP, IFIELD,
& 'step number', NCSTEP, N, *230)
NSTEP = N
ELSE IF (LISTYP .EQ. 'TIME') THEN
CALL FFREAL (IFLD, INTYP, RFIELD,
& 'time step time', TIME, T, *230)
NSTEP = LOCREA (T, NSTEPS, TIMES)
END IF
CALL TOSTEP (NSTEP, NUMELB, IDELB, ISEVOK, TIME,
& VARGL, VARNP, VAREL)
230 CONTINUE
CALL PRSTEP ('*', NOUT, TIME, NCSTEP, NSTEPS)
C *** EXODUS Print Commands ***
ELSE IF (LISTYP .EQ. 'GVARS') THEN
IF (VERB .EQ. '*') VERB = 'SELECT'
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NVARGL, .FALSE., 'global variables', *270)
CALL RIXWRD (DUMLIN, IFLD, INTYP, CFIELD,
& 'global variable name', NVARGL, NAMOGV,
& LISGV(0), LISGV(1), *270)
ELSE IF (LISTYP .EQ. 'NVARS') THEN
IF (VERB .EQ. '*') VERB = 'SELECT'
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NVARNP, .FALSE., 'nodal variables', *270)
CALL RIXWRD (DUMLIN, IFLD, INTYP, CFIELD,
& 'nodal variable name', NVARNP, NAMONV,
& LISNV(0), LISNV(1), *270)
ELSE IF ((VERB .NE. 'SELECT')
& .AND. (LISTYP .EQ. 'NODALS')) THEN
IF (VERB .EQ. '*') VERB = 'LIST'
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NUMNP, .FALSE., 'nodes', *270)
CALL RMIXINT (DUMLIN, IFLD, INTYP, CFIELD, IFIELD,
& 'node number', NUMNP, LISNP(0), LISNP(1), MAPND, *270)
ELSE IF (LISTYP .EQ. 'EVARS') THEN
IF (VERB .EQ. '*') VERB = 'SELECT'
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NVAREL, .FALSE., 'element variables', *270)
CALL RIXWRD (DUMLIN, IFLD, INTYP, CFIELD,
& 'element variable name', NVAREL, NAMOEV,
& LISEV(0), LISEV(1), *270)
ELSE IF (LISTYP .EQ. 'NSVARS') THEN
NSTEPNS = -1
IF (VERB .EQ. '*') VERB = 'SELECT'
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NVARNS, .FALSE., 'nodeset variables', *270)
CALL RIXWRD (DUMLIN, IFLD, INTYP, CFIELD,
& 'nodeset variable name', NVARNS, NAMONS,
& LISMV(0), LISMV(1), *270)
ELSE IF (LISTYP .EQ. 'SSVARS') THEN
NSTEPSS = -1
IF (VERB .EQ. '*') VERB = 'SELECT'
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NVARSS, .FALSE., 'sideset variables', *270)
CALL RIXWRD (DUMLIN, IFLD, INTYP, CFIELD,
& 'sideset variable name', NVARSS, NAMOSS,
& LISSV(0), LISSV(1), *270)
ELSE IF (VERB .EQ. 'SELECT') THEN
CALL SHOCMD ('SELECT Options:', SELTBL)
END IF
END IF
IF (VERB .EQ. '*') VERB = 'LIST'
IF (VERB .EQ. 'SELECT') THEN
CONTINUE
ELSE IF ((VERB .EQ. 'LIST') .OR. (VERB .EQ. 'PRINT')) THEN
IF (listyp .eq. 'GLOBNODE') THEN
233 continue
if (ffexst(ifld, intyp)) THEN
call ffintg(ifld, intyp, ifield, 'Global ID',
* 0, IDGLO, *270)
call selmap(nout, 'node', idglo, numnp, mapnd)
go to 233
end if
ELSE IF (listyp .eq. 'GLOBELEM') THEN
234 continue
if (ffexst(ifld, intyp)) then
call ffintg(ifld, intyp, ifield, 'Global ID',
* 0, IDGLO, *270)
call selmap(nout, 'element', idglo, numel, mapel)
goto 234
end if
ELSE IF ((LISTYP .EQ. 'TITLE') .OR. (LISTYP .EQ. 'VARS')) THEN
IF (EXODUS) THEN
CALL PRINIT ('NTSICV', NOUT, DBNAME, TITLE,
& NDIM, NUMNP, NUMEL, NELBLK,
& NUMNPS, LNPSNL, LNPSDF,
& NUMESS, LESSEL, LESSNL, LESSDF,
& NVARGL, NVARNP, NVAREL, NVARNS, NVARSS)
ELSE
CALL PRINIT ('NTSIC', NOUT, DBNAME, TITLE,
& NDIM, NUMNP, NUMEL, NELBLK,
& NUMNPS, LNPSNL, LNPSDF,
& NUMESS, LESSEL, LESSNL, LESSDF,
& NVARGL, NVARNP, NVAREL, NVARNS, NVARSS)
END IF
ELSE IF (LISTYP .EQ. 'VERSION') THEN
CALL PRVERS (NDB, NOUT)
ELSE IF (LISTYP .EQ. 'COORDINA') THEN
CALL CKNONE (NDIM, .FALSE., 'coordinates', *270)
CALL CKNONE (NUMNP, .FALSE., 'nodes', *270)
CALL CKNONE (LISNP(0), .TRUE., 'nodes', *270)
CALL PRXYZ ('*', NOUT, NDIM, NAMECO, NUMNP, LISNP, CORD,
* MAPND, DOMAPN)
ELSE IF (LISTYP .EQ. 'MAP') THEN
CALL CKNONE (NUMEL, .FALSE., 'elements', *270)
CALL PRMAP ('*', NOUT, 'Element', NUMEL, DBMAPEL)
ELSE IF (LISTYP .EQ. 'NMAP' .OR. LISTYP .EQ. 'NODEMAP') THEN
CALL CKNONE (NUMNP, .FALSE., 'nodes', *270)
CALL PRMAP ('*', NOUT, 'Node', NUMNP, DBMAPND)
ELSE IF ((LISTYP .EQ. 'BLOCKS') .OR. (LISTYP .EQ. 'MATERIAL')
& .OR. (LISTYP .EQ. 'LINK') .OR. (LISTYP .EQ. 'CONNECTI')
& .OR. (LISTYP .EQ. 'ATTRIBUT')) THEN
CALL CKNONE (NELBLK, .FALSE., 'element blocks', *270)
CALL CKNONE (NLISEL(0), .TRUE., 'element blocks', *270)
IF ((LISTYP .EQ. 'BLOCKS')
& .OR. (LISTYP .EQ. 'MATERIAL')) THEN
IF (EXODUS) THEN
OPT = 'NV'
ELSE
OPT = 'N'
END IF
ELSE IF ((LISTYP .EQ. 'LINK')
& .OR. (LISTYP .EQ. 'CONNECTI')) THEN
OPT = 'C'
ELSE IF (LISTYP .EQ. 'ATTRIBUT') THEN
OPT = 'A'
END IF
IF (INDEX (OPT, 'V') .GT. 0) THEN
CALL MDRSRV ('XLISEV', KXLSEV, NVAREL)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
END IF
CALL PRELB (OPT, NOUT, NELBLK, NLISEL, LISEL,
& IDELB, LENE, NUMLNK, NUMATR, LINK, ATRIB,
& EBTYPE, EBNAME, NVAREL, NAMIEV, ISEVOK, A(KXLSEV),
* ATNAME, MAPND, DOMAPN, MAPEL, DOMAPE)
IF (INDEX (OPT, 'V') .GT. 0) THEN
CALL MDDEL ('XLISEV')
END IF
ELSE IF ((LISTYP .EQ. 'NSETS')
& .OR. (LISTYP .EQ. 'NNODES')
& .OR. (LISTYP .EQ. 'NFACTORS')) THEN
CALL CKNONE (NUMNPS, .FALSE., 'nodal point sets', *270)
CALL CKNONE (LISNPS(0), .TRUE., 'nodal point sets', *270)
IF (LISTYP .EQ. 'NSETS') THEN
if (exodus) then
opt = 'V'
else
OPT = ' '
end if
ELSE IF (LISTYP .EQ. 'NNODES') THEN
OPT = 'N'
ELSE IF (LISTYP .EQ. 'NFACTORS') THEN
OPT = 'F'
END IF
IF (INDEX (OPT, 'V') .GT. 0) THEN
CALL MDRSRV ('XLISNV', KXLSNV, NVARNS)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
END IF
CALL PRNPS (OPT, NOUT, NUMNPS, LISNPS, LNPSNL,
& IDNPS, NNNPS, NDNPS, IXNNPS, IXDNPS, LTNNPS, FACNPS,
* NSNAME, nvarns, namins, isnsvok, a(kxlsnv),
$ MAPND, DOMAPN)
IF (INDEX (OPT, 'V') .GT. 0) THEN
CALL MDDEL ('XLISNV')
END IF
ELSE IF ((LISTYP .EQ. 'SSETS')
& .OR. (LISTYP .EQ. 'SELEMS')
& .OR. (LISTYP .EQ. 'SFACES')
& .OR. (LISTYP .EQ. 'SFACTORS')) THEN
CALL CKNONE (NUMESS, .FALSE., 'element side sets', *270)
CALL CKNONE (LISESS(0), .TRUE., 'element side sets', *270)
IF (LISTYP .EQ. 'SSETS') THEN
if (exodus) then
opt = 'V'
else
OPT = ' '
end if
ELSE IF (LISTYP .EQ. 'SELEMS') THEN
OPT = 'E'
ELSE IF (LISTYP .EQ. 'SFACES') THEN
OPT = 'N'
ELSE IF (LISTYP .EQ. 'SFACTORS') THEN
OPT = 'F'
END IF
IF (INDEX (OPT, 'V') .GT. 0) THEN
CALL MDRSRV ('XLISSV', KXLSSV, NVARSS)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
END IF
IF (INDEX (OPT, 'F') .GT. 0) then
CALL MDRSRV ('NDFSID', KNDFSID, LESSEL)
CALL MDRSRV ('NODSID', KNODSID, LESSNL)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
END IF
CALL PRESS (OPT, NOUT, NUMESS, LISESS, LESSEL, LESSNL,
& IDESS, NEESS, NNESS, IXEESS, IXNESS,
& LTEESS, LTSESS, FACESS, SSNAME,
$ nvarss, namiss, isssvok, a(kxlssv),
& a(kndfsid), a(knodsid),MAPEL, MAPND, DOMAPE, DOMAPN)
IF (INDEX (OPT, 'V') .GT. 0) THEN
CALL MDDEL ('XLISSV')
END IF
IF (INDEX (OPT, 'F') .GT. 0) THEN
CALL MDDEL ('NDFSID')
CALL MDDEL ('NODSID')
END IF
ELSE IF (LISTYP .EQ. 'INVCON') THEN
CALL FFCHAR (IFLD, INTYP, CFIELD,' ', WORD)
doblk = .false.
doele = .false.
IF (MATSTR(WORD, 'ELEMENTS', 1)) THEN
DOELE = .true.
ELSE IF (MATSTR(WORD, 'BLOCKS', 1)) THEN
DOBLK = .true.
ELSE
DOELE = .true.
DOBLK = .true.
END IF
if (kinvc .eq. 0) then
CALL MDRSRV ('INVCON', KINVC, NELBLK*NUMNP)
CALL MDRSRV ('INVSCR', KINVS, 2*NELBLK)
CALL MDRSRV ('NODMAP', KNDMP, 2*NUMNP)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 280
end if
call invcon(ia, nelblk, idelb, numelb, numlnk, link, numnp,
* ia(kinvc), ia(kinvs), ia(kndmp), lisnp, NOUT, MAPND,
$ MAPEL, DOMAPN, DOMAPE, DOBLK, DOELE, ebtype)
ELSE IF (LISTYP .EQ. 'QA') THEN
CALL PRQA ('*', NOUT, NQAREC, QAREC, NINFO, INFO)
C *** EXODUS Print Commands ***
ELSE IF (LISTYP .EQ. 'NAMES') THEN
CALL CKEXOD (EXODUS, *270)
CALL PRNAME ('*', NOUT,
& NAMIGV, NAMINV, NAMIEV, NAMINS, NAMISS)
ELSE IF ((LISTYP .EQ. 'TIMES')
& .OR. (LISTYP .EQ. 'ALLTIMES')) THEN
IF (LISTYP .EQ. 'ALLTIMES') CALL PRTERR ('CMDREQ',
& 'Please use the LIST TIMES command')
CALL CKEXOD (EXODUS, *270)
CALL PRTIMS ('NT', NOUT, NSTEPS, TIMES)
ELSE IF (LISTYP .EQ. 'STEPS') THEN
CALL CKEXOD (EXODUS, *270)
CALL PRTIMS ('NM', NOUT, NSTEPS, TIMES)
ELSE IF ((LISTYP .EQ. 'GVARS')
& .OR. (LISTYP .EQ. 'GLOBALS')) THEN
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NVARGL, .FALSE., 'global variables', *270)
CALL CKNONE (LISGV(0), .TRUE., 'global variables', *270)
CALL PRSTEP ('*', NOUT, TIME, NCSTEP, NSTEPS)
CALL PRGLOB ('*', NOUT, NVARGL, LISGV, NAMIGV, VARGL)
ELSE IF ((LISTYP .EQ. 'NVARS')
& .OR. (LISTYP .EQ. 'NODALS')) THEN
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NUMNP, .FALSE., 'nodes', *270)
CALL CKNONE (NVARNP, .FALSE., 'nodal variables', *270)
CALL CKNONE (LISNV(0), .TRUE., 'nodal variables', *270)
CALL PRSTEP ('*', NOUT, TIME, NCSTEP, NSTEPS)
CALL PRNODE ('*', NOUT, NUMNP, LISNP, NVARNP, LISNV, NAMINV,
& VARNP, MAPND, DOMAPN)
ELSE IF ((LISTYP .EQ. 'EVARS')
& .OR. (LISTYP .EQ. 'ELEMENTS')) THEN
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NUMEL, .FALSE., 'elements', *270)
CALL CKNONE (NVAREL, .FALSE., 'element variables', *270)
CALL CKNONE (LISEV(0), .TRUE., 'element variables', *270)
CALL PRSTEP ('*', NOUT, TIME, NCSTEP, NSTEPS)
CALL PRELEM ('*', NOUT, NELBLK, NUMEL, NLISEL, LISEL, LENE,
& NVAREL, LISEV, NAMIEV, ISEVOK, VAREL, max(1,nvarel),
* MAPEL, DOMAPE)
ELSE IF ((LISTYP .EQ. 'NSVARS')
& .OR. (LISTYP .EQ. 'NODESETVARS')) THEN
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NUMNPS, .FALSE., 'nodesets', *270)
CALL CKNONE (NVARNS, .FALSE., 'nodeset variables', *270)
CALL CKNONE (LISMV(0), .TRUE., 'nodeset variables', *270)
CALL PRSTEP ('*', NOUT, TIME, NCSTEP, NSTEPS)
CALL PRNSV (NOUT, NCSTEP, NUMNPS, LISNPS, LNPSNL,
& IDNPS, NNNPS, IXNNPS, LTNNPS, NSNAME,
$ NVARNS, LISMV(0), NAMINS, ISNSVOK, VARNS, max(1,nvarns),
* MAPND, DOMAPN)
ELSE IF ((LISTYP .EQ. 'SSVARS')
& .OR. (LISTYP .EQ. 'SIDESETVARS')) THEN
CALL CKEXOD (EXODUS, *270)
CALL CKNONE (NUMESS, .FALSE., 'sidesets', *270)
CALL CKNONE (NVARSS, .FALSE., 'sideset variables', *270)
CALL CKNONE (LISSV(0), .TRUE., 'sideset variables', *270)
CALL PRSTEP ('*', NOUT, TIME, NCSTEP, NSTEPS)
CALL PRSSV (NOUT, NCSTEP, NUMESS, LISESS, LESSEL,
& IDESS, NEESS, IXEESS, LTEESS, LTSESS, SSNAME,
$ NVARSS, LISSV(0), NAMISS, ISSSVOK, VARSS, max(1,nvarss),
* MAPEL, DOMAPE)
C ... Coordinate Frames
ELSE IF (LISTYP .EQ. 'FRAMES') THEN
CALL PRFRM (NOUT)
ELSE IF (LISTYP .EQ. 'COMMANDS') THEN
CALL SHOCMD ('COMMAND Options:', CMDTBL)
ELSE
CALL SHOCMD ('LIST/PRINT Options:', LISTBL)
END IF
C *** Miscellaneous Commands ***
ELSE IF (VERB .EQ. 'LIMITS') THEN
call limits(ndim, numnp, cord)
ELSE IF (VERB .EQ. 'MAP') THEN
call prterr('CMDERR',
* 'The map nodes|elements|both command is no longer'
* // ' supported. The mapping of nodes/elements is'
* // ' selected at program startup with the -map '
* // ' or -nomap option.')
c$$$ CALL FFCHAR (IFLD, INTYP, CFIELD,'BOTH', WORD)
c$$$ CALL FFONOF (IFLD, INTYP, CFIELD, MAPTMP, *270)
c$$$
c$$$ IF (MATSTR(WORD, 'ELEMENTS', 1)) THEN
c$$$ DOMAPE = MAPTMP
c$$$ ELSE IF (MATSTR(WORD, 'NODES', 1)) THEN
c$$$ DOMAPN = MAPTMP
c$$$ ELSE IF (MATSTR(WORD, 'BOTH', 1)) THEN
c$$$ DOMAPE = MAPTMP
c$$$ DOMAPN = MAPTMP
c$$$ END IF
ELSE IF (VERB .EQ. 'MAXERRS') THEN
CALL FFINTG (IFLD, INTYP, IFIELD,
& 'maximum errors to print; 0 for all', 10, MAXERRS, *235)
235 continue
ELSE IF (VERB .EQ. 'OUTPUT') THEN
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', OUTPUT)
C ... Filename will be converted to lowercase -- FREFLD returns
C everything in uppercase Assume user wanted lowercase; if they
C didn't, need to rewrite frefld to return mixed case.
call lowstr(lcoutput,output)
if (anyprt) then
close (nprt)
end if
OPEN (unit=nprt, file=lcoutput, IOSTAT=IERR)
IF (IERR .NE. 0) THEN
CALL PRTERR ('CMDERR', 'Print file cannot be opened')
NPRT = -1
GOTO 270
END IF
ANYPRT = .TRUE.
ELSE IF (VERB .EQ. 'CHECK') THEN
call check(a, ia, exodus, idelb, ebtype, numelb, isevok, numlnk,
* numatr, link, atrib, atname, mapnd, dbmapnd, mapel, dbmapel,
* idnps, nnnps, ixnnps,
* ltnnps, facnps, idess, neess, nness, ixeess, ixness, lteess,
* ltsess, facess, vargl, varnp, varel)
ELSE IF (VERB .EQ. 'MINMAX') THEN
CALL RDMMAX (IFLD, INTYP, CFIELD,
& NAMIGV, NAMINV, NAMIEV,
& NAMOGV, NAMONV, NAMOEV,
& NCSTEP, MMSTEP, MMNAME, MMTYP, MMVAR, MMNUM, *270)
IF (MMNUM .LT. 0) THEN
CALL PRTERR ('CMDERR', 'All minimums and maximums'
& // ' for this variable have been displayed')
GOTO 270
END IF
CALL PRMMAX (NOUT, MMSTEP, MMNAME, MMTYP, MMVAR, MMNUM,
& XMIN, XMAX, NUMELB, IDELB, ISEVOK, VARGL, VARNP, VAREL)
IF (MMSTEP .EQ. 0) THEN
NSTEP = 1
CALL TOSTEP (NSTEP, NUMELB, IDELB, ISEVOK,
& TIME, VARGL, VARNP, VAREL)
END IF
C *** Miscellaneous Commands ***
ELSE IF (VERB .EQ. 'HELP') THEN
ISON = HELP ('EXPLORE', 'COMMANDS', CFIELD(IFLD))
IF (.NOT. ISON)
& CALL SHOCMD ('COMMANDS', CMDTBL)
ELSE IF (VERB .EQ. 'PRECISION') THEN
if (FFMATC (IFLD, INTYP, CFIELD, 'HIGH', 1)) THEN
IPREC = 9
else if (FFMATC (IFLD, INTYP, CFIELD, 'LOW', 1) .OR.
$ FFMATC (IFLD, INTYP, CFIELD, 'NORMAL', 1)) THEN
IPREC = 4
else if (ffexst(ifld, intyp)) THEN
call ffintg(ifld, intyp, ifield, 'Precision',
* 4, IPREC, *270)
else
CALL PRTERR ('CMDERR',
& 'Syntax: PRECISION high|low|normal|0..9')
GOTO 270
end if
if (IPREC .gt. 16) then
CALL PRTERR ('CMDERR',
& 'Maximum precision is 16.')
IPREC = 16
end if
if (IPREC .le. 0) then
CALL PRTERR ('CMDERR',
& 'Precision must be positive.')
GOTO 270
end if
CALL SETPRC(IPREC,1)
ELSE IF ((VERB .EQ. 'EXIT') .OR. (VERB .EQ. 'END')
& .OR. (VERB .EQ. 'QUIT')) THEN
CALL SCNEOF
GOTO 280
ELSE
CALL PRTERR ('CMDERR', '"' // VERB(:LENSTR(VERB))
& // '" is an invalid command')
END IF
270 CONTINUE
GOTO 200
280 CONTINUE
RETURN
END