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.

83 lines
2.7 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 REPSMO (MXND, XN, YN, LXN, NNN, NNNOLD, NIT, EPS, RO,
& M1)
C***********************************************************************
C SUBROUTINE REPSMO = SMOOTHS A MESH GENERATED BY RMESH BY THE
C EQUIPOTENTIAL, OR WEIGHTED LAPLACIAN METHOD.
C GAUSS-SEIDEL TYPE RELAXATION IS USED.
C REFERENCE--MESH GENERATION-A SURVEY, BY BUELL AND BUSH, F.M.C.
C***********************************************************************
C NIT - MAX NUMBER OF ITERATIONS
C EPS - CONVERGENCE CRITERION FOR NODE MOVEMENTS
C RO - RELAXATION FACTOR (USUALLY 1.0 OR LARGER)
C M1 - SAME AS M1 GIVEN TO RMESH. THE MESH MUST BE LOGICALLY
C EXACTLY AS PRODUCED BY RMESH.
C***********************************************************************
DIMENSION LXN (4, MXND), XN (MXND), YN (MXND)
LOGICAL BIG
EPS2 = (EPS*RO)**2
NROW = M1 + 1
C ITERATION LOOP
DO 110 IT = 1, NIT
BIG = .FALSE.
C NODE LOOP
DO 100 NODE = NNNOLD + 1, NNN
C SKIP BOUNDARY NODES
IF (LXN (2, NODE) .GT. 0) THEN
NT = NODE + NROW
NB = NODE - NROW
C COMPUTE WEIGHTS
XPHI = 0.5* (XN (NT) - XN (NB))
YPHI = 0.5* (YN (NT) - YN (NB))
XPSI = 0.5* (XN (NODE + 1) - XN (NODE - 1))
YPSI = 0.5* (YN (NODE + 1) - YN (NODE - 1))
ALPHA = XPSI**2 + YPSI**2
GAMMA = XPHI**2 + YPHI**2
BETA2 = (XPHI*XPSI + YPHI*YPSI)*0.5
WEIGHT = 2.0* (ALPHA + GAMMA)
C COMPUTE WEIGHTED SUM OF COORDINATES
XSUM = ALPHA * (XN (NT) + XN (NB))
& + GAMMA * (XN (NODE - 1) + XN (NODE + 1))
& + BETA2 * (XN (NT - 1) + XN (NB + 1)
& - XN (NT + 1) - XN (NB - 1))
YSUM = ALPHA * (YN (NT) + YN (NB))
& + GAMMA * (YN (NODE - 1) + YN (NODE + 1))
& + BETA2 * (YN (NT - 1) + YN (NB + 1)
& - YN (NT + 1) - YN (NB - 1))
C MOVE THE NODE AS INDICATED
DELX = (XSUM/WEIGHT - XN (NODE)) * RO
DELY = (YSUM/WEIGHT - YN (NODE)) * RO
XN (NODE) = XN (NODE) + DELX
YN (NODE) = YN (NODE) + DELY
IF (DELX ** 2 + DELY ** 2 .GT. EPS2) BIG = .TRUE.
ENDIF
100 CONTINUE
IF (.NOT.BIG) RETURN
110 CONTINUE
RETURN
END