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.
 
 
 
 
 
 

135 lines
4.1 KiB

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 QUAL2N (MXND, MXCORN, MLN, NCORN, LCORN, LNODES, ICOMB,
& BNSIZE, ANGLE, LXN, ITEST, LTEST, QUAL, POSBL2, POSBL3, ROWCHN,
& SIDPIN, ISTART, IEND, IPINCH, NPINCH, ERR)
C***********************************************************************
C SUBROTINE QUAL2 = CHECKS THE QUALITY OF A SEMICIRCLE INTERPRETATION
C***********************************************************************
DIMENSION LNODES (MLN, MXND), ANGLE (MXND), LCORN (MXCORN)
DIMENSION BNSIZE (2, MXND), IPINCH(4)
DIMENSION ICOMB (MXCORN), ITEST (2), LTEST (2), LXN (4, MXND)
LOGICAL ERR, POSBL2, POSBL3, ROWCHN, SHRUNK, SIDPIN
REAL NICKS, NICKC
ERR = .FALSE.
C ... See note below regarding bug...
ISTEP = 0
C ASSUME PERFECT QUALITY
QUAL = 0.
POSBL2 = .FALSE.
POSBL3 = .FALSE.
ROWCHN = .FALSE.
SIDPIN = .FALSE.
C FIRST GET THE INTERVAL LENGTHS TO THE CHOSEN CORNERS
ILEN = 2
CALL SPACED (MXND, MXCORN, MLN, ILEN, NCORN, LCORN, LNODES, ICOMB,
& ITEST, LTEST, ERR)
IF (ERR) GOTO 130
C SEE IF A SEMICIRCLE INTERPRETATION IS POSSIBLE WITH
C THESE INTERVALS
IF ( (LTEST(1) .GE. 2) .AND. (LTEST(2) .GE. 2) ) THEN
POSBL2 = .TRUE.
ENDIF
C NOT ADD UP THE NICKS FOR BAD ANGLES
DO 100 I =1, NCORN
NODE = LCORN (I)
IF (ICOMB (I) .EQ. 1) THEN
QUAL = QUAL + NICKC (ANGLE (NODE), LXN (1, NODE))
ELSE
QUAL = QUAL + NICKS (ANGLE (NODE), LXN (1, NODE))
ENDIF
100 CONTINUE
C NOW SEE IF A TRIANGLE INTERPRETATION IS WARRANTED
IF (LTEST (1) .GT. LTEST (2)) THEN
I1 = ITEST (1)
L1 = LTEST (1)
I2 = ITEST (2)
L2 = LTEST (2)
ELSE
I1 = ITEST (2)
L1 = LTEST (2)
I2 = ITEST (1)
L2 = LTEST (1)
ENDIF
LDIF = (L1 - L2) / 2
IF (LDIF .GT. L1 / 2) LDIF = L1 - LDIF
C THIS TESTS THE FORCED RETANGLE - THE TWO NEW ROWS MUST BE
C ENDED AT CURRENT SIDE NODES
IF (L1 .EQ. L2) THEN
NCHG1 = JUMPLP (MXND, MLN, LNODES, I1, L1 / 2)
NCHG2 = JUMPLP (MXND, MLN, LNODES, I2, L1 / 2)
IF ( (SHRUNK (BNSIZE (2, NCHG1), LNODES(8, NCHG1))) .OR.
& (SHRUNK (BNSIZE (2, NCHG2), LNODES(8, NCHG2))) ) THEN
IF (NPINCH .EQ. 0) THEN
SIDPIN = .TRUE.
POSBL2 = .TRUE.
IPINCH(1) = NCHG1
IPINCH(2) = NCHG2
NPINCH = 2
ISTART = I1
ENDIF
ENDIF
C SEE IF THE ROW NEEDS ADJUSTED SO THAT A RECTANGLE REMAINS POSSIBLE
C WITH A SIGNIFICANTLY REDUCED ELEMENT SIZE ON THE LONG SIDE
ELSE
C ... There is a bug here since ISTEP is not defined
C Since it has been 'kindof' working for several years,
C we assume that ISTEP=0 will work the first time through
C and we add that initialization to the beginning of this routine
NCHG1 = JUMPLP (MXND, MLN, LNODES, I1, ISTEP)
NCHG2 = JUMPLP (MXND, MLN, LNODES, I1, L1 - ISTEP)
IF ( (SHRUNK (BNSIZE (2, NCHG1), LNODES(8, NCHG1))) .AND.
& (SHRUNK (BNSIZE (2, NCHG2), LNODES(8, NCHG2))) ) THEN
ROWCHN = .TRUE.
ISTART = I2
IEND = I1
C CHECK THE SIZE REDUCTIONS AND TRIANGLE INTERPRETATION
ELSE
DO 110 ISTEP = LDIF + 1, L1 / 2 - 1
NCHG1 = JUMPLP (MXND, MLN, LNODES, I1, ISTEP)
NCHG2 = JUMPLP (MXND, MLN, LNODES, I1, L1 - ISTEP)
IF ( (SHRUNK (BNSIZE (2, NCHG1), LNODES(8, NCHG1))) .AND.
& (SHRUNK (BNSIZE (2, NCHG2), LNODES(8, NCHG2))) ) THEN
ROWCHN = .TRUE.
ISTART = I2
IEND = I1
GOTO 120
ENDIF
110 CONTINUE
120 CONTINUE
ENDIF
ENDIF
130 CONTINUE
RETURN
END