# FORTRAN-77. Part 2

Document Sample

```					•   Program full of "errors"
•          program errors
•             double precision x
•             integer i
•             real CalLF(10)
•
•          i = 1
•          x = 1
•
•          CalLF(i) = x
•
•    20    continue
•          do 10 i = 1.10
•             x = x + 1
•    10    continue
•          call dp(x)
•
•          goto 20
•
•
•         1    = call f(x)
•
•          end
•
•          subroutine dp(x)
•             double precision x
•
•          write(*,*)'dp. x=',x
•          return
•          end
•
•          subroutine f(x)
•             double precision x
•
•             write(*,*)'I am subroutine f'
•             write(*,*)'x=',x
•             return
•             end

•   Changing constant
•             implicit none
•             integer x,y
•             integer one
•             parameter (one = 1)
•
•          x = 1
•          write(*,*)'x=',x
•          write(*,*)'new x=',x
•
•
•          end
•
•
•             implicit none
•             integer x
•
•          x = x + 1
•          end

•   Arrays in memory
•          program arrays in memory
•             implicit none
•             integer n,m,p
•             parameter (n=2, m=2)
•             double precision a(n,m)
•
•          p = n*m
•          a(1,1) = 1
•          a(1,2) = 2
•          a(2,1) = 3
•          a(2,2) = 4
•          call arrprt(a,p)
•          end
•
•          subroutine arrprt(x,p)
•             implicit none
•             integer p
•             double precision x(p)
•             integer i
•
•          do i=1,p
•              write(*,*)i,x(i)
•          end do
•          return
•          end

•   Machine epsilon.
The smallest floating-point number eps such that:
1 + eps > 1
Write a program which calculates machine epsilon for single (real)
and double precision.
1. eps = 1
2. eps = eps/2
3. if 1 + eps > 1, repeat 2
Make two functions:
real function eps()
double precision function deps()

1.        File I/O
o   Opening and closing a file
open(list-of-specifiers)
[UNIT=] u number (1 - 99, but usually can be much more)
IOSTAT= ios Input/Output status, integer variable. Upon return, ios is
zero if the statement was successful and returns a non-zero
value otherwise
ERR= err    is a label which the program will jump to if there is an error
FILE= fname is a character string denoting the file name
STATUS= sta is a character string that has to be either NEW, OLD or
SCRATCH. It shows the prior status of the file. A scratch file
is a file that is created when opened and deleted when closed
(or the program ends).
ACCESS= acc must be either SEQUENTIAL or DIRECT. The default is
SEQUENTIAL.
FORM= frm must be either FORMATTED or UNFORMATTED. The default is
FORMATTED.
RECL= rl    rl specifies the length of each record in a direct-access
file.
close([UNIT=]u[,IOSTAT=ios,ERR=err,STATUS=sta])
In this case sta is a character string which can be KEEP
(the default) or DELETE
o          read ([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err,
END=s)list-of-variables
o          write([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err,
END=s)list-of-variables

The ERR=err specifier defines which statement label the
program jumps to if an error occurs
The END=s specifier defines which statement label the
program jumps to if it reaches end-of-file
Note: Some unit numbers are reserved: 5 is standard input, 6
is standard output.

2.       Format statements
o   Syntax
o                     label   format(format-code)

o                 Example:

900 format (I4,F8.3)

o        Common format codes
o

A
text string
D
double precision numbers, exponent notation
E
real numbers, exponent notation
F
real numbers, fixed point format
I
integer
X
horizontal skip (space)
/
vertical skip (newline)

o

o                 Example:
o
o                    program io_example
o                       implicit none
o                       double precision t,x,y
o                       integer i,j,k
o
o                    t=1.0d0
o                    i=1
o                    write(*,100)t,i,j,y
o                100 format(1x,E15.6,2I3,' x=',f15.9)
o                    open(9,file='data.dat',status='old')
o                    write(*,*)i,j,k
o                    close(9)
o                101 format(i5,i2,i2)
o                    end
o
o
o
o

3.       Unformatted input/output
o           Form='unformatted'
Example:
c-------------------------------------
program rw
implicit none
double precision x,y,z
double precision u,v,t
integer ierr

x = 1.0d0
y = 2.0d0
z = 3.0d0

u = 4.0d0
v = 5.0d0
t = 6.0d0

open(9,file='temp.dat',form='unformatted',status='unknown')
write(9)x,y,z
write(9)u,v,t
close(9)

x = 0.0
y = 0.0
z = 0.0

u = 0.0
v = 0.0
t = 0.0

open(9,file='temp.dat',form='unformatted',status='old')
close(9)

write(*,*)'x,y,z:',x,y,z
write(*,*)'u,v,t:',u,v,t

x = 0.0
y = 0.0
z = 0.0

u = 0.0
v = 0.0
t = 0.0

open(9,file='temp.dat',form='unformatted',status='old')
close(9)
stop
10    continue
write(*,1)ierr
write(*,*)'x,y,z:',x,y,z
write(*,*)'u,v,t:',u,v,t
close(9,status='delete')
1     format(1x,'IOSTAT=',i3)
end
c-------------------------------------

4.      Format strings in read/write statements
Instead of specifying the format code in a separate format statement,
one can give the format code in the read/write statement directly. For
example, the statement
write (*,'(A, F8.3)') 'The answer is x = ', x
c     is equivalent to
write (*,990) 'The answer is x = ', x
990 format (A, F8.3)

5.         Implicit loops and repeat counts
6.                      program implicit_loop
7.                         implicit none
8.                         integer n,i,j
9.                         parameter (n=10)
10.                        double precision x(n),pi
11.
12.                     pi=4.0d0*datan(1.0d0)
13.                     do i=1,n
14.                         x(i) = sin((i-1)/(n-1.0)*pi)
15.                     end do
16.                     write(*,'(f6.3)')(x(j),j=1,n)
17.                     end

18.        Exercise
expression (x2+y2)1/2 in three different ways:
1.        Using a following equation: z1=(x2+y2)1/2
2. Using an equation with sqrt: z2 = sqrt(x2+y2))
3. Unwing a function which you need to write: z3=pythag(x,y).
Algorithm for pythag function:

1.         If abs(x) > abs(y)    =>   abs(x)*sqrt(1+(abs(y)/abs(x))2)

2.         If abs(y) = 0   =>   0

3.         Else abs(y)*sqrt((1+(abs(x)/abs(y))2)
Input file:
1.00 2.00
2.00 1.00
0.00 1.00
1.00 0.00
1.0e-260,2.0e-260
1.0e160, 2.0e160
Make the output file in teh following format:
o        Column 1: x
o        Column 2: y
o        Column 3: z1
o        Column 4: z2
o        Column 5: z3
o        Column 6: err1=abs((z1-z3)/z3)
o        Column 7: err2=abs((z2-z3)/z3)

```
DOCUMENT INFO
Shared By:
Categories:
Stats:
 views: 10 posted: 2/1/2010 language: English pages: 8