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.
82 lines
2.7 KiB
82 lines
2.7 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 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
|
|
|