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.

238 lines
8.1 KiB

2 years ago
C Copyright(C) 1999-2021 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 LONGEL (MXND, MLN, LNODES, XN, YN, NUID, LXK, KXL, NXL,
& LXN, NNN, NAVAIL, IAVAIL, NODE, KELEM, ANG, TOLER,
& N1, N2, KREG, XMIN, XMAX, YMIN, YMAX, KKK, LLL, DONE, GRAPH,
& VIDEO, NOROOM, ERR, KKKADD)
C***********************************************************************
C SUBROUTINE LONGEL = AN ELONGATED ELEMENT OVER 150 DEGREES GETS A
C 3 ELEMENT REPLACEMENT FOR THE TWO ELEMENTS THERE
C***********************************************************************
DIMENSION LXK(4, MXND), NXL(2, 3*MXND), KXL(2, 3*MXND)
DIMENSION LXN(4, MXND), XN(MXND), YN(MXND), NUID(MXND)
DIMENSION LNODES (MLN, MXND)
DIMENSION NODES(4)
LOGICAL NOROOM, ERR, DONE, GRAPH, CCW, VIDEO
CCW = .TRUE.
C SEE IF THE ANGLE IS WITHIN BOUNDS
IF (ANG .GT. TOLER) THEN
CALL GNXKA (MXND, XN, YN, KELEM, NODES, AREA, LXK, NXL, CCW)
NODE2 = NODES(1) + NODES(2) + NODES(3) + NODES(4) - NODE
& - N1 - N2
D12 = SQRT ( ((XN (NODE2) - XN (N1)) ** 2) +
& ((YN (NODE2) - YN (N1)) ** 2) )
D22 = SQRT ( ((XN (NODE2) - XN (N2)) ** 2) +
& ((YN (NODE2) - YN (N2)) ** 2) )
DN1 = SQRT ( ((XN (NODE) - XN (N1)) ** 2) +
& ((YN (NODE) - YN (N1)) ** 2) )
DN2 = SQRT ( ((XN (NODE) - XN (N2)) ** 2) +
& ((YN (NODE) - YN (N2)) ** 2) )
DMIN = ((DN1 + DN2) * .5) * 1.7
DMAX = (DN1 + DN2) * .5
C SEE IF IT IS A LONG LEGGED BEAST
IF ((D12 .GT. DMIN) .OR. (D22 .GT. DMIN)) THEN
C FIND L1, L2, L3, AND L4
DO 100 I = 1, 4
LTEST = LXK (I, KELEM)
IF ( ((NXL (1, LTEST) .EQ. NODE) .AND.
& (NXL (2, LTEST) .EQ. N1)) .OR.
& ((NXL (2, LTEST) .EQ. NODE) .AND.
& (NXL (1, LTEST) .EQ. N1)) ) THEN
L1 = LTEST
GOTO 110
ENDIF
100 CONTINUE
CALL MESSAGE('** PROBLEMS IN LONGEL FINDING L1 **')
ERR = .TRUE.
GOTO 250
110 CONTINUE
DO 120 I = 1, 4
LTEST = LXK (I, KELEM)
IF ( ((NXL (1, LTEST) .EQ. NODE) .AND.
& (NXL (2, LTEST) .EQ. N2)) .OR.
& ((NXL (2, LTEST) .EQ. NODE) .AND.
& (NXL (1, LTEST) .EQ. N2)) ) THEN
L2 = LTEST
GOTO 130
ENDIF
120 CONTINUE
CALL MESSAGE('** PROBLEMS IN LONGEL FINDING L2 **')
ERR = .TRUE.
GOTO 250
130 CONTINUE
DO 140 I = 1, 4
LTEST = LXK (I, KELEM)
IF ( ((NXL (1, LTEST) .EQ. NODE2) .AND.
& (NXL (2, LTEST) .EQ. N1)) .OR.
& ((NXL (2, LTEST) .EQ. NODE2) .AND.
& (NXL (1, LTEST) .EQ. N1)) ) THEN
IF (D12 .GT. D22) THEN
L4 = LTEST
ELSE
L3 = LTEST
ENDIF
GOTO 150
ENDIF
140 CONTINUE
CALL MESSAGE('** PROBLEMS IN LONGEL FINDING L4/L3 **')
ERR = .TRUE.
GOTO 250
150 CONTINUE
DO 160 I = 1, 4
LTEST = LXK (I, KELEM)
IF ( ((NXL (1, LTEST) .EQ. NODE2) .AND.
& (NXL (2, LTEST) .EQ. N2)) .OR.
& ((NXL (2, LTEST) .EQ. NODE2) .AND.
& (NXL (1, LTEST) .EQ. N2)) ) THEN
IF (D12 .GT. D22) THEN
L3 = LTEST
ELSE
L4 = LTEST
ENDIF
GOTO 170
ENDIF
160 CONTINUE
CALL MESSAGE('** PROBLEMS IN LONGEL FINDING L3/L4 **')
ERR = .TRUE.
GOTO 250
170 CONTINUE
C NOW FIND KELEM2
KELEM2 = KXL (1, L4) + KXL (2, L4) - KELEM
IF (KELEM2 .EQ. 0) GOTO 250
C NOW FIND NODE3 - THE NODE THAT WILL BE PART OF THE NEWLY
C FORMED ELEMENT
CALL GNXKA (MXND, XN, YN, KELEM2, NODES, AREA,
& LXK, NXL, CCW)
IF (D12 .GT. D22) THEN
DO 180 I = 1, 4
IF (NODES (I) .EQ. N1) THEN
IF (I .EQ. 1) THEN
NODE3 = NODES (4)
ELSE
NODE3 = NODES (I - 1)
ENDIF
GOTO 190
ENDIF
180 CONTINUE
CALL MESSAGE('**PROBLEMS IN LONGEL FINDING NODE3/D11**')
ERR = .TRUE.
GOTO 250
190 CONTINUE
ELSE
DO 200 I = 1, 4
IF (NODES (I) .EQ. N2) THEN
IF (I .EQ. 4) THEN
NODE3 = NODES (1)
ELSE
NODE3 = NODES (I + 1)
ENDIF
GOTO 210
ENDIF
200 CONTINUE
CALL MESSAGE('**PROBLEMS IN LONGEL FINDING NODE3/D11**')
ERR = .TRUE.
GOTO 250
210 CONTINUE
ENDIF
C NOW FIND L5
DO 220 I = 1, 4
LTEST = LXK (I, KELEM2)
IF (D12 .GT. D22) THEN
IF ( ( (NXL (1, LTEST) .EQ. NODE3) .AND.
& (NXL (2, LTEST) .EQ. N1) ) .OR.
& ( (NXL (1, LTEST) .EQ. N1) .AND.
& (NXL (2, LTEST) .EQ. NODE3) ) ) THEN
L5 = LTEST
GOTO 230
ENDIF
ELSE
IF ( ( (NXL (1, LTEST) .EQ. NODE3) .AND.
& (NXL (2, LTEST) .EQ. N2) ) .OR.
& ( (NXL (1, LTEST) .EQ. N2) .AND.
& (NXL (2, LTEST) .EQ. NODE3) ) ) THEN
L5 = LTEST
GOTO 230
ENDIF
ENDIF
220 CONTINUE
CALL MESSAGE('** PROBLEMS IN LONGEL FINDING L5 **')
ERR = .TRUE.
GOTO 250
230 CONTINUE
C NOW CHECK TO SEE IF IT MAKES SENSE TO ADD THE EXTRA ELEMENT TO
C IMPROVE AN ELONGATED ONE
DL3 = SQRT ( ((XN (NXL (1, L3)) - XN (NXL (2, L3))) ** 2) +
& ((YN (NXL (1, L3)) - YN (NXL (2, L3))) ** 2) )
DL4 = SQRT ( ((XN (NXL (1, L4)) - XN (NXL (2, L4))) ** 2) +
& ((YN (NXL (1, L4)) - YN (NXL (2, L4))) ** 2) )
DL5 = SQRT ( ((XN (NXL (1, L5)) - XN (NXL (2, L5))) ** 2) +
& ((YN (NXL (1, L5)) - YN (NXL (2, L5))) ** 2) )
IF ((DL3 .GT. DMAX) .OR. (DL5 .GT. DL4)) GOTO 250
C ADD THE EXTRA ELEMENT
IF (GRAPH) THEN
CALL LCOLOR ('PINK ')
DO 240 IL = 1, 4
IL1 = NXL (1, LXK (IL, KELEM))
IL2 = NXL (2, LXK (IL, KELEM))
CALL D2NODE (MXND, XN, YN, IL1, IL2)
IL1 = NXL (1, LXK (IL, KELEM2))
IL2 = NXL (2, LXK (IL, KELEM2))
CALL D2NODE (MXND, XN, YN, IL1, IL2)
240 CONTINUE
CALL LCOLOR ('WHITE')
CALL SFLUSH
ENDIF
IF ((D12 .GT. D22) .AND. (LXN (4, N1) .NE. 0)) THEN
CALL UNDELM (MXND, MLN, LNODES, XN, YN, NUID, LXK, KXL,
& NXL, LXN, NNN, LLL, KKK, NAVAIL, IAVAIL, NODE2, NODE3,
& N1, NODE, L5, L1, L4, KELEM, KELEM2, NOROOM, ERR,
& GRAPH, VIDEO)
IF ((ERR) .OR. (DONE)) GOTO 250
DONE = .TRUE.
ELSEIF (LXN (4, N2) .NE. 0) THEN
CALL UNDELM (MXND, MLN, LNODES, XN, YN, NUID, LXK, KXL,
& NXL, LXN, NNN, LLL, KKK, NAVAIL, IAVAIL, NODE2, NODE,
& N2, NODE3, L2, L5, L4, KELEM2, KELEM, NOROOM, ERR,
& GRAPH, VIDEO)
IF ((ERR) .OR. (DONE)) GOTO 250
DONE = .TRUE.
ENDIF
KKKADD = KKK
ENDIF
ENDIF
250 CONTINUE
RETURN
END