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.

202 lines
6.8 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 PRMMAX (NOUT, MMSTEP, MMNAME, MMTYP, MMVAR, MMNUM,
& XMIN, XMAX, NUMELB, IDELB, ISEVOK, VARGL, VARNP, VAREL)
C=======================================================================
C --*** PRMMAX *** (EXPLORE) Calculate and print the variable min/max
C --
C --PRMMAX calculates the minimum and maximum of a variable for either
C --one step or all steps and displays the values.
C --
C --Parameters:
C -- NOUT - IN - the output file, <=0 for standard
C -- MMSTEP - IN - the requested step number, <=0 for all
C -- MMNAME - IN - min/max variable name
C -- MMTYP - IN/OUT - min/max variable type:
C -- 'H'istory, 'G'lobal, 'N'odal, 'E'lement
C -- MMVAR - IN - min/max variable number
C -- MMNUM - IN/OUT - number of sequential min/max requests for this
C -- variable
C -- XMIN, XMAX - IN/OUT - the minimum and maximum values,
C -- input as last values if MMNUM > 1, output as current values
C -- NUMELB - IN - the number of elements per block
C -- ISEVOK - IN - the element block variable truth table;
C -- variable i of block j exists iff ISEVOK(i,j) is NOT 0
C -- VARGL - IN/OUT - the global variables for current time step
C -- VARNP - IN/OUT - the nodal variables for current time step
C -- VAREL - IN/OUT - the element variables for current time step
C --
C --Common Variables:
C -- Uses NUMNP, NUMEL, NVARNP, NVAREL, NVARGL of /DBNUMS/
include 'exodusII.inc'
include 'exp_dbnums.blk'
CHARACTER*(*) MMNAME
CHARACTER MMTYP
INTEGER NUMELB(*)
INTEGER IDELB(*)
INTEGER ISEVOK(*)
REAL VARGL(*), VARNP(*), VAREL(*)
CHARACTER*20 STR
IF (MMNUM .GT. 1) THEN
OLDMIN = XMIN
OLDMAX = XMAX
END IF
IF (MMSTEP .LE. 0) THEN
ISTART = 1
IEND = NSTEPS
ELSE
ISTART = MMSTEP
IEND = MMSTEP
END IF
DO 100 NSTEP = ISTART, IEND
C --Read in the variable for the time step
N = NSTEP
CALL TOSTEP (N, NUMELB, IDELB, ISEVOK,
& TIME, VARGL, VARNP, VAREL)
IF (N .NE. NSTEP) GOTO 110
C --Update the minimum and maximum
N = NSTEP
IF (MMSTEP .GT. 0) N = -999
IF (MMTYP .EQ. 'G') THEN
CALL NXMMAX (N, MMNUM, MMVAR, NVARGL, 1, VARGL,
& OLDMIN, OLDMAX, XMIN, XMAX,
& MINSTE, MAXSTE, MINNE, MAXNE, NMIN, NMAX)
ELSE IF (MMTYP .EQ. 'N') THEN
CALL NXMMAX (N, MMNUM, MMVAR, NVARNP, NUMNP, VARNP,
& OLDMIN, OLDMAX, XMIN, XMAX,
& MINSTE, MAXSTE, MINNE, MAXNE, NMIN, NMAX)
ELSE IF (MMTYP .EQ. 'E') THEN
CALL NXMMAX (N, MMNUM, MMVAR, NVAREL, NUMEL, VAREL,
& OLDMIN, OLDMAX, XMIN, XMAX,
& MINSTE, MAXSTE, MINNE, MAXNE, NMIN, NMAX)
END IF
100 CONTINUE
C --Print the minimum and maximum
IF (MMSTEP .LE. 0) THEN
STR = 'ALL time steps'
ELSE
STR = 'this time step only'
END IF
LSTR = LENSTR(STR)
IF (MMNUM .LE. 1) THEN
IF (NOUT .GT. 0) THEN
WRITE (NOUT, 10000, IOSTAT=IDUM)
& MMNAME(:LENSTR(MMNAME)), STR(:LSTR)
ELSE
WRITE (*, 10000, IOSTAT=IDUM)
& MMNAME(:LENSTR(MMNAME)), STR(:LSTR)
END IF
ELSE
IF (NOUT .GT. 0) THEN
WRITE (NOUT, 10000, IOSTAT=IDUM)
& MMNAME(:LENSTR(MMNAME)), STR(:LSTR), MMNUM
ELSE
WRITE (*, 10000, IOSTAT=IDUM)
& MMNAME(:LENSTR(MMNAME)), STR(:LSTR), MMNUM
END IF
END IF
IF ((MMNUM .LE. 1) .AND. (XMIN .EQ. XMAX)) THEN
IF (NOUT .GT. 0) THEN
WRITE (NOUT, 10010, IOSTAT=IDUM) XMIN
ELSE
WRITE (*, 10010, IOSTAT=IDUM) XMIN
END IF
ELSE IF (MMTYP .EQ. 'G') THEN
IF (MMSTEP .LE. 0) THEN
IF (NOUT .GT. 0) THEN
WRITE (NOUT, 10020, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN, MINSTE
WRITE (NOUT, 10020, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX, MAXSTE
ELSE
WRITE (*, 10020, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN, MINSTE
WRITE (*, 10020, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX, MAXSTE
END IF
ELSE
IF (NOUT .GT. 0) THEN
WRITE (NOUT, 10020, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN
WRITE (NOUT, 10020, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX
ELSE
WRITE (*, 10020, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN
WRITE (*, 10020, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX
END IF
END IF
ELSE IF ((MMTYP .EQ. 'N') .OR. (MMTYP .EQ. 'E')) THEN
IF (MMTYP .EQ. 'N') THEN
STR = 'node'
ELSE
STR = 'element'
END IF
LSTR = LENSTR(STR)
IF (MMSTEP .LE. 0) THEN
IF (NOUT .GT. 0) THEN
WRITE (NOUT, 10030, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN, STR(:LSTR), MINNE, MINSTE
WRITE (NOUT, 10030, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX, STR(:LSTR), MAXNE, MAXSTE
ELSE
WRITE (*, 10030, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN, STR(:LSTR), MINNE, MINSTE
WRITE (*, 10030, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX, STR(:LSTR), MAXNE, MAXSTE
END IF
ELSE
IF (NOUT .GT. 0) THEN
WRITE (NOUT, 10030, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN, STR(:LSTR), MINNE
WRITE (NOUT, 10030, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX, STR(:LSTR), MAXNE
ELSE
WRITE (*, 10030, IOSTAT=IDUM)
& NMIN, 'Minimum', XMIN, STR(:LSTR), MINNE
WRITE (*, 10030, IOSTAT=IDUM)
& NMAX, 'Maximum', XMAX, STR(:LSTR), MAXNE
END IF
END IF
END IF
C --Update the min/max number
IF (XMIN .NE. XMAX) THEN
MMNUM = MMNUM + 1
ELSE
MMNUM = -999
END IF
110 CONTINUE
RETURN
10000 FORMAT (/, 1X, 'Variable ', A, ' for ', A,
& :, ', number =', I12)
10010 FORMAT (4X, 'All values = ', 1PE17.10)
10020 FORMAT (1X, I12, ' ', A, '(s) = ', 1PE17.10, :
& ', first at step ', I12)
10030 FORMAT (1X, I12, ' ', A, '(s) = ', 1PE17.10,
& ', first at ', A, I12, :, ' of step ', I12)
END