Numerical Grid Generation
Foundations and Applications
By: Joe E. Thompson, Z.U.A. Warsi and C. Wayne Mastin
APPENDIX C
CODE DEVELOPMENT AND COMPUTER EXERCISES
1. Code Development Exercises
1. Take the computational region to be a rectangle on which the curvilinear coordinates are defined to be equal to the indices of the field arrays, i.e.,
= I and
= J, with x = X (I,J) and y = Y (I,J).
Make provision for reading in values of x and y on any segments of the boundary of the computational region. Generate x and y in the interior by interpolating linearly between the top and bottom boundaries. Plot the grid.
2. Modify the code to allow horizontal (in the computational plane) interpolation, as well, the choice being specified by input.
3. Now add the choice of interpolation from the four corners (tensor product interpolation).
4. Finally add the choice of transfinite interpolation.
5. Generalize the interpolation to cubic Hermite interpolation, with the grid being orthogonal at the boundary.
6. Generalize the interpolation to use the hyperbolic tangent distribution function, rather than being linear, with specified relative spacing on each end.
7. Modify the code to provide for reading in x and y on any segment of any horizontal or vertical line in the computational region. Also provide for the interpolation tion to be done on any rectangular segment of the computational region (including a segment that is only a line.)
8. Add another field array TYPE (I,J) which is a flag to identify each point as one for which the x,y values are (1) fixed, e.g., specified points on the physical boundary, (2) out of the computation, e.g., points inside a slab, or (3) to be generated. Provide for the designation (1) and (2) to be made by input for any rectangular segment of the computational region, the default being to the designation (3).
9. Modify the dimensions of the field arrays so that an extra layer of points surrounds the computational region. Also add two more field arrays, ILINK (I,J) and JLINK (I,J). Provide for any segments of any horizontal or vertical lines to be designated as image points in TYPE by input, i.e., points for which the values of x and y are set equal to those at some other point. Also provide for the indices of these other points to be put in ILINK and JLINK by input.
10. Add an elliptic generator, based on Laplace equation, to the code. Use the algebraic generator (the interpolation) to provide the initial guess for point SOR iteration.
11. Add control functions to the elliptic generator. Let the control function be evaluated on the boundaries and interpolated into the field by transfinite interpolation.
2. Computer Exercises
1. Generate an algebraic grid between two concentric circles. Use linear interpolation between the circles.
2. Generate an algebraic grid between two ellipses, both of which are centered at the origin but which may have different eccentricities, using interpolation between the ellipses. Compare grids generated using linear and Hermite interpolation, the latter being orthogonal at the boundaries.
3. Generate a C-type algebraic grid for an ellipse inside an outer boundary formed by a semicircle replacing one side of a rectangle:
Compare (1) vertical interpolation in the computational region boundary, (2) horizontal interpolation, (3) tensor product interpolation, and (4) transfinite interpolation, using linear interpolation in each case. Note that (2) and (3) are totally unreasonable.
4. Generate an algebraic grid for a circular simply-connected
region by (1) unidirectional interpolation,
(2) tensor product interpolation, and (3) transfinite
interpolation. Note that here only (3)gives a reasonable
grid. Compare linear and Hermite interpolation for (3).
5. Repeat Exercise 4 with a triangular boundary.
6. Using the boundary configuration of Exercise 3, but with a hyperbolic tangent point distribution on the right-hand boundary of the physical region with smaller spacing at the centerline than at the top and bottom. Compare algebraic grids generated using (1) linear interpolation between the inner and outer boundaries, (2) nonlinear interpolation, based on the hyperbolic tangent, between the inner and outer boundaries, (3) transfinite interpolation with linear blending functions, and (4) transfinite interpolation using the boundary point distribution (in terms of relative arc length) as the blending functions. Note that only (2) and (4) preserve the boundary point distribution in the field.
7. Generate an algebraic grid for a square inside a rectangle using linear interpolation between the inner and outer boundaries. Note the propagation of the boundary slope discontinuities into the field. Generate a grid from an elliptic generation system for the same boundary point distribution and note the difference.
8. Generate an algebraic grid for a square inside a circle using linear interpolation between the inner and outer boundaries. Show that it is possible to position the points on the circle such that the grid overlaps the corners of the square. Generate a grid from an elliptic generation system for the same boundary point distribution and note the difference.
3. Listing of Routine for Computer Exercises
SUBROUTINE INTERP
PARAMETER(NI=20,NJ=20,N=5)
COMMON/COORD/X(NI,NJ),Y(NI,NJ)
COMMON/CONST/CHOICE,IMAX,JMAX,NA,DS1,DS2
COMMON/ATTR/IAL(N),IAX(N),IAY(N),JAL(M),JAX(N),JAY(N)
COMMON/COEF/AI(N),BI(N),CI(N),DI(N),AJ(N),BJ(N)
COMMON/COEF/CJ(N),DJ(N)
DIMENSION P(NI,NJ),Q(NI,NJ),XX(0:NI,O:NJ),YY(0:MI,O:NJ)
DIMENSION X1(NI,NJ),X2(NI,NJ),Y1(NI,NJ),Y2(NI,NJ)
INTEGER CHOICE
C
C BOUNDARY INTERPOLATION
C
C X X ARRAY OF XI-ETA COORDINATE
C Y Y ARRAY OF XI-ETA COORDINATE
C IMAX MAX. NUMBER OF GRID IN XI AXIS
C JMAX MAX. NUMBER OF GRID IN ETA AXIS
C NA MAX. NUMBER OF ATTRACTIONS
C DSl SPECIFIED LENGTH OF INITIAL INTERVAL
C DS2 SPECIFIED LENGTH OF FINAL INTERVAL
C ATTR ARRAY OF ATTRACTION TO LINES/POINTS
C COEF ARRAY OF COEFFICIENT FOR ATTRACTION
C
C CHOICE
C 1 VERTICAL INTERPOLATION
C 2 HORIZONTAL INTERPOLATION
C 3 TENSOR PRODUCT INTERPOLATION
C 4 TRANSFINITE INTERPOLATION
C 5 HERMITE CUBIC INTERPOLATION
C 6 HYPERBOLIC TANGENT INTERPOLATION
C 7 ELLIPTIC GRID GENERATION ( SOR ITERATION )
C 8 ATTRACTION TO COORDINATES
C
IF(CHOICE.EQ.1) GO TO 100
IF(CHOICE.EQ.2) GO TO 200
IF(CHOICE.EQ.3) GO TO 300
IF(CHOICE.EQ.H) GO TO 400
IF(CHOICE.EQ.5) GO TO 500
IF(CHOICE.EQ.6) GO TO 600
IF(CHOICE.EQ.7) GO TO 700
IF(CHOICE.EQ.S) GO TO 800
C
C **** VERTICAL INTERPOLATION ****
C
100 DO 110 I 1,IMAX
DO 110 J 1,JMAX
RJ1=FLOAT(JMAX-J)/FLOAT(JMAX-1)
RJ2=FLOAT(J-1)/FLOAT(JMAX-1)
C *** ( EQ. 8-1 )
X(I,J)=RJ1*X(I,l)+RJ2*X(I,JMAX)
110 Y(I,J) RJl*Y(I.1)+RJ2*Y(I,JMAX)
RETURN
C
C **** HORIZONTAL INTERPOLATION ****
C
200 DO 210 I=l,JMAX
DO 210 J=1,IMAX
RI1=FLOAT(IMAX-I)/FLOAT(IMAX-1)
RI2=FLOAT(I-1)/FLOAT(IMAX-1)
C *** ( EQ. 8-1 )
X(I,J)=RI1*X(1,J)+RI2*X(IMAX,J)
210 Y(I,J)=RI1*Y(1,J)+RI2*Y(IMAX,J)
RETURN
C
C **** TENSOR PRODUCT INTERPOLATION ****
C
300 DO 310 I=1,IMAX
DO 310 J=l,JMAX
RI1=FLOAT(IMAX-I)/FLOAT(IMAX-1)
RI2=FLOAT(I-1)/FLOAT(IMAX-1)
RJl=FLOAT(JMAX-J)/FLOAT(JMAX-1)
RJ2=FLOAT(J-1)/FLOAT(JMAX-1)
C *** ( EQ. 8-69 )
X(I,J)=RI1*RJ1*X(1,1)+RI1*RJ2*X(1,JMAX)
*+RI2*RJ1*X(IMAX,1)+RI2*RJ2*X(IMAX,JMAX)
Y(I,J)=RI1*RJ1*Y(1,1)+RI1*RJ2*Y(1,JMAX)
*+RI2*RJ1*Y(IMAX,1)+RI2*RJ2*Y(IMAX,JMAX)
310 CONTINUE
RETURN
C
C **** TRANSFINITE INTERPOLATION ****
C
400 DO 410 I=l,IMAX
DO 410 J=1,JMAX
RI1=FLOAT(I-1)/FLOAT(IMAX-1)
RI2=FLOAT(IMAX-I)/FLOAT(IMAX-1)
X1(I,J)=RI1*X(IMAX,J)+RI2*X(1,J)
410 Yl(I,J)=RI1*Y(IMAX,J)+RI2*Y(1,J)
DO 420 I=1,IMAX
DO 420 J=1,JMAX
RJ1=FLOAT(J-1)/FLOAT(JMAX-1)
RJ2=FLOAT(JMAX-J)/FLOAT(JMAX-1)
X2(I,J)=RJ1*(X(I,JMAX)-X1(I,JMAX))+RJ2*(X(I,1)-X1(I,1))
420 Y2(I,J)=RJ1*(Y(I,JMAX)-Y1(I,JMAX))+RJ2*(Y(I,l)-Y1(I,1))
C *** ( EQ. 8-73 )
DO 430 I=1,IMAX
DO 430 J=1,JMAX
X(I,J)=X1(I,J)+X2(I,J)
430 Y(I,J)=Y1(I,J)+Y2(I,J)
IF(CHOICE.NE.4) GO TO 740
RETURN
C
C *** HERMITE CUBIC INTERPOLATION (ORTHOGONAL BOUNDARY) ***
C
500 DO 510 I=1,IMAX
DO 510 J=1,JMAX
XX(I,J)=X(I,J)
510 YY(I,J)=Y(I,J)
DO 520 J=1,JMAX
XX(O,J)=XX(IMAX-1,J)
YY(O,J)=YY(INAX-1,J)
XX(IMAX+1,J)=XX(2,J)
520 YY(IMAX+1,J)=YY(2,J)
DO 530 I=1,IMAX
DO 530 J=1,JMAX
RJJ=FLOAT(J-1)/FLOAT(JMAX-1)
C *** ( EQ. 8-6 a and b, n=2 )
PHI1=(1.+2.*RJJ)*(1.-RJJ)*(1.-RJJ)
PHI2=(3.-2.*RJJ)*RJJ*RJJ
PSI1=(1.-RJJ)*(1.-RJJ)*RJJ
PSI2=(RJJ-1.)*RJJ*RJJ
C
C ** CAL. NORMAL DERIV. **
C
XXI1=.5*(XX(I+1,1)-XX(I-1,1))
XXI2=.5*(XX(I+1,JMAX)-XX(I-1,JMAX))
YXI1=.5*(YY(I+1,1)-YY(I-1,1))
YXI2=.5*(YY(I+1,JMAX)-YY(I-1,JMAX))
UNIT1=SQRT(XXI1*XXI1+YXI1*YXI1)
UNIT2=SQRT(XXI2*XXI2+YXI2*YXI2)
C *** ( EQ. 3-108 )
XNl=-YXI1/UNIT1*DSl
XN2=-YXI2/UNIT2*DS2
YN1=XXI1/UNIT1*DSl
YN2=XXI2/UNIT2*DS2
C *** ( EQ. 8-5 )
XX(I,J)=PHI1*XX(I,l)+PHI2*XX(I,JMAX)+PSI1*XN1+PSI2*XN2
530 YY(I,J)=PHI1*YY(I,1)+PHI2*YY(I,JMAX)+PSI1*YN1+PSI2*YN2
DO 540 I=1,IMAX
DO 540 J=1,JMAX
X(I,J)=XX(I,J)
540 Y(I,J)=YY(I,J)
RETURN
C
C **** HYPERBOLIC TANGENT SPACING INTERPOLATION ****
C
600 TOL=1.0E-10
C *** ( EQ. 8-49, 50 and 51
A=SQRT(DS2/DS1)
B=1./(FLOAT(JMAX-1)*SQRT(DS1*DS2))
C *** INITIAL GUESS BY SERIES EXPANSION
DELTA=SQRT(6.*(B-1.))
DO 610 IT=1,20
RESID=SINH(DELTA)/(DELTA*B)-1.
IF(ABS(RESID)LT.TOL) GO TO 630
610 CALL AITKEN(DELTA,RESID,DELTO,RO,RSO)
PRINT 620, RESID,DELTA,IT-1
620 FORMAT(//, 5X, 'DELTA IS NOT CONVERGE ?', 5X, 2E15.5,
*5X, I3, //)
GO TO 660
630 CONTINUE
C *** ( EQ. 8-52, 53 and 54 )
DO 650 I=1,IMAX
DO 650 J=2,JMAX-1
RATIO FLOAT(J-1)/FLOAT(JMAX-1)
U=.5*(1.+TANH(DELTA"(RATIO-.5))/TANH(.5*DELTA))
S=U/(A+(1.-A)*U)
X(I,J)=X(I,1)+(X(I,JMAX)-X(I,1))*S
650 Y(I,J)=X(I,1)+(Y(I,JMAX)-Y(I,1))*S
660 RETURN
C
C **** ELLIPTIC GRID GENERATION ( SOR ITERATION ) ****
C *** CAL. P AND Q ON THE BOUNDARY **
C
700 DO 710 I=1,IMAX
DO 710 J=1,JMAX
XXI=.5*(X(I+1,J)-X(I-1,J))
XXIXI=X(I+1,J)-2.*X(I,J)+X(I-1,J)
XETA=.5*(X(I,J+1)-X(I,J-1))
XETA2=X(I,J+1)-2.*X(I,J)+X(I,J-1)
YXI=.5*(X(I+1,J)-Y(I-1,J))
XXIXI=Y(I+1,J)-2.*X(I,J)+Y(I-1,J)
YETA=.5*(Y(I,J+1)-Y(I,J-1))
YETA2-Y(I,J+1)-2.*Y(I,J)+Y(I,J-1)
IF(ABS(XETA2).LT.10E-3) XETA2=0.
IF(ABS(YETA2).LT.10E-3) YETA2=0.
RXI2=XXI*XXI+YXI*YXI
RETA2=XETA*XETA+YETA*YETA
C *** ( EQ. 8-70 )
P(I,J)=(XXI*XXIXI+XXI*YXIXI)/RXI2
Q(I,J)=(XETA*XETA2+YETA*YETA2)/RETA2
710 CONTINUE
C
C ** INTERPOLATE P AND Q BETWEEN BOUNDARY **
C P : VERTICAL, Q : HORIZONTAL
C
DO 720 I=1,IMAX
DO 720 J=l,JMAX
RJ1=FLOAT(JMAX-J)/FLOAT(JMAX-1)
RJ2=FLOAT(J-1)/FLOAT(JMAX-1)
RI1=FLOAT(IMAX-I)/FLOAT(IMAX-1)
RI2=FLOAT(I-1)/FLOAT(IMAX-1)
P(I,J)=RJl*P(I,l)+RJ2*P(I,JMAX)
Q(I,J)=RI1*Q(1,J)+RI2*Q(IMAX,J)
720 CONTINUE
C
C ** INITIAL GUESS WITH TRANSFINITE INTERPOLATION **
C
GO TO 400
740 CONTINUE
C
C *** ITERATION ( SOR ) ***
C
ITMAX=200
TOL=10.E-5
W=1.8
DO 760 IT=1,ITMAX
ERRX=0.
ERRY=0.
DO 750 J=2,JMAX-1
DO 750 I=2,IMAX-1
XXI=.5*(X(I+1,J)-X(I-1,J))
YXI=.5*(Y(I+1,J)-Y(I-1,J))
XXIXI=X(I+1,J)+X(I-1,J)
YXIXI=Y(I+1,J)+Y(I-1,J)
XETA=.5*(X(I,J+1)-X(I,J-1))
YETA .5*(Y(I,J+1)-Y(I,J-1))
XXIETA=.25*(X(I+1,J+1)-X(I+1,J-1)-X(I-1,J+1)+X(I-1,J-l))
YXIETA=.25*(Y(I+1,J+1)-Y(I+1,J-1)-Y(I-1,J+1)+Y(I-1,J-1))
XETA2=X(I,J+1)+X(I,J-1)
YETA2=Y(I,J+1)+Y(I,J-1)
C *** ( EQ. 6-18 and 6-20 )
G11=XXI*XXI+YXI*YXI
G22=XETA*XETA+YETA*YETA
G12=XXI*XETA+YXI*YETA
XTEMP=.5*(G22*(P(I,J)*XXI+XXIXI)+G11*(Q(I,J)*XETA+XETA2)
*-2.*G12*XXIETA)/(G11+G22)
YTENP=.5*(G22*(P(I,J)*YXI+YXIXI)+G11*(Q(I,J)*YETA+YETA2)
*-2.*Gf2*YXIETA)/(Gll+G22)
XTENP=W*XTEMP+(1.-W)*X(I,J)
YTEMP=W*YTEMP+(1.-W)*Y(I,J)
ERRX=AMAXO(ERRX,ABS(XTEMP-X(I,J)))
ERRY=AMAXO(ERRY,ABS(YTEMP-Y(I,J)))
X(I,J)=XTEMP
Y(I,J)=YTEMP
750 CONTINUE
IF(ERRX.LT.TOL.AND.ERRY.LT.TOL) GO TO 78O
760 CONTINUE
PRINT 770,ERRX,ERRY,IT-1
770 FORMAT(//, 5X, 'X AND Y ARE NOT CONVERGE ?', 2E15.5,
*5X, I5, //)
780 CONTINUE
IF(CHOICE.EQ.8) GO TO 830
RETURN
C
C **** ATTRACTION TO COORDINATE LINE/POINT ****
C
800 DO 810 I=1,IMAX
DO 810 J=1,JMAX
P(I,J)=0.
810 Q(I,J)=0.
DO 820 NS=1,NA
DO 820 I=1,IMAX
DO 820 J=1,JMAX
XL=FLOAT(I-IAL(NS))
XI=FLOAT(I-IAX(NS))
XJ=FLOAT(J-IAY(NS))
YL=FLOAT(J-JAL(NS))
YI=FLOAT(I-JAX(NS))
YJ=FLOAT(J-JAY(NS))
C *** ( EQ. 6-30 )
P(I,J)=P(I,J)-AI(NS)*(XL/ABS(XL))*EXP(-CI(NS)*ABS(XL))
*-BI(NS)*(XI/ABS(XI))*EXP(-DI(NS)*SQRT(XI*XI+XJ*XJ))
Q(I,J)=Q(I,J)-AJ(NS)*(YL/ABS(YL))*EXP(-CJ(NS)*ABS(YL))
*-BJ(NS)*(YJ/ABS(YJ))*EXP(-DJ(NS)*SQHT(YI*YI+YJ*YJ))
820 CONTINUE
GO TO 400
830 CONTINUE
RETURN
END
4. Examples for Computer Exercises