Showing posts with label Bhs Indonesia. Show all posts
Showing posts with label Bhs Indonesia. Show all posts

Thursday, April 30, 2026

Research Note #33 - Instalasi WRF-Chem 4.7.1 + KPP di HPC BRIN (Mahameru)

Kinetic PreProcessor (KPP) adalah tool untuk menerjemahkan reaksi kimia kompleks ke dalam kode program (misal Fortran atau C) dan umumnya digunakan pada pemodelan kimia atmosfer, termasuk WRF-Chem. Dengan sekian banyaknya pilihan opsi mekanisme kimia yang dapat digunakan pada WRF-Chem, KPP membantu developer untuk mengaplikasikan skema kimia kompleks yang mereka bangun tanpa harus 'mengganggu' kode program WRF-Chem itu sendiri. Beberapa mekanisme kimia yang menerapkan reaksi kimia kompleks, misalnya untuk simulasi fase gas pada secondary aerosol, antara lain: MOZART, MOZCART, RADM, MOSAIC dll. Dengan kata lain, bila ingin menggunakan mekanisme-mekanisme tersebut untuk simulasi, WRF-Chem yang digunakan wajib hukumnya dikompilasi dengan dukungan KPP.

Tulisan ini berasumsi bahwa environment yang digunakan adalah HPC BRIN, dengan bash shell, gcc 12.2.0 dan pembaca telah mengetahui dasar-dasar kompilasi WRF-Chem ver. 4.7.1 (misal, sudah memiliki library-library yang dibutuhkan, seperti NetCDF, MPICH dll). Bila belum, silakan membaca tulisan berikut: https://sketsa-langit.blogspot.com/2025/10/research-note-29-instalasi-wrf-chem-di.html.

Berikut langkah-langkah kompilasi WRF-Chem dengan KPP pada HPC BRIN. 

Temukan path library flex di sistem. Library flex ini akan digunakan untuk kompilasi KPP:

module load gcc flex
module show flex

------------------------------------------------------------------------------------------------------------------------------------------------------------
   /mgpfs/shared/apps/mod/library/flex/2.6.4:
------------------------------------------------------------------------------------------------------------------------------------------------------------
load("gcc/12.2.0")
whatis("flex 2.6.4 - The fast lexical analyzer generator")
setenv("FLEXHOME","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0")
prepend_path("PATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/bin")
prepend_path("CPATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/include")
prepend_path("INCLUDE_PATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/include")
prepend_path("INCLUDE_LIBRARY_PATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/include")
prepend_path("LIBRARY_PATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/lib")
prepend_path("LD_LIBRARY_PATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/lib")
prepend_path("INFOPATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/share/info")
prepend_path("MANPATH","/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/share/man")


Deklarasikan WRF_CHEM, WRF_KPP dan FLEX_LIB_DIR di environment bash:

export WRF_CHEM=1
export WRF_KPP=1
export FLEX_LIB_DIR=/mgpfs/shared/apps/app/flex/2.6.4/GCC/12.2.0/lib

Masuk ke interactive-node HPC karena proses kompilasi ini akan memakan memori sistem yang besar. Proses kompilasi pada login-node hampir bisa dipastikan akan gagal (akan di-kill oleh sistem).

srun --partition=interactive --pty /bin/bash

Setelah masuk ke interactive-node, masuk ke direktori WRF dan jalankan konfigurasi kompilasi wrf.

./clean -aa
./configure

Pilih 34 (dmpar) untuk GCC compiler. Untuk nesting, pilih 1 (basic).

Pastikan proses konfigurasi berjalan lancar, tanpa ada pesan masalah pada compiler. Bila ada masalah, bereskan dulu masalah compiler, lalu lakukan konfigurasi ulang. Bila tak ada masalah, buka dan edit file configure.wrf.

Hilangkan 'time' pada deklarasi fortran compile 'FC':

FC = time $(DM_FC)  menjadi  FC = $(DM_FC)

Simpan file dan keluar dari configure.wrf. Selanjutnya, pada direktori WRF, buka dan edit file scan.h dan scan.y yang terdapat pada direktori chem/KPP/kpp/kpp-2.1/src/

Pada file scan.h (dan scan.y), temukan kode baris void yyerror( char * str ) ; pada baris ke-101 (390 pada scan.y), dan ubah menjadi void yyerror( const char * str ) ;. Simpan perubahan dan keluar dari kedua file tersebut.

Buka file compile_wkc pada direktori chem/KPP dan ubahlah baris kode pada baris 121:

 $WKC_HOME/util/wkc/tuv_kpp FIRST ../../inc/

menjadi:

 $WKC_HOME/util/wkc/tuv_kpp FIRST ../../../../inc/

Simpan perubahan dan keluar dari file. Sekarang anda bisa melakukan kompilasi wrf.

./compile -j 2 em_real >& compile.log

Proses kompilasi akan memakan waktu kurang lebih 30 menit - 1 jam. Pastikan tidak ada Error yang tercatat pada file compile.log dan file-file exe berhasil dibuat.

--->                  Executables successfully built                  <---

-rwxr-xr-x 1 ardh003 researcher 63915712 Apr 30 10:35 main/ndown.exe
-rwxr-xr-x 1 ardh003 researcher 64055224 Apr 30 10:35 main/real.exe
-rwxr-xr-x 1 ardh003 researcher 57765544 Apr 30 10:35 main/tc.exe
-rwxr-xr-x 1 ardh003 researcher 85490080 Apr 30 10:29 main/wrf.exe

==========================================================================

Friday, October 17, 2025

Research Note #32 - Instalasi ARWpost pada HPC BRIN

Update: 27 April 2026 (fix untuk WRF-Chem)

ARWpost adalah salah satu tool untuk mengolah keluaran (post-processor) dari WRF. Tool ini sebenarnya sudah termasuk 'kuno', dengan versi terakhir yang bisa diunduh adalah V3.1 (2 Maret 2011). Lalu kenapa saya pake tool ini? Alasannya karena keluaran dari ARWpost ini adalah data dalam format GrADS, dan saya sudah sangat terbiasa (dan nyaman) pake GrADS untuk analisis data.

Masalah utama dari ARWpost ini (seperti yg sudah-sudah) adalah kode programnya yang jadul, sehingga bila diinstall dengan compiler modern akan terjadi error, sehingga untuk instalasi pada Mahameru, diperlukan sedikit trik.

Pertama, download source ARWpost pada link ini. Ekstrak dan jalankan, script configurenya. Sebelum menjalankan configure, pastikan anda sudah memuat path NetCDF aktif pada enviroment sistem.

$ mkdir ARWpost
$ cd ARWpost
$ wget https://www2.mmm.ucar.edu/wrf/src/ARWpost_V3.tar.gz
$ tar -xzvf  ARWpost_V3.tar.gz
$ ./configure
Will use NETCDF in dir: /mgpfs/home/ardh003/source/wrf_dependencies/netcdf
------------------------------------------------------------------------
Please select from among the following supported platforms.
   1.  PC Linux i486 i586 i686 x86_64, PGI compiler
   2.  PC Linux i486 i586 i686 x86_64, Intel compiler
   3.  PC Linux i486 i586 i686 x86_64, gfortran compiler
Enter selection [1-3] : 3
------------------------------------------------------------------------
Configuration successful. To build the ARWpost, type: compile
------------------------------------------------------------------------

Sampai sini jangan langsung compile, karena perlu beberapa modifikasi pada file configure.arwp dan Makefile.

Penting: 
Bila tidak menggunakan WRF-Chem, silakan lanjut ke configure.arwp. 

Bila menggunakan WRF-Chem, perlu ada modifikasi pada source code salah satu script Fortran dalam direktori /src. Modifikasi ini diperlukan agar ARWpost bisa melakukan identifikasi header pada file wrfout yang akan diproses. Tanpa modifikasi ini, wrfout masih bisa diproses namun ARWpost tidak akan melakukan interpolasi pada level model (meskipun opsi interpolasi diaktifkan pada namelist.ARWpost) karena wrfout dianggap bukan keluaran wrf.exe. Tanpa interpolasi, beberapa fungsi diagnostic ARWpost, misalnya cape, cin dll tidak akan bisa aktif dan file GrADS yang dihasilkan hanya akan memiliki level vertikal yang linear, tidak logaritmik seperti level tekanan pada umumnya.

Buka /src/input_module.f90, dan cari blok berikut:

!! Any unknown program (including WRFSI) will be 0
      iprogram = 0
      title(:) = ' '
      istatus = NF_GET_ATT_TEXT(ncid, nf_global, 'TITLE', title)
      IF ( INDEX(title,'OUTPUT FROM GEOGRID') /= 0 ) iprogram = 1 !! geogrid output
      IF ( INDEX(title,'OUTPUT FROM GRIDGEN') /= 0 ) iprogram = 1 !! old geogrid output
      IF ( INDEX(title,'OUTPUT FROM METGRID') /= 0 ) iprogram = 3 !! metgrid output
      IF ( INDEX(title,'OUTPUT FROM OBSGRID') /= 0 ) iprogram = 3 !! obsgrid output
      IF ( INDEX(title,'OUTPUT FROM REAL_EM') /= 0 ) iprogram = 6 !! real.exe output
      IF ( INDEX(title,'OUTPUT FROM WRF') /= 0 )     iprogram = 8 !! wrf.exe output
      IF ( iprogram == 0 ) THEN
         print*," "
         print*,"  WARNING --- I do not recognize this data."
         print*,"             ",trim(title)
         print*,"              Will make an attempt to read it."
         print*," "
      END IF

Sisipkan baris kode setelah IF ( INDEX(title,'OUTPUT FROM WRF') /= 0 )     iprogram = 8 !! wrf.exe output

Kodenya:

IF ( INDEX(title,'OUTPUT FROM *             PROGRAM:WRF-Chem V4.7.1 MODEL') /= 0 ) iprogram = 8 !! wrfchem output

Setelah itu, simpan file fortran yang telah dimodifikasi tersebut, dan lanjutkan ke configure.arwp.

$ vi configure.arwp

Modifikasi baris C-Pre-Processor (CPP) pada file tersebut menjadi:

CPP = gfortran -E -x f95-cpp-input -P

Kemudian tambahkan argumen untuk Fortran compiler (FFLAGS) sehingga menjadi seperti ini:

FFLAGS          =       -ffree-form -O -fno-second-underscore -fconvert=big-endian -frecord-marker=4 -std=legacy -fallow-argument-mismatch

Lalu simpan perubahan dan keluar dari file configure.arwp. Berikutnya, masuk ke direktori /src dan modifikasi file Makefile.

$ cd src
$ vi Makefile

Lalu tambahkan linker untuk Fortran compiler. Perhatikan urutannya.
 
ARWpost.exe: $(OBJS)
        $(FC) $(FFLAGS) $(LDFLAGS) -o $@ $(OBJS)  \
                -L$(NETCDF)/lib -I$(NETCDF)/include -lnetcdff -lnetcdf

Setelah itu simpan dan keluar dari Makefile. Sekarang anda bisa menjalankan compilernya.

$ ./compile

Pastikan tidak ada pesan error pada display. Berikut contoh beberapa baris terakhir proses compile bila tidak terjadi error.

gfortran -ffree-form -O -fno-second-underscore -fconvert=big-endian -frecord-marker=4 -std=legacy -fallow-argument-mismatch  -o ARWpost.exe module_model_basics.o constants_module.o gridinfo_module.o ARWpost.o input_module.o output_module.o module_map_utils.o misc_definitions_module.o module_date_pack.o module_debug.o process_domain_module.o module_get_file_names.o module_interp.o module_basic_arrays.o module_diagnostics.o module_arrays.o module_pressure.o module_calc_height.o module_calc_pressure.o module_calc_theta.o module_calc_tk.o module_calc_tc.o module_calc_td.o module_calc_td2.o module_calc_rh.o module_calc_rh2.o module_calc_uvmet.o module_calc_slp.o module_calc_dbz.o module_calc_cape.o module_calc_wdir.o module_calc_wspd.o module_calc_clfr.o  \
        -L/mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib -I/mgpfs/home/ardh003/source/wrf_dependencies/netcdf/include -lnetcdff -lnetcdf

Setelah itu pastikan file ARWpost.exe sudah terdapat pada direktori.

$ ls -alh ARWpost.exe
lrwxrwxrwx 1 ardh003 researcher 15 Oct 16 15:09 ARWpost.exe -> src/ARWpost.exe

Pastikan ARWpost.exe menggunakan library yg benar:

$ ldd ARWpost.exe
 linux-vdso.so.1 (0x00007ffd717be000)
        libnetcdff.so.7 => /mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib/libnetcdff.so.7 (0x000014756b874000)
        libnetcdf.so.15 => /mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib/libnetcdf.so.15 (0x000014756b564000)
        libgfortran.so.5 => /mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib64/libgfortran.so.5 (0x000014756b097000)
        libm.so.6 => /lib64/libm.so.6 (0x000014756ad15000)
        libgcc_s.so.1 => /mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib64/libgcc_s.so.1 (0x000014756aaf6000)
        libquadmath.so.0 => /mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib64/libquadmath.so.0 (0x000014756a8b1000)
        libc.so.6 => /lib64/libc.so.6 (0x000014756a4ec000)
        libhdf5_hl.so.100 => /mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib/libhdf5_hl.so.100 (0x000014756a2c7000)
        libhdf5.so.103 => /mgpfs/home/ardh003/source/wrf_dependencies/netcdf/lib/libhdf5.so.103 (0x0000147569cf7000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000147569af3000)
        libz.so.1 => /mgpfs/home/ardh003/source/wrf_dependencies/grib2/lib/libz.so.1 (0x00001475698d8000)
        /lib64/ld-linux-x86-64.so.2 (0x000014756bb33000)

Bila tidak ada error/library yang hilang, anda bisa langsung memodifikasi file konfigurasi namelist.ARWpost dan menjalankan ARWpost.exe. 

Thursday, October 16, 2025

Research Note #31 - Contoh Perintah Linux dan Slurm untuk Bekerja di HPC BRIN (updated)

Berikut beberapa perintah yang berguna untuk bekerja menggunakan fasilitas parallel computing di HPC BRIN (Mahameru). Perintah-perintah ini umumnya digunakan untuk mengetahui spesifikasi sistem yang digunakan sebelum menjalankan batch job pada slurm workload manager.

1. Mengetahui spesifikasi lengkap HPC

$ lscpu

2. Mengetahui jumlah processor pada node saat ini

$nproc
128

128 adalah jumlah cpu pada node yang aktif.

3. Mengetahui konfigurasi cluster HPC (Slurm)

$ sinfo -p medium-small -o "%N %c %m %G"
NODELIST CPUS MEMORY GRES
trembesi[51-72] 128 256000 (null)

trembesi[51-72] adalah node yang digunakan pada partisi medium-small, dengan jumlah cpu dan memori max masing-masing 128 dan 256 GB.

4. Submit dan menghentikan batch job (Slurm)

$ sbatch <script program.sh>  --> menjalankan script untuk batch job 

$ scancel -u <nama_user> --> menghentikan batch job oleh <nama_user>

5. Melihat status batch job dari user (slurm)

$ squeue -u 'whoami' --> melihat status batch job oleh user saat ini

$ squeue -u <nama_user> --> melihat status batch job oleh <nama_user>

$ sqeueu -all --> melihat status batch job oleh semua user

6. Melihat daftar seluruh partisi yang tersedia pada HPC (slurm)

$ sinfo -all

7. Masuk ke mode interaktif (slurm)

$ srun --partition=interactive --pty /bin/bash

Setelah masuk ke mode interaktif, anda bisa menjalankan script/program yang anda inginkan. Bila ingin keluar dari mode interaktif, ketik perintah 'exit' pada prompt shell.



Sunday, October 12, 2025

Research Note #30 - Instalasi Ncview dengan Miniconda3 di HPC BRIN

Conda adalah suatu package manager yang memungkinkan anda untuk menggunakan aplikasi scientific pada Linux tanpa harus repot menginstall/mengkonfigurasi library khusus pada sistem (seperti yg terjadi pada WRF-Chem). Dengan conda, anda dapat memilih instalasi aplikasi yang diinginkan dan menjalankannya pada environment khusus tanpa khawatir akan terjadi konflik dengan library lain pada system.

Pada tulisan ini, contoh aplikasi yang akan diinstall adalah ncview yang biasa digunakan untuk visualisasi data NetCDF (misal data domain WRF yang dibuat oleh geogrid). Salah satu kesulitan ketika instalasi ncview adalah tidak adanya library X11 untuk visualisasi pada server, terutama bila anda user biasa yang tidak punya akses admin untuk instalasi X11 pada sistem Linux. Pada HPC BRIN (Mahameru), ada beberapa jenis Conda yang bisa dipakai seperti Anaconda3 dan Miniconda3, tapi pada tulisan ini saya menggunakan Miniconda3.

Langkah pertama, pastikan conda sudah tersedia di module yang ada di Mahameru.

 $ module avail conda
----------- /mgpfs/shared/apps/mod/tools ---------------------
   Anaconda/3-2023.09-0
----------- /mgpfs/apps/modulefiles ---------------------------
   ai-ml/Anaconda/3-2023.09              earth/anaconda3/2019.07          earth/miniconda3/24.7.1
   bioinformatics/anaconda3/2023.09-0    earth/anaconda3/2023.09-0 (D)    earth/miniconda3/24.11.1 (D)

Berikutnya muat module miniconda3 24.11.1 dan periksa path 'bin'nya.

$ module load earth/miniconda3/24.11.1
$ module show earth/miniconda3/24.11.1
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
   /mgpfs/apps/modulefiles/earth/miniconda3/24.11.1:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
load("readline/8.2")
whatis("miniconda3 2023.09-0 - anaconda3 is environment management system.")
setenv("RHOME","/mgpfs/apps/earth/apps/miniconda3/24.11.1")
prepend_path("PATH","/mgpfs/apps/earth/apps/miniconda3/24.11.1/bin")
prepend_path("LIBRARY_PATH","/mgpfs/apps/earth/apps/miniconda3/24.11.1/lib")
prepend_path("LD_LIBRARY_PATH","/mgpfs/apps/earth/apps/miniconda3/24.11.1/lib")
prepend_path("MANPATH","/mgpfs/apps/earth/apps/miniconda3/24.11.1/share/man")
help([[
        This module is for use of earth/miniconda3/24.11.1.
        use example:
            $ module load earth/miniconda3/24.11.1
]])

Berikutnya, muat path bin miniconda3 ke environment. Bila dilakukan dengan benar, kita dapat menjalankan conda pada shell, misal untuk melihat versi miniconda.

$ export PATH=/mgpfs/apps/earth/apps/miniconda3/24.11.1/bin:$PATH
$ conda --version
conda 25.1.1

Bila conda sudah bisa dijalankan, selanjutnya inisiasi conda pada shell. Perhatikan prompt shell berubah setelah aktivasi (anda masuk ke environment conda). 

$ source /mgpfs/apps/earth/apps/miniconda3/24.11.1/etc/profile.d/conda.sh
$ conda activate
(base) $

Setelah masuk ke environment conda, buat environment baru (sebut saja 'wrfvis') dan install ncview dan netcdf4. NetCDF pada conda ini tidak ada hubungannya alias terisolasi dari NetCDF yang sudah terinstall pada sistem). Tunggu sampai proses instalasi selesai, lalu aktifkan wrfvis.

(base) $ conda create -n wrfvis -c conda-forge ncview netcdf4
(base) $ conda activate wrfvis

Setelah wrfvis aktifkan, anda bisa menjalankan ncview untuk melihat isi data NetCDF. Tentu saja, X-server (misal X-ming) sudah harus terinstall dan aktif pada ssh client yang anda gunakan.

(wrfvis) $ ncview WPS/geo_em.d01.nc

Untuk keluar dari environment conda yang saat ini aktif:

(wrfvis) $ conda deactivate
$

Agar tidak perlu repot memuat conda ke environment tiap kali login, tambahkan dua baris ini pada file .bashrc.

export PATH=/mgpfs/apps/earth/apps/miniconda3/24.11.1/bin:$PATH
source /mgpfs/apps/earth/apps/miniconda3/24.11.1/etc/profile.d/conda.sh

Selanjutnya, anda bisa langsung masuk-keluar environment conda.

conda activate wrfvis
coda deactivate

Thursday, October 9, 2025

Research Note #29 - Instalasi WRF-Chem di HPC BRIN (Mahameru)

Last edited on 16-10-2022

Instalasi model WRF itu selalu menantang (baca: bikin stress), apalagi kalau terakhir kali installnya itu lebih dari 5 tahun yang lalu. Butuh waktu untuk mereview ulang langkah-langkah yang dulu pernah dilakukan, termasuk merefresh ilmu per-Linux-an yang sudah lumayan lama terlupa. Untungnya, berkat catatan-catatan proses instalasi njelimet yang masih tersimpan rapih di blog ini, ditambah dengan bantuan asisten virtual yang setia mendampingi (baca: chatGPT), akhirnya WRF bisa terinstall di HPC BRIN (selanjutnya kita sebut saja Mahameru). Yang lebih bikin senang, yg terinstall bukan cuma WRF, tapi juga WRF-Chem, dan ada beberapa hal baru yang saya pelajari dari proses instalasi ini.

Secara umum, proses intalasi model WRF-Chem di Mahameru hampir sama dengan Oakforest UTokyo dulu, dengan beberapa trik baru. Kalau dirangkum prosesnya kurang lebih seperti ini:

  1. Pastikan jenis C dan Fortran compiler yang tersedia di sistem. Mahameru menggunakan gcc dan gfortran, berbeda dengan Oakforest yang menggunakan icc dan ifort.  
  2. Install library-library yg dibutuhkan WRF, seperti NetCDF, grib2, Jasper, LibPNG dll. Sebagian library ini sudah tersedia di Mahameru, tinggal di-load saja modulnya. Untuk kasus saya, seluruh library ini saya install kembali di direktori user saya. Kenapa? Karena kl misal ada masalah, akan lebih gampang melacak dan memodifikasi path library-nya tanpa harus memuat ulang modul yang ada di sistem.
  3. Cara paling mudah instalasi library adalah dengan mengikuti panduan yang ada di website ini. Ikuti saja langkah-langkahnya sampai sebelum instalasi WRF/WPS, kecuali untuk MPICH, WRF dan WPS. MPICH tidak digunakan karena Mahameru sudah menggunakan OpenMPI untuk parallel computing. Instalasi WRF/WPS di Mahameru juga perlu beberapa trik khusus yang tidak ada di panduan tersebut.
  4. Download WRF dan WPS terbaru via github. Ini termasuk hal baru karena sebelumnya saya download manual dari website WRF (UCAR). Bedanya, download WRF via github memungkin modul WRF seperti Chem, WRFDA dll otomatis terunduh, jadi tidak perlu didownload satu-per-satu lagi. Praktis.
  5. Mulai dengan konfigurasi kompilasi WRF dahulu. Bila menggunakan bash shell, pastikan WRF_CHEM=1 dan NETCDF_classic=1 sudah tersimpan di environment. Jalankan configure script, pilih opsi #34 (dmpar, gcc/gfortran) dan basic nesting (#1). Pastikan proses configure berjalan normal.
  6. Untuk WRF-Chem, pastikan YACC (Yet Another Compiler-Compiler) sudah terinstall. Bila tidak ada (di Mahameru tidak ada), lakukan instalasi manual dengan Bison (YACC sudah include di dalamnya). Jangan lupa, deklarasikan pathnya, misal: export YACC="$CUSLIB/bison/bin/yacc -d". Bison bisa diunduh di sini.
  7. Trik pertama. Setelah configure selesai, edit file configure.wrf, dan hilangkan 'time' pada bagian deklarasi variabel FC (fortran compiler). Misal:   FC  =  time $(DM_FC) menjadi  FC  =  $(DM_FC). Kenapa ini penting? Karena script compiler WRF menggunakan 'time' untuk mencatat proses kompilasi, sedangkan Mahameru tidak memiliki modul 'time' ini, sehingga kalau script configure.wrf tidak diubah, maka proses kompilasi nantinya akan gagal (dikenal juga dengan Error 127).
  8. Trik berikutnya, jalankan kompilasi dengan batch job di Mahameru. Kenapa harus pakai batch job? Proses kompilasi ini memakan memori yg besar, sehingga bila dijalankan langsung dari login node (shell tempat anda mulai login), akan ada suatu saat di mana sistem akan menghentikan proses kompilasi secara paksa (kill/terminate) karena batasan memori untuk login node (dikenal juga dengan Error 1). Untuk instalasi ini, saya menggunakan opsi  #SBATCH --mem-per-cpu=16G pada script batch job untuk memastikan kompilasi mendapat alokasi yang cukup. Contoh script ada di catatan 3 di bawah.
  9. Bila proses kompilasi berjalan lancar, beberapa file executable akan tersedia di direktori /main WRF, antara lain: real.exe, wrf.exe, ndown.exe dan tc.exe. Kalau tidak ada, ya berarti proses kompilasi gagal dan kompilasi WPS selanjutnya tidak akan bisa dilakukan.
  10. Untuk WPS, pastikan library fortran yg dibutuhkan sudah dimuat pada environment. Bila belum, jalankan: export LD_LIBRARY_PATH=$NETCDF/lib64, di mana $NETCDF adalah direktori library netcdf yg aktif digunakan. Pastikan juga WRF_DIR=[direktori WRF] karena WPS perlu executable WRF untuk mengkompilasi WPS.
  11. Jalankan script configure WPS, pilih opsi #1 (serial), dan pastikan proses configure lancar. Bila ada pesan "Your Fortran + NETCDF did not run successfully" itu artinya langkah 10 di atas msh belum benar.
  12. Jalankan script kompilasi WPS. Proses ini bisa dilakukan di login node dan tidak sampai 5 menit selesai. Bila proses lancar, akan ada tiga file executable baru di direktori WPS: geogrid.exe, metgrid.exe dan ungrib.exe.
  13. Pastikan ketiga file tadi terhubung dengan library yang dibutuhkan dengan menggunakan perintah 'ldd'. Misalnya: ldd geogrid.exe. Kalau tidak ada masalah, seharusnya sistem akan menunjukkan link ke tiap library untuk file tersebut tanpa ada pesan error.


Catatan #1: WRF-Chem yang diinstall tidak menggunakan KPP Library

Catatan #2:
Dengan asumsi langkah 1-4 tidak ada masalah, saya menggunakan konfigurasi berikut untuk file ~/.bashrc, supaya langkah 5 dst tidak perlu capek-capek memuat konfigurasi ke environment sistem tiap kali login. Konfigurasi ini bisa berbeda-beda untuk tiap orang/user dan sistemnya.

export CUSLIB=$HOME/source/wrf_dependencies
export NETCDF=$CUSLIB/netcdf
export LD_LIBRARY_PATH=$NETCDF/lib:$CUSLIB/grib2/lib:$CUSLIB/flex/lib:$NETCDF/lib64:/opt/ohpc/pub/mpi/openmpi4-gnu12/4.1.4/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/ohpc/localpub/libs/hwloc/lib:$LD_LIBRARY_PATH
export PATH=$NETCDF/bin:$HOME/opengrads/Contents:/opt/ohpc/pub/mpi/openmpi4-gnu12/4.1.4/bin:$PATH
export JASPERLIB=$CUSLIB/grib2/lib
export JASPERINC=$CUSLIB/grib2/include
export YACC="$CUSLIB/bison/bin/yacc -d"

Catatan #3: 
Script batch job untuk instalasi WRF-Chem di Mahameru (untuk mencegah Error 1):

#!/bin/bash
#SBATCH --job-name=insjob
#SBATCH --ntasks=1
#SBATCH --partition=short
#SBATCH --cpus-per-task=4
#SBATCH --mem-per-cpu=16G
module load  openmpi4/4.1.4
export LD_LIBRARY_PATH=/opt/ohpc/pub/mpi/openmpi4-gnu12/4.1.4/lib:$LD_LIBRARY_PATH
export PATH=/opt/ohpc/pub/mpi/openmpi4-gnu12/4.1.4/bin:$PATH
# Your script goes here
./compile em_real >& log.compile


Wednesday, September 24, 2025

Ressurrection

Dua setengah tahun ... Cukup lama blog ini tertidur. Mungkin sekarang sudah waktunya bangkit kembali. Merajut kembali cita dan cerita yang telah sekian lama mati suri.

I'll be back soon .... :-)

 

Thursday, June 22, 2017

Gaijin Story #10 - Income Tax Return dan Asuransi Kesehatan Nasional Jepang


Februari 2017 adalah salah satu bulan tersibuk selama saya tinggal di Jepang. Saat itu anak pertama lahir dan saya lumayan kelimpungan mengurus berkas kelahirannya, mulai dari rumah sakit, municipal office, kantor imigrasi sampai KBRI. Ujung-ujungnya, saya melupakan salah satu hal paling penting yang harus dilakukan setiap orang-terutama kepala keluarga-di Jepang setiap tahun: melaporkan pajak pendapatan alias income tax return ke municipal office. 

Laporan ini bisa dilakukan dengan mengisi form yang dikirimkan municipal office ke rumah via pos, atau datang langsung ke kantornya, dan biasanya deadlinenya adalah tanggal 15 Maret. Laporan pajak pendapatan ini wajib dilakukan setiap orang, terlepas apakah ybs memiliki pendapatan atau tidak. Mahasiswa yang hidupnya bergantung pada beasiswa seperti saya termasuk yang tidak memiliki pendapatan, tapi tetap diwajibkan untuk melapor. Tapi seberapa penting laporan pajak ini?

Informasi pendapatan yang ada di laporan tersebut akan menjadi dasar perhitungan berbagai subsidi yang akan diterima dari pemerintah. Salah satunya adalah asuransi kesehatan nasional (NHI/hokensho). Bagi yang tidak memiliki pendapatan (0 Yen income), akan mendapat diskon premi asuransi yang jumlahnya lumayan. Selain itu laporan ini juga dibutuhkan untuk memperoleh subsidi pengobatan anak dari pemerintah kota.  

Saya baru ngeh atas kealpaan melaporkan income tax ini ketika menerima slip pembayaran hokensho terbaru bulan Juni 2017. Tahun lalu, saya membayar sekitar 24,000 Yen untuk premi hokensho selama 10 bulan, untuk dua orang (saya dan istri). Alhasil, matapun terbelalak ketika menerima tagihan baru hokensho sebesar 120,000 Yen untuk 10 bulan. Itu artinya 12,000 Yen per bulan. Bagi mahasiswa MEXT yang beasiswanya pas-pasan seperti saya, tentu tagihan sebanyak itu bisa mencekik leher. 

Slip Premi Hokensho

Income Tax Return Form (Kashiwa-shi)
Kejadian lupa melaporkan income tax seperti ini lumrah terjadi di Jepang, terutama oleh foreigner, dan untungnya, pemerintah kota masih "berbaik hati" memberikan kesempatan kedua bagi orang-orang yang alpa tersebut. Setelah datang langsung ke municipal office dan melaporkan pendapatan ke bagian pajak, saya pun melapor ke bagian asuransi. Pihak asuransi nantinya akan menyesuaikan tagihan premi dan mengirimkan slip baru ke rumah. Berita bagus lainnya, tidak ada denda atau pungutan atas keteledoran saya. Alhamdulillah.

Pelajaran berharganya, kalo anda mahasiswa di Jepang dan tiba-tiba dapat tagihan premi asuransi membengkak, coba cek lagi, apakah income tax anda sudah dilaporkan. Intinya ya jangan sampai lupa lapor pajak setiap tahunnya (=  

Wednesday, June 21, 2017

Gaijin Story #9 - V-Preca, Kartu Kredit Pra-bayar di Jepang


Kartu kredit mungkin adalah metode pembayaran paling populer di dunia saat ini, termasuk di Jepang. Hampir semua transaksi di negeri sakura mendukung pembayaran dengan kartu kredit, baik on-the-spot maupun via online. Namun, mendapatkan kartu kredit di Jepang bukan hal yang mudah, terutama bagi gaijin (foreigner). Selain proses screening yang ketat, aplikasi kartu kredit di bank juga butuh kemampuan bahasa Jepang yang cukup, dan penolakan aplikasi oleh bank juga tidak jarang terjadi. Umumnya, foreigner yang ingin mendapatkan kartu kredit akan membawa temannya yang orang Jepang untuk membantu komunikasi dengan pihak Bank.

Nah, salah satu hal menarik yang saya temui di Jepang adalah kartu kredit pra-bayar. Ya, pra-bayar dan bisa diisi ulang seperti pulsa ponsel yang ada di Indonesia. Kartu kredit jenis ini bisa dibeli dengan mudah di berbagai convenient store dalam beberapa nominal, mulai dari 2000 - 10000 Yen, dan tentu saja, tidak perlu aplikasi yang ribet seperti di bank. Tinggal bayar di kasir, isi via website dan anda langsung bisa menggunakannya untuk berbagai transaksi. Sayangnya, kartu kredit jenis ini hanya bisa digunakan untuk transaksi online.

Voucher V-Preca
Salah satu kartu kredit pra-bayar yang saya gunakan di Jepang adalah V-Preca (Lifecard), yang bisa digunakan untuk transaksi di berbagai merchant online yang menerima pembayaran dengan kartu kredit VISA. Walaupun namanya kartu kredit, tapi V-Preca ini lebih mirip voucher. Untuk bisa menggunakannya, kita perlu melakukan registrasi via website dan memasukkan kode yang ada pada voucher tadi sebelum menggunakannya untuk transaksi. Untuk proses registrasi, anda harus memiliki nomor telepon Jepang yang bisa dihubungi, karena kode konfirmasi akan dikirimkan via SMS.

Kartu V-Preca Gift
Bagi yang tidak punya nomor telepon Jepang, tersedia juga V-Preca Gift dalam bentuk kartu yang bisa langsung digunakan untuk transaksi, namun hanya sekali pakai dan nominalnya berbeda dengan V-Preca biasa.

V-Preca bisa digunakan untuk transaksi online di dalam maupun luar Jepang, misalnya di Amazon.com atau ETS (untuk test TOEFL/GRE). Hal penting yang perlu diperhatikan, pada beberapa situs yang membutuhkan registrasi kartu kredit (untuk pembayaran berkala), V-Preca tidak bisa digunakan, karena nomor kartunya akan berubah setiap kali diisi ulang. 

Keunggulan V-Preca:
  • Bisa dibeli di berbagai convenient store
  • Bisa digunakan pada berbagai merchant online yang menerima pembayaran dengan VISA
  • Registrasi mudah dan disposable, cocok bagi foreigner/mahasiswa asing
  • Tidak ada bunga atau biaya aneh-aneh, jadi tak perlu khawatir belanja berlebihan atau debt collector ;-)
  • Bagi yang tidak punya nomor telepon Jepang, bisa menggunakan V-Preca Gift Card
Kekurangan V-Preca:
  • Hanya untuk transaksi online
  • Nominal yang terbatas
  • Tidak bisa digunakan untuk pembayaran berkala, misal untuk fee registrasi bulanan di Yahoo!Auction.
  • Website untuk registrasi/isi ulang, 90% dalam bahasa Jepang
Website V-Preca : http://vpc.lifecard.co.jp/en/

Monday, June 12, 2017

Melakukan Reset Pada Windows Folder Security

Salah satu hal paling menyebalkan ketika bekerja dengan Windows adalah berurusan dengan security setting pada folder/direktori. Pada UNIX-based OS, konfigurasi security pada direktori bisa dengan mudah dilakukan dengan perintah CHMOD. Di Windows, hal ini jadi lebih rumit, karena selain permission, pengguna juga harus berurusan dengan konfigurasi lain seperti ownership atau auditing, dan masing-masing konfigurasi ini bisa berdiri sendiri. Akibatnya, tidak jarang hal konyol terjadi, misalnya: saya adalah administrator dan pemilik folder "A" , namun karena suatu dan lain hal (misalnya windows explorer error), nama saya tidak tercantum dalam daftar pengguna/grup yang mendapat permission untuk melakukan perubahan pada folder tersebut. Maka saya tidak akan bisa melakukan perubahan, walaupun saya adalah admin sekaligus owner folder. Masalah ini sering muncul ketika kita ingin melakukan perubahan pada media (harddisk) dengan file system NTFS, dengan OS selain Windows.

Cara paling mudah untuk mengatasi hal tersebut adalah dengan melakukan reset pada security setting NTFS melalui command prompt windows. Konfigurasi via security setting (klik kanan) tidak dianjurkan karena berpotensi membingungkan, di mana pengguna harus berurusan dengan konfigurasi permission, ownership dll. Selain itu, proses via dekstop ini cukup menyita waktu, apalagi kalau folder tersebut berisi ribuan file. Jadi, daripada ribet dan lama, lebih baik di-reset saja sekalian.

1. Jalankan command prompt Windows, sebagai Administrator.
2. Masuk ke direktori yang ingin di-reset security-nya.
3. Ambil alih ownership isi folder tersebut dengan perintah berikut:

          takeown /R /F *

4. Reset permission setting seluruh isi folder tersebut dengan perintah tersebut:

          icacls * /T /Q /C /RESET

Tunggu sampai seluruh proses selesai, dan perubahan pada folder akan bisa dilakukan.




Thursday, May 11, 2017

Research Note #2 - draft

2017/05/30:
  • Bila draft dijalankan pada Cygwin 64-bit, akan ada masalah pada sistem permission file. Lebih baik dijalankan pada Cygwin 32-bit. Pastikan menjalankan Cygwin dalam sebagai Administrator di Windows untuk mencegah masalah permission pada file data.
2017/05/11:
<OMG HAMPIR TEPAT SETAHUN SEJAK TULISAN INI DIUPDATE!!>
  • Draft harus dijalankan dengan c-shell (csh). Bila dengan bash, penulisan file binary (file size) akan bermasalah, dan baru ketahuan setelah dijalankan dengan GrADS.
2016/05/13:
  • [Script] Bila proses dilakukan langsung, maka file lama hasil proses akan langsung di overwrite oleh file baru. Jadi file lama tidak perlu dihapus (untuk keperluan tes/ujicoba)
2016/05/12:
  • [Script] File CTL hanya mewakili satu tanggal saja (tiap direktori). Dengan sedikit modifikasi, 1 file CTL bisa dibuat untuk mewakili semua tanggal.
  • [Script] Untuk radar furuno selama IOP 2016, waktu observasi adalah tiap 5 menit, berarti 1 jam ada 12 observasi, atau 288 observasi selama 24 jam. Itu artinya TDEF di file CTL untuk 1 hari observasi adalah 288. Bila 30 hari TDEFnya 8640.
  • [Script] Data yang kosong akan menghasilkan error bila dibuka dengan GrADS. Cara mengatasinya kemungkinan adalah dengan membuat data set baru dengan dimensi yang sama (dengan data yg tidak kosong) dan diberi nilai -999 (no data) untuk waktu observasi tersebut. Masalahnya adalah, bagaimana cara membuat data kosong dengan dimensi yang sama persis dengan data yang dihasilkan draft.
Error pada data kosong

2016/05/11:
  • [Script] Proses untuk 24 jam akan menghasilkan 24 data CAPPI per jamnya dalam format binary GrADS, dengan 1 file CTL.
  • [Script] Proses untuk 24 jam akan tetap menghasilkan 24 data CAPPI, walaupun ada data yang tidak lengkap. Misal data jam 3 tidak ada, maka file data pada jam tersebut akan memiliki ukuran 0 kb.
  • [Script] Seluruh data CAPPI akan diletakkan pada direktori dengan yang sama dengan parameter hasil konversi, misal : /converted/dBuZ/20160124/.
  • [Script] Proses akan menghasilkan direktori data per jamnya dan direktori untuk menampung seluruh file CAPPI. Kedua direktori ini aman dihapus untuk menghemat space.
2016/05/09:
  • Merupakan kumpulan tool yang berfungsi untuk melakukan berbagai proses pada data/file dalam format draft (rt), misalnya membuat data CAPPI atau 3D.
  • Link download source code.
  • Bisa diinstal pada sistem 32-bit maupun 64-bit.
  • Instalasi pada Cygwin 32-bit di Windows 32-bit sudah dicoba berkali-kali dan tidak ada masalah.
  • Instalasi pada Cygwin 32-bit di Windows 64-bit sudah dicoba sekali dan tidak ada masalah.
Instalasi draft pada Cygwin 32-bit di Windows 64-bit
  • Instalasi langsung pada Cygwin 64-bit di Windows 64-bit bermasalah, karena script configure tidak mengenali system build type. Masalah ini (ternyata) bisa diselesaikan dengan menambahkan parameter build dengan nilai 'i686-pc-linux-gnu' pada perintah configure.
./configure F77=gfortran CC=gcc --build=i686-pc-linux-gnu

Error instalasi draft pada Cygwin 64-bit di Windows 64-bit
Penambahan parameter build pada configure untuk mengatasi error ketika instalasi di sistem 64-bit
  • Sebagai catatan, pada Cygwin 32-bit, system build typenya adalah 'i686-pc-cygwin'.
  • Bila draft tetap tidak bisa diinstall, kemungkinan alternatifnya adalah dengan menggunakan (copy) file executable dari tool yang sudah diinstall pada sistem yang berjalan. Tapi ini masih sebatas dugaan karena belum pernah dicoba.

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 ...)

Tuesday, August 2, 2016

Research Note #5 - Algoritma Array Koordinat Resolusi 0.1 Deg (GSMaP)

Algoritma ini digunakan untuk membuat array koordinat (geo) dengan resolusi spasial 0.1 derajat yang biasa digunakan oleh data GSMaP. Pada data ini, terdapat 3600 komponen x dan 1200 komponen y yang masing-masing merepresentasikan bujur dan lintang.

Pada tulisan ini, bahasa pemrograman yang digunakan adalah Fortran, walaupun algoritma ini sejatinya bisa digunakan pada semua bahasa pemrograman.


      integer :: x,y
      real :: o_lat,o_lon,delta
      delta=0.1

      do y=1,1200
        do x=1,3600
          o_lon=0.05+delta*(x-1)

c---- Bila bujur melewati dateline (>180E) ----- 

          if (o_lon>180) then
            o_lon=-360+(0.05+delta*(x-1))
          end if
c-----------------------------------------------

          o_lat=59.95-delta*(y-1)
          print *,y,'',x,'',o_lat,'',o_lon
        end do
      end do

Hasilnya adalah sebagai berikut :

Gambar pertama adalah output pada awal loop, gambar kedua adalah output ketika bujur melewati dateline (180E) dan yang terakhir adalah output pada akhir loop.

Monday, August 1, 2016

Research Note #4 - Struktur Data Binary Unformatted

Tulisan ini dibuat sebagai catatan (penting), karena berurusan dengan file binary itu seringkali merepotkan dan bikin pusing kepala.  

Dataset yang diolah : TRMM 2A25 (Level-2 swath product)/ GPRv7 (by Atsushi Hamada)
Format : Unformatted binary (2 bytes)

Masalah utama yang dihadapi sebenarnya klasik: bagaimana sebenarnya struktur data yang tersimpan dalam data binary unformatted yang nantinya akan diolah dengan Fortran. Tipe data ini sering kali digunakan ilmuwan untuk menyimpan data meteorologi karena lebih mudah dibuat (dibanding HDF atau NetCDF yg butuh library khusus), hemat space di memori/disk, dan tentu saja prosesnya jauh lebih cepat dibandingkan ASCII.

Kesimpulannya, menguasai pengolahan data binary unformatted adalah keharusan bila kita ingin banyak 'bermain' dengan data, secara numerik.

1. Record tersimpan secara serial
Data dalam file terdiri dari record-record. Record ini misalnya bisa berupa curah hujan, atau temperatur. Data curah hujan per-jam selama 1 hari misalnya, terdiri dari 24-record. Untuk data yang lebih kompleks, misalnya 2D atau 3D, jumlah recordnya bisa ratusan atau ribuan. 

Yang perlu diperhatikan di sini adalah, mau sebanyak apapun dan bagaimanapun dimensi datanya, entah itu 2D atau 3D, record akan selalu tersimpan secara serial dalam file. Contohnya pada gambar berikut :


Contoh data array misalnya, data spasial dari satelit. Misalnya record dari data spasial memiliki komponen x dan y, maka record tersebut akan disimpan secara berurut pada data. Dalam hal ini, komputer tidak akan mengerti dimensi atau array, bila kita tidak memberikan instruksi untuk membentuk array dari data yang ada. Dengan kata lain, urutan x dan y dari tiap record tergantung pada kita, atau orang yang membuat/menyimpan data tersebut.

Jadi, bila kita ingin membuka data binary unformatted, kita harus tahu terlebih dahulu dimensi dari data (misal jumlah komponen x, y, z dll). Informasi ini biasanya diberikan oleh penyedia data atau orang yang membuat data tersebut.

Lalu apakah data tersebut bisa dibuka bila kita tidak tahu dimensinya? Jawabnya : Bisa! 
Data tetap bisa dibuka (terutama data 1D). Untuk data 2D atau lebih, kita perlu menghitung atau menebak pola arraynya terlebih dahulu (x-nya ada berapa, y-nya ada berapa dst), kalau tidak, kita akan kesulitan mengolah data, walaupun bisa membukanya.

2. Hanya ada satu variabel record (direct access)
Berbeda dengan HDF atau NetCDF yang memiliki metadata yang tergabung dalam 1 file, unformatted binary adalah data yang 'plain', yaitu hanya berisi record tanpa informasi tambahan (metadata atau header). Itu sebabnya, untuk mengolah data unformatted binary dengan GrADS, kita membutuhkan control file (CTL) yang fungsinya untuk memberi informasi ke komputer (GrADS) tentang file yang akan diolah, misal komponen x, y, variabel dll.

Pada data spasial dengan format unformatted binary, record umumnya diakses secara langsung (direct atau random), tidak berurutan, di mana seluruh record akan dimasukkan ke dalam satu variabel/array record. Contoh di Fortran :

read(10,rec=1) ((rain(i,j),i=1,IDIM),j=1,JDIM)

Pada contoh di atas, seluruh record akan dimasukkan ke dalam array 2D dengan nama 'rain' dengan komponen i dan j. Untuk mengakses seluruh record, kita hanya perlu menggunakan record identifier 'rec=1' dan array 'rain', diikuti dengan indeks i dan j.

Intinya, berapapun dan apapun nama variabelnya ketika data dibuat, untuk membacanya, kita hanya perlu menggunakan 1 array dan kita bisa menggunakan nama apapun untuk nama array yang menampung record dari data tersebut.

Contoh: data yang dibuat dengan nama variabel/record 'hujan', bisa dibaca kembali dengan nama variabel lain, misal 'rain'. Kenapa bisa begitu ? Kembali ke atas, karena ini adalah data unformatted alias plain, nama record/variabel bisa dianggap tidak ada.

Bila kita membaca data binary dengan 2 variabel, maka dalam file, kedua variabel tersebut akan memiliki nama record/header yang sama. Keduanya akan dibedakan berdasarkan urutan record dalam data. Misal variabel A memiliki record 1-10, variabel B memiliki record 11-20 dst (perhatikan poin 1 di atas)
 
3. Record length (direct access)
RECL atau record length ini juga seringkali membingungkan, apalagi sedikit sekali referensi yang membahasnya. Kalaupun ada, biasanya bahasanya sudah 'tinggi' banget, nggak cocok dibaca sama pemula kayak saya. Setelah beberapa kali percobaan, akhirnya saya bisa memahami apa yang dimaksud dengan RECL.

RECL adalah panjang record dari data, dalam byte. Untuk data yang diakses secara langsung (direct/random), RECL ini wajib dicantumkan sebelum mengakses data. Contoh :

open(10,file=fname,
     &     form='unformatted',access='direct',recl=4*IDIM*JDIM,
     &     status='old')

Nah, bagaimanakah menentukan RECL ini ? Untuk data unformatted yang diakses secara langsung, RECL bisa dihitung dengan mengalikan kapasitas record dengan jumlah recordnya. Misalnya data spasial dengan 3600 komponen x dan 1200 komponen y, disimpan dengan record/variabel bertipe integer 2-byte, maka RECL = 2*3600*1200 = 8640000 bytes = 8.64 MB.

Fun fact : ukuran RECL mencerminkan ukuran dari file data tersebut dan bisa diketahui dengan perintah INQUIRE pada Fortran.

4. Jenis data dan jumlah record dalam byte
Seperti yang dijelaskan di poin 3 di atas, RECL mencerminkan ukuran file, dan ditentukan oleh kapasitas dan jumlah record. Kalau tidak ingin harddisk atau memori komputer cepat penuh, maka anda perlu memperhatikan jenis data dan jumlah record ketika akan menyimpan data.

Tipe data yang digunakan untuk menyimpan angka/bilangan dalam Fortran biasanya adalah integer dan real. Integer digunakan untuk menyimpan bilangan bulat (tanpa koma), dan sering digunakan karena lebih hemat space. Ada dua jenis integer biasa yang digunakan, yaitu 2-byte dan 4-byte integer.

2-byte integer bisa digunakan untuk menyimpan angka -32767 sampai dengan 32767. Perhitungannya sederhana.

Komputer hanya mengenal bilangan biner (0 dan 1), sehingga bilangan apapun akan dikonversi ke bilangan biner untuk bisa diproses komputer. 1 bit (binary digit) bisa digunakan untuk menyimpan 2 bilangan (1 dan 0 saja), 2 bit bisa digunakan untuk menyimpan 4 bilangan (00,01,10,11 atau 0,1,2,3 dalam desimal), dan seterusnya.

Artinya jumlah data bisa ditentukan dengan rumus 2 pangkat jumlah bit. Sehingga, data dengan ukuran 2 byte (16 bit, karena 1 byte=8 bit), bisa digunakan untuk menyimpan 2**16 bilangan =  65536 bilangan. Tapi, karena bit pertama data digunakan untuk menyimpan tanda positif/negatif, maka yang tersisa adalah 2**15 bilangan = 32768, jadi mulai dari -32767 sampai +32767 (+-111111111111111 dalam bilangan biner).

Hal yang sama juga berlaku untuk data integer 4-byte (32-bit). Untuk integer 4-byte jumlah datanya adalah 2**31= 2147483648 bilangan, mulai dari -2147483647 sampai +-2147483647.

5. Urutan record untuk unformatted binary GrADS
Masih ada urutannya dengan poin 1 dan 2 di atas.
Sebenarnya urutan record bisa diatur sesuka hati, tapi untuk unformatted binary GrADS GPRv7, file CTL-nya seperti ini :

dset /home/DATALINK/GPRv7/201301/GPR2013011686417.Lev80.gdat
title PR 2a25 data for GrADS
*options little_endian
options big_endian
undef -9999
xdef 1 linear 180. 0.5
ydef 49 linear 1 1
zdef 80 linear 250. 250.
tdef 9150 linear jan0001 1yr
vars 10
lat1    0 -1,40,2,-1 flat=lat1+lat2*0.001
lat2    0 -1,40,2,-1 flat=lat1+lat2*0.001
lon1    0 -1,40,2,-1 flon=lon1+lon2*0.001
lon2    0 -1,40,2,-1 flon=lon1+lon2*0.001
flag    0 -1,40,2,-1 rainflag 2byte integer
method  0 -1,40,2,-1 methodflag 2byte integr
rain1  80 -1,40,2,-1 rainfall*100 2byte integr
rnsfc   0 -1,40,2,-1 near-sfc rain*100 2byte integr
rave1   0 -1,40,2,-1 rainave(2km-4km)*100 2byte integr
rave2   0 -1,40,2,-1 rainave(top-bottom)*100 2byte integr
endvars


Setelah dibuka dengan Fortran, inilah urutan record pada data unformatted binarynya :

 read(10,rec=1)(((datfile(j,varnum,t),j=1,JDIM),varnum=1,VARS)
     &                               ,t=1,TDIM)


Sehingga pola urutan recordnya :
  1. y adalah dimensi terkecil (karena x=1), dengan 49 komponen.
  2. variabel adalah dimensi kedua, 89 komponen. Kenapa 89 ? Karena ada satu variabel yang memiliki 80 level vertikal. Sisa variabel yang lain hanya memiliki 1 level (permukaan).
  3. t adalah dimensi ketiga, dengan 9150 komponen.
Jadi kalau disimpulkan, kemungkinan besar pola urutan record untuk unformatted binary GrADS secara umum adalah sebagai berikut :
  1. x (atau y, bila x=1)
  2. variable level (z)
  3. variable name
  4. y (atau t, bila x=1)
  5. t
Memang sedikit membingungkan, sehingga perlu banyak percobaan lagi dengan menggunakan data unformatted binary untuk bisa memastikan polanya.