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.
2381 lines
84 KiB
2381 lines
84 KiB
2 years ago
|
C Copyright(C) 1999-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
|
||
|
|
||
|
C -*- Mode: fortran -*-
|
||
|
C=======================================================================
|
||
|
SUBROUTINE COMAND (NDBIN, EXECUT,
|
||
|
& IDELB, NUMELB, NUMLNK, NUMATR,
|
||
|
& IDNPS, NNNPS, NDNPS, IXNNPS, IXDNPS,
|
||
|
$ LTNNPS, FACNPS,
|
||
|
& IDESS, NEESS, NNESS, IXEESS, IXNESS,
|
||
|
$ LTEESS, LTSESS, FACESS,
|
||
|
& XN, YN, ZN, XEXPL, YEXPL, ZEXPL, MODBLK,
|
||
|
* ISATRB, ATRSCL, IEQUIV, MAPNOD, MAPEL,
|
||
|
$ IELBST, INPSST, IESSST,
|
||
|
* NQAREC, QAREC, NINFO, INFREC, BLKTYP,
|
||
|
* ebname, nsname, ssname, atname,
|
||
|
* namegv, nvargl, namenv, nvarnp, nameev, nvarel,
|
||
|
* namemv, nvarns, namesv, nvarss, INOD2EL,
|
||
|
* SWPSS, SMOOTH, USRSUB, CENTRD,
|
||
|
& NSTEPS, TIMES, ITIMST, A, IA, *)
|
||
|
#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER == 1300)
|
||
|
cDEC$ OPTIMIZE:2
|
||
|
#endif
|
||
|
C=======================================================================
|
||
|
|
||
|
C --*** COMAND *** (GREPOS) Input and process commands
|
||
|
C -- Written by Amy Gilkey - revised 05/09/88
|
||
|
C -- Modified by Greg Sjaardema - 02/06/89
|
||
|
C --
|
||
|
C --COMAND inputs and executes an user command.
|
||
|
C --
|
||
|
C --Parameters:
|
||
|
C -- IDNPS - IN - the IDs of existing node sets
|
||
|
C -- IDESS - IN - the IDs of existing side sets
|
||
|
C -- IBPARM - IN - the block parameters (defined by the block type)
|
||
|
C -- IDELB - IN - the ids 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 -- XN, YN, ZN - IN - the nodal coordinates
|
||
|
C -- XEXPL, YEXPL, ZEXPL - IN - the offsets if EXPLODE option
|
||
|
C -- * - return statement for QUIT
|
||
|
C --
|
||
|
C --Common Variables:
|
||
|
C -- Sets NDIM, NUMNP, NUMEL, NELBLK,
|
||
|
C -- NUMNPS, LNPSNL, NUMESS, LESSEL, LESSNL of /DBNUMS/
|
||
|
C -- Sets DOTRAN, NNREPL, NEREPL, DIM3, NRTRAN, D3TRAN, ZGRAD,
|
||
|
C -- CENTER, NUMCOL of /PARAMS/
|
||
|
C -- Sets XOFFS, YOFFS, ZOFFS of /XYZOFF/
|
||
|
C -- Sets ROT3D, ROTMAT, ROTCEN of /XYZROT/
|
||
|
|
||
|
PARAMETER (MAXFLD = 64)
|
||
|
|
||
|
include 'gp_params.blk'
|
||
|
include 'gp_namlen.blk'
|
||
|
include 'gp_dbnums.blk'
|
||
|
include 'gp_dbtitl.blk'
|
||
|
include 'gp_xyzoff.blk'
|
||
|
include 'gp_xyzrot.blk'
|
||
|
include 'gp_xyzmir.blk'
|
||
|
include 'gp_xyzero.blk'
|
||
|
include 'gp_xyzscl.blk'
|
||
|
include 'gp_xyzwrp.blk'
|
||
|
include 'gp_nsset.blk'
|
||
|
include 'gp_splxyz.blk'
|
||
|
include 'gp_smooth.blk'
|
||
|
include 'gp_snap.blk'
|
||
|
include 'gp_deform.blk'
|
||
|
include 'gp_combine.blk'
|
||
|
include 'gp_attrot.blk'
|
||
|
|
||
|
INTEGER IDELB(*)
|
||
|
INTEGER NUMELB(*)
|
||
|
INTEGER NUMLNK(*)
|
||
|
INTEGER NUMATR(*)
|
||
|
INTEGER IELBST(*), INPSST(*), IESSST(*), ITIMST(*)
|
||
|
INTEGER IEQUIV(*), MAPNOD(*), MAPEL(*)
|
||
|
|
||
|
logical glonod, absolute
|
||
|
|
||
|
INTEGER IDNPS(*), NNNPS(*), NDNPS(*), IXNNPS(*),
|
||
|
$ IXDNPS(*), LTNNPS(*)
|
||
|
REAL FACNPS(*)
|
||
|
|
||
|
INTEGER IDESS(*), NEESS(*), NNESS(*), IXEESS(*), IXNESS(*)
|
||
|
INTEGER LTEESS(*), LTSESS(*)
|
||
|
REAL FACESS(*)
|
||
|
REAL TIMES(*)
|
||
|
|
||
|
REAL XN(*), YN(*), ZN(*)
|
||
|
REAL XEXPL(*), YEXPL(*), ZEXPL(*)
|
||
|
REAL ATRSCL(2,*)
|
||
|
REAL A(*)
|
||
|
INTEGER IA(*)
|
||
|
|
||
|
LOGICAL FFEXST, MATSTR, HELP
|
||
|
|
||
|
CHARACTER*(256) STRING
|
||
|
CHARACTER*(mxlnln) INFREC(*)
|
||
|
CHARACTER*(mxstln) QAREC(4,*)
|
||
|
CHARACTER*(mxstln) BLKTYP(*)
|
||
|
character*(maxnam) ebname(*), nsname(*), ssname(*),
|
||
|
* namenv(*), nameev(*), namemv(*), namegv(*), namesv(*), ATNAME(*)
|
||
|
|
||
|
INTEGER INOD2EL(*)
|
||
|
CHARACTER*(256) CTEMP
|
||
|
CHARACTER*8 STRA
|
||
|
CHARACTER*1 ITYPE
|
||
|
CHARACTER*(128) WORD, VERB, LISTYP, WORD2, NEWNM, OLDNM
|
||
|
INTEGER INTYP(MAXFLD+1)
|
||
|
CHARACTER*(128) CFIELD(MAXFLD)
|
||
|
INTEGER IFIELD(MAXFLD)
|
||
|
REAL RFIELD(MAXFLD)
|
||
|
LOGICAL ISHELP, DELOK, SMOOTH
|
||
|
LOGICAL SWPSS, USRSUB, EXECUT, CENTRD
|
||
|
LOGICAL DOALLA, DOALLB, ISATRB, ATRWRN
|
||
|
|
||
|
INTEGER IRNG(3)
|
||
|
|
||
|
REAL RNUM(9)
|
||
|
CHARACTER*20 RSTR(9)
|
||
|
|
||
|
LOGICAL FIRST
|
||
|
SAVE FIRST
|
||
|
|
||
|
CHARACTER*(mxstln) MYNAME
|
||
|
CHARACTER*(mxstln) CMDTBL(41), LISTBL(15)
|
||
|
SAVE CMDTBL, LISTBL
|
||
|
C --CMDTBL - the valid commands table
|
||
|
|
||
|
C --Command table follows. Remember to change the dimensioned size when
|
||
|
C --changing the table.
|
||
|
DATA CMDTBL /
|
||
|
1 'OFFSET ', 'REVOLVE ', 'REVCEN ', 'MIRROR ', 'NAME ',
|
||
|
2 'LIST ', 'SHOW ', 'HELP ', 'ZERO ', 'RENAME ',
|
||
|
3 'END ', 'EXIT ', 'QUIT ', 'SCALE ',
|
||
|
4 'CHANGE ', 'DELETE ', 'EXPLODE ', 'SHIFT ',
|
||
|
5 'INCREMENT', 'LIMITS ', 'ADJUST ', 'RANDOMIZE',
|
||
|
6 'SMOOTH ', 'SWAP ', 'USERSUBROUTINE', 'SNAP ',
|
||
|
7 'MOVE ', 'WARP ', 'EXECUTE ', 'COMBINE ', 'CENTROIDS',
|
||
|
8 'UNDELETE', 'KEEP ', 'EQUIVALENCE', 'DEFORM ',
|
||
|
9 'ELEMENTIZE','ROTATE ', 'MERGE ', 'TMIN ', 'TMAX ',
|
||
|
$ ' ' /
|
||
|
|
||
|
DATA LISTBL /
|
||
|
* 'SSETS ', 'SIDESETS', 'NSETS ', 'NODESETS', 'VARS ',
|
||
|
* 'VARIABLE', 'BLOCKS ', 'MATERIAL', 'COMMANDS', 'INFORMATION',
|
||
|
* 'QA ', 'TIMES ', 'STEPS ', 'NAMES ', ' '/
|
||
|
|
||
|
DATA MYNAME /'GREPOS'/
|
||
|
DATA FIRST /.TRUE./
|
||
|
C --Initialize
|
||
|
|
||
|
EXECUT = .FALSE.
|
||
|
|
||
|
LNAM = LENSTR(MYNAME)
|
||
|
MBLK = MAX(NELBLK, NUMNPS)
|
||
|
CALL INIREA ( MBLK, 0.0, XEXPL)
|
||
|
CALL INIREA ( MBLK, 0.0, YEXPL)
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL INIREA ( MBLK, 0.0, ZEXPL)
|
||
|
END IF
|
||
|
|
||
|
CALL INIINT(NVARNP, 0, INOD2EL)
|
||
|
|
||
|
C...Initialize attribute rotation
|
||
|
REVATT = .FALSE.
|
||
|
ROTALL = .FALSE.
|
||
|
ROTTYP = .FALSE.
|
||
|
ATTIND = -1
|
||
|
ATTBLK = -1
|
||
|
ROTBLK = "NONE"
|
||
|
CALL INIREA (3*3, 0.0, ROTATT)
|
||
|
DO I = 1, 3
|
||
|
ROTATT(I,I) = 1.0
|
||
|
END DO
|
||
|
|
||
|
C...Initialize attribute scaling
|
||
|
ATRWRN = .FALSE.
|
||
|
CALL SCLATR(NELBLK, IDELB, NUMATR, 0, .TRUE., 0, .TRUE., 1.0,
|
||
|
* ATRSCL, .FALSE., .TRUE.)
|
||
|
|
||
|
if (FIRST) then
|
||
|
C... Initialization code that should only be executed once
|
||
|
|
||
|
C... Node equivalencing
|
||
|
equiv = .FALSE.
|
||
|
eqtoler = -1.0
|
||
|
do i=1, numnp
|
||
|
iequiv(i) = i
|
||
|
end do
|
||
|
|
||
|
C... Initialize Material, NodeSet, SideSet status
|
||
|
C -- 0 = same
|
||
|
C -- - = delete
|
||
|
C -- n = combine with entity n
|
||
|
do 10 i=1, nelblk
|
||
|
ielbst(i) = 0
|
||
|
10 continue
|
||
|
do 20 i=1, numnps
|
||
|
inpsst(i) = 0
|
||
|
20 continue
|
||
|
do 30 i=1, numess
|
||
|
iessst(i) = 0
|
||
|
30 continue
|
||
|
do 40 i=1, nsteps
|
||
|
itimst(i) = 0
|
||
|
40 continue
|
||
|
first = .false.
|
||
|
end if
|
||
|
C...Initialize transformation variables
|
||
|
ADJTYP = 0
|
||
|
XOFFS = 0.0
|
||
|
YOFFS = 0.0
|
||
|
ZOFFS = 0.0
|
||
|
XMIRR = 1.0
|
||
|
YMIRR = 1.0
|
||
|
ZMIRR = 1.0
|
||
|
XZERO = 0.0
|
||
|
YZERO = 0.0
|
||
|
ZZERO = 0.0
|
||
|
XSCAL = 1.0
|
||
|
YSCAL = 1.0
|
||
|
ZSCAL = 1.0
|
||
|
XRAND = 0.0
|
||
|
YRAND = 0.0
|
||
|
ZRAND = 0.0
|
||
|
|
||
|
IWARP = 0
|
||
|
MODBLK = 0
|
||
|
IDEFST = 0
|
||
|
|
||
|
SPLOFF = .FALSE.
|
||
|
SWPSS = .FALSE.
|
||
|
SMOOTH = .FALSE.
|
||
|
USRSUB = .FALSE.
|
||
|
CENTRD = .FALSE.
|
||
|
|
||
|
ROT3D = .FALSE.
|
||
|
CALL INIREA (3*3, 0.0, ROTMAT)
|
||
|
DO 100 I = 1, 3
|
||
|
ROTMAT(I,I) = 1.0
|
||
|
100 CONTINUE
|
||
|
|
||
|
CALL MINMAX (NUMNP, XN, XMIN, XMAX)
|
||
|
ROTCEN(1) = XMIN
|
||
|
CALL MINMAX (NUMNP, YN, YMIN, YMAX)
|
||
|
ROTCEN(2) = YMIN
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL MINMAX (NUMNP, ZN, ZMIN, ZMAX)
|
||
|
ROTCEN(3) = ZMIN
|
||
|
ELSE
|
||
|
ROTCEN(3) = 0.0
|
||
|
END IF
|
||
|
|
||
|
C ... Initialize SNAP variables
|
||
|
numsnp = 0
|
||
|
|
||
|
110 CONTINUE
|
||
|
|
||
|
C --Read command line
|
||
|
|
||
|
WRITE (*, *)
|
||
|
CALL FREFLD (0, 0, 'GREPOS> ', MAXFLD,
|
||
|
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
|
||
|
IF (IOSTAT .LT. 0) GOTO 430
|
||
|
IF (NUMFLD .EQ. 0) GOTO 110
|
||
|
INTYP(MIN(MAXFLD,NUMFLD)+1) = -999
|
||
|
if (numfld .gt. maxfld) then
|
||
|
write (string, 1) numfld, maxfld
|
||
|
1 format('There were ',i3, ' words entered on the command line,'
|
||
|
$ ' but only ',i3,' are allowed.')
|
||
|
CALL PRTERR ('WARNING', STRING(:LENSTR(STRING)))
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
$ ' Please enter the command on two or more lines')
|
||
|
CALL PRTERR ('CMDSPEC',' ')
|
||
|
end if
|
||
|
|
||
|
IFLD = 1
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL ABRSTR (VERB, WORD, CMDTBL)
|
||
|
IF (VERB .EQ. ' ') VERB = WORD
|
||
|
|
||
|
C --Perform command
|
||
|
|
||
|
IF (VERB .EQ. '?') THEN
|
||
|
CALL SHOCMD ('COMMANDS', CMDTBL)
|
||
|
VERB = ' '
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'OFFSET' .OR. VERB .EQ. 'SHIFT') THEN
|
||
|
|
||
|
C ... Originally offset just asked for NDIM values. It was changed
|
||
|
C to go by axis type (OFFSET Y 1.0). We do maintain compatibility
|
||
|
C and check for both types of input.
|
||
|
|
||
|
RMULT = 0.0
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
120 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'SPLINE', 1)) THEN
|
||
|
SPLOFF = .TRUE.
|
||
|
CALL GETSPL(A)
|
||
|
ELSE IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
XOFFS = 0.0
|
||
|
YOFFS = 0.0
|
||
|
ZOFFS = 0.0
|
||
|
RMULT = 0.0
|
||
|
ELSE IF (MATSTR (WORD, 'ADD', 2)) THEN
|
||
|
C ... Set for cumulative offsets/shifts
|
||
|
RMULT = 1.0
|
||
|
ELSE IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'model offset', 0.0, TOFFS, *130)
|
||
|
XOFFS = RMULT * XOFFS + TOFFS
|
||
|
YOFFS = RMULT * YOFFS + TOFFS
|
||
|
ZOFFS = RMULT * ZOFFS + TOFFS
|
||
|
ELSE IF (WORD .EQ. 'X') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X coordinate offset', 0.0, TOFFS, *130)
|
||
|
XOFFS = RMULT * XOFFS + TOFFS
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y coordinate offset', 0.0, TOFFS, *130)
|
||
|
YOFFS = RMULT * YOFFS + TOFFS
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z coordinate offset', 0.0, TOFFS, *130)
|
||
|
ZOFFS = RMULT * ZOFFS + TOFFS
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Z allowed for 3D database only')
|
||
|
END IF
|
||
|
ELSE
|
||
|
IF (NDIM .EQ. 3) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "Z", "ALL", "ADD", or "RESET"')
|
||
|
IF (NDIM .EQ. 2) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "ALL", "ADD", or "RESET"')
|
||
|
GOTO 130
|
||
|
END IF
|
||
|
GOTO 120
|
||
|
END IF
|
||
|
ELSE
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X coordinate offset', XOFFS, XOFFS, *130)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y coordinate offset', YOFFS, YOFFS, *130)
|
||
|
IF (NDIM .EQ. 3) CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z coordinate offset', ZOFFS, ZOFFS, *130)
|
||
|
END IF
|
||
|
130 CONTINUE
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'ADJUST') THEN
|
||
|
C... ADJUST {CENTER|MINIMUM|MAXIMUM} {X|Y|Z} adjustment
|
||
|
C... ADJUST {MINIMUM|MAXIMUM} {X|Y|Z} adjustment
|
||
|
|
||
|
C... Calculate offset such that the value in the generated mesh
|
||
|
C (ignoring any other offsets, scales, or rotations)
|
||
|
C will equal the input value.
|
||
|
|
||
|
C...EXAMPLE:adjust maximum x 10
|
||
|
C will set the maximum x in the generated mesh equal to 10.
|
||
|
|
||
|
140 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR(WORD, 'MAXIMUM', 3)) THEN
|
||
|
ADJTYP = 1
|
||
|
ELSE IF (MATSTR(WORD, 'MINIMUM', 3)) THEN
|
||
|
ADJTYP = 2
|
||
|
ELSE IF (MATSTR(WORD, 'CENTER', 3)) THEN
|
||
|
ADJTYP = 3
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "MINIMUM", "MAXIMUM", or "CENTER"')
|
||
|
GO TO 150
|
||
|
END IF
|
||
|
END IF
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (WORD .EQ. 'X') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X adjustment', 0.0, TOFFS, *150)
|
||
|
IF (ADJTYP .EQ. 1) THEN
|
||
|
XOFFS = TOFFS - XMAX
|
||
|
ELSE IF (ADJTYP .EQ. 2) THEN
|
||
|
XOFFS = TOFFS - XMIN
|
||
|
ELSE IF (ADJTYP .EQ. 3) THEN
|
||
|
XOFFS = TOFFS - (XMAX+XMIN)/2.0
|
||
|
END IF
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y adjustment', 0.0, TOFFS, *150)
|
||
|
IF (ADJTYP .EQ. 1) THEN
|
||
|
YOFFS = TOFFS - YMAX
|
||
|
ELSE IF (ADJTYP .EQ. 2) THEN
|
||
|
YOFFS = TOFFS - YMIN
|
||
|
ELSE IF (ADJTYP .EQ. 3) THEN
|
||
|
YOFFS = TOFFS - (YMAX+YMIN)/2.0
|
||
|
END IF
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z adjustment', 0.0, TOFFS, *150)
|
||
|
IF (ADJTYP .EQ. 1) THEN
|
||
|
ZOFFS = TOFFS - ZMAX
|
||
|
ELSE IF (ADJTYP .EQ. 2) THEN
|
||
|
ZOFFS = TOFFS - ZMIN
|
||
|
ELSE IF (ADJTYP .EQ. 3) THEN
|
||
|
ZOFFS = TOFFS - (ZMAX+ZMIN)/2.0
|
||
|
END IF
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Z allowed for 3D database only')
|
||
|
END IF
|
||
|
ELSE
|
||
|
IF (NDIM .EQ. 3) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", or "Z"')
|
||
|
IF (NDIM .EQ. 2) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X" or "Y"')
|
||
|
GOTO 150
|
||
|
END IF
|
||
|
GOTO 140
|
||
|
END IF
|
||
|
150 CONTINUE
|
||
|
VERB = 'OFFSET'
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'LIMITS') THEN
|
||
|
call limits('Input Mesh Limits:', ndim,
|
||
|
& xmin, xmax, ymin, ymax, zmin, zmax)
|
||
|
VERB = ' '
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'EXPLODE') THEN
|
||
|
DO 170 IBLK = 1, NELBLK
|
||
|
WRITE (CTEMP, 10010) 'Offset for Material ', idelb(iblk),' > '
|
||
|
10010 FORMAT (1X, A, I10, A)
|
||
|
CALL SQZSTR (CTEMP, LSTR)
|
||
|
|
||
|
CALL FREFLD (0, 0, CTEMP(:LENSTR(CTEMP)+1), MAXFLD,
|
||
|
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
|
||
|
IF (IOSTAT .LT. 0) GOTO 430
|
||
|
INTYP(MIN(MAXFLD,NUMFLD)+1) = -999
|
||
|
IFLD = 1
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, XEXPL(IBLK), *160)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, YEXPL(IBLK), *160)
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, ZEXPL(IBLK), *160)
|
||
|
END IF
|
||
|
160 CONTINUE
|
||
|
170 CONTINUE
|
||
|
MODBLK = 1
|
||
|
VERB = ' '
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'ZERO') THEN
|
||
|
180 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
XZERO = 0.0
|
||
|
YZERO = 0.0
|
||
|
ZZERO = 0.0
|
||
|
ELSE IF (WORD .EQ. 'X') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'minimum X coordinate', 0.0, XZERO, *190)
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'minimum Y coordinate', 0.0, YZERO, *190)
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'minimum Z coordinate', 0.0, ZZERO, *190)
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Z allowed for 3D database only')
|
||
|
END IF
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "Z" or "RESET"')
|
||
|
GOTO 190
|
||
|
END IF
|
||
|
GOTO 180
|
||
|
END IF
|
||
|
|
||
|
190 CONTINUE
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'SCALE') THEN
|
||
|
200 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
|
||
|
IF (.NOT. MATSTR(WORD, 'ATTRIBUTE', 2) .AND.
|
||
|
* ISATRB .AND. .NOT. ATRWRN) THEN
|
||
|
CALL PRTERR ('WARNING',
|
||
|
* 'Some element blocks have attributes which ' //
|
||
|
* 'may also need scaling.')
|
||
|
ATRWRN = .TRUE.
|
||
|
END IF
|
||
|
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
XSCAL = 1.0
|
||
|
YSCAL = 1.0
|
||
|
ZSCAL = 1.0
|
||
|
|
||
|
ELSE IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'model scale factor', 1.0, TSCAL, *230)
|
||
|
XSCAL = XSCAL * ABS(TSCAL)
|
||
|
YSCAL = YSCAL * ABS(TSCAL)
|
||
|
ZSCAL = ZSCAL * ABS(TSCAL)
|
||
|
|
||
|
ELSE IF (WORD .EQ. 'X') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X scale factor', 1.0, TSCAL, *230)
|
||
|
XSCAL = XSCAL * ABS(TSCAL)
|
||
|
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y scale factor', 1.0, TSCAL, *230)
|
||
|
YSCAL = YSCAL * ABS(TSCAL)
|
||
|
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z scale factor', 1.0, TSCAL, *230)
|
||
|
ZSCAL = ZSCAL * ABS(TSCAL)
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Z allowed for 3D database only')
|
||
|
END IF
|
||
|
|
||
|
ELSE IF (MATSTR(WORD, 'ATTRIBUTE', 2)) THEN
|
||
|
C ... SCALE ATTRIBUTE {num|ALL} BLOCK {id|ALL} scale
|
||
|
C ... SCALE ATTRIBUTE RESET
|
||
|
C ... See if next field is integer (id) or word ('all')
|
||
|
VERB = ' '
|
||
|
STRING = 'SCALE ATTRIBUTE {id|ALL} BLOCK {id|ALL} {scale}'
|
||
|
IF (.NOT. ISATRB) THEN
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'There are no attributes on this database')
|
||
|
GO TO 230
|
||
|
END IF
|
||
|
|
||
|
ATRWRN = .TRUE.
|
||
|
DOALLA = .FALSE.
|
||
|
DOALLB = .FALSE.
|
||
|
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
DOALLA = .TRUE.
|
||
|
ELSE IF (MATSTR (WORD, 'RESET', 2)) THEN
|
||
|
CALL SCLATR(NELBLK, IDELB, NUMATR, 0, .TRUE., 0,
|
||
|
* .TRUE., 1.0, ATRSCL, .TRUE., .TRUE.)
|
||
|
GO TO 230
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 230
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is Attribute number
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'attribute ID', 0, IDATR, *420)
|
||
|
END IF
|
||
|
|
||
|
C ... Next word should be 'BLOCK'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (.NOT.(MATSTR (WORD, 'BLOCK', 1))) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "BLOCK"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 230
|
||
|
END IF
|
||
|
C ... Now find block id or 'ALL'
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
DOALLB = .TRUE.
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 230
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is Attribute number
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'block ID', 0, IDBLK, *420)
|
||
|
END IF
|
||
|
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
* 'attribute scale factor', 1.0, ASCALE, *230)
|
||
|
|
||
|
C ... Setup the scale and echo to the user
|
||
|
CALL SCLATR(NELBLK, IDELB, NUMATR, IDATR, DOALLA,
|
||
|
* IDBLK, DOALLB, ASCALE, ATRSCL, .TRUE., .TRUE.)
|
||
|
|
||
|
ELSE IF (MATSTR(WORD, 'BLOCK', 1)) THEN
|
||
|
DO 220 IBLK = 1, NELBLK
|
||
|
CALL INTSTR (1, 0, IDELB(IBLK), WORD, LW)
|
||
|
WRITE (CTEMP, 10020)
|
||
|
$ 'Scale factor for Material ', WORD(:LW),'> '
|
||
|
10020 FORMAT (1X, 3A)
|
||
|
CALL FREFLD (0, 0, CTEMP(:LENSTR(CTEMP)+1), MAXFLD,
|
||
|
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
|
||
|
IF (IOSTAT .LT. 0) GOTO 430
|
||
|
INTYP(MIN(MAXFLD,NUMFLD)+1) = -999
|
||
|
IFLD = 1
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, XEXPL(IBLK), *210)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, YEXPL(IBLK), *210)
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, ZEXPL(IBLK), *210)
|
||
|
END IF
|
||
|
210 CONTINUE
|
||
|
220 CONTINUE
|
||
|
MODBLK = 2
|
||
|
VERB = ' '
|
||
|
ELSE
|
||
|
IF (NDIM .EQ. 3) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "Z", "ALL", "ATTRIBUTE", or "RESET"')
|
||
|
IF (NDIM .EQ. 2) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "ALL", "ATTRIBUTE", or "RESET"')
|
||
|
GOTO 230
|
||
|
END IF
|
||
|
GOTO 200
|
||
|
END IF
|
||
|
|
||
|
230 CONTINUE
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'DEFORM') THEN
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
IDEFST = 0
|
||
|
ELSE IF (WORD .EQ. 'STEP') THEN
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
& 'deform step', 0, IDEFST, *235)
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "STEP", or "RESET"')
|
||
|
GOTO 235
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
235 CONTINUE
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'RANDOMIZE') THEN
|
||
|
240 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
XRAND = 0.0
|
||
|
YRAND = 0.0
|
||
|
ZRAND = 0.0
|
||
|
ELSE IF (MATSTR (WORD, 'ALL', 1)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'model random factor', 0.0, TRAND, *270)
|
||
|
XRAND = ABS(TRAND)
|
||
|
YRAND = ABS(TRAND)
|
||
|
ZRAND = ABS(TRAND)
|
||
|
ELSE IF (WORD .EQ. 'X') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X random factor', 0.0, TRAND, *270)
|
||
|
XRAND = ABS(TRAND)
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y random factor', 0.0, TRAND, *270)
|
||
|
YRAND = ABS(TRAND)
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z random factor', 0.0, TRAND, *270)
|
||
|
ZRAND = ABS(TRAND)
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Z allowed for 3D database only')
|
||
|
END IF
|
||
|
ELSE IF (MATSTR(WORD, 'BLOCK', 1)) THEN
|
||
|
DO 260 IBLK = 1, NELBLK
|
||
|
CALL INTSTR (1, 0, IDELB(IBLK), WORD, LW)
|
||
|
WRITE (CTEMP, 10030)
|
||
|
$ 'Random factor for Material ', WORD(:LW),'> '
|
||
|
10030 FORMAT (1X, 3A)
|
||
|
CALL FREFLD (0, 0, CTEMP(:LENSTR(CTEMP)+1), MAXFLD,
|
||
|
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
|
||
|
IF (IOSTAT .LT. 0) GOTO 430
|
||
|
INTYP(MIN(MAXFLD,NUMFLD)+1) = -999
|
||
|
IFLD = 1
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, XEXPL(IBLK), *250)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, YEXPL(IBLK), *250)
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, ZEXPL(IBLK), *250)
|
||
|
END IF
|
||
|
250 CONTINUE
|
||
|
260 CONTINUE
|
||
|
MODBLK = 3
|
||
|
VERB = ' '
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',3) .OR.
|
||
|
$ MATSTR(WORD,'NSETS', 3) ) THEN
|
||
|
DO 265 IBLK = 1, NUMNPS
|
||
|
CALL INTSTR (1, 0, IDNPS(IBLK), WORD, LW)
|
||
|
WRITE (CTEMP, 10030)
|
||
|
$ 'Random factors (x y z) for Nodeset ', WORD(:LW),'> '
|
||
|
CALL FREFLD (0, 0, CTEMP(:LENSTR(CTEMP)+1), MAXFLD,
|
||
|
& IOSTAT, NUMFLD, INTYP, CFIELD, IFIELD, RFIELD)
|
||
|
IF (IOSTAT .LT. 0) GOTO 430
|
||
|
INTYP(MIN(MAXFLD,NUMFLD)+1) = -999
|
||
|
IFLD = 1
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, XEXPL(IBLK), *255)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, YEXPL(IBLK), *255)
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& CTEMP, 0.0, ZEXPL(IBLK), *255)
|
||
|
END IF
|
||
|
255 CONTINUE
|
||
|
265 CONTINUE
|
||
|
MODBLK = 4
|
||
|
VERB = ' '
|
||
|
ELSE
|
||
|
IF (NDIM .EQ. 3) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "Z", "ALL", or "RESET"')
|
||
|
IF (NDIM .EQ. 2) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "ALL", or "RESET"')
|
||
|
GOTO 270
|
||
|
END IF
|
||
|
GOTO 240
|
||
|
END IF
|
||
|
|
||
|
270 CONTINUE
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'MIRROR') THEN
|
||
|
|
||
|
280 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
XMIRR = 1.
|
||
|
YMIRR = 1.
|
||
|
ZMIRR = 1.
|
||
|
ELSE IF (WORD .EQ. 'X') THEN
|
||
|
XMIRR = -1.
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
YMIRR = -1.
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
ZMIRR = -1.
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Z not allowed for 2D database')
|
||
|
END IF
|
||
|
ELSE
|
||
|
IF (NDIM .EQ. 3) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "Z" or "RESET"')
|
||
|
IF (NDIM .EQ. 2) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", or "RESET"')
|
||
|
GOTO 290
|
||
|
END IF
|
||
|
GOTO 280
|
||
|
END IF
|
||
|
|
||
|
290 CONTINUE
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'REVOLVE' .OR. VERB .EQ. 'ROTATE') THEN
|
||
|
DEGANG = ATAN2(0.0, -1.0) / 180.0
|
||
|
|
||
|
300 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
ROT3D = .FALSE.
|
||
|
CALL INIREA (3*3, 0.0, ROTMAT)
|
||
|
DO 310 I = 1, 3
|
||
|
ROTMAT(I,I) = 1.0
|
||
|
310 CONTINUE
|
||
|
ELSE IF (NDIM .EQ. 3 .AND.
|
||
|
* ((WORD .EQ. 'X') .OR. (WORD .EQ. 'Y')
|
||
|
& .OR. (WORD .EQ. 'Z')) ) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'angle of rotation', 0.0, DEG, *320)
|
||
|
ROT3D = .TRUE.
|
||
|
CALL ROTXYZ (WORD, DEG * DEGANG, ROTMAT)
|
||
|
ELSE IF (NDIM .EQ. 2 .AND. (WORD .EQ. 'Z') ) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'angle of rotation', 0.0, DEG, *320)
|
||
|
ROT3D = .TRUE.
|
||
|
CALL ROTXYZ (WORD, DEG * DEGANG, ROTMAT)
|
||
|
|
||
|
ELSE IF (MATSTR(WORD, 'ATTRIBUTE', 2)) THEN
|
||
|
C ... REVOLVE ATTRIBUTE {which} BLOCK {id|ALL} {x|y|z} {angle}
|
||
|
C ... REVOLVE ATTRIBUTE {which} TYPE {blk_type}
|
||
|
C ... REVOLVE ATTRIBUTE RESET
|
||
|
C ... Next field is integer (which)
|
||
|
VERB = ' '
|
||
|
STRING = 'REVOLVE/ROTATE ATTRIBUTE {index} BLOCK {id|ALL}'
|
||
|
IF (.NOT. ISATRB) THEN
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'There are no attributes on this database')
|
||
|
GO TO 320
|
||
|
END IF
|
||
|
|
||
|
ROTALL = .FALSE.
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'HELP', 2)) THEN
|
||
|
CALL PRTERR('CMDREQ',
|
||
|
*'REVOLVE ATTRIBUTE {index} BLOCK {id|ALL} {X|Y|Z} {angle}')
|
||
|
CALL PRTERR('CMDREQ',
|
||
|
*'REVOLVE ATTRIBUTE {index} TYPE {type} {X|Y|Z} {angle}')
|
||
|
CALL PRTERR('CMDREQ',
|
||
|
*'REVOLVE ATTRIBUTE RESET')
|
||
|
ELSE IF (MATSTR (WORD, 'RESET', 2)) THEN
|
||
|
REVATT = .FALSE.
|
||
|
CALL INIREA (3*3, 0.0, ROTATT)
|
||
|
DO I = 1, 3
|
||
|
ROTATT(I,I) = 1.0
|
||
|
END DO
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "RESET"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 320
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is Attribute index -- first of ndim attributes involed in revolve. 1-based
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'attribute index', 0, ATTIND, *420)
|
||
|
END IF
|
||
|
|
||
|
C ... Next word should be 'BLOCK'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF ((MATSTR (WORD, 'BLOCK', 1))) THEN
|
||
|
C ... Now find block id or 'ALL'
|
||
|
ROTTYP = .FALSE.
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
ROTALL = .TRUE.
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 320
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is block id
|
||
|
ROTALL = .FALSE.
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'block ID', 0, ATTBLK, *420)
|
||
|
END IF
|
||
|
|
||
|
ELSE IF ((MATSTR (WORD, 'TYPE', 1))) THEN
|
||
|
ROTTYP = .TRUE.
|
||
|
C ... Now find block type
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', ROTBLK)
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "BLOCK" or "TYPE"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 320
|
||
|
END IF
|
||
|
339 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (NDIM .EQ. 3 .AND. ((WORD .EQ. 'X') .OR.
|
||
|
* (WORD .EQ. 'Y') .OR. (WORD .EQ. 'Z')) ) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'angle of rotation', 0.0, DEG, *320)
|
||
|
REVATT = .TRUE.
|
||
|
CALL ROTXYZ (WORD, DEG * DEGANG, ROTATT)
|
||
|
ELSE IF (NDIM .EQ. 2 .AND. (WORD .EQ. 'Z') ) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'angle of rotation', 0.0, DEG, *320)
|
||
|
REVATT = .TRUE.
|
||
|
CALL ROTXYZ (WORD, DEG * DEGANG, ROTATT)
|
||
|
END IF
|
||
|
GO TO 339
|
||
|
END IF
|
||
|
|
||
|
IF (REVATT) THEN
|
||
|
WRITE (*, 9940) 'Rotation matrix for selected attributes:'
|
||
|
DO I = 1, 3
|
||
|
IX = (I-1) * 3
|
||
|
DO J = 1, 3
|
||
|
RNUM(IX+J) = ROTATT(I,J)
|
||
|
END DO
|
||
|
END DO
|
||
|
CALL NUMSTR (9, 4, RNUM, RSTR, LR)
|
||
|
DO I = 1, 3
|
||
|
IX = (I-1) * 3
|
||
|
WRITE (*, 9940) (' ', RSTR(IX+J)(:LR), J=1,3)
|
||
|
9940 FORMAT (1X, 20A)
|
||
|
END DO
|
||
|
ELSE
|
||
|
WRITE (*, 9940) 'No rotation defined for generated mesh'
|
||
|
END IF
|
||
|
C ... End of "revolve attribute" parsing
|
||
|
|
||
|
ELSE
|
||
|
IF (NDIM .EQ. 3) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "X", "Y", "Z", "ATTRIBUTE" or "RESET"')
|
||
|
IF (NDIM .EQ. 2) CALL PRTERR ('CMDERR',
|
||
|
& 'Expected "Z", "ATTRIBUTE" or "RESET"')
|
||
|
GOTO 320
|
||
|
END IF
|
||
|
GOTO 300
|
||
|
END IF
|
||
|
|
||
|
320 CONTINUE
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'REVCEN') THEN
|
||
|
CALL MINMAX (NUMNP, XN, XMIN, XMAX)
|
||
|
CALL MINMAX (NUMNP, YN, YMIN, YMAX)
|
||
|
IF (NDIM .EQ. 3) THEN
|
||
|
CALL MINMAX (NUMNP, ZN, ZMIN, ZMAX)
|
||
|
ELSE
|
||
|
ZMIN = 0.0
|
||
|
END IF
|
||
|
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X revolution center', XMIN, ROTCEN(1), *420)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y revolution center', YMIN, ROTCEN(2), *420)
|
||
|
IF (NDIM .EQ. 3) CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z revolution center', ZMIN, ROTCEN(3), *420)
|
||
|
IF (NDIM .EQ. 2) ROTCEN(3) = 0.0
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'LIST') THEN
|
||
|
CALL ABRSTR (LISTYP, CFIELD(2), LISTBL)
|
||
|
IF (CFIELD(2) .EQ. ' ') THEN
|
||
|
CALL SHOCMD ('Valid LIST options', LISTBL)
|
||
|
ELSE IF (LISTYP .EQ. ' ') THEN
|
||
|
CALL PRTERR ('CMDERR', '"' // CFIELD(2)(:LENSTR(CFIELD(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,IDESS,IA(KNESS),IA(KNDSS),SSNAME)
|
||
|
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, IDNPS, IA(KNNNS), IA(1), NSNAME)
|
||
|
END IF
|
||
|
ELSE IF (LISTYP .EQ.'VARS' .OR. LISTYP .EQ.'VARIABLE') THEN
|
||
|
CALL DBPINI ('TISV', NDBIN, TITLE, NDIM, NUMNP, NUMEL,
|
||
|
& NELBLK, NUMNPS, LNPSNL, LNPSNL, NUMESS, LESSEL, LESSDF,
|
||
|
* NVARGL, NVARNP, NVAREL, NVARNS, NVARSS, ' ')
|
||
|
ELSE IF (LISTYP .EQ.'BLOCKS' .OR. LISTYP .EQ.'MATERIAL') THEN
|
||
|
CALL DBPELB ('N', NELBLK, IDELB, NUMELB, NUMLNK, NUMATR,
|
||
|
& BLKTYP, EBNAME, ATNAME, IDUM, IDUM, IDUM, IDUM)
|
||
|
ELSE IF (LISTYP .EQ. 'COMMANDS') THEN
|
||
|
CALL SHOCMD ('COMMANDS', CMDTBL)
|
||
|
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. 'TIMES' .OR. LISTYP .EQ. 'STEPS') THEN
|
||
|
if (nsteps .eq. 0) then
|
||
|
CALL PRTERR ('CMDSPEC', 'No timesteps on database')
|
||
|
else
|
||
|
do 324 itim = 1, nsteps
|
||
|
if (itimst(itim) .eq. 0) then
|
||
|
STRA = ' Active'
|
||
|
else
|
||
|
STRA = 'Inactive'
|
||
|
end if
|
||
|
write (*, 10060) itim, times(itim), stra
|
||
|
10060 FORMAT( 'Step ', i6, ', Time = ', 1pe12.5,1x, A)
|
||
|
324 continue
|
||
|
end if
|
||
|
ELSE IF (LISTYP .EQ. 'NAMES') THEN
|
||
|
WRITE (*, 10070) 'Global: ', (NAMEGV(I), I=1,NVARGL)
|
||
|
WRITE (*, 10070) 'Nodal: ', (NAMENV(I), I=1,NVARNP)
|
||
|
WRITE (*, 10070) 'Element: ', (NAMEEV(I), I=1,NVAREL)
|
||
|
WRITE (*, 10070) 'Nodeset: ', (NAMEMV(I), I=1,NVARNS)
|
||
|
WRITE (*, 10070) 'Sideset: ', (NAMESV(I), I=1,NVARSS)
|
||
|
10070 FORMAT (4X, A, :, 2 (2X, A), :, /, (14X, 2 (2X, A)))
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // CFIELD(2)(:LENSTR(CFIELD(2)))
|
||
|
& // '" is an invalid or nonunique LIST option')
|
||
|
END IF
|
||
|
VERB = ' '
|
||
|
|
||
|
ELSE IF ((VERB .EQ. 'SHOW') .OR. (VERB .EQ. 'LIST')) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL ABRSTR (VERB, WORD, CMDTBL)
|
||
|
CALL SHOW (VERB, WORD)
|
||
|
VERB = ' '
|
||
|
|
||
|
C=======================================================================
|
||
|
C NAME BLOCK|SIDESET|SSET|NODESET|NSET id newname
|
||
|
C NAME ATTRIBUTE attindex BLOCK id newname
|
||
|
|
||
|
ELSE IF (VERB .EQ. 'NAME') THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
|
||
|
itype = ' '
|
||
|
IF (MATSTR(WORD, 'BLOCK', 2)) THEN
|
||
|
itype = 'B'
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',3) .OR.
|
||
|
$ MATSTR(WORD,'SSETS', 3) ) THEN
|
||
|
itype = 'S'
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',3) .OR.
|
||
|
$ MATSTR(WORD,'NSETS', 3) ) THEN
|
||
|
itype = 'N'
|
||
|
ELSE IF (MATSTR(WORD,'ATTRIBUTE',3)) THEN
|
||
|
itype = 'A'
|
||
|
END IF
|
||
|
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'entity ID', 0, IDOLD, *420)
|
||
|
if (itype .eq. 'A') then
|
||
|
C.. Skip over 'block' and get block id
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'block ID', 0, IDBLK, *420)
|
||
|
end if
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
if (itype .eq. 'B') then
|
||
|
CALL NEWNAM ('B', IDELB, EBNAME, NELBLK, IDOLD, WORD)
|
||
|
else if (itype .eq. 'N') then
|
||
|
CALL NEWNAM ('N', IDNPS, NSNAME, NUMNPS, IDOLD, WORD)
|
||
|
else if (itype .eq. 'S') then
|
||
|
CALL NEWNAM ('S', IDESS, SSNAME, NUMESS, IDOLD, WORD)
|
||
|
else if (itype .eq. 'A') then
|
||
|
CALL NEWATT (IDELB, IDBLK, NELBLK, IDOLD, NUMATR, ATNAME,
|
||
|
* WORD)
|
||
|
end if
|
||
|
verb = ' '
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'RENAME') THEN
|
||
|
write (*,*) 'In rename'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD2)
|
||
|
if (.NOT. MATSTR (WORD2, 'VARIABLE', 2)) THEN
|
||
|
call PRTERR('CMDERR',
|
||
|
* 'SYNTAX: RENAME [global|nodal|node|element|nodeset|nset|'//
|
||
|
* 'sideset|sset] VARIABLE [oldname] [newname]')
|
||
|
go to 399
|
||
|
end if
|
||
|
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', OLDNM)
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', NEWNM)
|
||
|
|
||
|
IF (MATSTR(WORD, 'GLOBAL', 2)) THEN
|
||
|
CALL RENAM(WORD, NAMEGV, NVARGL, OLDNM, NEWNM)
|
||
|
ELSE IF (MATSTR(WORD,'NODESET',5) .OR.
|
||
|
$ MATSTR(WORD,'NSET', 3) ) THEN
|
||
|
CALL RENAM(WORD, NAMEMV, NVARNS, OLDNM, NEWNM)
|
||
|
ELSE IF (MATSTR(WORD, 'NODAL', 4) .OR.
|
||
|
* MATSTR(WORD,'NODE', 4)) THEN
|
||
|
CALL RENAM(WORD, NAMENV, NVARNP, OLDNM, NEWNM)
|
||
|
ELSE IF (MATSTR(WORD, 'ELEMENT', 2)) THEN
|
||
|
CALL RENAM(WORD, NAMEEV, NVAREL, OLDNM, NEWNM)
|
||
|
ELSE IF (MATSTR(WORD,'SIDESET',3) .OR.
|
||
|
$ MATSTR(WORD,'SSET', 3) ) THEN
|
||
|
CALL RENAM(WORD, NAMESV, NVARSS, OLDNM, NEWNM)
|
||
|
END IF
|
||
|
|
||
|
399 CONTINUE
|
||
|
verb = ' '
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'CHANGE') THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
|
||
|
IF (MATSTR(WORD, 'TYPE', 2)) THEN
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'block ID', 0, IDOLD, *420)
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL NEWNAM ('b', IDELB, BLKTYP, NELBLK, IDOLD, WORD)
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',3) .OR.
|
||
|
$ MATSTR(WORD,'SSETS', 3) ) THEN
|
||
|
C========================================================================
|
||
|
C ... CHANGE SIDESET {id|ALL} FACTOR {value}
|
||
|
C ... See if next field is integer (id) or word ('all')
|
||
|
VERB = ' '
|
||
|
STRING = 'CHANGE SIDESET {id|ALL} FACTOR {value}'
|
||
|
IF (NUMESS .EQ. 0) THEN
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'There are no sidesets on this database')
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
|
||
|
DOALLA = .FALSE.
|
||
|
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
DOALLA = .TRUE.
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is sideset id
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'sideset ID', 0, IDSET, *420)
|
||
|
END IF
|
||
|
|
||
|
C ... Next word should be 'FACTOR' or an id
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (.NOT.(MATSTR (WORD, 'FACTOR', 1))) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "FACTOR"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
* 'distribution factor value', 1.0, AVALUE, *420)
|
||
|
|
||
|
C ... Setup the scale and echo to the user
|
||
|
if (DOALLA) then
|
||
|
CALL INIREA (LESSNL, AVALUE, FACESS)
|
||
|
ELSE
|
||
|
iss = locint(idset, numess, idess)
|
||
|
IF (iss .EQ. 0) THEN
|
||
|
WRITE (STRING, 10040) 'Sideset', idset
|
||
|
10040 FORMAT (A,I5,' does not exist')
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('ERROR', STRING(:LSTR))
|
||
|
goto 420
|
||
|
END IF
|
||
|
call inirea(nness(iss), avalue, facess(ixness(iss)))
|
||
|
ENDIF
|
||
|
ELSE
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,'new ID', 0, IDNEW, *420)
|
||
|
CALL NEWID ('S', IDESS, NUMESS, IDNEW, IDSET)
|
||
|
END IF
|
||
|
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',3) .OR.
|
||
|
$ MATSTR(WORD,'NSETS', 3) ) THEN
|
||
|
C========================================================================
|
||
|
C ... CHANGE NODESET {id|ALL} FACTOR {value}
|
||
|
C ... See if next field is integer (id) or word ('all')
|
||
|
VERB = ' '
|
||
|
STRING = 'CHANGE NODESET {id|ALL} FACTOR {value}'
|
||
|
IF (NUMNPS .EQ. 0) THEN
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'There are no nodesets on this database')
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
|
||
|
DOALLA = .FALSE.
|
||
|
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
DOALLA = .TRUE.
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is nodeset id
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'nodeset ID', 0, IDSET, *420)
|
||
|
END IF
|
||
|
|
||
|
C ... Next word should be 'FACTOR' or an id
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (.NOT.(MATSTR (WORD, 'FACTOR', 1))) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "FACTOR"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
* 'distribution factor value', 1.0, AVALUE, *420)
|
||
|
|
||
|
C ... Setup the scale and echo to the user
|
||
|
if (DOALLA) then
|
||
|
CALL INIREA (LNPSNL, AVALUE, FACNPS)
|
||
|
ELSE
|
||
|
iss = locint(idset, numnps, idnps)
|
||
|
IF (iss .EQ. 0) THEN
|
||
|
WRITE (STRING, 10040) 'Nodeset', idset
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('ERROR', STRING(:LSTR))
|
||
|
goto 420
|
||
|
END IF
|
||
|
call inirea(ndnps(iss), avalue, facnps(ixdnps(iss)))
|
||
|
ENDIF
|
||
|
ELSE
|
||
|
C ... Changing id. Get the new id.
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD, 'new ID', 0, IDNEW, *420)
|
||
|
CALL NEWID ('N', IDNPS, NUMNPS, IDNEW, IDSET)
|
||
|
END IF
|
||
|
|
||
|
ELSE IF (MATSTR(WORD, 'ATTRIBUTE', 3)) THEN
|
||
|
C========================================================================
|
||
|
C ... CHANGE ATTRIBUTE {num|ALL} BLOCK {id|ALL} {value}
|
||
|
C ... CHANGE ATTRIBUTE RESET
|
||
|
C ... See if next field is integer (id) or word ('all')
|
||
|
VERB = ' '
|
||
|
STRING = 'CHANGE ATTRIBUTE {id|ALL} BLOCK {id|ALL} {value}'
|
||
|
IF (.NOT. ISATRB) THEN
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'There are no attributes on this database')
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
|
||
|
ATRWRN = .TRUE.
|
||
|
DOALLA = .FALSE.
|
||
|
DOALLB = .FALSE.
|
||
|
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
DOALLA = .TRUE.
|
||
|
ELSE IF (MATSTR (WORD, 'RESET', 2)) THEN
|
||
|
CALL SCLATR(NELBLK, IDELB, NUMATR, 0, .TRUE., 0,
|
||
|
* .TRUE., 0.0, ATRSCL, .TRUE., .FALSE.)
|
||
|
GO TO 420
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is Attribute number
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'attribute ID', 0, IDATR, *420)
|
||
|
END IF
|
||
|
|
||
|
C ... Next word should be 'BLOCK'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (.NOT.(MATSTR (WORD, 'BLOCK', 1))) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "BLOCK"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
C ... Now find block id or 'ALL'
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'ALL', 2)) THEN
|
||
|
DOALLB = .TRUE.
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
ELSE
|
||
|
C ... Field is Attribute number
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
$ 'block ID', 0, IDBLK, *420)
|
||
|
END IF
|
||
|
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
* 'attribute value', 1.0, AVALUE, *420)
|
||
|
|
||
|
C ... Setup the scale and echo to the user
|
||
|
CALL SCLATR(NELBLK, IDELB, NUMATR, IDATR, DOALLA,
|
||
|
* IDBLK, DOALLB, AVALUE, ATRSCL, .TRUE., .FALSE.)
|
||
|
|
||
|
ELSE
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
* 'old ID', 0, IDOLD, *420)
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
* 'new ID', 0, IDNEW, *420)
|
||
|
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
CALL NEWID ('M', IDELB, NELBLK, IDNEW, IDOLD)
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
$ MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
CALL NEWID ('N', IDNPS, NUMNPS, IDNEW, IDOLD)
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
$ MATSTR(WORD,'SSETS', 1)) THEN
|
||
|
CALL NEWID ('S', IDESS, NUMESS, IDNEW, IDOLD)
|
||
|
END IF
|
||
|
END IF
|
||
|
VERB = ' '
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'INCREMENT') THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
* 'increment', 0, IDINC, *420)
|
||
|
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
CALL INCID ('M', IDELB, NELBLK, IDINC)
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',5) .OR.
|
||
|
$ MATSTR(WORD,'NSETS', 2)) THEN
|
||
|
CALL INCID ('N', IDNPS, NUMNPS, IDINC)
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
$ MATSTR(WORD,'SSETS', 1)) THEN
|
||
|
CALL INCID ('S', IDESS, NUMESS, IDINC)
|
||
|
ELSE IF (MATSTR(WORD,'NODEMAP',5) .OR.
|
||
|
$ MATSTR(WORD,'NMAP', 2)) THEN
|
||
|
CALL INCMAP (MAPNOD, NUMNP, IDINC)
|
||
|
ELSE IF (MATSTR(WORD,'ELEMMAP',5) .OR.
|
||
|
$ MATSTR(WORD,'EMAP', 2)) THEN
|
||
|
CALL INCMAP (MAPEL, NUMEL, IDINC)
|
||
|
END IF
|
||
|
VERB = ' '
|
||
|
|
||
|
C=======================================================================
|
||
|
else if (verb .eq. 'MERGE') THEN
|
||
|
C ... Syntax: MERGE {global|local} Node {node_1} into node {node_2}
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
if (matstr(word, 'GLOBAL', 3)) then
|
||
|
glonod = .true.
|
||
|
else if (matstr(word, 'LOCAL', 3)) then
|
||
|
glonod = .false.
|
||
|
else
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Expected "global" or "local" following "merge"')
|
||
|
go to 420
|
||
|
end if
|
||
|
c ... skip 'node'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
|
||
|
C ... Get the two nodes to be equivalenced...
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD, 'Node1', 0, node1, *420)
|
||
|
C ... Skip 'node into'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD, 'Node2', 0, node2, *420)
|
||
|
|
||
|
if (glonod) then
|
||
|
node1 = ng2l('node', node1, numnp, mapnod)
|
||
|
node2 = ng2l('node', node2, numnp, mapnod)
|
||
|
end if
|
||
|
|
||
|
if (node1 .gt. numnp .or. node2 .gt. numnp) then
|
||
|
CALL PRTERR ('CMDERR', 'Node index exceeds node count')
|
||
|
else
|
||
|
C ... Grepos has requirement that the highest numbered node be removed
|
||
|
C in the equiv process. However, in user specification, they want
|
||
|
C to specify which node is removed. If it is the lower-numbered node,
|
||
|
C simply replace the coordinates of the higher numbered node with the
|
||
|
C coordinates of the lower-numbered node.
|
||
|
if (node1 .lt. node2) then
|
||
|
if (IEQUIV(node2) .ne. node2) then
|
||
|
call prterr ('CMDERR',
|
||
|
* 'Node already merged, cannot specify twice')
|
||
|
else
|
||
|
IEQUIV(node2) = -node1
|
||
|
xn(node1) = xn(node2)
|
||
|
if (ndim .ge. 2) yn(node1) = yn(node2)
|
||
|
if (ndim .eq. 3) zn(node1) = zn(node2)
|
||
|
endif
|
||
|
else
|
||
|
if (IEQUIV(node1) .ne. node1) then
|
||
|
call prterr ('CMDERR',
|
||
|
* 'Node already merged, cannot specify twice')
|
||
|
else
|
||
|
IEQUIV(node1) = -node2
|
||
|
end if
|
||
|
end if
|
||
|
equiv = .TRUE.
|
||
|
EQTOLER = -1.0
|
||
|
end if
|
||
|
verb = ' '
|
||
|
|
||
|
ELSE IF (VERB .EQ. 'EQUIVALENCE') THEN
|
||
|
C ... Syntax: EQUIVALENCE tolerance
|
||
|
C ... Syntax: EQUIVALENCE RESET
|
||
|
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 3)) THEN
|
||
|
EQUIV = .FALSE.
|
||
|
EQTOLER = 0.0
|
||
|
do i=1, numnp
|
||
|
iequiv(i) = i
|
||
|
end do
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', 'Expected "RESET"')
|
||
|
END IF
|
||
|
verb = ' '
|
||
|
ELSE
|
||
|
EQUIV = .TRUE.
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Tolerance', 0.0, EQTOLER, *420)
|
||
|
IF (EQTOLER .LT. 0.0) THEN
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
& "Tolerance must be greater than 0.0.")
|
||
|
EQUIV = .FALSE.
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
C=======================================================================
|
||
|
ELSE IF (VERB .EQ. 'COMBINE') THEN
|
||
|
C ... Syntax: COMBINE entity RESET (Not Implemented yet)
|
||
|
C ... Syntax: COMBINE BLOCK id_final WITH BLOCK id1, id2, ..., idn
|
||
|
C ... Syntax: COMBINE MATERIAL id_final WITH MATERIAL id1, id2, ..., idn
|
||
|
C ... Syntax: COMBINE NODESET id_final WITH NODESET id1, id2, ..., idn
|
||
|
C ... Syntax: COMBINE SIDESET id_final WITH SIDESET id1, id2, ..., idn
|
||
|
C Sets ids of id1, id2, ..., idn to -idfinal
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
* 'ID', 0, IDFINL, *420)
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
$ "Missing Keyword 'MATERIALS/NODESETS/SIDESETS'")
|
||
|
GO TO 420
|
||
|
END IF
|
||
|
|
||
|
C ... This should be the keyword 'WITH'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD2)
|
||
|
if (.NOT. MATSTR(WORD2, 'WITH', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
$ 'Expected keyword "WITH", found "' //
|
||
|
$ WORD2(:lenstr(word2)) // '".')
|
||
|
go to 420
|
||
|
end if
|
||
|
|
||
|
C ... This should be the entity type. Must match WORD.
|
||
|
C Matching assumed, not checked.
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD2)
|
||
|
if (.NOT. MATSTR(WORD2, WORD, 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
$ 'Expected keyword "'//word(:lenstr(word))//'" found "' //
|
||
|
$ WORD2(:lenstr(word2)) // '".')
|
||
|
go to 420
|
||
|
end if
|
||
|
|
||
|
325 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
* 'ID', 0, ID, *420)
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
CALL COMID ('Material', IDELB, IELBST, NELBLK, IDFINL, ID)
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
& MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
CALL COMID ('Nodeset', IDNPS, INPSST, NUMNPS, IDFINL, ID)
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
CALL COMID ('Sideset', IDESS, IESSST, NUMESS, IDFINL, ID)
|
||
|
ELSE
|
||
|
write (string, 326) word(:lenstr(word))
|
||
|
326 format('"',A,
|
||
|
$ '" is an invalid or nonunique COMBINE option')
|
||
|
call sqzstr(string, lstr)
|
||
|
CALL PRTERR ('CMDERR', string(:lstr))
|
||
|
END IF
|
||
|
GOTO 325
|
||
|
END IF
|
||
|
VERB = ' '
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'DELETE') THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR(WORD,'QAINFO',3)) THEN
|
||
|
NQAREC = 0
|
||
|
NINFO = 1
|
||
|
INFREC(NINFO) =
|
||
|
$ 'All previous QA and INFO records deleted by GREPOS'
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
$ 'All QA and INFO records deleted.')
|
||
|
ELSE IF (MATSTR(WORD,'QA',2)) THEN
|
||
|
NQAREC = 0
|
||
|
NINFO = NINFO + 1
|
||
|
INFREC(NINFO) =
|
||
|
$ 'All previous QA records deleted by GREPOS'
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
$ 'All QA records deleted.')
|
||
|
ELSE IF (MATSTR(WORD,'INFORMATION',2)) THEN
|
||
|
NINFO = 1
|
||
|
INFREC(NINFO) =
|
||
|
$ 'All previous INFO records deleted by GREPOS'
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
$ 'All INFO records deleted.')
|
||
|
ELSE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD2)
|
||
|
IF (MATSTR (WORD2, 'MAP', 3)) THEN
|
||
|
IF (MATSTR (WORD, 'NODE', 2)) THEN
|
||
|
do i=1, numnp
|
||
|
mapnod(i) = i
|
||
|
end do
|
||
|
ELSE IF (MATSTR (WORD, 'ELEMENT', 2)) THEN
|
||
|
do i=1, numel
|
||
|
mapel(i) = i
|
||
|
end do
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid DELETE MAP -- NODE or ELEMENT')
|
||
|
GO TO 333
|
||
|
END IF
|
||
|
ELSE IF (MATSTR (WORD2, 'ALL', 2)) THEN
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
do i=1, nelblk
|
||
|
ielbst(i) = -idelb(i)
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All material blocks deleted.')
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
& MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
do i=1, numnps
|
||
|
inpsst(i) = -idnps(i)
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All nodesets deleted.')
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
do i=1, numess
|
||
|
iessst(i) = -idess(i)
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All sidesets deleted.')
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid or nonunique DELETE option')
|
||
|
GO TO 333
|
||
|
END IF
|
||
|
|
||
|
ELSE IF (MATSTR (WORD2, 'NAMES', 2)) THEN
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
do i=1, nelblk
|
||
|
#if defined(__XLF__)
|
||
|
ebname(i) = " "
|
||
|
#else
|
||
|
ebname(i) = ""
|
||
|
#endif
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
* 'All material block names deleted.')
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
& MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
do i=1, numnps
|
||
|
#if defined(__XLF__)
|
||
|
nsname(i) = " "
|
||
|
#else
|
||
|
nsname(i) = ""
|
||
|
#endif
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All nodeset names deleted.')
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
do i=1, numess
|
||
|
#if defined(__XLF__)
|
||
|
ssname(i) = " "
|
||
|
#else
|
||
|
ssname(i) = ""
|
||
|
#endif
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All sideset names deleted.')
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid DELETE NAME option')
|
||
|
GO TO 333
|
||
|
END IF
|
||
|
|
||
|
ELSE IF (MATSTR (WORD2, 'ATTRIBUTES', 2)) THEN
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
do i=1, nelblk
|
||
|
numatr(i) = 0
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
* 'All element block attributes deleted.')
|
||
|
END IF
|
||
|
ELSE IF (MATSTR (WORD2, 'RESET', 2)) THEN
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
do i=1, nelblk
|
||
|
ielbst(i) = 0
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
* 'All material blocks undeleted.')
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
& MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
do i=1, numnps
|
||
|
inpsst(i) = 0
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All nodesets undeleted.')
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
do i=1, numess
|
||
|
iessst(i) = 0
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All sidesets undeleted.')
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid or nonunique DELETE option')
|
||
|
GO TO 333
|
||
|
END IF
|
||
|
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL" or "RESET"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 333
|
||
|
END IF
|
||
|
ENDIF
|
||
|
END IF
|
||
|
|
||
|
C ... Ids only. Either a list or range (or both)
|
||
|
330 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
|
||
|
C --Scan numeric range
|
||
|
|
||
|
CALL FFVRNG (IFLD, INTYP, CFIELD, IFIELD,
|
||
|
& WORD, -1, IRNG, *333)
|
||
|
|
||
|
C --Store the range selected
|
||
|
|
||
|
DO 332 I = IRNG(1), IRNG(2), IRNG(3)
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
CALL DELID ('M', IDELB, IELBST, NELBLK, I, .TRUE.)
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
& MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
CALL DELID ('N', IDNPS, INPSST, NUMNPS, I, .TRUE.)
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',2) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
CALL DELID ('S', IDESS, IESSST, NUMESS, I, .TRUE.)
|
||
|
ELSE IF (MATSTR(WORD,'STEPS',2) .OR.
|
||
|
& MATSTR(WORD,'TIMES', 1) ) THEN
|
||
|
if (i .le. nsteps) then
|
||
|
ITIMST(I) = 1
|
||
|
else
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Step number is out of range')
|
||
|
end if
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid or nonunique DELETE option')
|
||
|
END IF
|
||
|
332 CONTINUE
|
||
|
|
||
|
GOTO 330
|
||
|
END IF
|
||
|
END IF
|
||
|
333 CONTINUE
|
||
|
VERB = ' '
|
||
|
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'UNDELETE' .OR. VERB .EQ. 'KEEP') THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
C ... Field is character
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD2)
|
||
|
IF (MATSTR (WORD2, 'ALL', 2)) THEN
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
do i=1, nelblk
|
||
|
ielbst(i) = 0
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All material blocks undeleted.')
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
& MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
do i=1, numnps
|
||
|
inpsst(i) = 0
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All nodesets undeleted.')
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
do i=1, numess
|
||
|
iessst(i) = 0
|
||
|
end do
|
||
|
CALL PRTERR ('CMDSPEC','All sidesets undeleted.')
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid or nonunique DELETE option')
|
||
|
GO TO 336
|
||
|
END IF
|
||
|
|
||
|
ELSE
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected keyword "ALL"')
|
||
|
CALL PRTERR('CMDREQ', STRING(:LENSTR(STRING)))
|
||
|
GO TO 336
|
||
|
END IF
|
||
|
ELSE
|
||
|
335 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
|
||
|
C --Scan numeric range
|
||
|
CALL FFVRNG (IFLD, INTYP, CFIELD, IFIELD,
|
||
|
& WORD, -1, IRNG, *336)
|
||
|
|
||
|
C --Store the range selected
|
||
|
DO I = IRNG(1), IRNG(2), IRNG(3)
|
||
|
IF (MATSTR(WORD,'MATERIALS',1) .OR.
|
||
|
& MATSTR(WORD, 'BLOCKS',1)) THEN
|
||
|
CALL DELID ('M', IDELB, IELBST, NELBLK, I, .FALSE.)
|
||
|
ELSE IF (MATSTR(WORD,'NODESETS',1) .OR.
|
||
|
& MATSTR(WORD,'NSETS', 1) ) THEN
|
||
|
CALL DELID ('N', IDNPS, INPSST, NUMNPS, I, .FALSE.)
|
||
|
ELSE IF (MATSTR(WORD,'SIDESETS',2) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
CALL DELID ('S', IDESS, IESSST, NUMESS, I, .FALSE.)
|
||
|
ELSE IF (MATSTR(WORD,'STEPS',2) .OR.
|
||
|
& MATSTR(WORD,'TIMES', 1) ) THEN
|
||
|
if (i .le. nsteps) then
|
||
|
ITIMST(I) = 0
|
||
|
else
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Step number is out of range')
|
||
|
end if
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid or nonunique DELETE option')
|
||
|
END IF
|
||
|
END DO
|
||
|
|
||
|
GOTO 335
|
||
|
END IF
|
||
|
END IF
|
||
|
336 CONTINUE
|
||
|
VERB = ' '
|
||
|
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'SWAP') THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR(WORD,'SIDESETS',1) .OR.
|
||
|
& MATSTR(WORD,'SSETS', 1) ) THEN
|
||
|
340 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD,
|
||
|
* 'ID', 0, IDNEW, *420)
|
||
|
CALL SWPID ('S', IDESS, NUMESS, IDNEW, DELOK)
|
||
|
IF (DELOK) SWPSS = .TRUE.
|
||
|
GOTO 340
|
||
|
END IF
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // WORD(:LENSTR(WORD))
|
||
|
& // '" is an invalid or nonunique SWAP option')
|
||
|
END IF
|
||
|
VERB = ' '
|
||
|
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'TMIN') then
|
||
|
call ffreal (ifld, intyp, rfield,
|
||
|
$ 'Minimum Time', 0.0, tmin, *345)
|
||
|
do itim = 1, nsteps
|
||
|
if (times(itim) .lt. tmin) then
|
||
|
itimst(itim) = 1
|
||
|
end if
|
||
|
end do
|
||
|
345 continue
|
||
|
VERB = ' '
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'TMAX') then
|
||
|
call ffreal (ifld, intyp, rfield,
|
||
|
$ 'Maximum Time', 0.0, tmax, *346)
|
||
|
do itim = 1, nsteps
|
||
|
if (times(itim) .gt. tmax) then
|
||
|
itimst(itim) = 1
|
||
|
end if
|
||
|
end do
|
||
|
346 continue
|
||
|
VERB = ' '
|
||
|
C========================================================================
|
||
|
|
||
|
ELSE IF (VERB .EQ. 'SMOOTH') then
|
||
|
SMOOTH = .TRUE.
|
||
|
call ffreal (ifld, intyp, rfield,
|
||
|
$ 'Tolerance', 1.0e-6, toler, *350)
|
||
|
call ffintg (ifld, intyp, ifield,
|
||
|
$ 'Iterations', 100, NIT, *350)
|
||
|
call ffreal (ifld, intyp, rfield,
|
||
|
$ 'Relaxation Factor', 1.0, R0, *350)
|
||
|
|
||
|
350 continue
|
||
|
|
||
|
C ... SNAP
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'SNAP') then
|
||
|
if (ffexst(ifld, intyp)) then
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
NUMSNP = 0
|
||
|
go to 360
|
||
|
ELSE
|
||
|
call PRTERR('CMDERR', 'Expected "RESET" or sideset id')
|
||
|
go to 370
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
if (ffexst(ifld, intyp)) then
|
||
|
numsnp = numsnp + 1
|
||
|
if (numsnp .gt. mxsnap) then
|
||
|
call PRTERR('CMDERR', 'Too many snap sets specified')
|
||
|
go to 370
|
||
|
end if
|
||
|
|
||
|
ismtyp(numsnp) = ISNAP
|
||
|
usnorm(numsnp) = PNORM
|
||
|
snptol(numsnp) = 0.0
|
||
|
gap(numsnp) = 0.0
|
||
|
C ... NOTE: This value is squared in snpnod, don't increase too big.
|
||
|
delmax(numsnp) = 1.0e15
|
||
|
|
||
|
call ffintg (ifld, intyp, ifield,
|
||
|
$ 'sideset to snap nodes from', 0, IDSSSL(numsnp), *370)
|
||
|
imat = locint(idsssl(numsnp), numess, idess)
|
||
|
IF (IMAT .EQ. 0) THEN
|
||
|
WRITE (STRING, 10040) 'Sideset', idsssl(numsnp)
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('ERROR', STRING(:LSTR))
|
||
|
NUMSNP = NUMSNP - 1
|
||
|
GO TO 370
|
||
|
END IF
|
||
|
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (.NOT. MATSTR (WORD, 'TO', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected required keyword "TO"')
|
||
|
NUMSNP = NUMSNP - 1
|
||
|
GO TO 370
|
||
|
END IF
|
||
|
|
||
|
call ffintg (ifld, intyp, ifield,
|
||
|
$ 'sideset to snap nodes to', 0, IDSSMA(numsnp), *370)
|
||
|
imat = locint(idssma(numsnp), numess, idess)
|
||
|
IF (IMAT .EQ. 0) THEN
|
||
|
WRITE (STRING, 10040) 'Sideset', idssma(numsnp)
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('ERROR', STRING(:LSTR))
|
||
|
NUMSNP = NUMSNP - 1
|
||
|
GO TO 370
|
||
|
END IF
|
||
|
end if
|
||
|
|
||
|
360 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
numsnp = 0
|
||
|
go to 360
|
||
|
else IF (MATSTR(WORD, 'NORMAL', 1)) THEN
|
||
|
USNORM(NUMSNP) = PNORM
|
||
|
VECTOR(1,numsnp) = 0.0
|
||
|
VECTOR(2,numsnp) = 0.0
|
||
|
VECTOR(3,numsnp) = 0.0
|
||
|
else IF (MATSTR(WORD, 'EDGE', 1)) THEN
|
||
|
USNORM(NUMSNP) = PEDGE
|
||
|
VECTOR(1,numsnp) = 0.0
|
||
|
VECTOR(2,numsnp) = 0.0
|
||
|
VECTOR(3,numsnp) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'X') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 1.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = 1.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = 1.0
|
||
|
ELSE IF (WORD .EQ. 'MINUSX') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = -1.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'MINUSY') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = -1.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'MINUSZ') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = -1.0
|
||
|
ELSE IF (MATSTR(WORD, 'VECTOR', 1)) THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'vector X coordinate', 0.0, VECTOR(1,NUMSNP), *370)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'vector Y coordinate', 0.0, VECTOR(2,NUMSNP), *370)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'vector Z coordinate', 0.0, VECTOR(3,NUMSNP), *370)
|
||
|
ELSE IF (MATSTR(WORD, 'RADIAL', 1)) THEN
|
||
|
USNORM(NUMSNP) = PRAD
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (MATSTR(WORD, 'CENTER', 1)) THEN
|
||
|
USNORM(NUMSNP) = PRAD
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X center', 0.0, VECTOR(1,NUMSNP), *370)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y center', 0.0, VECTOR(2,NUMSNP), *370)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z center', 0.0, VECTOR(3,NUMSNP), *370)
|
||
|
ELSE IF (MATSTR(WORD, 'TOLERANCE', 1)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Tolerance', 0.0, SNPTOL(NUMSNP), *370)
|
||
|
ELSE IF (MATSTR(WORD, 'MAXDELTA', 1)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'MaxDelta', 1.0E15, DELMAX(NUMSNP), *370)
|
||
|
ELSE IF (MATSTR(WORD, 'GAP', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* '"GAP" not supported for "SNAP" command')
|
||
|
END IF
|
||
|
GO TO 360
|
||
|
END IF
|
||
|
end if
|
||
|
370 CONTINUE
|
||
|
VERB = 'SNAP'
|
||
|
|
||
|
C ... MOVE
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'MOVE') then
|
||
|
if (ffexst(ifld, intyp)) then
|
||
|
IF ((INTYP(IFLD) .EQ. 0) .OR. ((CFIELD(IFLD) .GE. 'A')
|
||
|
& .AND. (CFIELD(IFLD) .LE. 'Z'))) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
NUMSNP = 0
|
||
|
go to 380
|
||
|
ELSE IF (MATSTR (WORD, 'GLOBAL', 3) .OR.
|
||
|
* MATSTR (WORD, 'LOCAL', 3)) THEN
|
||
|
C ... Syntax here is:
|
||
|
C MOVE GLOBAL NODE {id} TO {x} {y} {z} (absolute move)
|
||
|
C MOVE LOCAL NODE {id} TO {x} {y} {z}
|
||
|
C MOVE GLOBAL NODE {id} BY {x} {y} {z} (relative move)
|
||
|
C MOVE LOCAL NODE {id} BY {x} {y} {z}
|
||
|
glonod = .FALSE.
|
||
|
if (matstr(word, 'GLOBAL', 3)) glonod = .TRUE.
|
||
|
|
||
|
c ... skip 'node'
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
if (.NOT. MATSTR (WORD, 'NODE', 2)) THEN
|
||
|
call PRTERR('CMDERR',
|
||
|
* 'SYNTAX: Move {global|local} NODE {id} {TO|BY} x y z')
|
||
|
go to 390
|
||
|
end if
|
||
|
|
||
|
C ... Get the id of the node to be moved
|
||
|
CALL FFINTG (IFLD, INTYP, IFIELD, 'Node', 0, node, *420)
|
||
|
if (glonod) then
|
||
|
node = ng2l('node', node, numnp, mapnod)
|
||
|
end if
|
||
|
if (node .le. 0 .or. node .gt. numnp) then
|
||
|
CALL PRTERR ('CMDERR', 'Node index exceeds node count')
|
||
|
go to 390
|
||
|
end if
|
||
|
|
||
|
C ... See if absolute or relative
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
absolute = .false.
|
||
|
if (MATSTR (WORD, 'TO', 2)) THEN
|
||
|
absolute = .true.
|
||
|
else if (MATSTR (WORD, 'BY', 2)) THEN
|
||
|
absolute = .false.
|
||
|
else
|
||
|
call PRTERR('CMDERR',
|
||
|
* 'Expected "TO" or "BY" in move command')
|
||
|
go to 390
|
||
|
|
||
|
end if
|
||
|
|
||
|
x = 0.0
|
||
|
y = 0.0
|
||
|
z = 0.0
|
||
|
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'X value', 0.0, X, *420)
|
||
|
if (ndim .gt. 1) then
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Y value', 0.0, Y, *420)
|
||
|
if (ndim .gt. 2) then
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Z value', 0.0, Z, *420)
|
||
|
end if
|
||
|
end if
|
||
|
|
||
|
C ... Move the node...
|
||
|
if (absolute) then
|
||
|
xn(node) = x
|
||
|
if (ndim .ge. 2) yn(node) = y
|
||
|
if (ndim .eq. 3) zn(node) = z
|
||
|
else
|
||
|
xn(node) = xn(node) + x
|
||
|
if (ndim .ge. 2) yn(node) = yn(node) + y
|
||
|
if (ndim .eq. 3) zn(node) = zn(node) + z
|
||
|
end if
|
||
|
VERB = ' '
|
||
|
go to 420
|
||
|
ELSE
|
||
|
call PRTERR('CMDERR',
|
||
|
* 'Expected "RESET", "GLOBAL", "LOCAL", or sideset id')
|
||
|
go to 390
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
if (ffexst(ifld, intyp)) then
|
||
|
numsnp = numsnp + 1
|
||
|
if (numsnp .gt. mxsnap) then
|
||
|
call PRTERR('CMDERR', 'Too many snap sets specified')
|
||
|
go to 390
|
||
|
end if
|
||
|
|
||
|
ismtyp(numsnp) = IMOVE
|
||
|
usnorm(numsnp) = PNORM
|
||
|
snptol(numsnp) = 0.0
|
||
|
gap(numsnp) = 0.0
|
||
|
C ... NOTE: This value is squared in snpnod, don't increase too big.
|
||
|
delmax(numsnp) = 1.0e15
|
||
|
|
||
|
call ffintg (ifld, intyp, ifield,
|
||
|
$ 'sideset to move nodes from', 0, IDSSSL(numsnp), *390)
|
||
|
imat = locint(idsssl(numsnp), numess, idess)
|
||
|
IF (IMAT .EQ. 0) THEN
|
||
|
WRITE (STRING, 10050) idsssl(numsnp)
|
||
|
10050 FORMAT ('Sideset ',I5,' does not exist')
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('ERROR', STRING(:LSTR))
|
||
|
NUMSNP = NUMSNP - 1
|
||
|
GO TO 390
|
||
|
END IF
|
||
|
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (.NOT. MATSTR (WORD, 'TO', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Expected required keyword "TO"')
|
||
|
NUMSNP = NUMSNP - 1
|
||
|
GO TO 390
|
||
|
END IF
|
||
|
|
||
|
call ffintg (ifld, intyp, ifield,
|
||
|
$ 'sideset to move nodes to', 0, IDSSMA(numsnp), *390)
|
||
|
imat = locint(idssma(numsnp), numess, idess)
|
||
|
IF (IMAT .EQ. 0) THEN
|
||
|
WRITE (STRING, 10050) idssma(numsnp)
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('ERROR', STRING(:LSTR))
|
||
|
NUMSNP = NUMSNP - 1
|
||
|
GO TO 390
|
||
|
END IF
|
||
|
end if
|
||
|
|
||
|
380 CONTINUE
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RESET', 1)) THEN
|
||
|
numsnp = 0
|
||
|
go to 380
|
||
|
else IF (MATSTR(WORD, 'NORMAL', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* '"NORMAL" not supported for "MOVE" command')
|
||
|
go to 390
|
||
|
else IF (MATSTR(WORD, 'EDGE', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* '"EDGE" not supported for "MOVE" command')
|
||
|
go to 390
|
||
|
ELSE IF (WORD .EQ. 'X') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 1.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'Y') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = 1.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'Z') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = 1.0
|
||
|
ELSE IF (WORD .EQ. 'MINUSX') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = -1.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'MINUSY') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = -1.0
|
||
|
VECTOR(3,NUMSNP) = 0.0
|
||
|
ELSE IF (WORD .EQ. 'MINUSZ') THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
VECTOR(1,NUMSNP) = 0.0
|
||
|
VECTOR(2,NUMSNP) = 0.0
|
||
|
VECTOR(3,NUMSNP) = -1.0
|
||
|
ELSE IF (MATSTR(WORD, 'VECTOR', 1)) THEN
|
||
|
USNORM(NUMSNP) = PVECT
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'vector X coordinate', 0.0, VECTOR(1,NUMSNP), *390)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'vector Y coordinate', 0.0, VECTOR(2,NUMSNP), *390)
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'vector Z coordinate', 0.0, VECTOR(3,NUMSNP), *390)
|
||
|
ELSE IF (MATSTR(WORD, 'RADIAL', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* '"RADIAL" not supported for "MOVE" command')
|
||
|
go to 390
|
||
|
ELSE IF (MATSTR(WORD, 'CENTER', 1)) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* '"CENTER" not supported for "MOVE" command')
|
||
|
go to 390
|
||
|
ELSE IF (MATSTR(WORD, 'TOLERANCE', 1)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Tolerance', 0.0, SNPTOL(NUMSNP), *390)
|
||
|
ELSE IF (MATSTR(WORD, 'MAXDELTA', 1)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'MaxDelta', 1.0E15, DELMAX(NUMSNP), *390)
|
||
|
ELSE IF (MATSTR(WORD, 'GAP', 1)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
& 'Gap', 0.0, GAP(NUMSNP), *390)
|
||
|
END IF
|
||
|
GO TO 380
|
||
|
END IF
|
||
|
end if
|
||
|
390 CONTINUE
|
||
|
VERB = 'MOVE'
|
||
|
|
||
|
C --- BEGINNING OF WARP
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'WARP') THEN
|
||
|
IF (NDIM .NE. 3) THEN
|
||
|
CALL PRTERR('CMDERR',
|
||
|
* 'Warp cannot be specified for 2D databases')
|
||
|
GO TO 410
|
||
|
END IF
|
||
|
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD,
|
||
|
* 'HELP', WORD)
|
||
|
|
||
|
IF (MATSTR(WORD, 'HELP', 1)) THEN
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
* 'Syntax: WARP {XAXIS|YAXIS|ZAXIS|ORIGIN} RADIUS {radius}'//
|
||
|
* ' NORMAL {X|Y|Z}')
|
||
|
VERB = ' '
|
||
|
GO TO 410
|
||
|
ELSE IF (MATSTR(WORD, 'XAXIS', 1)) THEN
|
||
|
IWARP = -1
|
||
|
ELSE IF (MATSTR(WORD, 'YAXIS', 1)) THEN
|
||
|
IWARP = -2
|
||
|
ELSE IF (MATSTR(WORD, 'ZAXIS', 1)) THEN
|
||
|
IWARP = -3
|
||
|
ELSE IF (MATSTR(WORD, 'ORIGIN', 1)) THEN
|
||
|
IWARP = 1
|
||
|
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', 'Invalid WARP Option')
|
||
|
IWARP = 0
|
||
|
GO TO 410
|
||
|
END IF
|
||
|
|
||
|
400 continue
|
||
|
IF (FFEXST (IFLD, INTYP)) THEN
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
IF (MATSTR (WORD, 'RADIUS', 1)) THEN
|
||
|
CALL FFREAL (IFLD, INTYP, RFIELD,
|
||
|
* 'reference distance', 0.0, WRPDIS, *410)
|
||
|
IF (WRPDIS .LE. 0.0) THEN
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Reference radius must be greater than zero')
|
||
|
IWARP = 0
|
||
|
GO TO 410
|
||
|
END IF
|
||
|
ELSE IF (MATSTR (WORD, 'NORMAL', 1)) THEN
|
||
|
NRMWRP = 0
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, 'X', WORD)
|
||
|
IF (MATSTR(WORD, 'X', 1)) THEN
|
||
|
NRMWRP = 1
|
||
|
ELSE IF (MATSTR(WORD, 'Y', 1)) THEN
|
||
|
NRMWRP = 2
|
||
|
ELSE IF (MATSTR(WORD, 'Z', 1)) THEN
|
||
|
NRMWRP = 3
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', 'Invalid WARP NORMAL Option')
|
||
|
END IF
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', 'Invalid WARP Option')
|
||
|
IWARP = 0
|
||
|
GO TO 410
|
||
|
END IF
|
||
|
GO TO 400
|
||
|
ELSE
|
||
|
GO TO 410
|
||
|
END IF
|
||
|
|
||
|
410 CONTINUE
|
||
|
IF (IWARP .NE. 0) THEN
|
||
|
if (wrpdis .le. 0.0) then
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Reference radius must be greater than zero')
|
||
|
IWARP = 0
|
||
|
end if
|
||
|
if (nrmwrp .eq. 0) then
|
||
|
CALL PRTERR ('CMDERR',
|
||
|
* 'Normal Vector Axis must be specified')
|
||
|
IWARP = 0
|
||
|
end if
|
||
|
END IF
|
||
|
|
||
|
C... User Subroutine
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'USERSUBROUTINE') then
|
||
|
call ffonof (ifld, intyp, cfield, USRSUB, *420)
|
||
|
|
||
|
C... Convert nodal variable to element variable (average nodal quantities)
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'ELEMENTIZE') then
|
||
|
CALL FFCHAR (IFLD, INTYP, CFIELD, ' ', WORD)
|
||
|
|
||
|
IF (MATSTR(WORD, 'HELP', 1)) THEN
|
||
|
CALL PRTERR ('CMDSPEC',
|
||
|
* 'Syntax: ELEMENTIZE {nodal_variable_name}')
|
||
|
VERB = ' '
|
||
|
goto 420
|
||
|
END IF
|
||
|
C ... Search for name in list of nodal variables.
|
||
|
index = locstr(word, nvarnp, namenv)
|
||
|
|
||
|
if (index .eq. 0) then
|
||
|
write (STRING,*) 'Could not find nodal variable ',
|
||
|
* word(:lenstr(word)),
|
||
|
* ' Enter "list names" to see valid names.'
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('ERROR', STRING(:LSTR))
|
||
|
else
|
||
|
inod2el(index) = 1
|
||
|
write (STRING,*) 'Elementizing nodal variable ',
|
||
|
* word(:lenstr(word))
|
||
|
CALL SQZSTR (STRING, LSTR)
|
||
|
CALL PRTERR ('CMDSPEC', STRING(:LSTR))
|
||
|
end if
|
||
|
VERB = ' '
|
||
|
|
||
|
C... Output element centroids
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'CENTROIDS') then
|
||
|
call ffonof (ifld, intyp, cfield, CENTRD, *420)
|
||
|
|
||
|
C... Help
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'HELP') THEN
|
||
|
ISHELP = HELP (MYNAME(:LNAM), 'COMMANDS', CFIELD(IFLD))
|
||
|
IF (.NOT. ISHELP) THEN
|
||
|
CALL PRTERR('CMDREQ', 'Help is not available at this time')
|
||
|
END IF
|
||
|
VERB = ' '
|
||
|
|
||
|
C========================================================================
|
||
|
ELSE IF ((VERB .EQ. 'END') .OR. (VERB .EQ. 'EXIT')) THEN
|
||
|
CALL SCNEOF
|
||
|
GOTO 430
|
||
|
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'EXECUTE') THEN
|
||
|
CALL SHOW(VERB, ' ')
|
||
|
EXECUT = .TRUE.
|
||
|
GOTO 430
|
||
|
|
||
|
C========================================================================
|
||
|
ELSE IF (VERB .EQ. 'QUIT') THEN
|
||
|
call prterr('WARNING',
|
||
|
& 'Aborting current execution; no output file will be written')
|
||
|
CALL SCNEOF
|
||
|
RETURN 1
|
||
|
|
||
|
C========================================================================
|
||
|
ELSE
|
||
|
CALL PRTERR ('CMDERR', '"' // VERB(:LENSTR(VERB))
|
||
|
& // '" is an invalid command')
|
||
|
VERB = ' '
|
||
|
END IF
|
||
|
|
||
|
420 CONTINUE
|
||
|
|
||
|
IF (VERB .NE. ' ') THEN
|
||
|
CALL SHOW (VERB, ' ')
|
||
|
END IF
|
||
|
|
||
|
GOTO 110
|
||
|
|
||
|
430 CONTINUE
|
||
|
|
||
|
RETURN
|
||
|
END
|
||
|
|
||
|
C=======================================================================
|
||
|
integer function ng2l (type, idglo, num, map)
|
||
|
C=======================================================================
|
||
|
|
||
|
C --G2L locates the local node/element corresponding to the global id
|
||
|
C --
|
||
|
C --Parameters:
|
||
|
C -- TYPE - IN - 'node' or 'element'
|
||
|
C -- NUM - IN - the number of node/elements
|
||
|
C -- MAP - IN - the node/element number map
|
||
|
|
||
|
C ... TYPE = Node or Element
|
||
|
CHARACTER*(*) TYPE
|
||
|
INTEGER MAP(*)
|
||
|
|
||
|
CHARACTER*128 STRA
|
||
|
LOGICAL FOUND
|
||
|
|
||
|
ng2l = idglo
|
||
|
found = .FALSE.
|
||
|
do i = 1, num
|
||
|
if (idglo .eq. map(i)) then
|
||
|
ng2l = i
|
||
|
return
|
||
|
end if
|
||
|
end do
|
||
|
|
||
|
write (stra, 10000) type, idglo
|
||
|
call sqzstr(stra, lstra)
|
||
|
call prterr('WARNING', stra(:lstra))
|
||
|
RETURN
|
||
|
|
||
|
10000 FORMAT (' No local ',A,' has global id equal to ',I10)
|
||
|
END
|