Tải bản đầy đủ (.ppt) (19 trang)

Giới thiệu về Fortran 90 - Bùi Hoàng Hải pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (150.62 KB, 19 trang )





Giới thiệu về Fortran 90
Giới thiệu về Fortran 90
Bùi Hoàng Hải
Bùi Hoàng Hải

Yêu cầu & Nội dung
Yêu cầu & Nội dung

Yêu cầu – đã nắm được fortran 77 (Nếu không thì tự đọc
bài giảng của PGS Phan Văn Tân)

Nội dung
o
Free form vs fixed form
Free form vs fixed form
o
Biến và khai báo biến
Biến và khai báo biến
o
Cấu trúc điều khiển
Cấu trúc điều khiển
o
Module
Module
o
Kiểu biến người dùng định nghĩa
Kiểu biến người dùng định nghĩa



Free form (f90) vs Fixed form (f77)
Free form (f90) vs Fixed form (f77)

Phần mở rộng file: .for vs .f90

Dòng lệnh không bị giới hạn về độ dài, không cần thụt
đầu dòng

Comment bắt đầu từ dấu ! Đến hết dòng

Dấu & nối dòng
o
Write(*,*), 'This is a long output line',
Write(*,*), 'This is a long output line',
&
&


' this is the second part'
' this is the second part'

Nhiều lệnh trên một dòng
o
A = 0.0 ; B = 1.0 ; C = 2.0
A = 0.0 ; B = 1.0 ; C = 2.0

Cấu trúc một chương trình
Cấu trúc một chương trình
PROGRAM program-name

IMPLICIT NONE ! Nên có phần này
[Phần khai báo]
[Phần thực thi]
[Các chương trình con]
END PROGRAM program-name

Phần khai báo
Phần khai báo

[Kiểu Biến], [Các thuộc tính] :: [Danh sách các biến]

Khai báo biến đơn:
o
Integer :: i, j, number_Tcs
Integer :: i, j, number_Tcs
o
Real :: Radius, Rmax, Vmax
Real :: Radius, Rmax, Vmax

Khai báo hằng số
o
Real, Parameter :: Pi=3.14156, g=9.81
Real, Parameter :: Pi=3.14156, g=9.81

Khai báo chuỗi ký tự
o
Character (Len=11) :: Str1
Character (Len=11) :: Str1
o
Character (Len=*), Parameter:: Str2 = “Hello"

Character (Len=*), Parameter:: Str2 = “Hello"

Phần khai báo
Phần khai báo

Khai báo mảng
o
Integer, Parameter :: Nx=101, Ny=101
Integer, Parameter :: Nx=101, Ny=101
o
Real, Dimension(Nx) :: Rx
Real, Dimension(Nx) :: Rx
o
Real, Dimension(Ny) :: Ry
Real, Dimension(Ny) :: Ry
o
Real, Dimension(Nx,Ny) :: U, V, W, SLp
Real, Dimension(Nx,Ny) :: U, V, W, SLp

Khai báo mảng động
o
Real, Dimension(:,:), Allocatable :: Var1,
Real, Dimension(:,:), Allocatable :: Var1,
Var2
Var2
o


o
Allocate(Var1(100,100))

Allocate(Var1(100,100))
o


o
DeAllocate(Var1)
DeAllocate(Var1)

Phép gán với mảng
Phép gán với mảng
o
Integer, Parameter :: Nx=121, Ny=101
Integer, Parameter :: Nx=121, Ny=101
o
Real, Dimension(Nx) :: Rx
Real, Dimension(Nx) :: Rx
o
Real, Dimension(Ny) :: Ry
Real, Dimension(Ny) :: Ry
o
Real, Dimension(Nx,Ny) :: A, B, C
Real, Dimension(Nx,Ny) :: A, B, C
o
A = B
A = B
o
A(1,:) = Ry
A(1,:) = Ry
o
B(Ny,:) = Rx

B(Ny,:) = Rx

Dịch 1 file f90 trong Cygwin
Dịch 1 file f90 trong Cygwin

File nguồn: test.f90
Integer :: i
Integer :: i
Do i=1,10
Do i=1,10
Write(*,*)i
Write(*,*)i
Enddo
Enddo
End
End

Dịch
o
g95 test.f90
g95 test.f90

Hoặc
o
g95 test.f90 –o test.out
g95 test.f90 –o test.out

Chạy chương trình
o
./test.out

./test.out

Module
Module

FORTRAN định nghĩa 3 khái niệm đơn vị chương trình
là: Chương trình chính, Chương trình con ngoài, và
module.

Modul khác với các chương trình con ở 2 điểm quan
trọng:
o
Module có thể chứa trong đó nhiều hơn một chương trình con
(được gọi là các chương trình con module);
o
Modul có thể chứa những câu lệnh khai báo và đặc tả mà
chúng có thể tham chiếu được đối với tất cả các đơn vị
chương trình có sử dụng modul

Các module cũng có thể được biên dịch một cách độc
lập

Để sử dụng module hãy dùng câu lệnh khai báo USE
ngay đầu chương trình:

USE Tên_Các_Modul_được_sử_dụng

Một module này có thể sử dụng module khác

VD về module

VD về module

Module_mydata.f90
Module mydata
Module mydata
Implict none
Implict none
Integer, Parameter :: Nx=10
Integer, Parameter :: Nx=10
Real, Dimension(Nx) :: dat
Real, Dimension(Nx) :: dat
Contains
Contains
Subroutine init_data
Subroutine init_data


integer :: i
integer :: i


Do i=1,10
Do i=1,10


dat(i)=i
dat(i)=i


Enddo

Enddo
End Subroutine init_data
End Subroutine init_data
End Module mydata
End Module mydata

VD về module
VD về module

main.f90
Program main
Program main
Implicit none
Implicit none
Use mydata
Use mydata
Call init_data ! Gọi ct con từ module
Call init_data ! Gọi ct con từ module
Do i=1,Nx ! Sử dụng dữ liệu của module
Do i=1,Nx ! Sử dụng dữ liệu của module


write(*,*)dat(i)
write(*,*)dat(i)
Enddo
Enddo
End Program main
End Program main

Biên dịch (sẽ báo lỗi)

o
G95 main.f90 module_mydata.f90
G95 main.f90 module_mydata.f90

Quan hÖ gi÷a c¸c ®¬n v ch ¬ng tr×nhị

Kiểu người dùng định nghĩa
Kiểu người dùng định nghĩa

Để nhóm các kiểu biến khác nhau thành 1 kiểu biến mới

Cú pháp
Type tên_kiểu
Type tên_kiểu
[danh sách khai báo các biến (dữ_liệu)]
[danh sách khai báo các biến (dữ_liệu)]
End Type tên_kiểu
End Type tên_kiểu

Sử dụng
Type(Tên_kiểu) :: [Tên biến]
Type(Tên_kiểu) :: [Tên biến]
Tên_biến%dữ_liệu = …
Tên_biến%dữ_liệu = …

VD Kiểu người dùng định nghĩa
VD Kiểu người dùng định nghĩa
module pipedef
type pipe
real diameter

real flowrate
integer length
character(len=10) :: flowtype
end type pipe
end module pipedef program

VD Kiểu người dùng định nghĩa
VD Kiểu người dùng định nghĩa
Program main
use pipedef
type(pipe) water1, gas1
water1 = pipe(4.5,44.8,1200,"turbulent")
gas1%flowrate = 91.284
gas1%length = 2550
gas1%flowtype = 'laminar'
gas1%diameter = 14.9
end program

Để viết chương trình sáng sủa và ít lỗi
Để viết chương trình sáng sủa và ít lỗi

Luôn dùng implicit none

Các khối cấu trúc điều khiển (if, do,…) khi mở một
khối cần đóng khối ngay sau đó, tiếp theo mới chèn các
lệnh vào trong khối

Các khối lệnh cần phân cấp theo mức độ thò thụt của
dòng lệnh (thông thường 1 cấp 3 space)


Sử dụng comment khi cần

Tên biến: sensible, không quá ngắn hoặc quá dài

Hạn chế sử dụng lệnh goto và nhãn

Bài tập – (viết trên ngôn ngữ f90)
Bài tập – (viết trên ngôn ngữ f90)

BT1 – Nhập từ bàn phím ba số a, b, c, giải và
biện luận phương trình bậc 2 với các hệ số nói
trên

BT2 - Ký hiệu X là mảng một chiều gồm 100 phần
tử. Viết chương trình:
o
a) Gán 100 số nguyên dương đầu tiên cho các phần tử
tương ứng của X, từ phần tử có chỉ số lớn nhất đến
phần tử có chỉ số nhỏ nhất;
o
b) Gán 50 số nguyên dương lẻ đầu tiên cho 50 phần tử
đầu tiên và 50 số nguyên dương chẵn đầu tiên cho 50
phần tử tiếp theo của X;
o
c) Gán 100 số tự nhiên đầu tiên chia hết cho 3 lần
lượt cho các phần tử của X.
o
Mỗi một trường hợp như vậy, hãy in kết quả lên màn
hình thành 10 dòng, mỗi dòng 10 số sao cho thẳng hàng
thẳng cột.


Bài tập – (viết trên ngôn ngữ f90)
Bài tập – (viết trên ngôn ngữ f90)

BT2 – Tạo một module định nghĩa kiểu dữ liệu thời
gian: module_datetime,
o
trong đó định nghĩa kiểu dữ liệu mới là
trong đó định nghĩa kiểu dữ liệu mới là
datetime có chứa các biến thành viên:
datetime có chứa các biến thành viên:
year, month, day, hour
year, month, day, hour
o
Viết chương trình con module kiểm tra tính
Viết chương trình con module kiểm tra tính
đúng đắn của một biến datetime
đúng đắn của một biến datetime
o
Viết chương trình con module để cộng một
Viết chương trình con module để cộng một
số giờ (<24) vào một biến datetime
số giờ (<24) vào một biến datetime
o
Viết chương trình chính sử dụng module
Viết chương trình chính sử dụng module
trên
trên

Buổi sau

Buổi sau

Biên dịch fortran trên linux

Thực hành & chữa bài tập

×