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.
 
 
 
 
 
 

903 lines
33 KiB

C Copyright(C) 1999-2020, 2022 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
SUBROUTINE COMMAND (A, IA, TITLE, TIME, ITMSEL, MAT, DISP,
* CRD, LINK, DENSTY, WAVE, ISEVOK,
* NAMEGL, NAMENV, NAMEEL,
* NQAREC, QAREC, NINFO, INFREC, DBNAME)
C READ AND INTERPRET ALL INPUT DATA
include 'exodusII.inc'
CHARACTER*80 TITLE, COMMENT
INTEGER IA(*)
DIMENSION A(*), TIME(*), MAT(6,*), DISP(NUMNP,*), CRD(NUMNP,*),
* LINK(*), DENSTY(*), WAVE(*)
INTEGER ITMSEL(*), ISEVOK(*)
CHARACTER*(MXSTLN) NAMEGL(*), NAMENV(*), NAMEEL(*)
CHARACTER*(MXLNLN) INFREC(*)
CHARACTER*(MXSTLN) QAREC(4,*)
CHARACTER*(*) DBNAME
include 'nu_cvty.blk'
include 'nu_ptim.blk'
include 'nu_mass.blk'
include 'nu_logs.blk'
include 'nu_numg.blk'
include 'nu_varcnt.blk'
include 'nu_cav.blk'
include 'nu_nset.blk'
include 'nu_io.blk'
DIMENSION TRANGE(3), CENT(3)
PARAMETER (MXNAM = 132)
DIMENSION KV(MXNAM), RV(MXNAM), IVAL(MXNAM)
CHARACTER*32 CV(MXNAM), NAME, CTMP
CHARACTER*16 LABEL(32), TYPE, PROMPT
CHARACTER*8 GMTHD, SORTYP, LISTYP, OPT
LOGICAL FIRST, EXOSAV, ALLTIM, ISON, SORUP, ISHELP, LTMP,
* LTMP2, LTMP3, LTMP4, CENTER
LOGICAL FFNUMB, FFMATC, HELP, MATSTR, FFEXST
CHARACTER*8 CMDTBL(38), SORTBL(12), LISTBL(20)
SAVE CMDTBL, SORTBL, LISTBL
C --CMDTBL - the valid commands table
C --SORTBL - the valid sort options table
C --LISTBL - the valid list options table
C --Command table follows. Remember to change the dimensioned size when
C --changing the table.
DATA CMDTBL /
* 'AXISYMME', 'CAVITY ', 'COMMENT ', 'DELTIME ', 'DENSITY ',
* 'EXIT ', 'END ', 'EXODUS ', 'GAP ', 'HELP ',
* 'LIMITS ', 'LIST ', 'LOCATE ', 'OVERLAP ', 'PLANE ',
* 'PLANAR ', 'PROPERTI', 'SORT ', 'TIMES ', 'TMAX ',
* 'TMIN ', 'MASS ', 'PRINT ', 'ECHO ', 'SELECT ',
* 'WAVESPEE', 'TIMESTEP', 'ALLTIMES', 'NINTV ', 'ZINTV ',
* 'SUM ', 'AVERAGE ', 'CONDITIO', 'ESUM ', 'EAVERAGE',
* 'QUIT ', 'MCAVITY ', ' '/
DATA SORTBL /
* 'X ', 'Y ', 'Z ', 'T ', 'DISTANCE',
* 'RADIAL ', 'PARAMETR', 'ANGLE ', 'THETA ', 'PHI ',
* 'NONE ', ' '/
DATA LISTBL /
* 'SSETS ', 'SIDESETS', 'NSETS ', 'NODESETS', 'VARS ',
* 'VARIABLE', 'BLOCKS ', 'MATERIAL', 'TIMES ', 'STEPS ',
* 'COMMANDS', 'SORT ', 'STIMES ', 'NAMES ', 'SELECTED',
* 'INFORMAT', 'QA ', 'VOLUME ', 'NODALVOL', ' '/
DATA FIRST /.TRUE./, PROMPT /' NUMBERS> '/
DATA GMTHD /'DISTANCE'/, SORTYP /'NONE'/, SORUP /.TRUE./
AXI = .TRUE.
EXOSAV = EXODUS
IF (FIRST) THEN
FIRST = .FALSE.
CALL HEADER (NDIM, TITLE, NUMEL, NUMNP, AXI)
END IF
DO 10 IBLK = 1, NELBLK
MAT(5,IBLK) = 1
10 CONTINUE
if (nstep .gt. 0) then
CALL INILOG (NSTEP, .TRUE., ITMSEL)
TMIN = TIME(1)
TMAX = TIME(NSTEP)
else
tmin = 0.0
tmax = 0.0
end if
STMIN = TMIN
STMAX = TMAX
LSTSEL= NSTEP
IOMIN = 6
IOMAX = 7
NQUAD = 1
C ... GET SOME SCRATCH SPACE
CALL MDRSRV ('SCRTCH', ISCR, NDIM*NUMNP)
CALL MDRSRV ('SCRTC2', ISCR2, NDIM*NUMNP)
CALL MDRSRV ('SORTMP', ISMP, MAX(NUMEL, NUMNP) )
CALL MDRSRV ('NODSEL', INDSEL, NUMNP)
CALL MDRSRV ('ELMSEL', IELSEL, NUMEL)
CALL MDRSRV ('BLKSCR', IBLSC, NELBLK+1)
call MDRSRV ('NBLSEL', INSEL, NELBLK+1)
CALL MDSTAT (NERRS, NUSED)
IF (NERRS .GT. 0) THEN
CALL MEMERR
STOP
END IF
CALL INILOG (NUMNP, .TRUE., IA(INDSEL))
CALL INILOG (NUMEL, .TRUE., IA(IELSEL))
NSELND = NUMNP
NSELEL = NUMEL
20 CONTINUE
PRINT *, ' '
CALL FREFLD (0, 0, PROMPT(:LENSTR(PROMPT)+1), MXNAM, IOS, NF, KV,
* CV, IVAL, RV)
IF (IOS .NE. 0) CV(1) = 'EXIT'
KV(MIN(MXNAM,NF)+1) = -999
NAME = CV(1)
CALL ABRSTR (NAME, CV(1), CMDTBL)
IFLD = 2
IF (NAME .EQ. ' ') NAME = CV(1)
C ...SCAN FOR INPUT CARD MATCH
IF (NAME.EQ.' ') THEN
GO TO 20
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'ECHO') THEN
CALL FFONOF (IFLD, KV, CV, ISON, *20)
IF (ISON) THEN
IOMIN = ITERM
IF (IOMAX .EQ. IHARD) THEN
CALL PRTERR ('CMDSPEC',
* 'Results output to both the terminal and list file')
ELSE
CALL PRTERR ('CMDSPEC',
* 'Results output to terminal only')
END IF
ELSE
IOMIN = IHARD
IOMAX = IHARD
CALL PRTERR ('CMDSPEC',
* 'Results output to list file only')
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'PRINT') THEN
CALL FFONOF (IFLD, KV, CV, ISON, *20)
IF (ISON) THEN
IOMAX = IHARD
IF (IOMIN .EQ. ITERM) THEN
CALL PRTERR ('CMDSPEC',
* 'Results output to both the terminal and list file')
ELSE
CALL PRTERR ('CMDSPEC',
* 'Results output to list file only')
END IF
ELSE
IOMIN = ITERM
IOMAX = ITERM
CALL PRTERR ('CMDSPEC', 'Results output to terminal only')
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'COMMENT') THEN
IFLD = 2
IF (MATSTR(CV(2), 'PAGE', 1)) THEN
WRITE (IHARD, 40)
IFLD = 3
END IF
ICOM = MIN(1, IVAL(IFLD))
DO 30 IC = 1, ICOM
CALL GETINP (0, 0, 'COMMENT> ', COMMENT, IOSTAT)
WRITE (IHARD,50) COMMENT(:LENSTR(COMMENT))
30 CONTINUE
40 FORMAT ('1')
50 FORMAT (1X,A)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'EXODUS') THEN
CALL CKEXOD (EXOSAV, *20)
CALL FFONOF (IFLD, KV, CV, EXODUS, *20)
IF (EXODUS) THEN
CALL PRTERR ('CMDSPEC',
* 'Calculations performed for all selected time steps')
ELSE
CALL PRTERR ('CMDSPEC',
* 'Calculations performed for undeformed geometry only')
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'HELP') THEN
ISHELP = HELP ('NUMBERS', 'COMMANDS', CV(2) )
IF (.NOT. ISHELP) CALL SHOCMD ('COMMANDS', CMDTBL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'AXISYMME') THEN
AXI = .TRUE.
CALL PRTERR ('CMDSPEC', 'Axisymmetric Body Geometry')
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'PLANAR' .OR. NAME .EQ. 'PLANE') THEN
AXI = .FALSE.
CALL PRTERR ('CMDSPEC', 'Planar Body Geometry')
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ.'PROPERTI' .OR. NAME .EQ. 'MASS') THEN
C ... SET NUMBER OF QUADRATURE POINTS
CALL FFINTG (IFLD, KV, IVAL,
* 'number of quadrature points', 1, NQUAD, *20)
IF (NQUAD .NE. 1 .AND. NQUAD .NE. 2**NDIM) THEN
IF (NDIM .EQ. 2) CALL PRTERR ('CMDERR',
* 'quadrature order must be 1 or 4')
IF (NDIM .EQ. 3) CALL PRTERR ('CMDERR',
* 'quadrature order must be 1 or 8')
GO TO 20
END IF
CALL FFREAL (IFLD, KV, RV,
* 'common material density', 0.0, CDENS, *20)
IF (CDENS .GT. 0.) THEN
CALL INIREA (NELBLK, CDENS, DENSTY)
CALL INISTR (NELBLK, ' ', LABEL)
ELSE IF (CDENS .LT. 0.) THEN
CALL PRTERR ('CMDERR',
* 'density must be greater than zero')
GO TO 20
END IF
CALL MASSPR (A, TIME, ITMSEL, DENSTY, MAT,
* DISP, NQUAD, LABEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'TIMESTEP') THEN
CALL FFREAL (IFLD, KV, RV,
* 'common material wavespeed', 0.0, CWAVE, *20)
IF (CWAVE .GT. 0.) THEN
CALL INIREA (NELBLK, CWAVE, WAVE)
CALL INISTR (NELBLK, ' ', LABEL)
ELSE IF (CWAVE .LT. 0.) THEN
CALL PRTERR ('CMDERR',
* 'wavespeed must be greater than zero')
GO TO 20
END IF
IF (WAVE(1) .EQ. 0.) THEN
CALL GETWAV (MAT, WAVE, NELBLK, LABEL)
END IF
CALL FFREAL (IFLD, KV, RV,
* 'critical damping fraction', 0.06, EPSLON, *20)
CALL ESTIME (CRD, WAVE, LINK, MAT, LABEL, NDIM, 2**NDIM,
* NELBLK, A(ISCR), A(ISCR2), EPSLON, NUMNP )
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'DENSITY') THEN
CALL GETDEN (MAT, DENSTY, NELBLK, LABEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'WAVESPEE') THEN
CALL GETWAV (MAT, WAVE, NELBLK, LABEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'CAVITY') THEN
NUMCAV = 0
60 CONTINUE
IF (FFNUMB (IFLD, KV)) THEN
NUMCAV = MIN(NUMCAV + 1, MAXCAV)
CALL FFINTG (IFLD, KV, IVAL,
* 'cavity boundary flag', 0, ICAV(NUMCAV), *20)
GO TO 60
END IF
CENT(1) = 0.0
CENT(2) = 0.0
CENT(3) = 0.0
CENTER = .FALSE.
C ... For 3d, if no center specified use 0,0,0 unless user enters 'centroid'
IF (NDIM .eq. 3) then
center = .true.
end if
IF (FFMATC (IFLD, KV, CV, 'CENTROID', 5)) THEN
CENTER = .FALSE.
ELSE IF (FFMATC (IFLD, KV, CV, 'CENTER', 1)) THEN
CALL FFREAL (IFLD, KV, RV, 'X coordinate of center',
* 0.0, CENT(1), *20)
CALL FFREAL (IFLD, KV, RV, 'Y coordinate of center',
* 0.0, CENT(2), *20)
IF (NDIM .EQ. 3) THEN
CALL FFREAL (IFLD, KV, RV, 'Z coordinate of center',
* 0.0, CENT(3), *20)
END IF
CENTER = .TRUE.
ELSE
END IF
CALL CAVITY (A, CRD, A(IBC1), A(IBC2), A(IBC3), A(IBC4),
* A(IBC5),A(IBC6), A(IBC7), A(IBC8), DISP, NUMNP, NDIM,
* NUMESS, TIME, ITMSEL, TITLE, CENT, CENTER)
ELSE IF (NAME .EQ. 'MCAVITY') THEN
NUMCAV = 0
66 CONTINUE
IF (FFNUMB (IFLD, KV)) THEN
NUMCAV = MIN(NUMCAV + 1, MAXCAV)
CALL FFINTG (IFLD, KV, IVAL,
* 'cavity boundary flag', 0, ICAV(NUMCAV), *20)
GO TO 66
END IF
CENT(1) = 0.0
CENT(2) = 0.0
CENT(3) = 0.0
CENTER = .FALSE.
C ... For 3d, if no center specified use 0,0,0 unless user enters 'centroid'
IF (NDIM .eq. 3) then
center = .true.
end if
IF (FFMATC (IFLD, KV, CV, 'CENTROID', 5)) THEN
CENTER = .FALSE.
ELSE IF (FFMATC (IFLD, KV, CV, 'CENTER', 1)) THEN
CALL FFREAL (IFLD, KV, RV, 'X coordinate of center',
* 0.0, CENT(1), *20)
CALL FFREAL (IFLD, KV, RV, 'Y coordinate of center',
* 0.0, CENT(2), *20)
IF (NDIM .EQ. 3) THEN
CALL FFREAL (IFLD, KV, RV, 'Z coordinate of center',
* 0.0, CENT(3), *20)
END IF
CENTER = .TRUE.
ELSE
END IF
CALL MULTI_CAVITY (A, CRD, A(IBC1), A(IBC2), A(IBC3), A(IBC4),
* A(IBC5),A(IBC6), A(IBC7), A(IBC8), DISP, NUMNP, NDIM,
* NUMESS, TIME, ITMSEL, TITLE, CENT, CENTER)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'GAP') THEN
CALL FFINTG (IFLD, KV, IVAL,
* 'gap master surface', 0, IMAS, *20)
CALL FFINTG (IFLD, KV, IVAL,
* 'gap slave surface', 0, ISLV, *20)
CALL FFREAL (IFLD, KV, RV,
* 'maximum gap matching distance', 0.0, DMAX, *20)
CALL FFCHAR (IFLD, KV, CV, GMTHD, GMTHD)
IF (MATSTR(GMTHD, 'DISTANCE', 1)) THEN
GMTHD = 'DISTANCE'
ELSE IF (MATSTR(GMTHD, 'NORMAL', 1)) THEN
GMTHD = 'NORMAL'
ELSE
CALL PRTERR ('CMDERR', '"' // GMTHD(:LENSTR(GMTHD))
& // '" is an invalid matching option')
GO TO 20
END IF
CALL GAPINI (A, CRD, A(IBC1), A(IBC2), A(IBC3), A(IBC4),
* A(IBC5),A(IBC6), A(IBC7), A(IBC8), DISP, NUMNP, NDIM,
* NUMESS, TIME, ITMSEL, TITLE, IMAS, ISLV,
* DMAX,GMTHD)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'OVERLAP') THEN
CALL FFINTG (IFLD, KV, IVAL,
* 'overlap master surface', 0, IMAS, *20)
CALL FFINTG (IFLD, KV, IVAL,
* 'overlap slave surface', 0, ISLV, *20)
CALL OVRLAP(A, CRD, A(IBC1), A(IBC2), A(IBC3), A(IBC4),
* A(IBC5),A(IBC6), A(IBC7), A(IBC8), DISP, NUMNP, NDIM,
* NUMESS, TIME, ITMSEL, TITLE, IMAS, ISLV, NUMEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'SELECT') THEN
IF (MATSTR(CV(2), 'ALL', 3)) THEN
DO 70 IBLK = 1, NELBLK
MAT(5,IBLK) = 1
70 CONTINUE
CALL INILOG(NUMNP, .TRUE., IA(INDSEL))
CALL INILOG(NUMEL, .TRUE., IA(IELSEL))
CALL PRTERR ('CMDSPEC',
* 'All Blocks, Elements, and Nodes Selected')
ELSE IF (MATSTR(CV(2), 'BLOCKS', 1)) THEN
IF (MATSTR(CV(3), 'ALL', 1) .OR. NF .EQ. 2) THEN
DO 80 IBLK = 1, NELBLK
MAT(5,IBLK) = 1
80 CONTINUE
CALL PRTERR ('CMDSPEC',
* 'All Blocks, Elements, and Nodes Selected')
ELSE
DO 90 IBLK = 1, NELBLK
MAT(5,IBLK) = 0
90 CONTINUE
DO 100 IBLK = 3, NF
IF (IVAL(IBLK).GT.0 .AND. IVAL(IBLK).LE.NELBLK) THEN
MAT(5,IVAL(IBLK)) = 1
ELSE
COMMENT = 'Invalid block number: '
CALL FFADDI (IVAL(IBLK), COMMENT)
CALL PRTERR ('CMDERR', COMMENT(:LENSTR(COMMENT)))
END IF
100 CONTINUE
END IF
CALL SELNOD (MAT, LINK, A(INDSEL), NUMNP, 2**NDIM, NELBLK,
* NSELND)
CALL SELELM (MAT, A(IELSEL), NUMEL, NELBLK, NSELEL)
CALL SHWBLK (NELBLK, MAT, NSELND, NSELEL)
ELSE IF (MATSTR(CV(2), 'MATERIAL', 1)) THEN
IF (MATSTR(CV(3), 'ALL', 1)) THEN
DO 110 IBLK = 1, NELBLK
MAT(5,IBLK) = 1
110 CONTINUE
ELSE
DO 120 IBLK = 1, NELBLK
MAT(5,IBLK) = 0
120 CONTINUE
DO 140 IFLD = 3, NF
IMAT = 0
DO 130 IBLK = 1, NELBLK
IF (IVAL(IFLD) .EQ. MAT(1,IBLK)) IMAT = IBLK
130 CONTINUE
IF (IMAT .NE. 0) THEN
MAT(5,IMAT) = 1
ELSE
COMMENT = 'Invalid Material Number: '
CALL FFADDI (IVAL(IFLD), COMMENT)
CALL PRTERR ('CMDERR', COMMENT(:LENSTR(COMMENT)))
END IF
140 CONTINUE
END IF
CALL SELNOD (MAT, LINK, A(INDSEL), NUMNP, 2**NDIM, NELBLK,
* NSELND)
CALL SELELM (MAT, A(IELSEL), NUMEL, NELBLK, NSELEL)
CALL SHWBLK (NELBLK, MAT, NSELND, NSELEL)
ELSE IF (MATSTR(CV(2), 'SIDESETS', 1) .OR.
* MATSTR(CV(2), 'SSETS', 1)) THEN
CALL SELSSN (A(INDSEL), NUMNP, NF-2, IVAL(3),
* A(IBC1), A(IBC3), A(IBC5), A(IBC7), NUMESS,
* NUMSEL)
ELSE IF (MATSTR(CV(2), 'NODESETS', 1) .OR.
* MATSTR(CV(2), 'NSETS', 1)) THEN
CALL SELSSN (A(INDSEL), NUMNP, NF-2, IVAL(3),
* A(INS1), A(INS2), A(INS3), A(INS4), NUMNPS,
* NUMSEL)
ELSE IF (MATSTR(CV(2), 'BOX', 1)) THEN
CALL SELBOX (A(IR), NUMNP, NDIM, RV(3), A(INDSEL), 'Nodes')
CALL SELBOX (A(IECEN), NUMEL, NDIM, RV(3), A(IELSEL),
* 'Elements')
ELSE
CALL PRTERR ('CMDERR', '"' // CV(2)(:LENSTR(CV(2)))
& // '" is an invalid or nonunique SELECT option')
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'LIST') THEN
CALL ABRSTR (LISTYP, CV(2), LISTBL)
IF (CV(2) .EQ. ' ') THEN
CALL SHOCMD ('Valid LIST options', LISTBL)
ELSE IF (LISTYP .EQ. ' ') THEN
CALL PRTERR ('CMDERR', '"' // CV(2)(:LENSTR(CV(2)))
& // '" is an invalid or nonunique LIST option')
CALL SHOCMD ('Valid LIST options', LISTBL)
ELSE IF (LISTYP .EQ. 'SSETS' .OR. LISTYP .EQ. 'SIDESETS') THEN
IF (NUMESS .EQ. 0) THEN
CALL PRTERR ('CMDSPEC', 'No side sets to list')
ELSE
CALL SHOWFL ('S', NUMESS, A(IBC1), A(IBC2), A(IBC3))
END IF
ELSE IF (LISTYP .EQ. 'NSETS' .OR. LISTYP .EQ. 'NODESETS') THEN
IF (NUMNPS .EQ. 0) THEN
CALL PRTERR ('CMDSPEC', 'No node sets to list')
ELSE
CALL SHOWFL ('N', NUMNPS, A(INS1), A(INS2), A(1))
END IF
ELSE IF (LISTYP .EQ.'VARS' .OR. LISTYP .EQ.'VARIABLE') THEN
CALL DBPINI ('*', NDB, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
* NUMNPS, LNPSNL, LNPSDF, NUMESS, LESSEL, LESSNL, LESSDF,
* NVARGL, NVARNP, NVAREL, DBNAME)
ELSE IF (LISTYP .EQ.'BLOCKS' .OR. LISTYP .EQ.'MATERIAL') THEN
CALL SHWBLK (NELBLK, MAT, NSELND, NSELEL)
ELSE IF (LISTYP .EQ. 'TIMES') THEN
CALL CKEXOD (EXOSAV, *20)
CALL DBPTIM ('*', NSTEP, TIME)
ELSE IF (LISTYP .EQ. 'STEPS') THEN
CALL CKEXOD (EXOSAV, *20)
CALL DBPTIM ('NM', NSTEP, TIME)
ELSE IF (LISTYP .EQ. 'STIMES' .OR.
* LISTYP .EQ. 'SELECTED' .AND. MATSTR(CV(3),'TIMES',1)) THEN
CALL CKEXOD (EXOSAV, *20)
CALL STIMES ('*', .FALSE., .TRUE., NSTEP, TIME, ITMSEL)
ELSE IF (LISTYP .EQ. 'COMMANDS') THEN
CALL SHOCMD ('COMMANDS', CMDTBL)
ELSE IF (LISTYP .EQ. 'SORT') THEN
CALL SHOCMD ('Valid SORT fields', SORTBL)
ELSE IF (LISTYP .EQ. 'NAMES') THEN
CALL CKEXOD (EXOSAV, *20)
CALL DBPNAM ('*', NVARGL, NVARNP, NVAREL,
* NAMEGL, NAMENV, NAMEEL)
ELSE IF (LISTYP .EQ. 'SELECTED') THEN
IF (MATSTR(CV(4),'RANGE',1)) THEN
OPT = 'R'
ELSE
OPT = ' '
END IF
IF (MATSTR(CV(3),'NODES',1)) THEN
CALL LISSEL (OPT//'L', 'Nodes', IOMIN, IOMAX,
* IDUM, A(INDSEL), NUMNP)
ELSE IF (MATSTR(CV(3),'ELEMENTS',1)) THEN
CALL LISSEL (OPT//'L', 'Elements', IOMIN, IOMAX,
* IDUM, A(IELSEL), NUMEL)
ELSE
CALL PRTERR ('CMDERR', '"' // CV(3)(:LENSTR(CV(3)))
& // '" is an invalid LIST SELECTED option')
END IF
ELSE IF (LISTYP .EQ. 'QA' .OR. LISTYP .EQ. 'INFORMAT') THEN
IF ((NQAREC .GT. 0) .OR. (NINFO .GT. 0)) THEN
CALL DBPQA ('*', NQAREC, QAREC, NINFO, INFREC)
END IF
ELSE IF (LISTYP .EQ. 'VOLUME') THEN
CALL PRVOL (ndim, CRD, link, numnp, numel, 8,
& a(ismp), IHARD)
CALL PRTERR ('CMDSPEC',
* 'Element Volumes were written to the list file')
ELSE IF (LISTYP .EQ. 'NODALVOL') THEN
CALL PRNVOL (ndim, CRD, link, numnp, numel, 8,
& a(ismp), IHARD)
CALL PRTERR ('CMDSPEC',
* 'Nodal Volumes were written to the list file')
ELSE
CALL PRTERR ('CMDERR', '"' // CV(2)(:LENSTR(CV(2)))
& // '" is an invalid or nonunique LIST option')
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'TMIN') THEN
CALL CKEXOD (EXOSAV, *20)
CALL FFREAL (IFLD, KV, RV,
* 'minimum selected time', TMIN, STMIN, *20)
CALL SELTIM (TIME, ITMSEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'TMAX') THEN
CALL CKEXOD (EXOSAV, *20)
CALL FFREAL (IFLD, KV, RV,
* 'maximum selected time', TMAX, STMAX, *20)
CALL SELTIM (TIME, ITMSEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ.'TIMES') THEN
CALL CKEXOD (EXOSAV, *20)
CALL FFRRNG (IFLD, KV, CV, RV, 'time selection',
* TIME(NSTEP), TRANGE, *20)
IF (TRANGE(3) .GT. 0.0) THEN
STMIN = TRANGE(1)
STMAX = TRANGE(2)
STDEL = TRANGE(3)
ELSE
STMIN = TRANGE(2)
STMAX = TRANGE(1)
STDEL = TRANGE(3)
END IF
CALL SELTIM (TIME, ITMSEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'DELTIME') THEN
CALL CKEXOD (EXOSAV, *20)
CALL FFREAL (IFLD, KV, RV,
* 'selected time interval', 0.0, STDEL, *20)
CALL SELTIM (TIME, ITMSEL)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'ALLTIMES') THEN
CALL CKEXOD (EXOSAV, *20)
STMIN = TMIN
STMAX = TMAX
STDEL = 0.0
CALL SELTIM (TIME, ITMSEL)
EXODUS = .TRUE.
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'NINTV') THEN
CALL CKEXOD (EXOSAV, *20)
CALL FFINTG (IFLD, KV, IVAL,
* 'time step interval', 10, NINTV, *20)
CALL SELINV (TIME, ITMSEL, NINTV)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'ZINTV') THEN
CALL CKEXOD (EXOSAV, *20)
CALL FFINTG (IFLD, KV, IVAL,
* 'time step interval', 10, NINTV, *20)
CALL SELINV (TIME, ITMSEL, -NINTV)
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'EXIT' .OR. NAME .EQ. 'END'
& .or. name .eq. 'QUIT') THEN
GO TO 190
C ... LOCATE NODES|ELEMENTS WITHIN toler OF LINE|PLANE|POINT
C --- FORMAT: locate nodes line x1,y1,[z1] x2,y2,[z2], toler1, toler2 type
C locate nodes plane x1,y1,[z1] i2,j2,[k2], toler1, toler2
C locate nodes point x1,y1,[z1] toler1, toler2
C locate elements line x1,y1,[z1] x2,y2,[z2], toler1, toler2 type
C locate elements plane x1,y1,[z1] i2,j2,[k2], toler1, toler2
C locate elements point x1,y1,[z1] toler1, toler2
C x1, y1, z1, x2, y2, z2 = Coordinate locations
C i2, j2, k2 = Normal Vector to plane
C If TOLER2 .EQ. 0, then TOLER1 = Maximum Distance for locate
C If TOLER2 .NE. 0, then TOLER1 = Minimum Distance for locate,
C TOLER2 = Maximum Distance for locate.
C If TYPE .EQ. BOUNDED, then only search within line
C If TYPE .EQ. UNBOUNDED, then search along projection of line
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'LOCATE') THEN
TYPE = 'UNBOUNDE'
DO 150 I=NF,4,-1
IF (KV(I) .EQ. 0) THEN
TYPE = CV(I)(:16)
GO TO 160
END IF
150 CONTINUE
160 CONTINUE
IF (MATSTR(CV(2),'NODES',1)) THEN
NUMLEN = NUMNP
IPTR = IR
ISEL = INDSEL
ELSE IF (MATSTR(CV(2),'ELEMENTS',1)) THEN
NUMLEN = NUMEL
IPTR = IECEN
ISEL = IELSEL
ELSE
CALL PRTERR ('CMDERR', '"' // CV(2)(:LENSTR(CV(2)))
& // '" is an invalid option')
GO TO 170
END IF
CALL LOCTOL (CV(3), NDIM, RV, KV)
IF (MATSTR(CV(3), 'LINE', 1)) THEN
IF (NDIM .EQ. 3) THEN
CALL LINE3 (A(IPTR), NUMLEN, A(ISCR), A(ISCR+NUMNP),
* NDIM, RV(4), RV(7), RV(10), CV(2), TYPE, SORTYP,
* A(ISMP), SORUP, IDUM, '*', A(ISEL))
ELSE
CALL LINE2 (A(IPTR), NUMLEN, A(ISCR), A(ISCR+NUMNP),
* NDIM, RV(4), RV(6), RV(8), CV(2), TYPE, SORTYP,
* A(ISMP), SORUP, IDUM, '*', A(ISEL))
END IF
ELSE IF (MATSTR(CV(3), 'PLANE', 2)) THEN
IF (NDIM .EQ. 3) THEN
CALL PLANE3 (A(IPTR), NUMLEN, A(ISCR), A(ISCR+NUMNP),
* NDIM, RV(4), RV(7), RV(10), CV(2), SORTYP,
* A(ISMP), SORUP, IDUM, '*', A(ISEL))
ELSE
CALL PRTERR ('CMDERR',
* 'use locate node/element line for 2D')
END IF
ELSE IF (MATSTR(CV(3), 'POINT', 2)) THEN
IF (NDIM .EQ. 3) THEN
CALL POINT3 (A(IPTR), NUMLEN, A(ISCR),
* NDIM, RV(4), RV(7), CV(2), SORTYP,
* A(ISMP), A(ISCR2), SORUP, IDUM, '*', A(ISEL))
ELSE
CALL POINT2 (A(IPTR), NUMLEN, A(ISCR),
* NDIM, RV(4), RV(6), CV(2), SORTYP,
* A(ISMP), A(ISCR2), SORUP, IDUM, '*', A(ISEL))
END IF
ELSE
CALL PRTERR ('CMDERR', '"' // CV(3)(:LENSTR(CV(3)))
& // '" is an invalid LOCATE option')
GO TO 170
END IF
170 CONTINUE
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'SORT') THEN
IF (CV(2) .EQ. ' ') CV(2) = 'NONE'
IF (CV(3) .EQ. ' ') CV(3) = 'UP'
CALL ABRSTR (SORTYP, CV(2), SORTBL)
IF (SORTYP .EQ. ' ') THEN
CALL PRTERR ('CMDERR', '"' // CV(2)(:LENSTR(CV(2)))
& // '" is an invalid or nonunique SORT option')
SORTYP = 'NONE'
END IF
IF (MATSTR(CV(3), 'UP', 1) .OR.
* MATSTR(CV(3), 'ASCENDIN', 1) .OR.
* MATSTR(CV(3), 'INCREASI', 1) ) THEN
SORUP = .TRUE.
ELSE IF (MATSTR(CV(3), 'DOWN', 1) .OR.
* MATSTR(CV(3), 'DESCENDI', 1) .OR.
* MATSTR(CV(3), 'DECREASI', 1) ) THEN
SORUP = .FALSE.
ELSE
CALL PRTERR ('CMDERR', '"' // CV(3)(:LENSTR(CV(3)))
& // '" is an invalid SORT order')
SORUP = .TRUE.
END IF
IF (SORUP) THEN
CALL PRTERR ('CMDSPEC',
* 'Sorting on field ' // SORTYP(:LENSTR(SORTYP)) //
* ' in ascending order.')
ELSE
CALL PRTERR ('CMDSPEC',
* 'Sorting on field ' // SORTYP(:LENSTR(SORTYP)) //
* ' in descending order.')
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'LIMITS') THEN
CALL MDRSRV ('XYZMIN', IXYZMN, NELBLK*NDIM)
CALL MDRSRV ('XYZMAX', IXYZMX, NELBLK*NDIM)
CALL MDSTAT (NERRS, NUSED)
IF (NERRS .GT. 0) THEN
CALL MEMERR
STOP
END IF
IF (MATSTR(CV(2), 'ALLTIMES', 1) .AND. EXOSAV .AND. ISDIS) THEN
ALLTIM = .TRUE.
ELSE
ALLTIM = .FALSE.
END IF
IF (ALLTIM) THEN
CALL LIMITS (A(IXYZMN), A(IXYZMX), CRD, LINK, MAT, NDIM,
* NELBLK, 2**NDIM, ALLTIM, TIME, ITMSEL,
* DISP, NUMNP)
ELSE
CALL LIMITS (A(IXYZMN), A(IXYZMX), CRD, LINK, MAT, NDIM,
* NELBLK, 2**NDIM, ALLTIM, TIME, ITMSEL,
* CRD, NUMNP)
END IF
CALL MDDEL ('XYZMIN')
CALL MDDEL ('XYZMAX')
CALL MDSTAT (NERRS, NUSED)
IF (NERRS .GT. 0) THEN
CALL MEMERR
STOP 'MEMORY'
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'SUM' .OR. NAME .EQ. 'AVERAGE') THEN
LTMP2 = .FALSE.
LTMP3 = .FALSE.
CALL CKEXOD (EXOSAV, *20)
IF (NAME .EQ. 'SUM') THEN
LTMP = .FALSE.
ELSE
LTMP = .TRUE.
END IF
CALL FFCHAR (IFLD, KV, CV, ' ', NAME)
IND = LOCSTR (NAME, NVARNP, NAMENV)
IF (IND .EQ. 0) THEN
CALL PRTERR ('ERROR', '"' // NAME(:LENSTR(NAME))
& // '" is not a valid nodal variable name')
ELSE
IPTR = INDSEL
LTMP2 = .FALSE.
LTMP3 = .FALSE.
180 CONTINUE
CALL FFCHAR (IFLD, KV, CV, 'RADIAL', CTMP)
IF (MATSTR(CTMP, 'LINEAR', 1)) THEN
LTMP2 = .FALSE.
ELSE IF (MATSTR(CTMP, 'RADIAL', 1)) THEN
LTMP2 = .TRUE.
ELSE IF (MATSTR(CTMP, 'ABSOLUTE', 1)) THEN
LTMP3 = .TRUE.
ELSE
CALL PRTERR ('ERROR', '"' // CTMP(:LENSTR(CTMP))
& // '" is not a valid option')
GO TO 20
END IF
IF (FFEXST (IFLD, KV)) GO TO 180
CALL SUMNOD (CRD, DISP, A(ISCR), NDIM, NUMNP, IND,
* A(IPTR), NAMENV(IND), TIME, ITMSEL,
$ LTMP2, LTMP, LTMP3)
END IF
C-----------------------------------------------------------------------
ELSE IF (NAME .EQ. 'ESUM' .OR. NAME .EQ. 'EAVERAGE') THEN
LTMP2 = .FALSE.
LTMP3 = .FALSE.
CALL CKEXOD (EXOSAV, *20)
IF (NAME .EQ. 'ESUM') THEN
LTMP = .FALSE.
ELSE
LTMP = .TRUE.
END IF
CALL FFCHAR (IFLD, KV, CV, ' ', NAME)
IND = LOCSTR (NAME, NVAREL, NAMEEL)
IF (IND .EQ. 0) THEN
CALL PRTERR ('ERROR', '"' // NAME(:LENSTR(NAME))
& // '" is not a valid element variable name')
ELSE
IPTR = IELSEL
LTMP4 = .FALSE.
LTMP2 = .TRUE.
LTMP3 = .FALSE.
182 CONTINUE
CALL FFCHAR (IFLD, KV, CV, 'DENSITY', CTMP)
C ... Determine whether element variable is per unit volume or is total
IF (MATSTR(CTMP, 'DENSITY', 1)) THEN
LTMP4 = .TRUE.
ELSE IF (MATSTR(CTMP, 'TOTAL', 1)) THEN
LTMP2 = .FALSE.
ELSE IF (MATSTR(CTMP, 'ABSOLUTE', 1)) THEN
LTMP3 = .TRUE.
ELSE IF (MATSTR(CTMP, 'AVERAGE', 1)) THEN
LTMP3 = .TRUE.
ELSE
CALL PRTERR ('ERROR', '"' // CTMP(:LENSTR(CTMP))
& // '" is not a valid option')
GO TO 20
END IF
IF (FFEXST (IFLD, KV)) GO TO 182
CALL SUMELM (CRD, DISP, A(ISCR), MAT, NDIM, NUMNP, IND,
* A(IPTR), NAMEEL(IND), TIME, ITMSEL,
$ LTMP, LTMP2, LTMP3, LTMP4, numel, link, 2**ndim,
& nelblk, a(ismp), ISEVOK, A(IBLSC), A(INSEL))
END IF
C ----------------------------------------
ELSE IF (NAME .EQ. 'CONDITIO' ) THEN
LTMP = .FALSE.
CALL FFCHAR (IFLD, KV, CV, 'NODEBUG', CTMP)
IF (MATSTR(CTMP, 'DEBUG', 1)) LTMP = .TRUE.
CALL MDRSRV ('SUMRY', ISUMR, 16*NELBLK)
CALL MDRSRV ('ISUMR', IISUM, 8*NELBLK)
CALL MDRSRV ('ASPECT', IASPEC, NUMEL)
CALL MDRSRV ('SKEW', ISKEW, NUMEL)
CALL MDRSRV ('TAPER', ITAPER, NUMEL)
CALL MDRSRV ('AREA', IAREA, NUMEL)
IF (NDIM .EQ. 3) THEN
CALL MDRSRV ('SKEWX', ISKX, NUMEL)
CALL MDRSRV ('SKEWY', ISKY, NUMEL)
CALL MDRSRV ('SKEWZ', ISKZ, NUMEL)
CALL MDRSRV ('TAPRX', ITPX, NUMEL)
CALL MDRSRV ('TAPRY', ITPY, NUMEL)
CALL MDRSRV ('TAPRZ', ITPZ, NUMEL)
CALL MDRSRV ('JACOB', IJAC, NUMEL)
END IF
CALL MDSTAT (NERRS, NUSED)
IF (NERRS .GT. 0) THEN
CALL MEMERR
STOP 'MEMORY'
END IF
NNODES = 2**NDIM
IF (NDIM .EQ. 2) THEN
CALL CON2D(CRD, NDIM, NUMNP, LINK, NNODES, NUMEL, MAT,
* NELBLK, A(IELSEL), A(IASPEC), A(ISKEW), A(ITAPER),
* A(IAREA), A(ISUMR), A(IISUM), LTMP)
ELSE
CALL CON3D(CRD, NDIM, NUMNP, LINK, NNODES, NUMEL, MAT,
* NELBLK, A(IELSEL), A(IASPEC), A(ISKEW), A(ITAPER),
* A(IAREA), A(ISUMR), A(IISUM), A(ISKX), A(ISKY), A(ISKZ),
* A(ITPX), A(ITPY), A(ITPZ), A(IJAC), LTMP)
END IF
CALL MDDEL ('SUMRY')
CALL MDDEL ('ISUMR')
CALL MDDEL ('ASPECT')
CALL MDDEL ('SKEW')
CALL MDDEL ('TAPER')
CALL MDDEL ('AREA')
IF (NDIM .EQ. 3) THEN
CALL MDDEL ('SKEWX')
CALL MDDEL ('SKEWY')
CALL MDDEL ('SKEWZ')
CALL MDDEL ('TAPRX')
CALL MDDEL ('TAPRY')
CALL MDDEL ('TAPRZ')
CALL MDDEL ('JACOB')
END IF
CALL MDSTAT (NERRS, NUSED)
IF (NERRS .GT. 0) THEN
CALL MEMERR
STOP 'MEMORY'
END IF
ELSE
CALL PRTERR ('CMDERR', '"' // NAME(:LENSTR(NAME))
& // '" is an invalid or nonunique command')
END IF
GO TO 20
190 CONTINUE
RETURN
END