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
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
|
|
|