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.

817 lines
25 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
SUBROUTINE RENUM (NPNODE, NPELEM, MXNFLG, MXSFLG, NPNBC, NPSBC,
& NPWTS, NPREGN, MP, ML, MS, MR, MSC, MAXKXN, NNUID, NNXK,
& MXLPS, IUNIT, NNN, KKK, KCRD, NL, NPBF, NLBF, NSBF, IPART,
& LSTNBC, LSTSBC, NNFLG, NNPTR, NNLEN, NSFLG, NSPTR, NSLEN,
& NVPTR, NVLEN, NSIDEN, NUID, XN, YN, NXK, MAT, KXN, LIST, LA,
& LB, MATMAP, LISTN, WTNODE, WTSIDE, WTHOLD, IHERE, ILIST, XLIST,
& NUMMAT, NBCNOD, NNLIST, NBCSID, NSLIST, NVLIST, COOR, ILINE,
& LTYPE, LCON, ISIDE, NLPS, IFLINE, ILLIST, LINKP, LINKL, LINKS,
& LINKR, IMAT, LINKB, JMAT, IPBF, NPPF, IFPB, LISTPB, IWTPBF,
& ILBF, NLPF, IFLB, LISTLB, IWTLBF, ISBF, NSPF, IFSB, LISTSB,
& IWTSBF, LINKPB, LINKLB, LINKSB, NUMBER, THREE, EIGHT, NINE,
& OPTIM, ISBARS)
C***********************************************************************
C SUBROUTINE RENUM = NUMBERS QMESH OUTPUT, AND RENUMBERS AS NEEDED FOR
C OPTIMIZATION
C***********************************************************************
C THE REFERENCE DOCUMENTS FOR THIS CODE ARE SLA-73-1088, JULY 1974,
C AND SLA-74-0239, JULY 1974
C***********************************************************************
DIMENSION NLIST(20), IPART(3, NPREGN)
DIMENSION COOR(2, MP), ILINE(ML), LTYPE(ML), LCON(3, ML)
DIMENSION ISIDE(MS), NLPS(MS), IFLINE(MS), ILLIST(MS*3)
DIMENSION LINKP(2, MP), LINKL(2, ML), LINKS(2, MS), LINKB(2, MS)
DIMENSION LINKR(2, MR)
DIMENSION IMAT(MR), JMAT(MS)
DIMENSION IPBF(MP), NPPF(MP), IFPB(MP), LISTPB(2, MP)
DIMENSION ILBF(ML), NLPF(ML), IFLB(ML), LISTLB(2, ML)
DIMENSION ISBF(ML), NSPF(ML), IFSB(ML), LISTSB(2, ML)
DIMENSION IWTPBF(3, MP), IWTLBF(3, ML), IWTSBF(3, ML)
DIMENSION LINKPB(2, MP), LINKLB(2, ML), LINKSB(2, ML)
DIMENSION LIST(NNUID), LISTN(NNUID), NUID(NNUID), XN(NPNODE)
DIMENSION YN(NPNODE), NXK(NNXK, NPELEM), MAT(NPELEM)
DIMENSION KXN(NNXK, MAXKXN), LA(NPNODE), LB(NPNODE)
DIMENSION IHERE(NNUID), ILIST(MXLPS), XLIST(MXLPS)
DIMENSION LSTNBC(NPNBC), LSTSBC(NPSBC), NSIDEN(NPSBC)
DIMENSION NNFLG(MXNFLG), NNLEN(MXNFLG), NNPTR(MXNFLG)
DIMENSION NSFLG(MXSFLG), NSLEN(MXSFLG), NSPTR(MXSFLG)
DIMENSION WTHOLD(NPWTS), WTNODE(NPNBC), WTSIDE(NPSBC)
DIMENSION NVLEN(MXSFLG), NVPTR(MXSFLG), MATMAP(3, NPREGN)
DIMENSION KLIST(20)
LOGICAL OPTIM, ERR, NOROOM, ALL, THREE, EIGHT, NINE
LOGICAL ITSOK, ISBARS
CHARACTER*80 NUMBER(MSC)
C HEADER
CALL MESSAGE(' ')
CALL MESSAGE('NUMBERING OF GENERATED OUTPUT BEGUN')
IF (OPTIM) CALL MESSAGE(' -- OPTIMIZATION IS ENABLED --')
C READ THE MESH TAPE
CALL RDMESH (NPNODE, NPELEM, NPNBC, NPSBC, NPREGN, MS, MR, NNUID,
& NNXK, IUNIT, NNN, KKK, IPART, LSTNBC, LSTSBC, NUID, XN, YN,
& NXK, MAT, MATMAP, NUMMAT, ISIDE, NLPS, IFLINE, ILLIST, LINKS,
& LINKR, IMAT, LINKB, JMAT, NNNBC, NNSBC, ERR)
IF (ERR) THEN
CALL MESSAGE('** NUMBERING ABORT **')
RETURN
END IF
C SORT NODE LIST INTO INCREASING NUID-S
DO 100 I = 1, NNN
LISTN(I) = NUID(I)
100 CONTINUE
IF (OPTIM) THEN
CALL NODORD (NPNODE, XN, YN, LISTN, NUID, NNN)
ELSE
DO 110 I = 1, NNN
LIST(I) = I
110 CONTINUE
CALL SORT (NNN, NUID, LIST)
END IF
C CONVERT REFERENCES TO NUID-S TO REFERENCES TO
C SEQUENCE NUMBERS
DO 130 I = 1, 4
DO 120 K = 1, KKK
IF (NXK(I, K) .GT. 0) THEN
NEW = INDX(NNN, NUID, NXK(I, K))
IF (NEW .EQ. 0) THEN
CALL MESSAGE('ERROR SORTING NUMBERING DATA -- NODE')
CALL MESSAGE('*** NO MESH SAVED ***')
KKK = 0
RETURN
END IF
IF (OPTIM) THEN
NXK(I, K) = NEW
ELSE
NXK(I, K) = LIST(NEW)
END IF
END IF
120 CONTINUE
130 CONTINUE
IF (NNNBC .GT. 0) THEN
DO 140 I = 1, NNNBC
IF (LSTNBC(I) .GT. 0) THEN
NEW = INDX(NNN, NUID, LSTNBC(I))
IF (NEW .EQ. 0) THEN
CALL MESSAGE('ERROR SORTING NUMBERING DATA -- NBC')
CALL MESSAGE('*** NO MESH SAVED ***')
KKK = 0
RETURN
END IF
IF (OPTIM) THEN
LSTNBC(I) = NEW
ELSE
LSTNBC(I) = LIST(NEW)
END IF
END IF
140 CONTINUE
END IF
C BUILD KXN ARRAY
NUMKXN = NNN
DO 160 I = 1, NNXK
DO 150 J = 1, MAXKXN
KXN(I, J) = 0
150 CONTINUE
160 CONTINUE
DO 180 I = 1, 4
DO 170 K = 1, KKK
IF (NXK(I, K) .GT. 0) THEN
CALL KXNADD (MAXKXN, NNXK, KXN, NUMKXN, K, NXK(I, K),
& ERR)
IF (ERR) THEN
CALL MESSAGE('** NUMBERING ABORT **')
KKK = 0
RETURN
END IF
END IF
170 CONTINUE
180 CONTINUE
IF (OPTIM) THEN
C GET STARTING LIST FOR CUTHILL-MCKEE PROCESS
IF (KCRD .GT. 0) THEN
CALL GNLIST (NPNODE, NNUID, MSC, NPNODE, NPELEM, MAXKXN,
& NNXK, KXN, NXK, NUID, XN, YN, LIST, NUML, NUMBER, KCRD,
& NNN, ERR, NOROOM)
IF (NOROOM) THEN
CALL MESSAGE('TOO MANY NODES IN STARTING LIST')
CALL MESSAGE('*** NO MESH SAVED ***')
CALL MESSAGE('** NUMBERING ABORT **')
KKK = 0
RETURN
ELSE IF (ERR) THEN
CALL MESSAGE('ERROR GENERATING STARTING LIST')
CALL MESSAGE('*** NO MESH SAVED ***')
CALL MESSAGE('** NUMBERING ABORT **')
KKK = 0
RETURN
END IF
ELSE
CALL MESSAGE('NO CARDS AVAILABLE FOR STARTING LIST')
CALL MESSAGE('FIRST NODE IN THE OUTPUT USED')
NUML = 1
LIST(1) = 1
END IF
C INITIALIZE LISTS
DO 190 I = 1, NNN
LISTN(I) = I
190 CONTINUE
C USE LISTN AS A CHECK ON WHETHER THE NODE HAS BEEN USED (NEGATED)
DO 200 I = 1, NUML
LA(I) = LIST(I)
NODE = LIST(I)
LISTN(NODE) = -LISTN(NODE)
200 CONTINUE
NUMA = NUML
C CREATE LIST OF NEW NODES CONNECTED TO LIST A
210 CONTINUE
NUMB = 0
DO 230 N = 1, NUMA
ALL = .TRUE.
CALL GETNXN (NPNODE, NPELEM, MAXKXN, NNXK, KXN, NXK, LISTN,
& LA(N), NLIST, NUMB1, ALL, ERR)
IF (ERR) THEN
CALL MESSAGE('** NUMBERING ABORT **')
KKK = 0
RETURN
END IF
IF (NUMB1 .GT. 0) THEN
IF ((NUMB + NUMB1) .GT. NPNODE) THEN
CALL MESSAGE('LIST B HAS OVERFLOWED')
CALL MESSAGE('*** NO MESH SAVED ***')
CALL MESSAGE('** NUMBERING ABORT **')
KKK = 0
RETURN
END IF
DO 220 I = 1, NUMB1
NODE = NLIST(I)
NUMB = NUMB + 1
LB(NUMB) = NODE
LISTN(NODE) = -LISTN(NODE)
220 CONTINUE
END IF
230 CONTINUE
IF (NUMB .GT. 0) THEN
C INCLUDE LIST B INTO FULL LIST
C ALSO TRANSFER LIST B TO LIST A
DO 240 I = 1, NUMB
NUML = NUML + 1
LIST(NUML) = LB(I)
LA(I) = LB(I)
240 CONTINUE
NUMA = NUMB
C CHECK FOR CONVERGENCE
IF (NUML .LT. NNN) GO TO 210
C PROCESS HAS CONVERGED
C CHECK IF ALL NODES WERE COVERED
ELSE IF (NUML .LT. NNN) THEN
DO 250 I = 1, NNN
IF (LISTN(I) .GT. 0) THEN
C START THE LIST AGAIN WITH THE MISSED NODE
CALL MESSAGE('A DISCONTINUITY (SLIDE LINE) IN THE '//
& 'BODY HAS BEEN FOUND')
CALL MESSAGE
& ('SEPARATE PART NUMBERING WILL ALSO BE OPTIMIZED')
NUMA = 1
LA(1) = I
GO TO 210
END IF
250 CONTINUE
C DEFINITE ERROR IN THE NUMBERING PROCESS
CALL MESSAGE('ALL NODES COULD NOT BE FOUND TO NUMBER')
CALL MESSAGE(' *** NO MESH SAVED ***')
CALL MESSAGE(' ** NUMBERING ABORT **')
KKK = 0
RETURN
END IF
C PREPARE TO PUT NODE LIST INTO NEWLY DETERMINED ORDER
C LISTN BECOMES THE POINTER FROM THE OLD NUMBER TO THE NEW
DO 260 I = 1, NNN
J = LIST(I)
LISTN(J) = I
260 CONTINUE
C CONVERT NODE NUMBERS TO NEW NODE ORDER BY REDOING THE NXK ARRAY
DO 280 I = 1, 4
DO 270 K = 1, KKK
J = NXK(I, K)
IF (J .GT. 0) NXK(I, K) = LISTN(J)
270 CONTINUE
280 CONTINUE
IF (NNNBC .GT. 0) THEN
DO 290 I = 1, NNNBC
IF (LSTNBC(I) .GT. 0) THEN
J = LSTNBC(I)
LSTNBC(I) = LISTN(J)
END IF
290 CONTINUE
END IF
C PUT NODE LIST INTO NEW ORDER
CALL NODORD (NPNODE, XN, YN, LISTN, NUID, NNN)
C REBUILD KXN ARRAY
NUMKXN = NNN
DO 310 I = 1, NNXK
DO 300 J = 1, MAXKXN
KXN(I, J) = 0
300 CONTINUE
310 CONTINUE
DO 330 I = 1, 4
DO 320 K = 1, KKK
IF (NXK(I, K) .GT. 0) THEN
CALL KXNADD (MAXKXN, NNXK, KXN, NUMKXN, K, NXK(I, K),
& ERR)
IF (ERR) THEN
CALL MESSAGE('** NUMBERING ABORT **')
KKK = 0
RETURN
END IF
END IF
320 CONTINUE
330 CONTINUE
C PUT ELEMENT NUMBERING INTO NEW ORDER USING LA AS TEMPORARY STORAGE
DO 340 I = 1, KKK
LA(I) = 0
LB(I) = 0
340 CONTINUE
KOUNT = 0
DO 360 I = 1, NNN
CALL GETKXN (NPNODE, MAXKXN, NNXK, KXN, NUID, I, KLIST,
& NUMK, ERR)
DO 350 J = 1, NUMK
IF (LB(KLIST(J)) .EQ. 0) THEN
KOUNT = KOUNT + 1
LA(KOUNT) = KLIST(J)
LB(KLIST(J)) = 1
END IF
350 CONTINUE
360 CONTINUE
C END OF OPTIMIZATION
ELSE
DO 370 I = 1, NNN
NUID(I) = LISTN(I)
370 CONTINUE
END IF
C STICK LSTNBC INTO LISTN AS A WORK ARRAY FOR SORTING NODAL BOUNDARY
C CONDITIONS LISTS
IF (NNNBC .GT. 0) THEN
DO 380 I = 1, NNNBC
LISTN(I) = LSTNBC(I)
380 CONTINUE
C SORT THROUGH LSTNBC AND RECREATE IT IN PLACE
C USING LISTN AS THE ARRAY TO TAKE LSTNBC OVER
C AND IHERE AS A WORK ARRAY
C (LSTNBC NOW BECOMES THE NODES ARRAY FOR THE
C GENESIS DATA BASE)
CALL SRTNBC (MXNFLG, NPNBC, NNN, NNFLG, NNLEN, NNPTR, LSTNBC,
& LISTN, IHERE, NNNBC, NBCNOD, NNLIST)
ELSE
NNLIST = 0
NBCNOD = 0
END IF
C SORT THROUGH LSTSBC AND RECREATE IT IN PLACE
C USING LISTN AS THE ARRAY TO TAKE LSTSBC OVER
C AND KXN AS A WORK ARRAY
C (LSTSBC NOW BECOMES THE NELEMS ARRAY FOR THE
C GENESIS DATA BASE)
IF (NNSBC .GT. 0) THEN
DO 390 I = 1, NNSBC
LISTN(I) = LSTSBC(I)
390 CONTINUE
CALL SRTSBC (MXSFLG, NPSBC, NPELEM, NNXK, NXK, NSFLG, NSLEN,
& NSPTR, NVLEN, NVPTR, LISTN, LSTSBC, NSIDEN, IHERE, NNSBC,
& NSLIST, NVLIST, NBCSID)
ELSE
NBCSID = 0
NSLIST = 0
NVLIST = 0
END IF
C PUT WEIGHTS ON FLAGGED NODES AS NEEDED
C USE THE IHERE ARRAY AS A WORK ARRAY
CALL ADDWT (NNUID, NNXK, MAXKXN, NPNODE, NPELEM, MXLPS, MP, ML,
& MS, NPNBC, NPSBC, MXNFLG, MXSFLG, NPWTS, COOR, ILINE, LTYPE,
& LCON, ISIDE, NLPS, IFLINE, ILLIST, LINKP, LINKL, LINKS, IPBF,
& NPPF, IFPB, LISTPB, IWTPBF, ILBF, NLPF, IFLB, LISTLB, IWTLBF,
& ISBF, NSPF, IFSB, LISTSB, IWTSBF, LINKPB, LINKLB, LINKSB, XN,
& YN, NUID, NXK, KXN, LSTNBC, NNFLG, NNPTR, NNLEN, NSFLG, NVPTR,
& NVLEN, NSIDEN, WTNODE, WTSIDE, WTHOLD, NBCNOD, NNLIST, NBCSID,
& NSLIST, NVLIST, ILIST, XLIST)
C SORT NUMBERS ACCORDING TO MATERIAL TYPE
C USE KXN AS A WORK ARRAY
DO 410 J = 1, 4
DO 400 I = 1, KKK
KXN(J, I) = NXK(J, I)
400 CONTINUE
410 CONTINUE
C SET UP THE MATERIAL MAPPING ARRAY
C MATMAP(1, I) = THE MATERIAL ID FOR THE I'TH BLOCK
C MATMAP(2, I) = THE FIRST ELEMENT IN THE I'TH BLOCK
C MATMAP(3, I) = THE LAST ELEMENT IN THE I'TH BLOCK
KOUNT = 1
DO 440 I = 1, NUMMAT
KMAT = MATMAP(1, I)
MATMAP(2, I) = KOUNT
DO 430 J = 1, KKK
IF (MAT(J) .EQ. KMAT) THEN
LISTN(J) = KOUNT
LIST(KOUNT) = J
DO 420 K = 1, 4
NXK(K, KOUNT) = KXN(K, J)
420 CONTINUE
KOUNT = KOUNT + 1
END IF
430 CONTINUE
MATMAP(3, I) = KOUNT - 1
440 CONTINUE
IF (KOUNT - 1 .NE. KKK) THEN
CALL MESSAGE('ALL ELEMENTS DID NOT HAVE AN ELEMENT ID')
CALL MESSAGE('MESH NUMBERING ABORTED')
KKK = 0
RETURN
END IF
C REDO THE REGION POINTER ARRAY
DO 450 I = 1, NPREGN
IPART(2, I) = LISTN(IPART(2, I))
IPART(3, I) = LISTN(IPART(3, I))
450 CONTINUE
C REDO THE MATERIAL ARRAY
DO 470 I = 1, NUMMAT
DO 460 J = MATMAP(2, I), MATMAP(3, I)
MAT(J) = MATMAP(1, I)
460 CONTINUE
470 CONTINUE
C REDO THE MAPPING ARRAY IF OPTIMIZING RENUMBERING HAS BEEN DONE
IF (OPTIM) THEN
DO 480 I = 1, KKK
LA(I) = LISTN(LA(I))
480 CONTINUE
END IF
C REDO THE ELEMENT SIDE BOUNDARY LISTING WITH THE CURRENT ELEMENT NO.
DO 490 I = 1, NSLIST
LSTSBC(I) = LISTN(LSTSBC(I))
490 CONTINUE
C STORE THE LISTN POINTER SYSTEM FOR NOW
DO 500 I = 1, KKK
LIST(I) = LISTN(I)
500 CONTINUE
C ADD THE MID-SIDE NODES IF EIGHT OR NINE NODE QUADS ARE WANTED
C OR IF THREE NODE BARS ARE WANTED
IF ((EIGHT) .OR. (NINE) .OR. (THREE)) THEN
C FLAG ALL ELEMENT SIDES ONLY ONCE (NO SHARED SIDE FLAGGED)
CALL NXKBDY (NNXK * MAXKXN, NNXK, NPELEM, NXK, KKK, KXN,
& THREE, EIGHT, NINE)
C CREATE THE MIDSIDE NODES
CALL MIDNOD (NPNODE, NNUID, NPELEM, NNXK, MP, ML, KKK, NNN,
& NALL, NL, NXK, NUID, XN, YN, LISTN, COOR, ILINE, LTYPE,
& LCON, LINKP, LINKL, THREE, EIGHT, NINE)
C MODIFY THE IDENTIFIERS OF THE OLD NODES
DO 510 I = 1, NNN
LISTN(I) = I * 100000
510 CONTINUE
NNN = NALL
C ORDER THE EXPANDED NODE LIST
CALL NODORD (NPNODE, XN, YN, LISTN, NUID, NNN)
C EXPAND THE CONNECTIVITY ARRAY TO INCLUDE THE MIDSIDE NODES
C WHILE REPOSITIONING THE CORNER NODES INTO PROPER SEQUENCE
DO 540 I = 1, KKK
IF ((THREE) .AND. (NXK (3, I) .EQ. 0)) THEN
ITSOK = .TRUE.
ELSEIF ((NXK (3, I) .NE. 0) .AND. ((EIGHT) .OR. (NINE)))
& THEN
ITSOK = .TRUE.
ELSE
ITSOK = .FALSE.
ENDIF
IF (ITSOK) THEN
DO 520 J = 4, 1, -1
JJ = J + 1
IF (JJ .EQ. 5) JJ = 1
NODEA = IABS(NXK(J, I))
NODEB = IABS(NXK(JJ, I))
C CHECK FOR 3 NODE BAR ELEMENTS
IF ((NODEA .GT. 0) .AND. (NODEB .GT. 0)) THEN
NXK (J * 2 - 1, I) = NODEA * 100000
NLO = MIN0(NODEA, NODEB)
NHI = MAX0(NODEA, NODEB)
NXK (J * 2, I) = NLO * 100000 + NHI
ELSE IF (NODEA .GT. 0) THEN
NXK (J * 2 - 1, I) = NODEA * 100000
END IF
520 CONTINUE
ELSE
DO 530 J = 1, 4
NXK (J, I) = IABS (NXK (J,I)) * 100000
530 CONTINUE
ENDIF
540 CONTINUE
C GET THE LIST OF NODAL BOUNDARY FLAGS EXTENDED AND THE NEW IDENTIFIERS
C IN PLACE (USE NUID AND WTHOLD AS WORK ARRAYS)
IF (NBCNOD .GT. 0) THEN
KOUNT = 0
DO 570 I = 1, NBCNOD
JEND = NNLEN(I) + NNPTR(I) - 1
DO 560 J = NNPTR(I), JEND
KOUNT = KOUNT + 1
NUID(KOUNT) = LSTNBC(J) * 100000
WTHOLD(KOUNT) = WTNODE(J)
DO 550 K = J + 1, JEND
ILO = MIN0(LSTNBC(J), LSTNBC(K))
IHI = MAX0(LSTNBC(J), LSTNBC(K))
ITRY = (ILO * 100000) + IHI
IF (INDX(NNN, LISTN, ITRY) .GT. 0) THEN
KOUNT = KOUNT + 1
NNLEN(I) = NNLEN(I) + 1
NUID(KOUNT) = ITRY
WTHOLD(KOUNT) = (WTNODE(J) + WTNODE(K)) * .5
END IF
550 CONTINUE
560 CONTINUE
IF (I .NE. 1) NNPTR(I) = NNPTR(I - 1) + NNLEN(I - 1)
570 CONTINUE
NNLIST = KOUNT
DO 580 I = 1, NNLIST
LSTNBC(I) = NUID(I)
WTNODE(I) = WTHOLD(I)
580 CONTINUE
END IF
C GET THE LIST OF SIDE BOUNDARY FLAGS EXTENDED AND THE NEW IDENTIFIERS
C IN PLACE (USE NUID, WTHOLD, AND KXN AS WORK ARRAYS)
IF (NBCSID .GT. 0) THEN
KOUNT = 0
KOUNT2 = 0
DO 600 I = 1, NBCSID
ISTART = NSPTR (I)
IEND = NSPTR (I) + NSLEN (I) - 1
J = NVPTR (I)
JEND = NVPTR (I) + NVLEN (I) - 1
DO 590 II = ISTART, IEND
KELEM = LSTSBC (II)
KOUNT = KOUNT + 1
KXN (1, KOUNT) = KELEM
K = J + 1
KOUNT2 = KOUNT2 + 1
NUID(KOUNT2) = NSIDEN(J) * 100000
WTHOLD(KOUNT2) = WTSIDE(J)
C DO THE ADJUSTMENTS IF THE ELEMENT IS ONE THAT HAS BEEN EXPANDED
IF ( ((THREE) .AND. (NXK (4, KELEM) .EQ. 0)) .OR.
& ( ((EIGHT) .OR. (NINE)) .AND.
& (NXK (4, KELEM) .NE. 0) ) ) THEN
KOUNT = KOUNT + 1
KXN (1, KOUNT) = LSTSBC(II)
NSLEN (I) = NSLEN (I) + 1
ILO = MIN0(NSIDEN(J), NSIDEN(K))
IHI = MAX0(NSIDEN(J), NSIDEN(K))
ITRY = (ILO * 100000) + IHI
KOUNT2 = KOUNT2 + 1
NUID(KOUNT2) = ITRY
WTHOLD(KOUNT2) = (WTSIDE(J) + WTSIDE(K)) * .5
KOUNT2 = KOUNT2 + 1
NUID(KOUNT2) = ITRY
WTHOLD(KOUNT2) = (WTSIDE(J) + WTSIDE(K)) * .5
NVLEN(I) = NVLEN(I) + 2
ENDIF
KOUNT2 = KOUNT2 + 1
NUID(KOUNT2) = NSIDEN(K) * 100000
WTHOLD(KOUNT2) = WTSIDE(K)
J = J + 2
590 CONTINUE
IF (I .GT. 1) THEN
NSPTR(I) = NSPTR(I - 1) + NSLEN(I - 1)
NVPTR(I) = NVPTR(I - 1) + NVLEN(I - 1)
ENDIF
600 CONTINUE
C TRANSFER THE ELEMENT BOUNDARIES BACK FROM THE WORK ARRAYS
NSLIST = KOUNT
DO 610 I = 1, NSLIST
LSTSBC(I) = KXN(1, I)
610 CONTINUE
NVLIST = KOUNT2
DO 620 I = 1, NVLIST
NSIDEN(I) = NUID(I)
WTSIDE(I) = WTHOLD(I)
620 CONTINUE
END IF
C ADD A CENTER NODE TO THE NODE LIST IF NEEDED
IF (NINE) THEN
NOLD = NNN
DO 630 I = 1, KKK
C WATCH OUT FOR 3 NODE BAR ELEMENTS
IF (.NOT. ISBARS .OR. NXK(4, I) .GT. 0) THEN
N2 = INDX(NOLD, LISTN, NXK(2, I))
N4 = INDX(NOLD, LISTN, NXK(4, I))
N6 = INDX(NOLD, LISTN, NXK(6, I))
N8 = INDX(NOLD, LISTN, NXK(8, I))
IF ((N2 .EQ. 0) .OR. (N4 .EQ. 0) .OR.
& (N6 .EQ. 0) .OR. (N8 .EQ. 0)) THEN
CALL MESSAGE('BAD LINK IN RENUM AT 8 NODE LIST')
CALL MESSAGE('NO MESH SAVED')
KKK = 0
RETURN
END IF
DIST1 = SQRT((XN(N2) - XN(N6)) **2
& + (YN(N2) - YN(N6)) **2)
DIST2 = SQRT((XN(N8) - XN(N4)) **2
& + (YN(N8) - YN(N4)) **2)
NNN = NNN + 1
IF (DIST1 .LT. DIST2) THEN
XN(NNN) = .5 * (XN(N2) + XN(N6))
YN(NNN) = .5 * (YN(N2) + YN(N6))
ELSE
XN(NNN) = .5 * (XN(N4) + XN(N8))
YN(NNN) = .5 * (YN(N4) + YN(N8))
END IF
LISTN(NNN) = INT((MIN0(NXK(1, I), NXK(5, I))) +
& (MAX0(NXK(1, I), NXK(5, I)) * .0001))
NXK(9, I) = LISTN(NNN)
ELSE
write (*,*) 'Element ', i, ' is a 3-node bar?'
END IF
630 CONTINUE
C NOW, ORDER THE EXPANDED NODE LIST AGAIN
CALL NODORD (NPNODE, XN, YN, LISTN, NUID, NNN)
IEND = 9
ELSEIF (EIGHT) THEN
IEND = 8
ELSE
IEND = 4
END IF
C NOW REPLACE THE NODE REFERENCES WITH AN EXPANDED ORDER NUMBER
C FIRST FIX THE CONNECTIVITY (NXK ARRAY)
DO 650 I = 1, IEND
DO 640 K = 1, KKK
C AGAIN, WATCH OUT FOR 3 NODE BAR ELEMENTS
IF (.NOT. ISBARS .OR. NXK(I, K) .GT. 0) THEN
NEW = INDX(NNN, LISTN, NXK(I, K))
IF (NEW .EQ. 0) THEN
CALL MESSAGE('BAD LINK IN RENUM 8 NODE LIST')
CALL MESSAGE('NO MESH SAVED')
KKK = 0
RETURN
END IF
NXK(I, K) = NEW
END IF
640 CONTINUE
650 CONTINUE
C NOW FIX THE NODE BOUNDARY FLAGS
IF (NBCNOD .GT. 0) THEN
DO 660 I = 1, NNLIST
NEW = INDX(NNN, LISTN, LSTNBC(I))
IF (NEW .EQ. 0) THEN
CALL MESSAGE('BAD LINK IN RENUM AT 8 NODE NBC')
CALL MESSAGE('NO MESH SAVED')
KKK = 0
RETURN
END IF
LSTNBC(I) = NEW
660 CONTINUE
END IF
C NOW FIX THE SIDE BOUNDARY FLAGS
IF (NBCSID .GT. 0) THEN
DO 670 I = 1, NVLIST
NEW = INDX(NNN, LISTN, NSIDEN(I))
IF (NEW .EQ. 0) THEN
CALL MESSAGE('BAD LINK IN RENUM AT 8 NODE SBC')
CALL MESSAGE('NO MESH SAVED')
KKK = 0
RETURN
END IF
NSIDEN(I) = NEW
670 CONTINUE
END IF
END IF
C RENUMBERING COMPLETED
CALL MESSAGE(' ')
CALL MESSAGE('**************************************************')
CALL MESSAGE('** MESH PROCESSING COMPLETED **')
IF (ISBARS .AND. NINE) THEN
CALL MESSAGE('** THREE NODE BARS OUTPUT '//
& ' **')
ENDIF
IF (NINE) THEN
CALL MESSAGE('** NINE NODE QUADS OUTPUT '//
& ' **')
ELSE IF (EIGHT) THEN
CALL MESSAGE('** EIGHT NODE QUADS OUTPUT '//
& ' **')
END IF
IF (OPTIM) THEN
CALL MESSAGE
& ('** WITH NODE AND ELEMENT NUMBERING OPTIMIZED **')
C FIND LARGEST NODE DIFFERENCE FOR AN ELEMENT
LWID = 0
DO 680 K = 1, KKK
N1 = NXK(1, K)
N2 = NXK(2, K)
N3 = NXK(3, K)
N4 = NXK(4, K)
IF ((N4 .GT. 0) .AND. ((EIGHT) .OR. (NINE))) THEN
N5 = NXK(5, K)
N6 = NXK(6, K)
N7 = NXK(7, K)
N8 = NXK(8, K)
IF (NINE) THEN
N9 = NXK(9, K)
NLO = MIN0(N1, N2, N3, N4, N5, N6, N7, N8, N9)
NHI = MAX0(N1, N2, N3, N4, N5, N6, N7, N8, N9)
ELSE
NLO = MIN0(N1, N2, N3, N4, N5, N6, N7, N8)
NHI = MAX0(N1, N2, N3, N4, N5, N6, N7, N8)
END IF
ELSE
IF (N3 .LE. 0) N3 = N1
IF (N4 .LE. 0) N4 = N2
NLO = MIN0(N1, N2, N3, N4)
NHI = MAX0(N1, N2, N3, N4)
END IF
LWID = MAX0(LWID, NHI - NLO)
680 CONTINUE
WRITE(*, 10000) LWID
END IF
WRITE(*, 10010) NNN, KKK, NUMMAT
CALL MESSAGE('**************************************************')
C RESTORE THE NUID ARRAY AS A POINTER ARRAY OF OLD TO NEW ELEMENTS
C (MAPDXG ARRAY)
IF (OPTIM) THEN
DO 690 I = 1, KKK
NUID(I) = LA(I)
LIST(NUID(I)) = I
690 CONTINUE
ELSE
DO 700 I = 1, KKK
NUID(I) = I
LIST(I) = I
700 CONTINUE
END IF
RETURN
10000 FORMAT(' ** LARGEST NODE DIFFERENCE PER ELEMENT:', I6, ' **')
10010 FORMAT(' ** NODES:', I6, '; ELEMENTS:', I6, '; MATERIALS:', I3,
& ' **')
END