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.

289 lines
8.7 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 -*- Mode: fortran -*-
C=======================================================================
SUBROUTINE COMAND (A, IELBST, IDELB, NUMELB, NUMLNK, NUMATR,
& NAMELB, INPSST, IDNPS, NNNPS, IESSST, IDESS, NEESS, DONE, *)
C=======================================================================
C --*** COMAND *** (GJOIN) Command input and execution
C -- Written by Amy Gilkey - revised 02/23/88
C --
C --COMAND inputs and executes an user command.
C --
C --Parameters:
C -- A - IN - the dynamic memory base array
C -- IELBST - IN/OUT - the element block status
C -- IDELB - IN/OUT - the element block ID for each block
C -- NUMELB - IN - the number of elements for each block
C -- NUMLNK - IN - the number of nodes per element for each block
C -- NUMATR - IN - the number of attributes for each block
C -- INPSST - IN/OUT - the nodal point set status
C -- IDNPS - IN/OUT - the nodal point set ID for each set
C -- NNNPS - IN - the number of nodes for each set
C -- IESSST - IN/OUT - the element side set status
C -- IDESS - IN/OUT - the element side set ID for each set
C -- NEESS - IN - the number of elements for each set
C -- DONE - OUT - true iff no more input files
C -- * - return statement if quit
C --
C --Common Variables:
C -- Sets and uses /TITLES/
C -- Uses /DBVARS/
PARAMETER (MAXFLD=80)
include 'exodusII.inc'
include 'gj_params.blk'
include 'gj_filnum.blk'
include 'gj_titles.blk'
include 'gj_dbvars.blk'
DIMENSION A(*)
INTEGER IELBST(*)
INTEGER IDELB(*)
INTEGER NUMELB(*)
INTEGER NUMLNK(*)
INTEGER NUMATR(*)
CHARACTER*(MXSTLN) NAMELB(*)
INTEGER INPSST(*)
INTEGER IDNPS(*)
INTEGER NNNPS(*)
INTEGER IESSST(*)
INTEGER IDESS(*)
INTEGER NEESS(*)
LOGICAL DONE
CHARACTER*8 WORD, VERB, STRA, STRB
INTEGER INTYP(MAXFLD+1)
CHARACTER*8 CFIELD(MAXFLD)
INTEGER IFIELD(MAXFLD)
REAL RFIELD(MAXFLD)
LOGICAL ISON
CHARACTER*8 CMDTBL(14)
SAVE CMDTBL
C --CMDTBL - the valid commands table
C --Command table follows. Remember to change the dimensioned size when
C --changing the table.
DATA CMDTBL /
$ 'TITLE ', 'BLOCKS ', 'MATERIAL', 'NSETS ', 'SSETS ',
$ 'HELP ', 'FINISH ', 'EXIT ', 'END ', 'QUIT ',
$ 'NODESETS', 'SIDESETS', 'ADD ', ' ' /
WRITE (*, *)
C --Initialize the database title
TITLE = TITLE1
C --Initialize the element blocks
DO 100 IELB = 1, NEWELB
IELBST(IELB) = 0
100 CONTINUE
ISON = .FALSE.
DO 110 IELB = 1, NEWELB
I = LOCINT (IDELB(IELB), NEWELB, IDELB)
IF (I .LT. IELB) THEN
ISON = .TRUE.
IELBST(IELB) = I
IELBST(I) = I
C ... Check for compatible element blocks if combining...
IF ( (NUMLNK(I) .NE. NUMLNK(IELB)) .OR.
& (NUMATR(I) .NE. NUMATR(IELB)) ) THEN
CALL INTSTR (1, -1, I, STRA, LSTRA)
CALL INTSTR (1, -1, IELB, STRB, LSTRB)
CALL PRTERR ('CMDWARN',
& 'Element blocks '//STRA(:LSTRA)//' and '
& //STRB(:LSTRB)//
& ' have duplicate IDS but are not compatible')
ELSE IF (NAMELB(I) .NE. NAMELB(IELB)) THEN
CALL INTSTR (1, -1, I, STRA, LSTRA)
CALL INTSTR (1, -1, IELB, STRB, LSTRB)
CALL PRTERR ('CMDWARN',
& 'Element blocks '//STRA(:LSTRA)//' and '
& //STRB(:LSTRB)//
& ' have duplicate IDS but different element types')
END IF
END IF
110 CONTINUE
IF (ISON)
& CALL PRTERR ('CMDWARN', 'Duplicate IDs in element blocks'
& // ' - combined unless changed')
C --Initialize the nodal point sets
DO 120 INPS = 1, NEWNPS
INPSST(INPS) = 0
120 CONTINUE
ISON = .FALSE.
DO 130 INPS = 1, NEWNPS
I = LOCINT (IDNPS(INPS), NEWNPS, IDNPS)
IF (I .LT. INPS) THEN
ISON = .TRUE.
INPSST(INPS) = I
INPSST(I) = I
END IF
130 CONTINUE
IF (ISON)
& CALL PRTERR ('CMDWARN', 'Duplicate IDs in nodal point sets'
& // ' - combined unless changed')
C --Initialize the element side sets
DO 140 IESS = 1, NEWESS
IESSST(IESS) = 0
140 CONTINUE
ISON = .FALSE.
DO 150 IESS = 1, NEWESS
I = LOCINT (IDESS(IESS), NEWESS, IDESS)
IF (I .LT. IESS) THEN
ISON = .TRUE.
IESSST(IESS) = I
IESSST(I) = I
END IF
150 CONTINUE
IF (ISON)
& CALL PRTERR ('CMDWARN', 'Duplicate IDs in element side sets'
& // ' - combined unless changed')
160 CONTINUE
DONE = .FALSE.
C --Read command line
WRITE (*, *)
CALL FREFLD (0, 0, 'GJOIN> ', MAXFLD,
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
IF (IOSTAT .LT. 0) GOTO 210
IF (NUMFLD .EQ. 0) GOTO 160
INTYP(MIN(MAXFLD,NUMFLD)+1) = -999
IFLD = 1
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
CALL ABRSTR (VERB, WORD, CMDTBL)
IF (VERB .EQ. ' ') VERB = WORD
CFIELD(IFLD-1) = VERB
CALL OUTLOG (KLOG, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
IF (VERB .EQ. 'TITLE') THEN
C --Allow user to select the database title
CALL SETITL (TWODB)
ELSE IF ((VERB .EQ. 'BLOCKS') .OR. (VERB .EQ. 'MATERIAL')) THEN
C --Allow user to change element blocks
CALL CKNONE (NEWELB, .FALSE., 'element blocks', *210)
CALL MDRSRV ('ISCR', KISCR, NEWELB)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 210
180 CONTINUE
CALL PRTELB (IELBST, NELBL1, NELBL2,
& IDELB, NUMELB, NUMLNK, NUMATR, A(KISCR))
CALL SETSTA ('BLOCKS> ', 'element block',
& NELBL1, NELBL2, IDELB, IELBST, *180)
CALL MDDEL ('ISCR')
ELSE IF (VERB .EQ. 'NSETS' .or. VERB .EQ. 'NODESETS') THEN
C --Allow user to change nodal point sets
CALL CKNONE (NEWNPS, .FALSE., 'nodal point sets', *210)
CALL MDRSRV ('ISCR', KISCR, NEWNPS)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 210
190 CONTINUE
CALL PRTNPS (INPSST, NNPS1, NNPS2, IDNPS, NNNPS,
& A(KISCR))
CALL SETSTA ('NSETS> ', 'nodal point set',
& NNPS1, NNPS2, IDNPS, INPSST, *190)
CALL MDDEL ('ISCR')
ELSE IF (VERB .EQ. 'SSETS' .or. VERB .eq. 'SIDESETS') THEN
C --Allow user to change element side sets
CALL CKNONE (NEWESS, .FALSE., 'element side sets', *210)
CALL MDRSRV ('ISCR', KISCR, NEWESS)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 210
200 CONTINUE
CALL PRTESS (IESSST, NESS1, NESS2,
& IDESS, NEESS, A(KISCR))
CALL SETSTA ('SSETS> ', 'element side set',
& NESS1, NESS2, IDESS, IESSST, *200)
CALL MDDEL ('ISCR')
ELSE IF (VERB .EQ. 'HELP') THEN
WRITE (*, 10000)
10000 FORMAT (
& /,1X,'Valid Commands:',
& /,4X,'TITLE - change the database title'
& /,4X,'BLOCKS - manipulate the element blocks'
& /,4X,'NSETS - manipulate the nodal point sets'
& /,4X,'SSETS - manipulate the element side sets'
& /,4X,'EXIT - end command input, start processing'
$ /,4X,'FINISH - end command input, write output file'
& /,4X,'QUIT - abort processing'
& )
ELSE IF ((VERB .EQ. 'EXIT') .OR. (VERB .EQ. 'END')) THEN
CALL PRTERR ('CMDWARN', 'Please use "ADD" or "FINISH"')
IF (TWODB) THEN
WRITE (*, *)
CALL FREFLD (0, 0, 'Is there another database? ', MAXFLD,
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
CALL OUTLOG (KLOG, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
DONE = (CFIELD(1)(1:1) .NE. 'Y')
ELSE
DONE = .TRUE.
END IF
CALL SCNEOF
GOTO 210
ELSE IF (VERB .EQ. 'FINISH') THEN
DONE = .TRUE.
CALL SCNEOF
GOTO 210
ELSE IF (VERB .EQ. 'ADD') THEN
DONE = .FALSE.
CALL SCNEOF
GOTO 210
ELSE IF (VERB .EQ. 'QUIT') THEN
CALL SCNEOF
RETURN 1
ELSE
CALL PRTERR ('CMDERR', '"' // VERB(:LENSTR(VERB))
& // '" is an invalid command')
END IF
GOTO 160
210 CONTINUE
RETURN
END