Monday, December 12, 2016

Research Note #6 - Beberapa Script Fortran Serba Guna

Berikut ini adalah beberapa fungsi/statement Fortran yang biasa digunakan untuk berbagai keperluan (termasuk riset). Daftar script ini bisa diperbaharui kapan saja, sesuai kebutuhan. Yang perlu diperhatikan, untuk script Fortran pada tulisan ini, saya menggunakan gfortran compiler (GCC) versi 4.8.1 di Windows (MinGW).

Catatan:
(Last updated: Dec 14, 2016)
Judul tulisan ini sedikit diubah agar tidak bias. Versi GCC juga ditambahkan.

Selamat menikmati.

1. Deklarasi variabel
implicit none
character :: line,the_str,inputfile,outputfile
character(len=100) :: thn,yearstr
integer :: year,month,day,maxyear,maxmonth,maxday,obstime
integer*2 :: tmi_tot_px,tmi_rain_px,pr_tot_px,pr_rain_px
integer*4 :: comb_tot_px, comb_rain_px
real :: tmi_mean_rain,pr_mean_rain,comb_mean_rain
parameter (XDIM=1440,YDIM=720,undef=-999)

Catatan:
  • Karakter '::' d antara jenis variabel dan nama variabel bisa diabaikan.
  • 'Implicit none' diletakkan sebelum deklarasi variabel. Tanpa 'implicit none', variabel dengan nama i, j, k, l, m dan n akan dianggap integer, dan lainnya dianggap real. Statement ini harus digunakan untuk menghindari kebingungan yg akan muncul nantinya.
  • Data character tanpa opsi 'len' hanya memuat 1 karakter.
  • Integer *2 untuk integer 2 byte, integer*4 untuk integer 4 byte.
  • Parameter digunakan untuk menentukan konstanta.

2. Deklarasi array
real, dimension (1:XDIM,1:YDIM) :: grid_val 

atau

real grid_val(XDIM, YDIM)
Catatan:
  • Dimension berguna untuk menentukan awal indeks array (misalnya 0, 1 atau 2 dll). Tanpa dimension, indeks array akan dimulai dari 1.

3. Membuka file binary
open(unit_no,file=[filename],form='unformatted', access='direct',recl=[byte]*[xdim]*[ydim],status=[fstatus])
...
close(unit_no)

Catatan:
  • Unit_no adalah integer antara 1 sampai 99. Hindari 5 dan 6 karena merupakan reserved number (5=standard input, 6=standard output).
  • Filename harus berjenis karakter. 
  • Recl harus ada. Byte bisa 2 (2 byte) atau 4 (4 byte). 
  • Fstatus bisa 'old' bila hanya membuka, 'replace' bila ingin memodifikasi file.  

4. Membuka file teks/ASCII
open(unit_no,file=[filename],form='formatted',status=[status])
...
close(unit_no)

Catatan:
  • Opsi form bisa diabaikan.
  • Status sama aturannya dengan file binary.
  • Aturan lain sama dengan file binary.

5. Looping
Ada beberapa cara. Misalnya:
do n=[start],[end] 
 ...
end do 

atau,

n=[start]
do while(n<=[end])
   ...
  n=n+1
end do

Catatan:
  • Looping dengan 'while' harus menyertakan persamaan untuk counter (misal n=n+1) untuk menghindari looping tanpa akhir, kecuali pada kasus-kasus tertentu.

6. Komentar
Komentar bisa menggunakan 1 baris penuh (dengan 'c') atau pada baris yang sama di belakang script (dengan '!').

c --------------- The start of MAJOR comments #1 ----------------------------------
c This part will determine the starting and ending time of processed data files
c and observation time/type

write(*,'(a)',advance='no') ' Enter the starting year: '


day=1    ! Change this only if you want to start day other than 1. 


7. Kondisional
Ada dua jenis statement kondisional yang biasa digunakan. Yang pertama dan paling umum digunakan adalah (if .. then .. else .. end if) untuk dua atau tiga pilihan. Bila pilihannya banyak, bisa menggunakan (select .. case .. end select).

if ([cond1] [operator1] [cond2] [operator2] ... [condn]) then
 ...
else
 ...
end if

Catatan:

  • Operator bisa berupa boolean (misal: '.and.', 'or' dll) atau matematika (misal: '==', '=/', '<=' dll)

select case ([var_name])
case ([cond1,cond2:cond3])
 ...
case ([condA,condB,...,condn])
 ...
case default
 ...
end select

Catatan:

  • Koma digunakan untuk memisahkan kondisi tunggal, colon (:) digunakan untuk kondisi dengan selang tertentu.
  • 'Case default' kurang lebih sama dengan 'else'.

8. Membaca file teks/ASCII baris demi baris sampai akhir file
do while (1.eq.1)                       
read(unit_no,END=500) line 
 ... 
end do
 ...
500 [CONTINUE or some script]
end

Catatan:
  • Unit_no (unit number) harus sama dengan unit_no file yang hendak dibaca .
  • Line number tidak harus 500. 

9. Memasukkan data file binary ke dalam array
Untuk array 2 dimensi (misalnya matriks array 10x10):

implicit none
parameter (XDIM=10,YDIM=10)
 ... 
do y=1,10
 do x=1,10
  read([unit_no],rec=1) ((rain(x,y),x=1,XDIM),y=1,YDIM)
 end do
end do  

Catatan:
  • Rec=1 untuk akses direct.
  • Untuk array 3 dimensi dst, tinggal tambahkan kurung di belakang statement read. Jangan lupa deklarasikan komponen arraynya. Contoh:
  read([unit_no],rec=1) (((rain(x,y,z),x=1,XDIM),y=1,YDIM),z=1,ZDIM)
     
 (Bersambung ...)

No comments:

Post a Comment