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.

273 lines
10 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 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***********************************************************************
C SUBROUTINE ADDWT = ADDS THE WEIGHTING FACTORS TO ANY NODES WITH
C FLAGS CONTAINING WEIGHTS
C***********************************************************************
C SUBROUTINE CALLED BY:
C RENUM = NUMBERS QMESH OUTPUT, AND RENUMBERS AS NEEDED FOR
C OPTIMIZATION
C***********************************************************************
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)
DIMENSION IPBF (MP), NPPF (MP), IFPB (MP), LISTPB (2, MP),
& IWTPBF (3, MP)
DIMENSION ILBF (ML), NLPF (ML), IFLB (ML), LISTLB (2, ML),
& IWTLBF (3, ML)
DIMENSION ISBF (ML), NSPF (ML), IFSB (ML), LISTSB (2, ML),
& IWTSBF (3, ML)
DIMENSION LINKPB (2, MP), LINKLB (2, ML), LINKSB (2, ML)
DIMENSION NUID (NNUID), NXK (NNXK, NPELEM), KXN (NNXK, MAXKXN)
DIMENSION XN (NPNODE), YN (NPNODE), ILIST (MXLPS), XLIST (MXLPS)
DIMENSION LSTNBC (NPNBC), NSIDEN (NPSBC), WTHOLD (NPWTS)
DIMENSION NNFLG (MXNFLG), NNLEN (MXNFLG), NNPTR (MXNFLG),
& WTNODE (NPNBC)
DIMENSION NSFLG (MXSFLG), NVLEN (MXSFLG), NVPTR (MXSFLG),
& WTSIDE (NPSBC)
LOGICAL ADDLNK, ERR, ISPNT
ADDLNK = .FALSE.
IPNTR = 0
C FIRST FLAG ALL WEIGHT ARRAYS TO -1.0 TO KNOW WHICH REMAIN DEFAULTED
DO 100 I = 1, NNLIST
WTNODE (I) = -1.0
WTHOLD (I) = -1.0
100 CONTINUE
DO 110 I = 1, NVLIST
WTSIDE (I) = -1.0
110 CONTINUE
C NOW CHECK ALL POINT FLAGS FOR WEIGHTS AND APPLY THE POINT
C Y VALUE AS THE WEIGHT FOR THE NODE AT THE BEGINNING POINT
ISPNT = .TRUE.
DO 120 I = 1, NBCNOD
CALL LTSORT (MP, LINKPB, NNFLG (I), IPNTR, ADDLNK)
IF (IPNTR .GT. 0) THEN
IF (IWTPBF (1, IPNTR) .GT. 0) THEN
IPOINT = IWTPBF (1, IPNTR)
JPOINT = IWTPBF (2, IPNTR)
CALL CHKWT (MP, ML, MS, NNLIST, NBCNOD, NNUID, MXLPS,
& LINKP, LINKL, LINKS, NUID, NNFLG, NNLEN, NNPTR,
& LSTNBC, IPBF (IPNTR), LTYPE, LCON, NLPS, IFLINE,
& ILLIST, COOR, JPOINT, IPOINT, ILOC, JLOC, NIX, ILIST,
& XLIST, ADDLNK, ISPNT, ERR)
IF (ERR) THEN
WTNODE (JLOC) = 1.0
ELSE
CALL LTSORT (MP, LINKP, IPOINT, IPNTR, ADDLNK)
WTNODE (JLOC) = COOR (2, IPNTR)
WTHOLD (JLOC) = 1.
ENDIF
ENDIF
ENDIF
120 CONTINUE
ISPNT = .FALSE.
C NOW CHECK ALL LINE FLAGS FOR WEIGHTS AND APPLY THE APPROPRIATE
C WEIGHT ALL ALONG CONTINUOUS NODES ON THE BOUNDARY.
DO 160 I = 1, NBCNOD
CALL LTSORT (ML, LINKLB, NNFLG (I), IPNTR, ADDLNK)
IF (IPNTR .GT. 0) THEN
IF (IWTLBF (1, IPNTR) .NE. 0) THEN
WRITE (*, 10000)NNFLG (I)
JSIDE = IWTLBF (1, IPNTR)
JPOINT = IWTLBF (2, IPNTR)
CALL CHKWT (MP, ML, MS, NNLIST, NBCNOD, NNUID, MXLPS,
& LINKP, LINKL, LINKS, NUID, NNFLG, NNLEN, NNPTR,
& LSTNBC, ILBF (IPNTR), LTYPE, LCON, NLPS, IFLINE,
& ILLIST, COOR, JPOINT, JSIDE, ILOC, JLOC, NIX, ILIST,
& XLIST, ADDLNK, ISPNT, ERR)
IF (.NOT.ERR) THEN
C LOOP UNTIL ALL THE NODES HAVE BEEN FOUND,
C FIRST PUTTING THE ACCUMULATED LENGTH IN THE WTNODE ARRAY
NEWNOD = 0
ACCLEN = 0.
NODE = LSTNBC (JLOC)
IF (IWTLBF (3, IPNTR) .NE. 0) THEN
LINE1 = IWTLBF (3, IPNTR)
ELSE
LINE1 = LISTLB (1, IFLB (IPNTR))
ENDIF
130 CONTINUE
WTNODE (JLOC) = ACCLEN
CALL BFNODE (NNLEN (ILOC), NNXK, NPNODE, NPELEM,
& MAXKXN, NNUID, NODE, NEWNOD, LSTNBC (NNPTR (ILOC)),
& KXN, NXK, NUID, JLOC, LINE1, ERR)
IF (ERR) THEN
WRITE (*, 10010)NNFLG (IPNTR)
GOTO 150
ENDIF
JLOC = JLOC+NNPTR (ILOC)-1
IF (NEWNOD .GT. 0) THEN
ACCLEN = ACCLEN+SQRT (( (XN (NODE)-XN (NEWNOD))
& ** 2) + ((YN (NODE)-YN (NEWNOD)) ** 2))
NUID (NODE) = -ABS (NUID (NODE))
NODE = NEWNOD
NEWNOD = 0
GOTO 130
ENDIF
C NOW CHANGE THE ACCUMULATED LENGTH TO A PERCENTAGE LENGTH
C AND GET THE WEIGHTING FUNCTION
DO 140 J = NNPTR (ILOC), NNPTR (ILOC)+NNLEN (ILOC)-1
IF ((WTNODE (J) .GE. 0.).AND. (ACCLEN .NE. 0.))
& THEN
WTHOLD (J) = 1.
WTNODE (J) = WTNODE (J)/ACCLEN
CALL GETWT (MP, ML, MXLPS, NIX, ILIST, XLIST,
& ILINE, LCON, LTYPE, COOR, LINKP, WTNODE (J),
& ADDLNK, ERR)
IF (ERR)GOTO 150
ENDIF
140 CONTINUE
ENDIF
ENDIF
ENDIF
150 CONTINUE
160 CONTINUE
C NOW RESET NUIDS AND PUT ALL DEFAULTS TO 1.0
DO 170 I = 1, NNLIST
NUID (LSTNBC (I)) = ABS (NUID (LSTNBC (I)))
IF (WTHOLD (I) .LT. 0.)WTNODE (I) = 1.0
170 CONTINUE
C NOW CHECK ALL SIDE FLAGS FOR WEIGHTS AND APPLY THE APPROPRIATE
C WEIGHT ALL ALONG CONTINUOUS NODES ON THE BOUNDARY.
DO 260 I = 1, NBCSID
CALL LTSORT (MP, LINKSB, NSFLG (I), IPNTR, ADDLNK)
IF (IPNTR .GT. 0) THEN
IF (IWTSBF (1, IPNTR) .NE. 0) THEN
WRITE (*, 10020)NSFLG (I)
JSIDE = IWTSBF (1, IPNTR)
JPOINT = IWTSBF (2, IPNTR)
CALL CHKWT (MP, ML, MS, NVLIST, NBCSID, NNUID, MXLPS,
& LINKP, LINKL, LINKS, NUID, NSFLG, NVLEN, NVPTR,
& NSIDEN, ISBF (IPNTR), LTYPE, LCON, NLPS, IFLINE,
& ILLIST, COOR, JPOINT, JSIDE, ILOC, JLOC, NIX, ILIST,
& XLIST, ADDLNK, ISPNT, ERR)
IF (ERR) THEN
DO 180 J = NVPTR (IPNTR), NVPTR (IPNTR) +
& NVLEN (IPNTR) + 1
WTSIDE (J) = 1.0
180 CONTINUE
ELSE
C LOOP UNTIL ALL THE NODES HAVE BEEN FOUND,
C FIRST PUTTING THE ACCUMULATED LENGTH IN THE WTSIDE ARRAY
NEWNOD = 0
J1 = NVPTR (ILOC)
J2 = NVPTR (ILOC)+NVLEN (ILOC)-1
ACCLEN = 0.
NODE = NSIDEN (JLOC)
IF (IWTSBF (3, IPNTR) .NE. 0) THEN
LINE1 = IWTSBF (3, IPNTR)
ELSE
LINE1 = LISTLB (1, IFSB (IPNTR))
ENDIF
190 CONTINUE
C PUT THIS ACCLEN FOR ALL OCCURRENCES OF NODE IN THE LIST
DO 200 J = J1, J2
IF (NSIDEN (J) .EQ. NODE)WTSIDE (J) = ACCLEN
200 CONTINUE
CALL BFNODE (NVLEN (ILOC), NNXK, NPNODE, NPELEM,
& MAXKXN, NNUID, NODE, NEWNOD, NSIDEN (NVPTR (ILOC)),
& KXN, NXK, NUID, JLOC, LINE1, ERR)
IF (ERR) THEN
DO 210 J = NVPTR (IPNTR), NVPTR (IPNTR) +
& NVLEN (IPNTR)+1
WTSIDE (J) = 1.0
210 CONTINUE
WRITE (*, 10030)NSFLG (IPNTR)
GOTO 250
ENDIF
JLOC = JLOC+NNPTR (ILOC)-1
IF (NEWNOD .GT. 0) THEN
ACCLEN = ACCLEN + SQRT (( (XN (NODE)-XN (NEWNOD))
& ** 2) + ((YN (NODE)-YN (NEWNOD)) ** 2))
NUID (NODE) = -ABS (NUID (NODE))
NODE = NEWNOD
NEWNOD = 0
GOTO 190
ENDIF
C NOW CHANGE THE ACCUMULATED LENGTH TO A PERCENTAGE LENGTH
C AND GET THE WEIGHTING FUNCTION
DO 220 J = NVPTR (ILOC), NVPTR (ILOC)+NVLEN (ILOC)-1
IF ((WTSIDE (J) .GE. 0.).AND. (ACCLEN .NE. 0.))
& THEN
WTSIDE (J) = WTSIDE (J)/ACCLEN
CALL GETWT (MP, ML, MXLPS, NIX, ILIST, XLIST,
& ILINE, LCON, LTYPE, COOR, LINKP, WTSIDE (J),
& ADDLNK, ERR)
IF (ERR)GOTO 250
ELSE
WTSIDE (J) = 0.
ENDIF
220 CONTINUE
C NOW RESET NUIDS FROM THIS SIDE SET
DO 230 JI = 1, NVLIST
NUID (NSIDEN (JI)) = ABS (NUID (NSIDEN (JI)))
230 CONTINUE
ENDIF
ELSE
DO 240 J = NVPTR (I), NVPTR (I)+NVLEN (I)+1
WTSIDE (J) = 1.0
240 CONTINUE
ENDIF
ENDIF
250 CONTINUE
260 CONTINUE
C NOW RESET NUIDS
DO 270 I = 1, NVLIST
NUID (NSIDEN (I)) = ABS (NUID (NSIDEN (I)))
270 CONTINUE
RETURN
10000 FORMAT (/, ' WEIGHTING BEGUN FOR NODAL FLAG', I5)
10010 FORMAT (' NO WEIGHTING POSSIBLE FOR NODAL FLAG', I5)
10020 FORMAT (/, ' WEIGHTING BEGUN FOR ELEMENT FLAG', I5)
10030 FORMAT (' NO WEIGHTING POSSIBLE FOR ELEMENT FLAG', I5)
END