Example 1. Gauss elimination algorithm
PROGRAM GAUSS C Solving linear equation system Ax = b PARAMETER ( N = 100 ) REAL A( N, N+1 ), X( N ) C A : Coefficient matrix with dimension (N,N+1) C Right hand side vector of linear equations is stored C in last (N+1)-th column of matrix A C X : Vector of unknowns C N : Number of linear equations *HPF$ DISTRIBUTE A (BLOCK,*) *HPF$ ALIGN X(I) WITH A(I,N+1) C Initialization *HPF$ INDEPENDENT DO 100 I = 1, N DO 100 J = 1, N+1 IF (( I .EQ. J ) THEN A(I,J) = 2.0 ELSE IF ( J .EQ. N+1) THEN A(I,J) = 0.0 ENDIF ENDIF 100 CONTINUE C C Elimination C DO 1 I = 1, N *HPF$ INDEPENDENT DO 5 J = I+1, N DO 5 K = I+1, N+1 A(J,K) = A(J,K) - A(J,I) * A(I,K) / A(I,I) 5 CONTINUE 1 CONTINUE C First calculate X(N) X(N) = A(N,N+1) / A(N,N) C C Solve X(N-1), X(N-2), ...,X(1) by backward substitution C DO 6 J = N-1, 1, -1 *HPF$ INDEPENDENT DO 7 I = 1, J A(I,N+1) = A(I,N+1) - A(I,J+1) * X(J+1) 7 CONTINUE X(J) = A(J,N+1) / A(J,J) 6 CONTINUE PRINT *, X END
PROGRAM JACOBI PARAMETER (K=8, ITMAX=20) REAL A(K,K), B(K,K) *HPF$ DISTRIBUTE A (BLOCK, BLOCK) *HPF$ ALIGN B(I,J) WITH A(I,J) C arrays A and B with block distribution PRINT *, '******** TEST_JACOBI_HPF ********' C nest of two independent loops, iteration (i,j) will be executed C on processor, which is owner of element A(i,j) *HPF$ INDEPENDENT DO 1 J = 1, K *HPF$ INDEPENDENT DO 1 I = 1, K A(I,J) = 0. IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.K .OR. J.EQ.K) THEN B(I,J) = 0. ELSE B(I,J) = 1. + I + J ENDIF 1 CONTINUE DO 2 IT = 1, ITMAX *HPF$ INDEPENDENT DO 21 J = 2, K-1 *HPF$ INDEPENDENT DO 21 I = 2, K-1 A(I,J) = B(I,J) 21 CONTINUE *HPF$ INDEPENDENT DO 22 J = 2, K-1 *HPF$ INDEPENDENT DO 22 I = 2, K-1 B(I,J) = (A(I-1,J) + A(I,J-1) + A(I+1,J) + A(I,J+1)) / 4 22 CONTINUE 2 CONTINUE 3 OPEN (3, FILE='JACH.DAT', FORM='FORMATTED') WRITE (3,*) B CLOSE (3) END
Example 3. Red-black successive over-relaxation
PROGRAM REDBLACK PARAMETER (N1 = 20,N2 = 10) REAL A(N1,N2),W INTEGER ITMAX *HPF$ DISTRIBUTE (BLOCK,BLOCK) :: A ITMAX = 20 W = 0.5 *HPF$ INDEPENDENT DO 1 J = 1,N2 *HPF$ INDEPENDENT DO 1 I = 1,N1 IF (I.EQ.J) THEN A(I,J) = N1+2 ELSE A(I,J) = (-(1.)) ENDIF 1 CONTINUE DO 2 IT = 1,ITMAX *HPF$ INDEPENDENT DO 21 J = 1,N2/2-1 *HPF$ INDEPENDENT DO 21 I = 1,N1/2-1 A(2*I+1,2*J+1) = W/4*(A(2*I,2*J+1)+A(2*I+2,2*J+1)+ + A(2*I+1,2*J)+A(2*I+1,2*J+2))+(1-W)*A(2*I+1,2*J+1) 21 CONTINUE *HPF$ INDEPENDENT DO 22 J = 1, N2/2-1 *HPF$ INDEPENDENT DO 22 I = 1,N1/2-1 A(2*I,2*J) = W/4*(A(2*I-1,2*J)+A(2*I+1,2*J)+A(2*I,2*J-1)+ + A(2*I,2*J+1))+(1-W)*A(2*I,2*J) 22 CONTINUE *HPF$ INDEPENDENT DO 23 J = 1,N2/2-1 *HPF$ INDEPENDENT DO 23 I = 1,N1/2-1 A(2*I,2*J+1) = W/4*(A(2*I-1,2*J+1)+A(2*I+1,2*J+1)+A(2*I,2*J) + +A(2*I,2*J+2))+(1-W)*A(2*I,2*J+1) 23 CONTINUE *HPF$ INDEPENDENT DO 24 J = 1,N2/2-1 *HPF$ INDEPENDENT DO 24 I = 1,N1/2-1 A(2*I+1,2*J) = W/4*(A(2*I,2*J)+A(2*I+2,2*J)+A(2*I+1,2*J-1)+ + A(2*I+1,2*J+1))+(1-W)*A(2*I+1,2*J) 24 CONTINUE PRINT *,'IT= ',IT 2 CONTINUE END
Example 4. Gauss Elimination with Pivoting and Error Correction
***GAUSS ELIMINATION METHOD************************************************ * THE PROGRAM FOR SYSTEM OF LINEAR EQUATION BY GAUSS ELIMINATION METHOD * * WITH COMPLETE PIVOTING AND ERROR CORRECTION * *************************************************************************** * program GAUSS integer nd,i,j,n,m,nn,k,kk,p,r,index,determ,chec,z parameter (nd = 40) doubleprecision AM(nd,nd),XM(nd),CM(nd),EM(nd),PE(nd),DX(nd), $XX(nd),DM(nd),ORDC(nd),YM(nd),qt,d,t parameter (epsil = 1.0e-9) ** * SEGMENT FOR READING THE EQUATION ** write(6,*) ' Enter number of equations, n:' read(*,*) n m = n + 1 write(6,*) ' Enter augmented coefficient matrix row-wise:' read(*,*) ((AM(i,j),j = 1,m),i = 1,n) ** z = 0 nn = n - 1 chec = 1 ** * ESTABLISH INITIAL ORDER IN THE COLUMN ORDER VECTOR ** do 270 i = 1,n ORDC(i) = i 270 continue ** * SEGMENT FOR PARTIAL PIVOTING ** do 300 p = 1,nn CALL PIVOT(AM,n,ORDC,p,ORD) ** * TRIANGULARIZATION BY ELIMINATING THE VARIABLES ** kk = p + 1 do 290 i = kk,n if(abs(AM(p,p)).lt.epsil) then chec = 0 else qt = AM(i,p)/AM(p,p) endif do 280 j = p,m AM(i,j) = AM(i,j) - qt * AM(p,j) 280 continue 290 continue 300 continue ** * CHECKING FOR THE SINGULARITY OF COEFFICIENT MATRIX ** determ = 1 do 310 i = 1,n if ((abs(AM(i,i)).lt.epsil).or.(chec.eq.0)) then determ = 0 write(6,*)'--------------------------------------------------' write(6,*)'Coefficient matrix is singular. No Solution exist.' write(6,*)'--------------------------------------------------' endif 310 continue if (determ.eq.1.and.chec.eq.1) then ** * BACK SUBSTITUTION ** XM(n) = AM(n,m)/AM(n,n) do 330 i = nn,1,-1 sum = 0.0 k = i + 1 do 320 j = k,n sum = sum + AM(i,j) * XM(j) 320 continue XM(i) = (AM(i,m) - sum)/AM(i,i) 330 continue ** * REARRANGE THE SOLUTION VECTOR ** do 340 i = 1,n j = ORDC(i) YM(j) = XM(i) 340 continue ** * OUTPUTTING THE SOLUTION VECTOR ** write(6,*)'--------------------------------------------------' write(6,*) ' The solution Vector is:' write(6,*) write(6,341) (YM(i),i = 1,n) 341 format('',30x,f12.4) write(6,*)'--------------------------------------------------' ** * CHECK FOR THE VALUE OF THE DETERMINANT ** d = 1.0 do 350 i = 1,n d = d * AM(i,i) 350 continue d = d * (-1) **z write(6,351) 'The determinant of coefficient Matrix is:',d 351 format('0',a41,2x,f10.3) write(6,*)'--------------------------------------------------' write(6,*) ' ENTER [RETURN] TO CONTINUE:' read(*,*) ** * SUBSTITUTION OF SOLUTION IN THE EQUATION TO GET THE RIGHT HAND SIDE ** do 370 i = 1,n CM(i) = 0.0 do 360 index = 1,n CM(i) = CM(i) + AM(i,index) * XM(index) 360 continue 370 continue ** * CALCULATION OF RIGHT HAND SIDE ERROR VECTOR ** do 380 i = 1,n EM(i) = AM(i,m) - CM(i) 380 continue write(6,*)'---------------------------------------------------' write(6,*) ' The right-hand side error vector is:' write(6,381) (EM(i),i = 1,n) 381 format('',28x,f12.4) write(6,*)'---------------------------------------------------' write(6,*) 'The relative percentage errors of the right-hand sid $e contants are:' ** * CALCULATION OF PERCENTAGE ERROR OF RIGHT HAND SIDE CONSTANT ** do 390 i = 1,n PE(i) = EM(i)/CM(i) 390 continue CALL pr(PE,n,1) write(6,*) ** ** do 400 i = 1,n AM(i,m) = EM(i) 400 continue ** * DETERMINATION OF CORRECTION FACTOR VECTOR ** DX(n) = AM(n,m)/AM(n,n) do 420 i = nn,1,-1 sum = 0.0 k = i + 1 do 410 j = k,n sum = sum + AM(i,j) * DX(j) 410 continue DX(i) = (AM(i,m) - sum)/AM(i,i) 420 continue write(6,*)'---------------------------------------------------' write(6,*) ' The correction factor vector for variable is:' CALL pr(DX,n,1) write(6,*) ** write(6,*)'---------------------------------------------------' write(6,*) ' The corrected solution vector is:' write(6,*) do 430 i = 1,n XX(i) = XM(i) - DX(i) 430 continue ** * REARRANGE THE SOLUTION VECTOR ** do 440 i = 1,n j = ORDC(i) DM(j) = XX(i) 440 continue write(6,441) (DM(i),i = 1,n) 441 format('',28x,f12.4) write(6,*)'---------------------------------------------------' endif stop end ********************************************************************** * ***COMPLETE PIVOTING (Loop in the calling program)******************** * * subroutine PIVOT(A,n,ORDC,i,ORD) integer nd,n,m,i,j,ii,jj,col,row,p,r parameter (nd = 40) doubleprecision A(nd,nd),ORD(nd),ORDC(nd),t,tem ** * COMPLETE PIVOTING ** row = i col = i do 30 p = i,n do 20 r = i,n if (abs(A(row,col)).lt.abs(A(p,r))) then row = p col = r endif 20 continue 30 continue ** if (col.ne.i) then do 40 ii = 1,n tem = A(ii,i) A(ii,i) = A(ii,col) A(ii,col) = tem 40 continue t = ORDC(i) ORDC(i) = ORDC(col) ORDC(col) = t endif * m = n + 1 if (row.ne.i) then do 50 jj = 1,m tem = A(i,jj) A(i,jj) = A(row,jj) A(row,jj) = tem 50 continue t = ORD(i) ORD(i) = ORD(row) ORD(row) = t endif * return end ***SUBROUTINE FOR PRINTING THE MATRIX********************************* * * subroutine pr(C,m,n) integer nd,m,n,i,j parameter (nd = 40) doubleprecision C(nd,nd) if(n.eq.1) then do 20 i = 1,m write(6,10)C(i,1) 10 format('',f10.4) 20 continue elseif(n.eq.2) then do 40 i = 1,m write(6,30)C(i,1),C(i,2) 30 format('',2f10.4) 40 continue elseif(n.eq.3) then do 60 i = 1,m write(6,50)C(i,1),C(i,2),C(i,3) 50 format('',3f10.4) 60 continue elseif(n.eq.4) then do 80 i = 1,m write(6,70)C(i,1),C(i,2),C(i,3),C(i,4) 70 format('',4f10.4) 80 continue elseif(n.eq.5) then do 100 i = 1,m write(6,90)C(i,1),C(i,2),C(i,3),C(i,4),C(i,5) 90 format('',5f10.4) 100 continue elseif(n.eq.6) then do 120 i = 1,m write(6,110)C(i,1),C(i,2),C(i,3),C(i,4),C(i,5),C(i,6) 110 format('',6f10.4) 120 continue elseif(n.eq.7) then do 140 i = 1,m write(6,130)C(i,1),C(i,2),C(i,3),C(i,4),C(i,5),C(i,6),C(i,7) 130 format('',7f10.4) 140 continue elseif(n.eq.8) then do 160 i = 1,m write(6,150)C(i,1),C(i,2),C(i,3),C(i,4),C(i,5),C(i,6),C(i,7), $C(i,8) 150 format('',8f10.4) 160 continue elseif(n.eq.9) then do 180 i = 1,m write(6,170)C(i,1),C(i,2),C(i,3),C(i,4),C(i,5),C(i,6),C(i,7), $C(i,8),C(i,9) 170 format('',9f10.4) 180 continue elseif(n.eq.10) then do 200 i = 1,m write(6,190)C(i,1),C(i,2),C(i,3),C(i,4),C(i,5),C(i,6),C(i,7), $C(i,8),C(i,9),C(i,10) 190 format('',10f10.4) 200 continue endif return end
Example 5. Runge Kutta 4 Method
PROGRAM D15R2 C Driver for routine RKDUMB PARAMETER(NVAR=2) DIMENSION VSTART(NVAR) COMMON /PATH/X(200),Y(10,200) OPEN(6,FILE='RK.OUT',FORM='FORMATTED') WRITE(*,*) ' X1=? X2=? NSTEP=?' READ(*,*) X1,X2,NSTEP VSTART(1)=1. VSTART(2)=0. CALL RKDUMB(VSTART,X1,X2,NSTEP) WRITE(*,'(/1X,T9,A,T17,A,T31,A/)') 'X','X1 VALUE','X2 VALUE' WRITE(6,'(/1X,T9,A,T17,A,T31,A/)') 'X','X1 VALUE','X2 VALUE' DO 11 I=1,NSTEP+1 WRITE(*,'(1X,F10.4,2X,2F12.6)') X(i),Y(1,i),Y(2,i) WRITE(6,'(1X,F10.4,2X,2F12.6)') X(i),Y(1,i),Y(2,i) 11 CONTINUE END C SUBROUTINE DERIVS(X,Y,DYDX) PARAMETER(NVAR=2) DIMENSION Y(NVAR),DYDX(NVAR) DYDX(1)=Y(2) DYDX(2)=-Y(2)*x-y(1) RETURN END C SUBROUTINE RKDUMB(VSTART,X1,X2,NSTEP) PARAMETER (NMAX=10,NVAR=2) COMMON /PATH/ XX(200),Y(10,200) DIMENSION VSTART(NVAR),V(NMAX),DV(NMAX) DO 11 I=1,NVAR V(I)=VSTART(I) Y(I,1)=V(I) 11 CONTINUE XX(1)=X1 X=X1 H=(X2-X1)/NSTEP DO 13 K=1,NSTEP CALL DERIVS(X,V,DV) CALL RK4(V,DV,X,H,V) IF(X+H.EQ.X)PAUSE 'Stepsize not significant in RKDUMB.' X=X+H XX(K+1)=X DO 12 I=1,NVAR Y(I,K+1)=V(I) 12 CONTINUE 13 CONTINUE RETURN END C SUBROUTINE RK4(Y,DYDX,X,H,YOUT) PARAMETER (NMAX=10,NVAR=2) DIMENSION Y(NVAR),DYDX(NVAR),YOUT(NVAR),YT(NMAX),DYT(NMAX), @DYM(NMAX) HH=H*0.5 H6=H/6. XH=X+HH DO 11 I=1,NVAR YT(I)=Y(I)+HH*DYDX(I) 11 CONTINUE CALL DERIVS(XH,YT,DYT) DO 12 I=1,NVAR YT(I)=Y(I)+HH*DYT(I) 12 CONTINUE CALL DERIVS(XH,YT,DYM) DO 13 I=1,NVAR YT(I)=Y(I)+H*DYM(I) DYM(I)=DYT(I)+DYM(I) 13 CONTINUE CALL DERIVS(X+H,YT,DYT) DO 14 I=1,NVAR YOUT(I)=Y(I)+H6*(DYDX(I)+DYT(I)+2.*DYM(I)) 14 CONTINUE RETURN END
Example 6. Eigenvalues and Eigenvectors
c Main program for finding the eigenvalues and eigenvectors c of a symmetric matrix AO (NxN) with Jacobi's method. ITMAX c and EPS are the stopping criteria, namely the maximum number c of iterations and error tolerance,respectively. DIMENSION AO(3,3), A(3,3) DATA N,ITMAX, EPS /3,100,1.0E-06/ AO(1,1)=2.0 AO(1,2)=8.0 AO(1,3)=10. AO(2,1)=8.0 AO(2,2)=3.0 AO(2,3)=4.0 AO(3,1)=10. AO(3,2)=4. AO(3,3)=7.0 CALL JACOBI(AO,N,A,EPS,ITMAX) PRINT 10, (AO(I,I),I=1,N),((A(I,J), J=1,N), I=1,N) 10 FORMAT (1X,'EIGENVALUES ARE',/,3X,3E18.8,//3X, # 'EIGENVECTORS',/,8X,' FIRST',15X,' SECOND',13X,'THIRD', # /,(3X,3E18.8)) STOP END C ********************************** SUBROUTINE JACOBI (AO,N,A,EPS,ITMAX) DIMENSION AO(N,N), A(N,N) ITER=0 DO 10 I=1,N DO 10 J=1,N A(I,J)=0.0 10 A(I,I)=1.0 20 Z=0. NM1=N-1 DO 30 I=1,NM1 IP1=I+1 DO 30 J=IP1,N IF (ABS(AO(I,J)) .LE. Z) GO TO 30 Z=ABS(AO(I,J)) IROW=I ICOL=J 30 CONTINUE IF (ITER .EQ. 0) Y=Z*EPS IF (Z .LT. Y) GO TO 200 DIF=AO(IROW,IROW)-AO(ICOL,ICOL) TANG= (-DIF+SQRT(DIF**2+4.0*Z**2))/(2.0*AO(IROW,ICOL)) COSE=1.0/SQRT(1.0+TANG**2) SINE=COSE*TANG DO 40 I=1,N ZZ=A(I,IROW) A(I,IROW)=COSE*ZZ+SINE*A(I,ICOL) 40 A(I,ICOL)=COSE*A(I,ICOL)-SINE*ZZ I=1 50 IF (I .EQ. IROW) GO TO 60 YY=AO(I,IROW) AO(I,IROW)=COSE*YY+SINE*AO(I,ICOL) AO(I,ICOL)=COSE*AO(I,ICOL)-SINE*YY I=I+1 GO TO 50 60 I=IROW+1 70 IF (I .EQ. ICOL) GO TO 80 YY=AO(IROW,I) AO(IROW,I)=COSE*YY+SINE*AO(I,ICOL) AO(I,ICOL)=COSE*AO(I,ICOL)-SINE*YY I=I+1 GO TO 70 80 I=ICOL+1 90 IF (I .GT. N) GO TO 100 ZZ=AO(IROW,I) AO(IROW,I)=COSE*ZZ+SINE*AO(ICOL,I) AO(ICOL,I)=COSE*AO(ICOL,I)-SINE*ZZ I=I+1 GO TO 90 100 YY=AO(IROW,IROW) AO(IROW,IROW)=YY*COSE**2+AO(IROW,ICOL)*2.0*COSE*SINE+ # AO(ICOL,ICOL)*SINE**2 AO(ICOL,ICOL)=AO(ICOL,ICOL)*COSE**2+YY*SINE**2-AO(IROW,ICOL) # *2.0*COSE*SINE AO(IROW,ICOL)=0.0 ITER=ITER+1 IF (ITER .LT. ITMAX) GO TO 20 200 RETURN END
Example 7 Matrix Multiplication :
#include<stdio.h>
#include<conio.h>
void main()
{
int mat1[2][2],mat2[2][2],mat3[2][2],i,j,k;
printf("************A program to find the multiplication of the given matrices***********\n\n");
printf("************Enter the value for the 1st matrix************\n");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("\nEnter the value for %d row,%d column:",i+1,j+1);
scanf("%d",&mat1[i][j]);
}
}
printf("\n************Enter the value for the 2nd matrix************\n");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("\nEnter the value for %d row,%d column:",i+1,j+1);
scanf("%d",&mat2[i][j]);
}
}
printf("\n****************************The given matrices are*****************************\n\n");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d\t",mat1[i][j]);
}
printf("\n");
}
printf("\n\n");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d\t",mat2[i][j]);
}
printf("\n");
}
printf("\n****************************The multiplication of the matrices is*************\n\n");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
mat3[i][j]=0;
for(k=0;k<2;k++)
{
mat3[i][j]=mat3[i][j]+(mat1[i][k]*mat2[k][j]);
}
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d\t",mat3[i][j]);
}
printf("\n");
}
getch();
getch();
}
Example 8 Finding Roots(Real and complex) of a Third Order Equation :
#include<conio.h>
#include<stdio.h>
#include<math.h>
void main(void)
{
clrscr();
float a,b,c,d,i,j,k,x1,x2,l,r,z,fxl,u,fxr;
float xl = -90.0;
float xu = 100.0;
float xr;
printf("Enter a, b, c & d:\n");
scanf("%f %f %f %f", &a, &b, &c,&d);
for(i=0;i<1000;i++)
{
fxl = (a*pow(xl,3)) + (b*pow(xl,2) ) + (c*xl) + d;
xr = (xl + xu)/2;
fxr = (a*pow(xr,3)) + (b*pow(xr,2) ) + (c*xr) + d;
if((fxl*fxr)<0)
xu = xr;
else
xl = xr;
if(fxr<0.000001 && fxr>-0.000001)
{
printf("The three roots are as follows: -\n");
printf("x1 = %.2f\n", xr);
break;
}
}
i = b + (xr*a);
j = c + (xr*i);
k = i*i - (4*a*j);
if( k >= 0)
{
x1 = (-i + sqrt(k))/(2*a);
x2 = (-i - sqrt(k))/(2*a);
printf("x2 = %.2f\n",x1);
printf("x3 = %.2f",x2);
}
else
{
l = -k;
r = -i/(2*a);
z = (sqrt(l))/(2*a);
printf("x2 = %.2f + j%.2f\n", r,z);
printf("x3 = %.2f - j%.2f\n", r,z);
}
getch();
}