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.

325 lines
11 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 MSSTEP (A, ISTEP, NEWSET, NEWFAC, ANYDEF, ANYUND,
& DOIXF, DON2B, DOELED, DOELEU, DODEAD, DONPS, DOESS,
& LENF, NLNKF, LINKF, LENL, KLNSET,
& KHIDEN, KHIDEF, KIXFAC,
& KXN, KYN, KZN, KHZ, KVT, KPD, KDHZ, KDVT, KDPD,
& KXF, KYF, KZF, KDXF, KDYF, KDZF,
& NEWELB, IELBST, KN2ELB, KDN2B, IF2EL, KNPSUR)
C=======================================================================
C --*** MSSTEP *** (MESH) Compute coordinates, etc for time step
C -- Written by Amy Gilkey - revised 05/26/88
C --
C --MSSTEP computes the values needed for the mesh plot of a particular
C --time step. These values include the nodal deformed coordinates,
C --the face coordinates (both deformed and undeformed), and
C --the line set. The memory for these values is expanded if needed.
C --The values which do not change between time steps (e.g., the
C --undeformed coordinates are not recalculated.
C --
C --This routine uses MDFIND to find the following dynamic memory arrays:
C -- IF2EL2 - the secondary element number of each face
C -- IE2ELB - the element block for each element
C --
C --Parameters:
C -- A - IN - the dynamic memory base array
C -- ISTEP - IN - the time step number
C -- NEWSET - IN - true iff start of a new plot set
C -- NEWFAC - IN - true iff the faces have changed
C -- ANYDEF - IN - true iff any deformed mesh is to be plotted
C -- ANYUND - IN - true iff any undeformed mesh is to be plotted
C -- DOIXF - IN - true iff the IXFAC array is needed
C -- DON2B - IN - true iff the IN2ELB array is needed
C -- DOELED - IN - true iff the deformed element quarilateral centers
C -- are needed
C -- DOELEU - IN - true iff the undeformed element quarilateral centers
C -- are needed
C -- DODEAD - IN - true iff dead nodes are needed
C -- DONPS - IN - true iff node set information is needed
C -- DOESS - IN - true iff side set information is needed
C -- LENF - IN/OUT - the cumulative face counts by element block
C -- NLNKF - IN - the number of nodes per face
C -- LINKF - IN/OUT - the connectivity for all faces
C -- LENL - IN/OUT - the cumulative line counts by element block
C -- KLNSET - IN/OUT - the dynamic memory index of the sorted line set
C -- KHIDEN - OUT - the index of HIDENP - sized only
C -- KHIDEF - OUT - the index of HIDEF - sized only
C -- KIXFAC - OUT - the index of IXFAC - sized only
C -- KXN, KYN, KZN - IN/OUT - the indices of XN, YN, ZN -
C -- the nodal coordinates (ZN for 3D only)
C -- KHZ, KVT, KPD - IN/OUT - the indices of HZ, VT, PD -
C -- the undeformed nodal coordinates
C -- (rotated for 3D, PD for 3D only)
C -- KDHZ, KDVT, KDPD - IN/OUT - the indices of DHZ, DVT, DPD -
C -- the deformed nodal coordinates
C -- (rotated for 3D, DPD for 3D only)
C -- KXF, KYF, KZF - IN/OUT - the indices of XF, YF, ZF -
C -- the element face center coordinates
C -- (rotated for 3D, ZF for 3D only)
C -- KDXF, KDYF, KDZF - IN/OUT - the indices of DXF, DYF, DZF -
C -- the deformed face center coordinates
C -- (rotated for 3D, DZF for 3D only)
C -- NEWELB - IN/OUT - the new element blocks flag:
C -- 0 = no new element blocks
C -- 1 = new selected element blocks
C -- 2 = new displayed element blocks (implies new selected blocks)
C -- IELBST - IN/OUT - the element block status:
C -- -1 = OFF, 0 = ON, but not selected, 1 = selected
C -- KN2ELB - IN/OUT - the index of IN2ELB -
C - the element block for each node;
C -- <0 if not in any selected element block
C -- =0 if in more than one selected element block
C -- KDN2B - IN/OUT - the index of IDN2B -
C -- the element block for each dead node; dead if >= 0
C -- IF2EL - IN - the element number of each face
C -- KNPSUR - IN/OUT - the index of NPSURF -
C -- the node numbers of the surface nodes or mesh boundary nodes (2D)
C --
C --Common Variables:
C -- Uses NDIM, NELBLK of /DBNUMS/
C -- Uses IS3DIM, NNPSUR, NUMNPF, LLNSET of /D3NUMS/
C -- Uses DEFPRO, DEFOK, DFAC of /DEFORM/
C -- Uses ROTMAT, ROTCEN of /ROTOPT/
include 'dbnums.blk'
COMMON /D3NUMS/ IS3DIM, NNPSUR, NUMNPF, LLNSET
LOGICAL IS3DIM
COMMON /DEFORM/ DEFPRO, DEFOK, DEFFAC, DDFAC, DFAC,
& IXDEF, IYDEF, IZDEF
LOGICAL DEFPRO, DEFOK
COMMON /ROTOPT/ NEWROT, ROTMAT(3,3), ROTCEN(3), EYE(3)
LOGICAL NEWROT
COMMON /SIZES/ NPSIZ
C --NPSIZ - the size of the nodal coordinate arrays passed to the
C -- HIDDEN routine for partial line
DIMENSION A(*)
LOGICAL NEWSET, NEWFAC
LOGICAL ANYDEF, ANYUND
LOGICAL DOIXF, DON2B, DOELED, DOELEU, DODEAD, DONPS, DOESS
INTEGER LENF(0:NELBLK+4)
INTEGER NLNKF(NELBLK)
INTEGER LINKF(*)
INTEGER LENL(-2:NELBLK)
INTEGER NEWELB
INTEGER IELBST(NELBLK)
INTEGER IF2EL(*)
LOGICAL NEWNPD, NEWNPU, NEWELD, NEWELU
SAVE NEWNPU, NEWELU
DATA NEWNPU, NEWELU / .TRUE., .TRUE. /
IF (NEWFAC) THEN
C --Force the re-calculation of connected element count, if needed
NEWELB = 1
C --Force the re-calculation of undeformed nodal and face coordinates
NEWNPU = .TRUE.
NEWELU = .TRUE.
C --Set size of deformed coordinate arrays for hidden line algorithm
NPSIZ = NUMNPF
IF (IS3DIM) NPSIZ = (13 * NUMNPF) / 10
END IF
C --Force the re-calculation of deformed nodal and face coordinates
NEWNPD = DEFOK .AND. DEFPRO
NEWELD = DEFOK .AND. DEFPRO
C --Force the re-calculation of undeformed nodal and face coordinates
IF (NEWROT .OR. NEWSET) THEN
NEWNPU = .TRUE.
NEWELU = .TRUE.
END IF
C --Release memory that will vary in size or not be needed
IF (NEWSET .OR. NEWFAC) THEN
IF (NEWELB .GE. 1) THEN
CALL MDLONG ('IN2ELB', KN2ELB, 0)
END IF
IF (DODEAD) CALL MDLONG ('IDN2B', KDN2B, 0)
END IF
IF (NNPSUR .LT. 0) THEN
CALL MDLONG ('NPSURF', KNPSUR, 0)
END IF
IF (IS3DIM .AND. NEWNPU) THEN
CALL MDLONG ('HZ', KHZ, 0)
CALL MDLONG ('VT', KVT, 0)
IF (IS3DIM) CALL MDLONG ('PD', KPD, 0)
END IF
IF (NEWNPD) THEN
CALL MDLONG ('DHZ', KDHZ, 0)
CALL MDLONG ('DVT', KDVT, 0)
IF (IS3DIM) CALL MDLONG ('DPD', KDPD, 0)
END IF
IF (NEWELU) THEN
CALL MDLONG ('XF', KXF, 0)
CALL MDLONG ('YF', KYF, 0)
IF (IS3DIM) CALL MDLONG ('ZF', KZF, 0)
END IF
IF (NEWELD) THEN
CALL MDLONG ('DXF', KDXF, 0)
CALL MDLONG ('DYF', KDYF, 0)
IF (IS3DIM) CALL MDLONG ('DZF', KDZF, 0)
END IF
IF (IS3DIM .AND. NEWFAC) THEN
CALL MDLONG ('HIDENP', KHIDEN, 0)
CALL MDLONG ('HIDEF', KHIDEF, 0)
IF (DOIXF) CALL MDLONG ('IXFAC', KIXFAC, 0)
END IF
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
C --Compute new line set if new faces
IF (NEWFAC) THEN
CALL MSLINS (A, LENF, NLNKF, LINKF, IF2EL, LENL, KLNSET)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
END IF
C --Compute node to element block and dead node to element block,
C --if needed
IF ((NEWELB .GE. 1) .AND. (DON2B .OR. DONPS .OR. DOESS)) THEN
IF (NEWSET .OR. NEWFAC) THEN
CALL MDLONG ('IN2ELB', KN2ELB, NUMNPF)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
END IF
CALL MAKN2B (LENF, NLNKF, LINKF, IELBST, A(KN2ELB))
NEWELB = 0
END IF
IF (DODEAD) THEN
IF (NEWSET .OR. NEWFAC) THEN
CALL MDLONG ('IDN2B', KDN2B, NUMNPF)
END IF
IF (IS3DIM) THEN
CALL MDFIND ('IF2EL2', KIF2E2, IDUM)
ELSE
KIF2E2 = 1
KE2ELB = 1
END IF
CALL MDFIND ('IE2ELB', KE2ELB, IDUM)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
CALL MAKD2B (LENF, NLNKF, LINKF, IELBST,
& IF2EL, A(KIF2E2), A(KE2ELB), A(KDN2B))
END IF
C --Compute NPSURF nodes for 3D, if changed
IF (NNPSUR .LT. 0) THEN
CALL MDLONG ('NPSURF', KNPSUR, NUMNPF)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
CALL MAKSUR (LENF, NLNKF, LINKF,
& DODEAD, A(KDN2B), A(KNPSUR))
CALL MDLONG ('NPSURF', KNPSUR, NNPSUR)
END IF
C --Put rotated undeformed coordinates in undeformed arrays, if needed
IF (NEWNPU .AND. ANYUND) THEN
IF (IS3DIM) THEN
CALL MDLONG ('HZ', KHZ, NPSIZ)
CALL MDLONG ('VT', KVT, NPSIZ)
IF (IS3DIM) CALL MDLONG ('PD', KPD, NPSIZ)
ELSE
KHZ = KXN
KVT = KYN
KPD = KZN
END IF
IF (IS3DIM) THEN
CALL BL_ROTATE (NNPSUR, A(KNPSUR), ROTMAT, ROTCEN,
& A(KXN), A(KYN), A(KZN), A(KHZ), A(KVT), A(KPD))
C --Force the re-calculation of undeformed face coordinates
NEWELU = .TRUE.
END IF
NEWNPU = .FALSE.
NEWROT = .FALSE.
END IF
C --Compute deformed nodal coordinates, if needed
IF (NEWNPD .AND. ANYDEF) THEN
CALL MDLONG ('DHZ', KDHZ, NPSIZ)
CALL MDLONG ('DVT', KDVT, NPSIZ)
IF (IS3DIM) CALL MDLONG ('DPD', KDPD, NPSIZ)
CALL DEFXYZ (A, ISTEP, DFAC, IS3DIM, A(KNPSUR),
& A(KXN), A(KYN), A(KZN), A(KDHZ), A(KDVT), A(KDPD))
IF (IS3DIM) THEN
CALL BL_ROTATE (NNPSUR, A(KNPSUR), ROTMAT, ROTCEN,
& A(KDHZ), A(KDVT), A(KDPD), A(KDHZ), A(KDVT), A(KDPD))
END IF
C --Force the re-calculation of deformed face coordinates
NEWELD = .TRUE.
NEWNPU = .FALSE.
END IF
C --Get face coordinates, if changed
IF (NEWELU .AND. DOELEU) THEN
IF (NEWELU) THEN
CALL MDLONG ('XF', KXF, LENF(NELBLK))
CALL MDLONG ('YF', KYF, LENF(NELBLK))
IF (IS3DIM) CALL MDLONG ('ZF', KZF, LENF(NELBLK))
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
END IF
CALL ELECOR (NDIM, NELBLK, LENF, NLNKF, LINKF,
& A(KHZ), A(KVT), A(KPD), A(KXF), A(KYF), A(KZF))
NEWELU = .FALSE.
END IF
IF (NEWELD .AND. DOELED) THEN
IF (NEWELD) THEN
CALL MDLONG ('DXF', KDXF, LENF(NELBLK))
CALL MDLONG ('DYF', KDYF, LENF(NELBLK))
IF (IS3DIM) CALL MDLONG ('DZF', KDZF, LENF(NELBLK))
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
END IF
CALL ELECOR (NDIM, NELBLK, LENF, NLNKF, LINKF,
& A(KDHZ), A(KDVT), A(KDPD), A(KDXF), A(KDYF), A(KDZF))
NEWELD = .FALSE.
END IF
IF (IS3DIM .AND. NEWFAC) THEN
CALL MDLONG ('HIDENP', KHIDEN, NUMNPF)
CALL MDLONG ('HIDEF', KHIDEF, LENF(NELBLK))
IF (DOIXF) CALL MDLONG ('IXFAC', KIXFAC, LENF(NELBLK))
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 100
END IF
100 CONTINUE
RETURN
END