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.

71 lines
2.4 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 ARELAX (MXND, XN, YN, LXK, KXL, NXL, LLL, ARFACT)
C***********************************************************************
C SUBROUTINE ARELAX = CALCULATES UNDER - RELAXATION FACTOR FOR AREA PULL
C AND LAPLACIAN SMOOTHER
C***********************************************************************
C NOTE:
C THE AREA PULL AND LAPLACIAN SMOOTHER WILL OVER - CORRECT
C AND BECOME UNSTABLE WHEN TYPICAL MESH ELEMENTS ARE MUCH
C LONGER THAN THEY ARE WIDE, SAY BY A FACTOR OF SIX OR MORE.
C THIS ROUTINE COMPUTES AN APPROPRIATE UNDER - RELAXATION
C FACTOR TO BE USED TO HELP CORRECT THIS PROBLEM. ON REGIONS
C WHICH HAVE GENERALLY NEAR SQUARE ELEMENTS WITH A SMALL
C PERCENTAGE OF VERY LONG THIN ELEMENTS THIS FACTOR WILL
C PROBABLY NOT ADEQUATELY HANDLE THE DIFFICULTY. IN SUCH
C SITUATIONS AN ALTERNATE SMOOTHER (SUCH AS THE CENTROID - AREA -
C PULL) SHOULD BE USED.
C THE FACTOR RETURNED BY THIS ROUTINE MAY BE LARGER THAN ONE,
C WHICH MEANS THAT OVER - RELAXATION IS APPROPRIATE.
C***********************************************************************
DIMENSION NODES (4), LXK (4, MXND), KXL (2, 3 * MXND)
DIMENSION NXL (2, 3 * MXND)
DIMENSION XN (MXND), YN (MXND)
LOGICAL CCW
ARFACT = 1.0
RATSUM = 0.
NUM = 0
DO 100 MYL = 1, LLL
C SKIP BOUNDARY LINES
IF (KXL(1, myL) .gt. 0 .and. KXL (2, myL) .GT. 0) THEN
CCW = .TRUE.
CALL GNXKA (MXND, XN, YN, KXL (1, MYL), NODES, AREA1, LXK,
& NXL, CCW)
CALL GNXKA (MXND, XN, YN, KXL (2, MYL), NODES, AREA2, LXK,
& NXL, CCW)
N1 = NXL (1, MYL)
N2 = NXL (2, MYL)
DXDY = (XN (N2) - XN (N1)) **2 + (YN (N2) - YN (N1)) **2
IF (AREA1 + AREA2 .GT. 0) THEN
RATIO = 2.0 * DXDY / (AREA1 + AREA2)
IF (RATIO .GE. 0.99) THEN
NUM = NUM + 1
RATSUM = RATSUM + RATIO
ENDIF
ENDIF
ENDIF
100 CONTINUE
IF (NUM .LE. 0) RETURN
ASPECT = RATSUM / DBLE(NUM)
ARFACT = AMIN1 (2.0 / ASPECT, 1.5)
RETURN
END