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.
 
 
 
 
 
 

99 lines
3.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
C=======================================================================
SUBROUTINE SMOGS (X, Y, Z, numelb, nlink, idelb, link,
$ isbnd, nelblk, NUMNP, NIT, EPS, R0,
$ xscr, yscr, zscr, nscr, ndim)
C=======================================================================
C***********************************************************************
C SUBROUTINE SMOGS = MESH SMOOTHING BY LAPLACE-S USING GAUSS-SEIDEL
C***********************************************************************
C VARIABLES USED:
C NIT = THE MAX NUMBER OF ITERATIONS TO DO.
C EPS = MINIMUM DISTANCE NODES MUST MOVE TO CONTINUE ITERATIONS
C RO = AN UNDER- OR OVER-RELAXATION FACTOR (NORMALLY 1.0)
C***********************************************************************
real x(*), y(*), z(*)
integer numelb(*), nlink(*), idelb(*), link(*)
logical isbnd(*)
real xscr(*), yscr(*), zscr(*)
integer nscr(*)
LOGICAL BIG
IF (R0 .LT. 0.01) R0 = 1.
EPS2 = (EPS*R0)**2
C ITERATION LOOP
DO 120 IT = 1, NIT
call inirea (numnp, 0.0, xscr)
call inirea (numnp, 0.0, yscr)
if (ndim .eq. 3) call inirea (numnp, 0.0, zscr)
call iniint (numnp, 0, nscr)
ielnk = 0
BIG = .FALSE.
C NODE LOOP
do 110 iblk = 1, nelblk
islnk = ielnk+1
ielnk = ielnk + nlink(iblk) * numelb(iblk)
C SKIP CONTINUATION AND BOUNDARY LINES
if (ndim .eq. 2) then
call smogs2 (xscr, yscr, isbnd, x, y, numelb(iblk),
$ link(islnk), nlink(iblk), numnp, nscr)
else
call smogs3 (xscr, yscr, zscr, isbnd, x, y, z,
$ numelb(iblk), link(islnk), nlink(iblk),
$ numnp, nscr)
end if
110 continue
delmax = 0.0
do 130 i=1, numnp
if (.not. isbnd(i)) then
SUMX = xscr(i)/dble(nscr(i))
SUMY = yscr(i)/dble(nscr(i))
XDEL = r0*(SUMX - X(i))
YDEL = r0*(SUMY - Y(i))
X(I) = X(I) + XDEL
Y(I) = Y(I) + YDEL
if (ndim .eq. 3) then
sumz = zscr(i)/dble(nscr(i))
zdel = r0*(sumz - z(i))
z(i) = z(i) + zdel
else
zdel = 0.0
end if
del = xdel*xdel + ydel*ydel + zdel*zdel
if (del .gt. delmax) then
delmax = del
idel = i
end if
C CHECK FOR CONVERGENCE
end if
130 continue
IF (delmax .GT. EPS2) BIG = .TRUE.
C IF NO SIGNIFICANT MOVEMENTS OCCURRED, RETURN
write (*,*) 'Iteration = ', it, sqrt(delmax)/r0, idel
IF (.NOT.BIG) RETURN
120 CONTINUE
call prterr ('INFO', 'Iterations exceeded in smogs')
RETURN
END