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.
151 lines
5.0 KiB
151 lines
5.0 KiB
2 years ago
|
C Copyright(C) 1999-2020 National Technology & Engineering Solutions
|
||
|
C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
|
||
|
C NTESS, the U.S. Government retains certain rights in this software.
|
||
|
C
|
||
|
C See packages/seacas/LICENSE for details
|
||
|
|
||
|
C=======================================================================
|
||
|
SUBROUTINE LOCNAM (NAME, NAMECO, NAMES,
|
||
|
& NENUM, TYPEQV, IDEQV, NERR)
|
||
|
C=======================================================================
|
||
|
|
||
|
C --*** LOCNAM *** (ALGEBRA) Locate equation variables
|
||
|
C --Written by Amy Gilkey - revised 02/22/88
|
||
|
C --
|
||
|
C --LOCNAM determines the type, location, and node/element specifier (if any)
|
||
|
C --of an equation variable. The variable type and database index
|
||
|
C --are returned. The specifier is checked for validity.
|
||
|
C --
|
||
|
C --Parameters:
|
||
|
C -- NAME - IN - the variable name
|
||
|
C -- NAMECO - IN - the coordinate names
|
||
|
C -- NAMES - IN - the history, global, nodal, and element variable names
|
||
|
C -- NENUM - IN/OUT - the node/element specifier; changed if incorrect
|
||
|
C -- TYPEQV - OUT - the variable type (as in /VAR../)
|
||
|
C -- IDEQV - OUT - the variable database index (as in /VAR../)
|
||
|
C -- NERR - IN/OUT - the number of errors in the equation, may be set
|
||
|
C --
|
||
|
C --Common Variables:
|
||
|
C -- Uses IXLHS, NAMVAR, TYPVAR of /VAR../
|
||
|
C -- Uses NDIM, NVARHI, NVARGL, NVARNP, NVAREL of /DBNUMS/
|
||
|
|
||
|
include 'ag_namlen.blk'
|
||
|
include 'ag_var.blk'
|
||
|
include 'ag_dbnums.blk'
|
||
|
|
||
|
CHARACTER*(*) NAME
|
||
|
CHARACTER*(*) NAMECO(*)
|
||
|
CHARACTER*(*) NAMES(*)
|
||
|
CHARACTER TYPEQV
|
||
|
|
||
|
CHARACTER*5 STRA, STRB
|
||
|
|
||
|
C --Save the node/element specifier, if any
|
||
|
INENUM = NENUM
|
||
|
|
||
|
C --Search LHS array first; thus, once an input variable is
|
||
|
C --assigned, its assigned value is referenced
|
||
|
|
||
|
C --Calculate number of LHS variables
|
||
|
NUMLHS = MAXVAR - IXLHS + 1
|
||
|
|
||
|
NV = LOCSTR (NAME, NUMLHS, NAMVAR(IXLHS))
|
||
|
IF (NV .GT. 0) THEN
|
||
|
NV = IXLHS + NV - 1
|
||
|
TYPEQV = TYPVAR(NV)
|
||
|
C --IDEQV used to determine if referencing a LHS or input variable
|
||
|
IDEQV = -NV
|
||
|
C --NENUM slot determined when storage linked
|
||
|
IF ((TYPEQV .EQ. 'T')
|
||
|
& .OR. (TYPEQV .EQ. 'G')) NENUM = -999
|
||
|
|
||
|
ELSE
|
||
|
|
||
|
C --Search TIME
|
||
|
|
||
|
IF (NAME .EQ. 'TIME') THEN
|
||
|
TYPEQV = 'T'
|
||
|
C --IDEQV used to determine if referencing a LHS or input variable
|
||
|
IDEQV = 0
|
||
|
C --NENUM slot determined when storage linked
|
||
|
NENUM = -999
|
||
|
|
||
|
ELSE
|
||
|
|
||
|
C --Search coordinate names
|
||
|
NV = LOCSTR (NAME, NDIM, NAMECO)
|
||
|
IF (NV .GT. 0) THEN
|
||
|
TYPEQV = 'C'
|
||
|
IDEQV = NV
|
||
|
|
||
|
ELSE
|
||
|
|
||
|
C --Search variable names
|
||
|
|
||
|
NV = LOCSTR (NAME, NVARGL+NVARNP+NVAREL, NAMES)
|
||
|
IF (NV .GT. 0) THEN
|
||
|
CALL DBVTYP (NV, TYPEQV, ID)
|
||
|
IF (TYPEQV .EQ. 'G') THEN
|
||
|
C --global variable
|
||
|
IDEQV = 1
|
||
|
C --NENUM slot determined when storage linked,
|
||
|
C --mark with global variable number
|
||
|
NENUM = ID
|
||
|
ELSE IF (TYPEQV .EQ. 'N') THEN
|
||
|
C --Nodal variable
|
||
|
IDEQV = ID
|
||
|
ELSE IF (TYPEQV .EQ. 'E') THEN
|
||
|
C --Element variable
|
||
|
IDEQV = ID
|
||
|
END IF
|
||
|
|
||
|
ELSE
|
||
|
|
||
|
C --Name not found, set up like history to eliminate problems
|
||
|
|
||
|
TYPEQV = ' '
|
||
|
IDEQV = 0
|
||
|
NENUM = 0
|
||
|
NERR = NERR + 1
|
||
|
CALL PRTERR ('CMDSPEC', '"' // NAME(:LENSTR(NAME))
|
||
|
& // '" is not a database or assigned variable')
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
C --Check validity of node/element specifier
|
||
|
|
||
|
IF ((TYPEQV .EQ. 'T')
|
||
|
& .OR. (TYPEQV .EQ. 'G')) THEN
|
||
|
IF (INENUM .NE. 0) THEN
|
||
|
NERR = NERR + 1
|
||
|
CALL PRTERR ('CMDSPEC', 'Node/element specifier not allowed'
|
||
|
& // ' on TIME or global variable '
|
||
|
& // NAME(:LENSTR(NAME)))
|
||
|
END IF
|
||
|
|
||
|
ELSE IF ((TYPEQV .EQ. 'C') .OR. (TYPEQV .EQ. 'N')) THEN
|
||
|
IF (NENUM .GT. NUMNP) THEN
|
||
|
NERR = NERR + 1
|
||
|
CALL INTSTR (1, 0, NENUM, STRA, LSTRA)
|
||
|
CALL INTSTR (1, 0, NUMNP, STRB, LSTRB)
|
||
|
CALL PRTERR ('CMDSPEC', 'Node specifier ' // STRA(:LSTRA)
|
||
|
& // ' of ' // NAME(:LENSTR(NAME))
|
||
|
& // ' is too big, number of nodes = ' // STRB(:LSTRB))
|
||
|
END IF
|
||
|
|
||
|
ELSE IF (TYPEQV .EQ. 'E') THEN
|
||
|
IF (NENUM .GT. NUMEL) THEN
|
||
|
NERR = NERR + 1
|
||
|
CALL INTSTR (1, 0, NENUM, STRA, LSTRA)
|
||
|
CALL INTSTR (1, 0, NUMNP, STRB, LSTRB)
|
||
|
CALL PRTERR ('CMDSPEC', 'Element specifier ' // STRA(:LSTRA)
|
||
|
& // ' of ' // NAME(:LENSTR(NAME))
|
||
|
& // ' is too big, number of elements = ' // STRB(:LSTRB))
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
RETURN
|
||
|
END
|